@descope/web-component 3.53.1 → 3.53.3
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/cjs/descope-wc/BaseDescopeWc.js +1 -1
- package/dist/cjs/descope-wc/DescopeWc.js +1 -1
- package/dist/cjs/descope-wc/DescopeWc.js.map +1 -1
- package/dist/esm/descope-wc/BaseDescopeWc.js +1 -1
- package/dist/esm/descope-wc/DescopeWc.js +1 -1
- package/dist/esm/descope-wc/DescopeWc.js.map +1 -1
- package/dist/index.js +2 -2
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DescopeWc.js","sources":["../../../src/lib/descope-wc/DescopeWc.ts"],"sourcesContent":["import {\n clearFingerprintData,\n ensureFingerprintIds,\n} from '@descope/web-js-sdk';\nimport {\n CUSTOM_INTERACTIONS,\n DESCOPE_ATTRIBUTE_EXCLUDE_FIELD,\n DESCOPE_ATTRIBUTE_EXCLUDE_NEXT_BUTTON,\n ELEMENT_TYPE_ATTRIBUTE,\n FETCH_ERROR_RESPONSE_ERROR_CODE,\n FETCH_EXCEPTION_ERROR_CODE,\n FLOW_REQUESTED_IS_IN_OLD_VERSION_ERROR_CODE,\n FLOW_TIMED_OUT_ERROR_CODE,\n POLLING_STATUS_NOT_FOUND_ERROR_CODE,\n RESPONSE_ACTIONS,\n SDK_SCRIPTS_LOAD_TIMEOUT,\n URL_CODE_PARAM_NAME,\n URL_RUN_IDS_PARAM_NAME,\n URL_TOKEN_PARAM_NAME,\n} from '../constants';\nimport {\n clearPreviousExternalInputs,\n getAnimationDirection,\n getElementDescopeAttributes,\n getFirstNonEmptyValue,\n getScriptResultPath,\n getUserLocale,\n handleAutoFocus,\n handleReportValidityOnBlur,\n injectSamlIdpForm,\n isConditionalLoginSupported,\n leadingDebounce,\n openCenteredPopup,\n setTOTPVariable,\n showFirstScreenOnExecutionInit,\n State,\n submitForm,\n timeoutPromise,\n transformScreenInputs,\n transformStepStateForCustomScreen,\n updateScreenFromScreenState,\n updateTemplateFromScreenState,\n withMemCache,\n} from '../helpers';\nimport { getABTestingKey } from '../helpers/abTestingKey';\nimport { calculateCondition, calculateConditions } from '../helpers/conditions';\nimport { getLastAuth, setLastAuth } from '../helpers/lastAuth';\nimport { IsChanged } from '../helpers/state';\nimport {\n disableWebauthnButtons,\n replaceElementMessage,\n setCssVars,\n setNOTPVariable,\n setPhoneAutoDetectDefaultCode,\n} from '../helpers/templates';\nimport {\n ClientScript,\n ComponentsConfig,\n CustomScreenState,\n FlowState,\n NextFn,\n NextFnReturnPromiseValue,\n ScriptElement,\n ScriptModule,\n SdkConfig,\n StepState,\n FlowJWTResponse,\n} from '../types';\nimport BaseDescopeWc from './BaseDescopeWc';\n\n// this class is responsible for WC flow execution\nclass DescopeWc extends BaseDescopeWc {\n errorTransformer:\n | ((error: { text: string; type: string }) => string)\n | undefined;\n\n static set sdkConfigOverrides(config: Partial<SdkConfig>) {\n BaseDescopeWc.sdkConfigOverrides = config;\n }\n\n static get sdkConfigOverrides() {\n return BaseDescopeWc.sdkConfigOverrides;\n }\n\n flowState: State<FlowState>;\n\n stepState = new State<StepState>({} as StepState);\n\n #pollingTimeout: NodeJS.Timeout;\n\n #conditionalUiAbortController = null;\n\n onScreenUpdate?: (\n screenName: string,\n context: CustomScreenState,\n next: StepState['next'],\n ref: typeof this,\n ) => boolean | Promise<boolean>;\n\n #sdkScriptsLoading = null;\n\n constructor() {\n const flowState = new State<FlowState>({\n deferredRedirect: false,\n } as FlowState);\n\n super(flowState.update.bind(flowState));\n\n this.flowState = flowState;\n }\n\n #eventsCbRefs = {\n visibilitychange: this.#syncStateWithVisibility.bind(this),\n };\n\n #syncStateWithVisibility() {\n if (!document.hidden) {\n // Defer the update a bit, it won't work otherwise\n setTimeout(() => {\n // Trigger state update that will redirect and pending deferred redirection\n this.flowState.update({ deferredRedirect: false });\n }, 300);\n }\n }\n\n // Native bridge version native / web syncing - change this when\n // a major change happens that requires some form of compatibility\n bridgeVersion = 2;\n\n // A collection of callbacks that are maintained as part of the web-component state\n // when it's connected to a native bridge.\n nativeCallbacks: {\n // This callback will be initialized once a 'nativeBridge' action is\n // received from a start or next request. It will then be called by\n // nativeResume if appropriate as part of handling some payload types.\n complete?: (input: Record<string, any>) => Promise<void>;\n\n // This callback is invoked when 'nativeResume' is called with a 'beforeScreen'\n // type, so the native bridge can resolve the async call to 'nativeBeforeScreen'\n // and tell the web-component whether it wants a custom screen or not.\n screenResolve?: (value: boolean) => void;\n\n // This callback it kept until 'nativeResume' is called with a 'resumeScreen'\n // type, so the native bridge can submit the result of a custom screen.\n screenNext?: StepState['next'];\n } = {};\n\n // Notifies the native bridge that we're about to show a new screen and lets it\n // override it by showing a native screen instead.\n async #nativeBeforeScreen(\n screen: string,\n context: CustomScreenState,\n next: StepState['next'],\n ): Promise<boolean> {\n if (this.nativeOptions?.bridgeVersion >= 2) {\n return new Promise<boolean>((resolve) => {\n this.nativeCallbacks.screenNext = next;\n this.nativeCallbacks.screenResolve = resolve;\n this.#nativeNotifyBridge('beforeScreen', { screen, context });\n });\n }\n return false;\n }\n\n // Notifies the native bridge that a screen has been shown.\n #nativeAfterScreen(screen: string) {\n if (this.nativeOptions?.bridgeVersion >= 2) {\n this.#nativeNotifyBridge('afterScreen', { screen });\n }\n }\n\n // This callback is called by the native layer to resume a flow\n // that's waiting for some external trigger, such as a magic link\n // redirect or native OAuth authentication.\n nativeResume(type: string, payload: string) {\n const response = JSON.parse(payload);\n if (type === 'oauthWeb' || type === 'sso') {\n let { exchangeCode } = response;\n if (!exchangeCode) {\n const url = new URL(response.url);\n exchangeCode = url.searchParams?.get(URL_CODE_PARAM_NAME);\n }\n this.nativeCallbacks.complete?.({\n exchangeCode,\n idpInitiated: true,\n });\n } else if (type === 'magicLink') {\n const url = new URL(response.url);\n const token = url.searchParams.get(URL_TOKEN_PARAM_NAME);\n const stepId = url.searchParams\n .get(URL_RUN_IDS_PARAM_NAME)\n .split('_')\n .pop();\n this.#resetPollingTimeout();\n // update the state along with cancelling out the action to abort the polling mechanism\n this.flowState.update({ token, stepId, action: undefined });\n } else if (type === 'beforeScreen') {\n const { screenResolve } = this.nativeCallbacks;\n this.nativeCallbacks.screenResolve = null;\n const { override } = response;\n if (!override) {\n this.nativeCallbacks.screenNext = null;\n }\n screenResolve?.(override);\n } else if (type === 'resumeScreen') {\n const { interactionId, form } = response;\n const { screenNext } = this.nativeCallbacks;\n this.nativeCallbacks.screenNext = null;\n screenNext?.(interactionId, form);\n } else {\n // expected: 'oauthNative', 'webauthnCreate', 'webauthnGet', 'failure'\n this.nativeCallbacks.complete?.(response);\n }\n }\n\n // Utility function for sending a generic message to the native bridge.\n #nativeNotifyBridge(type: string, payload: Record<string, any>) {\n this.#dispatch('bridge', {\n type,\n payload,\n });\n }\n\n // This object is set by the native layer to\n // inject native specific data into the 'flowState'.\n nativeOptions?: {\n platform: 'ios' | 'android';\n bridgeVersion: number;\n oauthProvider?: string;\n oauthRedirect?: string;\n magicLinkRedirect?: string;\n ssoRedirect?: string;\n origin?: string;\n };\n\n /**\n * Get all loaded SDK script modules from elements with data-script-id attribute\n * @returns Array of script modules that can be refreshed before form submission\n */\n loadSdkScriptsModules() {\n // Get all modules from the data-script-id elements\n const scriptElements = this.shadowRoot.querySelectorAll(\n 'div[data-script-id]',\n );\n\n // Filter out elements without moduleRes property\n return Array.from(scriptElements)\n .map((el) => (el as ScriptElement).moduleRes)\n .filter((module): module is ScriptModule => !!module);\n }\n\n loadSdkScripts(scripts: ClientScript[]) {\n if (!scripts?.length) {\n return null;\n }\n\n const createScriptCallback =\n (\n script: {\n id: string;\n resultKey?: string;\n },\n resolve: (value: any) => void,\n ) =>\n (result: string) => {\n this.dispatchEvent(\n // update the context with the result, under the `resultKey` key\n new CustomEvent('components-context', {\n detail: {\n // we store the result with script.id prefix to avoid conflicts with other scripts results\n // that may have the same key\n [getScriptResultPath(script.id, script.resultKey)]: result,\n },\n bubbles: true,\n composed: true,\n }),\n );\n resolve(script.id);\n };\n\n this.loggerWrapper.debug(\n `Preparing to load scripts: ${scripts.map((s) => s.id).join(', ')}`,\n );\n const promises = Promise.all(\n scripts?.map(async (script) => {\n const scriptElement = this.shadowRoot.querySelector(\n `[data-script-id=\"${script.id}\"]`,\n ) as ScriptElement;\n if (scriptElement) {\n this.loggerWrapper.debug('Script already loaded', script.id);\n const { moduleRes } = scriptElement;\n moduleRes?.start?.();\n return moduleRes;\n }\n await this.injectNpmLib(\n '@descope/flow-scripts',\n '1.0.13', // currently using a fixed version when loading scripts\n `dist/${script.id}.js`,\n );\n const module = globalThis.descope?.[script.id];\n return new Promise((resolve, reject) => {\n try {\n // call the module loading function\n const moduleRes = module(\n script.initArgs as any,\n { baseUrl: this.baseUrl, ref: this },\n createScriptCallback(script, resolve),\n this.loggerWrapper,\n );\n // some modules do not return a ScriptModule object\n if (moduleRes) {\n const newScriptElement = document.createElement(\n 'div',\n ) as ScriptElement;\n newScriptElement.setAttribute('data-script-id', script.id);\n newScriptElement.moduleRes = moduleRes;\n this.shadowRoot.appendChild(newScriptElement);\n this.nextRequestStatus.subscribe(() => {\n this.loggerWrapper.debug('Unloading script', script.id);\n moduleRes.stop?.();\n });\n }\n } catch (e) {\n reject(e);\n }\n });\n }),\n );\n\n const toPromise = new Promise((resolve) => {\n setTimeout(() => {\n this.loggerWrapper.warn('SDK scripts loading timeout');\n resolve(true);\n }, SDK_SCRIPTS_LOAD_TIMEOUT);\n });\n\n return Promise.race([promises, toPromise]);\n }\n\n get isDismissScreenErrorOnInput() {\n return this.getAttribute('dismiss-screen-error-on-input') === 'true';\n }\n\n #handleGlobalErrors({\n errorText,\n errorType,\n }: {\n errorText: string;\n errorType: string;\n }) {\n const updateGlobalError = () => {\n let transformedErrorText = errorText;\n try {\n transformedErrorText =\n this.errorTransformer?.({\n text: errorText,\n type: errorType,\n }) || errorText;\n } catch (e) {\n this.loggerWrapper.error('Error transforming error message', e.message);\n }\n replaceElementMessage(\n this.contentRootElement,\n 'error-message',\n transformedErrorText,\n );\n };\n\n // we do not know if the page is going to be updated or not,\n // so we are updating the error message component before and after the screen update\n this.addEventListener('screen-updated', updateGlobalError, { once: true });\n updateGlobalError();\n }\n\n init() {\n // when running in a webview (mobile SDK) we want to lazy init the component\n // so the mobile SDK will be able to register all the necessary callbacks\n // before the component will start loading the flow\n if (!(window as any).descopeBridge) {\n // eslint-disable-next-line no-underscore-dangle\n return this._init();\n }\n // eslint-disable-next-line no-underscore-dangle\n (this as any).lazyInit = this._init;\n return undefined;\n }\n\n #subscribeStepState() {\n this.stepState?.subscribe(\n this.onStepChange.bind(this),\n ({\n screenState: { errorText, errorType, ...screenState } = {},\n ...state\n }) => ({ ...state, screenState }),\n );\n\n this.stepState?.subscribe(\n this.#handleGlobalErrors.bind(this),\n (state) => ({\n errorText: state?.screenState?.errorText,\n errorType: state?.screenState?.errorType,\n }),\n { forceUpdate: true },\n );\n\n this.stepState?.subscribe(\n this.#handlePasscodeCleanup.bind(this),\n (state) => ({\n errorText: state?.screenState?.errorText,\n errorType: state?.screenState?.errorType,\n }),\n { forceUpdate: true },\n );\n }\n\n // because the screen does not re-render,\n // in case of an OTP code error, we want to clean the invalid code\n #handlePasscodeCleanup({ errorText, errorType }) {\n if (errorType || errorText) {\n this.contentRootElement\n .querySelectorAll('descope-passcode[data-auto-submit=\"true\"]')\n .forEach((passcodeEle: HTMLInputElement) => {\n // currently we do not have a way to reset the code value\n // so we are clearing the inputs\n passcodeEle.shadowRoot\n .querySelectorAll('descope-text-field[data-id]')\n .forEach((input: HTMLInputElement) => {\n // eslint-disable-next-line no-param-reassign\n input.value = '';\n });\n });\n\n // this should not be handled here, it's a workaround for focusing the code component on error\n // maybe it's about time to refactor this sdk\n handleAutoFocus(this.contentRootElement, this.autoFocus, false);\n }\n }\n\n // eslint-disable-next-line no-underscore-dangle\n async _init() {\n if (this.shadowRoot.isConnected) {\n this.flowState?.subscribe(this.onFlowChange.bind(this));\n this.#subscribeStepState();\n\n window.addEventListener(\n 'visibilitychange',\n this.#eventsCbRefs.visibilitychange,\n );\n }\n await super.init?.();\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n\n this.flowState.unsubscribeAll();\n this.stepState.unsubscribeAll();\n this.#resetPollingTimeout();\n this.#conditionalUiAbortController?.abort();\n this.#conditionalUiAbortController = null;\n\n window.removeEventListener(\n 'visibilitychange',\n this.#eventsCbRefs.visibilitychange,\n );\n }\n\n async getHtmlFilenameWithLocale(locale: string, screenId: string) {\n let filenameWithLocale: string;\n const userLocale = getUserLocale(locale); // use provided locals, otherwise use browser locale\n const targetLocales = await this.getTargetLocales();\n\n if (targetLocales.includes(userLocale.locale)) {\n filenameWithLocale = `${screenId}-${userLocale.locale}.html`;\n } else if (targetLocales.includes(userLocale.fallback)) {\n filenameWithLocale = `${screenId}-${userLocale.fallback}.html`;\n }\n return filenameWithLocale;\n }\n\n async getPageContent(htmlFilename: string, htmlLocaleFilename: string) {\n if (htmlLocaleFilename) {\n // try first locale url, if can't get for some reason, fallback to the original html url (the one without locale)\n try {\n const { body } = await this.fetchStaticResource(\n htmlLocaleFilename,\n 'text',\n );\n return body;\n } catch (ex) {\n this.loggerWrapper.error(\n `Failed to fetch flow page from ${htmlLocaleFilename}. Fallback to url ${htmlFilename}`,\n ex,\n );\n }\n }\n\n try {\n const { body } = await this.fetchStaticResource(htmlFilename, 'text');\n return body;\n } catch (ex) {\n this.loggerWrapper.error(`Failed to fetch flow page`, ex.message);\n }\n return null;\n }\n\n async #handleFlowRestart() {\n this.loggerWrapper.debug('Trying to restart the flow');\n const prevCompVersion = await this.getComponentsVersion();\n this.reset();\n const compVersion = await this.getComponentsVersion();\n\n if (prevCompVersion === compVersion) {\n this.loggerWrapper.debug(\n 'Components version was not changed, restarting flow',\n );\n this.flowState.update({\n stepId: null,\n executionId: null,\n });\n } else {\n this.loggerWrapper.error(\n 'Components version mismatch, please reload the page',\n );\n }\n }\n\n #isPrevCustomScreen = false;\n\n async #handleCustomScreen(stepStateUpdate: Partial<StepState>) {\n const { next, stepName, ...state } = {\n ...this.stepState.current,\n ...stepStateUpdate,\n };\n\n const context = transformStepStateForCustomScreen(state);\n\n // first check if we're running in a native bridge and the app wants a custom screen\n let isCustomScreen = await this.#nativeBeforeScreen(\n stepName,\n context,\n next,\n );\n if (!isCustomScreen) {\n // now check any custom callbacks that have been set on the component itself\n isCustomScreen = Boolean(\n await this.onScreenUpdate?.(stepName, context, next, this),\n );\n }\n\n const isFirstScreen = !this.stepState.current.htmlFilename;\n this.#toggleScreenVisibility(isCustomScreen);\n\n // Store the current custom screen state\n if (next) {\n next.isCustomScreen = isCustomScreen;\n }\n\n // if we switched from a custom screen to a regular screen or the other way around\n if (this.#isPrevCustomScreen !== isCustomScreen) {\n const [currentMode, prevMode] = ['flow', 'custom'].sort(() =>\n isCustomScreen ? -1 : 1,\n );\n this.loggerWrapper.debug(\n `Switching from ${prevMode} screen to ${currentMode} screen`,\n );\n\n this.#isPrevCustomScreen = isCustomScreen;\n\n if (isCustomScreen) {\n // we are unsubscribing all the listeners because we are going to render a custom screen\n // and we do not want that onStepChange will be called\n this.stepState.unsubscribeAll();\n } else {\n // we are subscribing to the step state again because we are going to render a regular screen\n this.#subscribeStepState();\n }\n }\n\n if (isCustomScreen) {\n this.loggerWrapper.debug('Showing a custom screen');\n this.#dispatchPageEvents({\n isFirstScreen,\n isCustomScreen,\n stepName: stepStateUpdate.stepName,\n });\n\n // disable key press handler\n this.disableKeyPressHandler();\n } else {\n // enable key press handler\n this.handleKeyPress();\n }\n\n this.stepState.forceUpdate = isCustomScreen;\n }\n\n async onFlowChange(\n currentState: FlowState,\n prevState: FlowState,\n isChanged: IsChanged<FlowState>,\n ) {\n const {\n projectId,\n flowId,\n tenant,\n stepId,\n executionId,\n action,\n screenId,\n screenState,\n redirectTo,\n redirectIsPopup,\n redirectUrl,\n token,\n code,\n isPopup,\n exchangeError,\n webauthnTransactionId,\n webauthnOptions,\n redirectAuthCodeChallenge,\n redirectAuthCallbackUrl,\n redirectAuthBackupCallbackUri,\n redirectAuthInitiator,\n locale,\n samlIdpResponseUrl,\n samlIdpResponseSamlResponse,\n samlIdpResponseRelayState,\n nativeResponseType,\n nativePayload,\n reqTimestamp,\n ...ssoQueryParams\n } = currentState;\n\n let startScreenId: string;\n let startScreenName: string;\n let conditionInteractionId: string;\n const abTestingKey = getABTestingKey();\n const { outboundAppId } = this;\n const { outboundAppScopes } = this;\n const loginId = this.sdk.getLastUserLoginId();\n const flowConfig = await this.getFlowConfig();\n const projectConfig = await this.getProjectConfig();\n const flowVersions = Object.entries(projectConfig.flows || {}).reduce(\n // pass also current versions for all flows, it may be used as a part of the current flow\n (acc, [key, value]) => {\n acc[key] = value.version;\n return acc;\n },\n {} as Record<string, number>,\n );\n const redirectAuth =\n redirectAuthCallbackUrl && redirectAuthCodeChallenge\n ? {\n callbackUrl: redirectAuthCallbackUrl,\n codeChallenge: redirectAuthCodeChallenge,\n backupCallbackUri: redirectAuthBackupCallbackUri,\n }\n : undefined;\n const nativeOptions = this.nativeOptions\n ? {\n platform: this.nativeOptions.platform,\n bridgeVersion: this.nativeOptions.bridgeVersion,\n oauthProvider: this.nativeOptions.oauthProvider,\n oauthRedirect: this.nativeOptions.oauthRedirect,\n magicLinkRedirect: this.nativeOptions.magicLinkRedirect,\n ssoRedirect: this.nativeOptions.ssoRedirect,\n }\n : undefined;\n let conditionComponentsConfig: ComponentsConfig = {};\n\n // if there is no execution id we should start a new flow\n if (!executionId) {\n const clientScripts = [\n ...(flowConfig.clientScripts || []),\n ...(flowConfig.sdkScripts || []),\n ];\n\n if (flowConfig.conditions) {\n let conditionScripts = [];\n ({\n startScreenId,\n conditionInteractionId,\n startScreenName,\n clientScripts: conditionScripts,\n componentsConfig: conditionComponentsConfig,\n } = calculateConditions(\n {\n loginId,\n code,\n token,\n abTestingKey,\n lastAuth: getLastAuth(loginId),\n },\n flowConfig.conditions,\n ));\n clientScripts.push(...(conditionScripts || []));\n } else if (flowConfig.condition) {\n ({ startScreenId, conditionInteractionId } = calculateCondition(\n flowConfig.condition,\n {\n loginId,\n code,\n token,\n abTestingKey,\n lastAuth: getLastAuth(loginId),\n },\n ));\n } else {\n startScreenName = flowConfig.startScreenName;\n startScreenId = flowConfig.startScreenId;\n }\n\n this.#sdkScriptsLoading = this.loadSdkScripts(clientScripts);\n if (flowConfig.fingerprintEnabled && flowConfig.fingerprintKey) {\n await ensureFingerprintIds(flowConfig.fingerprintKey, this.baseUrl);\n } else {\n clearFingerprintData();\n }\n\n // As an optimization - we want to show the first screen if it is possible\n if (!showFirstScreenOnExecutionInit(startScreenId, ssoQueryParams)) {\n const sdkResp = await this.sdk.flow.start(\n flowId,\n {\n tenant,\n redirectAuth,\n ...ssoQueryParams,\n client: this.client,\n ...(redirectUrl && { redirectUrl }),\n lastAuth: getLastAuth(loginId),\n abTestingKey,\n locale: getUserLocale(locale).locale,\n nativeOptions,\n outboundAppId,\n outboundAppScopes,\n },\n conditionInteractionId,\n '',\n projectConfig.componentsVersion,\n flowVersions,\n {\n ...this.formConfigValues,\n ...(code ? { exchangeCode: code, idpInitiated: true } : {}),\n ...(ssoQueryParams.descopeIdpInitiated && { idpInitiated: true }),\n ...(token ? { token } : {}),\n ...(ssoQueryParams.oidcLoginHint\n ? { externalId: ssoQueryParams.oidcLoginHint }\n : {}),\n },\n );\n\n this.#handleSdkResponse(sdkResp);\n if (sdkResp?.data?.status !== 'completed') {\n this.flowState.update({ code: undefined, token: undefined });\n }\n return;\n }\n }\n\n this.loggerWrapper.debug(\n 'Before popup postmessage send',\n JSON.stringify({\n isPopup,\n code,\n exchangeError,\n isCodeChanged: isChanged('code'),\n isExchangeErrorChanged: isChanged('exchangeError'),\n }),\n );\n if (\n isPopup &&\n ((isChanged('code') && code) ||\n (isChanged('exchangeError') && exchangeError))\n ) {\n // Sending data back from popup to opener (code / exchangeError)\n this.#notifyOpener(executionId, code, exchangeError);\n return;\n }\n\n // if there is a descope url param on the url its because the user clicked on email link or redirected back to the app\n // we should call next with the params\n if (\n executionId &&\n ((isChanged('token') && token) ||\n (isChanged('code') && code) ||\n (isChanged('exchangeError') && exchangeError))\n ) {\n const sdkResp = await this.sdk.flow.next(\n executionId,\n stepId,\n CUSTOM_INTERACTIONS.submit,\n flowConfig.version,\n projectConfig.componentsVersion,\n {\n token,\n exchangeCode: code,\n exchangeError,\n },\n );\n this.#handleSdkResponse(sdkResp);\n this.flowState.update({\n token: undefined,\n code: undefined,\n exchangeError: undefined,\n }); // should happen after handleSdkResponse, otherwise we will not have screen id on the next run\n return;\n }\n\n const samlProps = [\n 'samlIdpResponseUrl',\n 'samlIdpResponseSamlResponse',\n 'samlIdpResponseRelayState',\n ];\n if (\n action === RESPONSE_ACTIONS.loadForm &&\n samlProps.some((samlProp) => isChanged(samlProp))\n ) {\n if (!samlIdpResponseUrl || !samlIdpResponseSamlResponse) {\n this.loggerWrapper.error('Did not get saml idp params data to load');\n return;\n }\n\n // Handle SAML IDP end of flow (\"redirect like\" by using html form with hidden params)\n injectSamlIdpForm(\n samlIdpResponseUrl,\n samlIdpResponseSamlResponse,\n samlIdpResponseRelayState || '',\n submitForm,\n ); // will redirect us to the saml acs url\n }\n\n if (\n action === RESPONSE_ACTIONS.redirect &&\n (isChanged('redirectTo') || isChanged('deferredRedirect'))\n ) {\n if (!redirectTo) {\n this.loggerWrapper.error('Did not get redirect url');\n return;\n }\n if (redirectTo === 'no-op') {\n // this is part of the state update mechanism that allows multiple clicks\n // on the same button on mobile devices\n return;\n }\n if (redirectAuthInitiator === 'android' && document.hidden) {\n // on android native flows, defer redirects until in foreground\n this.flowState.update({\n deferredRedirect: true,\n });\n return;\n }\n\n this.loggerWrapper.debug(`Redirect is popup ${redirectIsPopup}`);\n if (redirectIsPopup) {\n // this width is below the breakpoint of most providers\n this.loggerWrapper.debug('Opening redirect in popup');\n const popup = openCenteredPopup(redirectTo, '?', 598, 700);\n const usePostMessageFallback = this.shouldUsePopupPostMessage();\n // mark popup so sending side knows to use postMessage and what origin to send to\n if (usePostMessageFallback) {\n popup.name = `descope-wc|${window.location.origin}`;\n }\n this.loggerWrapper.debug(\n `Popup communication method: ${\n usePostMessageFallback ? 'postMessage' : 'BroadcastChannel'\n }`,\n );\n\n const onPostMessage = (event: MessageEvent) => {\n this.loggerWrapper.debug(\n 'Received popup message',\n JSON.stringify(event.data),\n );\n const expectedOrigin = usePostMessageFallback\n ? this.popupOrigin\n : window.location.origin;\n\n if (event.origin !== expectedOrigin) {\n this.loggerWrapper.debug(\n `Ignoring message from unexpected origin. received: \"${event.origin}\", expected: \"${expectedOrigin}\"`,\n );\n return;\n }\n\n const { action: popupAction, data } = event.data || {};\n if (popupAction === 'code') {\n this.flowState.update({\n code: data.code,\n exchangeError: data.exchangeError,\n });\n }\n };\n\n let cleanup: () => void;\n\n this.loggerWrapper.debug('Starting popup closed detection');\n const intervalId = setInterval(() => {\n if (popup.closed) {\n this.loggerWrapper.debug(\n 'Popup closed, dispatching popupclosed event',\n );\n clearInterval(intervalId);\n this.#dispatch('popupclosed', {});\n\n this.loggerWrapper.debug('Cleaning up popup listeners');\n cleanup?.();\n }\n }, 1000);\n\n if (usePostMessageFallback) {\n window.addEventListener('message', onPostMessage);\n cleanup = () => {\n this.loggerWrapper.debug('Cleaning up popup postMessage listener');\n window.removeEventListener('message', onPostMessage);\n };\n } else {\n this.loggerWrapper.debug('Creating broadcast channel');\n const channel = new BroadcastChannel(executionId);\n channel.onmessage = onPostMessage;\n cleanup = () => {\n this.loggerWrapper.debug('Closing channel');\n channel.close();\n };\n }\n } else {\n this.handleRedirect(redirectTo);\n // on web we should not get here as when a redirect is performed the contents of the page immediately change,\n // but on mobile, there is usually no redirect in place, instead the url is opened in a new browser tab\n // while the flow continues to run inside a webview.\n // so we need to reset the loading state of the components, otherwise, they'll be stuck in loading state\n // and become unclickable, and we need to reset the flow state to allow the user to click the button more than once\n // otherwise consecutive next response will not cause any change to the state and thus will not be handled\n this.flowState.update({ redirectTo: 'no-op' });\n this.#dispatch('popupclosed', {});\n }\n return;\n }\n\n if (\n action === RESPONSE_ACTIONS.webauthnCreate ||\n action === RESPONSE_ACTIONS.webauthnGet\n ) {\n if (!webauthnTransactionId || !webauthnOptions) {\n this.loggerWrapper.error(\n 'Did not get webauthn transaction id or options',\n );\n return;\n }\n\n this.#conditionalUiAbortController?.abort();\n this.#conditionalUiAbortController = null;\n\n let response: string;\n let failure: string;\n\n try {\n response =\n action === RESPONSE_ACTIONS.webauthnCreate\n ? await this.sdk.webauthn.helpers.create(webauthnOptions)\n : await this.sdk.webauthn.helpers.get(webauthnOptions);\n } catch (e) {\n if (e.name === 'InvalidStateError') {\n // currently returned in Chrome when trying to register a WebAuthn device\n // that's already registered for the user\n this.loggerWrapper.warn('WebAuthn operation failed', e.message);\n } else if (e.name !== 'NotAllowedError') {\n // shouldn't happen in normal usage ('AbortError' is only when setting an AbortController)\n this.loggerWrapper.error(e.message);\n }\n failure = e.name;\n }\n // Call next with the transactionId and the response or failure\n const sdkResp = await this.sdk.flow.next(\n executionId,\n stepId,\n CUSTOM_INTERACTIONS.submit,\n flowConfig.version,\n projectConfig.componentsVersion,\n {\n transactionId: webauthnTransactionId,\n response,\n failure,\n },\n );\n this.#handleSdkResponse(sdkResp);\n }\n\n if (action === RESPONSE_ACTIONS.nativeBridge) {\n // prepare a callback with the current flow state, and accept\n // the input to be a JSON, passed down from the native layer.\n // this function will be called as an async response to a 'bridge' event\n this.nativeCallbacks.complete = async (input: Record<string, any>) => {\n const sdkResp = await this.sdk.flow.next(\n executionId,\n stepId,\n CUSTOM_INTERACTIONS.submit,\n flowConfig.version,\n projectConfig.componentsVersion,\n input,\n );\n this.#handleSdkResponse(sdkResp);\n };\n // notify the bridging native layer that a native action is requested via 'bridge' event.\n // the response will be in the form of calling the 'nativeCallbacks.complete' callback via\n // the 'nativeResume' function.\n this.#nativeNotifyBridge(nativeResponseType, nativePayload);\n return;\n }\n\n if (isChanged('action')) {\n this.#handlePollingResponse(\n executionId,\n stepId,\n flowConfig.version,\n projectConfig.componentsVersion,\n );\n }\n\n // if there is no screen id (possibly due to page refresh or no screen flow) we should get it from the server\n if (!screenId && !startScreenId) {\n this.loggerWrapper.warn('No screen was found to show');\n return;\n }\n\n const readyScreenId = startScreenId || screenId;\n\n // get the right filename according to the user locale and flow target locales\n const filenameWithLocale: string = await this.getHtmlFilenameWithLocale(\n locale,\n readyScreenId,\n );\n\n const {\n oidcLoginHint,\n oidcPrompt,\n oidcErrorRedirectUri,\n oidcResource,\n samlIdpUsername,\n } = ssoQueryParams;\n\n // generate step state update data\n const stepStateUpdate: Partial<StepState> = {\n direction: getAnimationDirection(stepId, prevState.stepId),\n screenState: {\n ...screenState,\n form: {\n ...this.formConfigValues,\n ...screenState?.form,\n },\n lastAuth: {\n loginId,\n name: this.sdk.getLastUserDisplayName() || loginId,\n },\n componentsConfig: {\n ...flowConfig.componentsConfig,\n ...conditionComponentsConfig,\n ...screenState?.componentsConfig,\n },\n },\n htmlFilename: `${readyScreenId}.html`,\n htmlLocaleFilename: filenameWithLocale,\n screenId: readyScreenId,\n stepName: currentState.stepName || startScreenName,\n samlIdpUsername,\n oidcLoginHint,\n oidcPrompt,\n oidcErrorRedirectUri,\n oidcResource,\n action,\n };\n\n const lastAuth = getLastAuth(loginId);\n\n // If there is a start screen id, next action should start the flow\n // But if any of the sso params are not empty, this optimization doesn't happen\n // because Descope may decide not to show the first screen (in cases like a user is already logged in) - this is more relevant for SSO scenarios\n if (showFirstScreenOnExecutionInit(startScreenId, ssoQueryParams)) {\n stepStateUpdate.next = async (interactionId, inputs) => {\n const screenScripts = flowConfig?.clientScripts || [];\n await this.#runSdkScriptsModules(screenScripts);\n\n const res = await this.sdk.flow.start(\n flowId,\n {\n tenant,\n redirectAuth,\n ...ssoQueryParams,\n lastAuth,\n preview: this.preview,\n abTestingKey,\n client: this.client,\n ...(redirectUrl && { redirectUrl }),\n locale: getUserLocale(locale).locale,\n nativeOptions,\n outboundAppId,\n outboundAppScopes,\n },\n conditionInteractionId,\n interactionId,\n projectConfig.componentsVersion,\n flowVersions,\n {\n ...this.formConfigValues,\n ...this.getComponentsContext(),\n ...transformScreenInputs(inputs),\n ...(code && { exchangeCode: code, idpInitiated: true }),\n ...(ssoQueryParams.descopeIdpInitiated && { idpInitiated: true }),\n ...(token && { token }),\n },\n stepStateUpdate.next.isCustomScreen,\n );\n\n this.#handleSdkResponse(res);\n\n return res;\n };\n } else if (\n isChanged('projectId') ||\n isChanged('baseUrl') ||\n isChanged('executionId') ||\n isChanged('stepId')\n ) {\n stepStateUpdate.next = async (interactionId, input) => {\n const screenScripts = screenState?.clientScripts || [];\n await this.#runSdkScriptsModules(screenScripts);\n\n const res = await this.sdk.flow.next(\n executionId,\n stepId,\n interactionId,\n flowConfig.version,\n projectConfig.componentsVersion,\n {\n ...this.getComponentsContext(),\n ...transformScreenInputs(input),\n },\n stepStateUpdate.next.isCustomScreen,\n );\n\n this.#handleSdkResponse(res);\n\n return res;\n };\n }\n\n this.loggerWrapper.debug('Got a screen with id', stepStateUpdate.screenId);\n\n await this.#handleCustomScreen(stepStateUpdate);\n\n this.stepState.update(stepStateUpdate);\n }\n\n // this function is used to handle redirects in the web component\n // it can be overridden by the user to handle redirects in a custom way\n // eslint-disable-next-line class-methods-use-this\n handleRedirect = (redirectTo: string) => {\n window.location.assign(redirectTo);\n };\n\n #toggleScreenVisibility = (isCustomScreen: boolean) => {\n const toggleVisibility = () => {\n this.contentRootElement.classList.toggle('hidden', isCustomScreen);\n this.slotElement.classList.toggle('hidden', !isCustomScreen);\n if (isCustomScreen) {\n this.contentRootElement.innerHTML = '';\n }\n };\n\n if (isCustomScreen && this.contentRootElement.hasChildNodes()) {\n this.#handlePageSwitchTransition(toggleVisibility);\n } else {\n toggleVisibility();\n }\n };\n\n #handlePageSwitchTransition(onTransitionEnd: () => void) {\n const transitionEndHandler = () => {\n this.loggerWrapper.debug('page switch transition end');\n this.contentRootElement.classList.remove('fade-out');\n onTransitionEnd();\n };\n this.contentRootElement.addEventListener(\n 'transitionend',\n transitionEndHandler,\n { once: true },\n );\n this.loggerWrapper.debug('page switch transition start');\n this.contentRootElement.classList.add('fade-out');\n }\n\n #handlePollingResponse = (\n executionId: string,\n stepId: string,\n flowVersion: number,\n componentsVersion: string,\n rescheduled: boolean = false,\n ) => {\n const pollingDefaultDelay = 2000;\n const pollingDefaultTimeout = 6000;\n const pollingThrottleDelay = 500;\n const pollingThrottleThreshold = 500;\n const pollingThrottleTimeout = 1000;\n const stopOnErrors = [\n FLOW_TIMED_OUT_ERROR_CODE,\n POLLING_STATUS_NOT_FOUND_ERROR_CODE,\n ];\n\n if (this.flowState.current.action === RESPONSE_ACTIONS.poll) {\n // schedule next polling request for 2 seconds from now\n this.logger.debug('polling - Scheduling polling request');\n const scheduledAt = Date.now();\n const delay = rescheduled ? pollingThrottleDelay : pollingDefaultDelay;\n this.#pollingTimeout = setTimeout(async () => {\n this.logger.debug('polling - Calling next');\n\n const nextCall = this.sdk.flow.next(\n executionId,\n stepId,\n CUSTOM_INTERACTIONS.polling,\n flowVersion,\n componentsVersion,\n {},\n );\n\n // Try to detect whether the tab is being throttled when running in a mobile browser, specifically on iOS.\n // We check whether the tab seems to hidden and the polling callback was called much later than expected,\n // in which case we allow a much shorter timeout for the polling request. The reschedule check ensures\n // this cannot happen twice consecutively.\n const throttled =\n document.hidden &&\n !rescheduled &&\n Date.now() - scheduledAt > delay + pollingThrottleThreshold;\n if (throttled) {\n this.logger.debug('polling - The polling seems to be throttled');\n }\n\n let sdkResp: Awaited<typeof nextCall>;\n try {\n const timeout = throttled\n ? pollingThrottleTimeout\n : pollingDefaultTimeout;\n sdkResp = await timeoutPromise(timeout, nextCall);\n } catch (err) {\n this.logger.warn(\n `polling - The ${\n throttled ? 'throttled fetch' : 'fetch'\n } call timed out or was aborted`,\n );\n this.#handlePollingResponse(\n executionId,\n stepId,\n flowVersion,\n componentsVersion,\n throttled,\n );\n return;\n }\n\n if (sdkResp?.error?.errorCode === FETCH_EXCEPTION_ERROR_CODE) {\n this.logger.debug(\n 'polling - Got a generic error due to exception in fetch call',\n );\n this.#handlePollingResponse(\n executionId,\n stepId,\n flowVersion,\n componentsVersion,\n );\n return;\n }\n\n this.logger.debug('polling - Got a response');\n if (sdkResp?.error) {\n this.logger.debug(\n 'polling - Response has an error',\n JSON.stringify(sdkResp.error, null, 4),\n );\n }\n\n // we want to stop polling for some errors\n if (\n !sdkResp?.error?.errorCode ||\n !stopOnErrors.includes(sdkResp.error.errorCode)\n ) {\n // will poll again if needed\n // handleSdkResponse will clear the timeout if the response action is not polling response\n this.#handlePollingResponse(\n executionId,\n stepId,\n flowVersion,\n componentsVersion,\n );\n } else {\n this.logger.debug('polling - Stopping polling due to error');\n }\n\n this.#handleSdkResponse(sdkResp);\n }, delay);\n }\n };\n\n #resetPollingTimeout = () => {\n clearTimeout(this.#pollingTimeout);\n this.#pollingTimeout = null;\n };\n\n #handleSdkResponse = (sdkResp: NextFnReturnPromiseValue) => {\n if (!sdkResp?.ok) {\n const defaultMessage = sdkResp?.response?.url;\n const defaultDescription = `${sdkResp?.response?.status} - ${sdkResp?.response?.statusText}`;\n\n this.#dispatch(\n 'error',\n sdkResp?.error || {\n errorCode: FETCH_ERROR_RESPONSE_ERROR_CODE,\n errorDescription: defaultDescription,\n errorMessage: defaultMessage,\n },\n );\n\n this.loggerWrapper.error(\n sdkResp?.error?.errorDescription || defaultMessage,\n sdkResp?.error?.errorMessage || defaultDescription,\n );\n\n const errorCode = sdkResp?.error?.errorCode;\n if (\n (errorCode === FLOW_REQUESTED_IS_IN_OLD_VERSION_ERROR_CODE ||\n errorCode === FLOW_TIMED_OUT_ERROR_CODE) &&\n this.isRestartOnError\n ) {\n this.#handleFlowRestart();\n }\n return;\n }\n\n sdkResp.data?.runnerLogs?.forEach((l) => {\n const { level, title, log } = l;\n if (level && this.loggerWrapper[level]) {\n this.loggerWrapper[level](title, log);\n } else {\n this.loggerWrapper.info(title, log);\n }\n });\n const errorText = sdkResp.data?.screen?.state?.errorText;\n if (sdkResp.data?.error) {\n this.loggerWrapper.error(\n `[${sdkResp.data.error.code}]: ${sdkResp.data.error.description}`,\n `${errorText ? `${errorText} - ` : ''}${sdkResp.data.error.message}`,\n );\n } else if (errorText) {\n this.loggerWrapper.error(errorText);\n }\n\n const { status, authInfo, lastAuth, action, openInNewTabUrl } =\n sdkResp.data;\n\n if (action !== RESPONSE_ACTIONS.poll) {\n this.#resetPollingTimeout();\n }\n\n if (status === 'completed') {\n if (this.storeLastAuthenticatedUser) {\n setLastAuth(lastAuth);\n }\n const payload: FlowJWTResponse = { ...authInfo };\n // add flow output onto the jwt response itself, as opposed to changed the response object,\n // to avoid breaking existing functionality\n if (sdkResp.data.output && Object.keys(sdkResp.data.output).length > 0) {\n payload.flowOutput = sdkResp.data.output;\n }\n this.#dispatch('success', payload);\n return;\n }\n\n if (this.storeLastAuthenticatedUser) {\n setLastAuth(lastAuth, true);\n }\n\n if (openInNewTabUrl) {\n window.open(openInNewTabUrl, '_blank');\n // we should not return here so the screen will be rendered\n }\n\n const {\n executionId,\n stepId,\n stepName,\n screen,\n redirect,\n webauthn,\n error,\n samlIdpResponse,\n nativeResponse,\n } = sdkResp.data;\n\n // this is used as a cache buster\n // we want to make sure the onScreenUpdate will be called after every next call even if the state was not changed\n const reqTimestamp = Date.now();\n\n if (action === RESPONSE_ACTIONS.poll) {\n // We only update action because the polling response action does not return extra information\n this.flowState.update({\n action,\n reqTimestamp,\n });\n return;\n }\n\n this.loggerWrapper.info(\n `Step \"${stepName || `#${stepId}`}\" is ${status}`,\n '',\n {\n screen,\n status,\n stepId,\n stepName,\n action,\n error,\n },\n );\n\n if (screen.state?.clientScripts) {\n this.#sdkScriptsLoading = this.loadSdkScripts(screen.state.clientScripts);\n }\n\n this.flowState.update({\n stepId,\n stepName,\n executionId,\n action,\n redirectTo: redirect?.url,\n redirectIsPopup: redirect?.isPopup,\n screenId: screen?.id,\n screenState: screen?.state,\n webauthnTransactionId: webauthn?.transactionId,\n webauthnOptions: webauthn?.options,\n samlIdpResponseUrl: samlIdpResponse?.url,\n samlIdpResponseSamlResponse: samlIdpResponse?.samlResponse,\n samlIdpResponseRelayState: samlIdpResponse?.relayState,\n nativeResponseType: nativeResponse?.type,\n nativePayload: nativeResponse?.payload,\n reqTimestamp,\n });\n };\n\n // we want to get the start params only if we don't have it already\n #getWebauthnConditionalUiStartParams = withMemCache(async () => {\n try {\n const startResp = await this.sdk.webauthn.signIn.start(\n '',\n window.location.origin,\n ); // when using conditional UI we need to call start without identifier\n if (!startResp.ok) {\n this.loggerWrapper.warn(\n 'Webauthn start failed',\n startResp?.error?.errorMessage,\n );\n }\n return startResp.data;\n } catch (err) {\n this.loggerWrapper.warn('Webauthn start failed', err.message);\n }\n\n return undefined;\n });\n\n /**\n * this is needed because Conditional UI does not work on all input names\n * we need to add a prefix to the input name so it will trigger the autocomplete dialog\n * but we want to remove it once the user starts typing because we want this field to be sent to the server with the correct name\n */\n\n // eslint-disable-next-line class-methods-use-this\n #handleConditionalUiInput(inputEle: HTMLInputElement) {\n const ignoreList = ['email'];\n const origName = inputEle.getAttribute('name');\n\n if (!ignoreList.includes(origName)) {\n const conditionalUiSupportName = `user-${origName}`;\n\n // eslint-disable-next-line no-param-reassign\n inputEle.setAttribute('name', conditionalUiSupportName);\n\n inputEle.addEventListener('input', () => {\n // eslint-disable-next-line no-param-reassign\n inputEle.setAttribute(\n 'name',\n inputEle.value ? origName : conditionalUiSupportName,\n );\n });\n }\n }\n\n async #handleWebauthnConditionalUi(fragment: DocumentFragment, next: NextFn) {\n this.#conditionalUiAbortController?.abort();\n\n const conditionalUiInput = fragment.querySelector(\n '*[autocomplete=\"webauthn\"]',\n ) as HTMLInputElement;\n\n if (conditionalUiInput && (await isConditionalLoginSupported())) {\n const { options, transactionId } =\n (await this.#getWebauthnConditionalUiStartParams()) || {};\n\n if (options && transactionId) {\n this.#handleConditionalUiInput(conditionalUiInput);\n\n // we need the abort controller so we can cancel the current webauthn session in case the user clicked on a webauthn button, and we need to start a new session\n this.#conditionalUiAbortController = new AbortController();\n\n // we should not wait for this fn, it will call next when the user uses his passkey on the input\n this.sdk.webauthn.helpers\n .conditional(options, this.#conditionalUiAbortController)\n .then(async (response) => {\n next(conditionalUiInput.id, {\n transactionId,\n response,\n });\n })\n .catch((err) => {\n if (err.name !== 'AbortError') {\n this.loggerWrapper.error('Conditional login failed', err.message);\n }\n });\n }\n }\n }\n\n #dispatchPageEvents({\n isFirstScreen,\n isCustomScreen,\n stepName,\n }: {\n isFirstScreen: boolean;\n isCustomScreen: boolean;\n stepName: string;\n }) {\n if (isFirstScreen) {\n // Dispatch when the first page is ready\n // So user can show a loader until his event is triggered\n this.#dispatch('ready', {});\n }\n\n if (!isCustomScreen) {\n this.#nativeAfterScreen(stepName);\n }\n\n this.#dispatch('page-updated', { screenName: stepName });\n this.#dispatch('screen-updated', { screenName: stepName });\n }\n\n async onStepChange(currentState: StepState, prevState: StepState) {\n const { htmlFilename, htmlLocaleFilename, direction, next, screenState } =\n currentState;\n\n this.loggerWrapper.debug('Rendering a flow screen');\n\n const stepTemplate = document.createElement('template');\n stepTemplate.innerHTML = await this.getPageContent(\n htmlFilename,\n htmlLocaleFilename,\n );\n\n const clone = stepTemplate.content.cloneNode(true) as DocumentFragment;\n\n const loadDescopeUiComponents = this.loadDescopeUiComponents(stepTemplate);\n\n // we want to disable the webauthn buttons if it's not supported on the browser\n if (!this.sdk.webauthn.helpers.isSupported()) {\n disableWebauthnButtons(clone);\n } else {\n await this.#handleWebauthnConditionalUi(clone, next);\n }\n\n if (\n currentState.samlIdpUsername &&\n !screenState.form?.loginId &&\n !screenState.form?.email\n ) {\n if (!screenState.form) {\n screenState.form = {};\n }\n screenState.form.loginId = currentState.samlIdpUsername;\n screenState.form.email = currentState.samlIdpUsername;\n }\n\n updateTemplateFromScreenState(\n clone,\n screenState,\n this.formConfig,\n this.loggerWrapper,\n );\n\n // set the default country code based on the locale value we got\n const { geo } = await this.getExecutionContext();\n setPhoneAutoDetectDefaultCode(clone, geo);\n\n const injectNextPage = async () => {\n await loadDescopeUiComponents;\n\n // put the totp and notp variable on the root element, which is the top level 'div' inside the shadowRoot\n const rootElement = this.contentRootElement;\n setTOTPVariable(rootElement, screenState?.totp?.image);\n\n setNOTPVariable(rootElement, screenState?.notp?.image);\n\n // set dynamic css variables that should be set at runtime\n setCssVars(rootElement, clone, screenState.cssVars, this.loggerWrapper);\n\n rootElement.replaceChildren(clone);\n\n // If before html url was empty, we deduce its the first time a screen is shown\n const isFirstScreen = !prevState.htmlFilename;\n\n // we need to wait for all components to render before we can set its value\n setTimeout(() => {\n this.#updateExternalInputs();\n\n if (this.validateOnBlur) {\n handleReportValidityOnBlur(rootElement);\n }\n\n // we need to wait for all components to render before we can set its value\n updateScreenFromScreenState(rootElement, screenState);\n\n this.#dispatchPageEvents({\n isFirstScreen,\n isCustomScreen: false,\n stepName: currentState.stepName,\n });\n\n handleAutoFocus(rootElement, this.autoFocus, isFirstScreen);\n });\n\n this.#hydrate(next);\n\n const loader = rootElement.querySelector(\n `[${ELEMENT_TYPE_ATTRIBUTE}=\"polling\"]`,\n );\n if (loader) {\n // Loader component in the screen triggers polling interaction\n next(CUSTOM_INTERACTIONS.polling, {});\n }\n };\n\n // no animation\n if (!direction) {\n injectNextPage();\n return;\n }\n\n this.#handlePageSwitchTransition(injectNextPage);\n }\n\n #validateInputs() {\n let isValid = true;\n Array.from(this.shadowRoot.querySelectorAll('*[name]'))\n .reverse()\n .forEach((input: HTMLInputElement) => {\n // We are hiding conditional components so we don't want to validate them\n if (input.localName === 'slot' || input.classList.contains('hidden')) {\n return;\n }\n input.reportValidity?.();\n if (isValid) {\n isValid = input.checkValidity?.();\n }\n });\n\n return isValid;\n }\n\n getInputs() {\n return Array.from(\n this.shadowRoot.querySelectorAll(\n `*:not(slot)[name]:not([${DESCOPE_ATTRIBUTE_EXCLUDE_FIELD}])`,\n ),\n ) as HTMLInputElement[];\n }\n\n async #getFormData() {\n const inputs = this.getInputs();\n\n // wait for all inputs\n const values = await Promise.all(\n inputs.map(async (input) => ({\n name: input.getAttribute('name'),\n value: input.value,\n })),\n );\n\n // reduce to object\n return values.reduce(\n (acc, val) => ({\n ...acc,\n [val.name]: val.value,\n }),\n {},\n );\n }\n\n #prevPageShowListener: ((e: PageTransitionEvent) => void) | null = null;\n\n #handleComponentsLoadingState(submitter: HTMLElement) {\n const enabledElements = Array.from(\n this.contentRootElement.querySelectorAll(\n ':not([disabled]), [disabled=\"false\"]',\n ),\n ).filter((ele) => ele !== submitter);\n\n const restoreComponentsState = async () => {\n this.loggerWrapper.debug('Restoring components state');\n this.removeEventListener('popupclosed', restoreComponentsState);\n submitter.removeAttribute('loading');\n enabledElements.forEach((ele) => {\n ele.removeAttribute('disabled');\n });\n // if there are client scripts, we want to reload them\n const flowConfig = await this.getFlowConfig();\n const clientScripts = [\n ...(flowConfig.clientScripts || []),\n ...(flowConfig.sdkScripts || []),\n ];\n this.loadSdkScripts(clientScripts);\n };\n\n const handleScreenIdUpdates = () => {\n // we want to remove the previous pageshow listener to avoid multiple listeners\n window.removeEventListener('pageshow', this.#prevPageShowListener);\n\n this.#prevPageShowListener = (e) => {\n if (e.persisted) {\n this.logger.debug(\n 'Page was loaded from cache, restoring components state',\n );\n restoreComponentsState();\n }\n };\n // we want to restore the components state when the page is shown from cache\n window.addEventListener('pageshow', this.#prevPageShowListener, {\n once: true,\n });\n\n // we want to restore the components state when the screenId is updated\n const unsubscribeScreenIdUpdates = this.stepState?.subscribe(\n (screenId, prevScreenId) => {\n // we want to restore components state only if we stay on the same screen\n // if we are rendering a new screen, the components state (disabled/loading) will remain until the new screen is rendered\n if (screenId === prevScreenId) {\n restoreComponentsState();\n }\n this.removeEventListener('popupclosed', restoreComponentsState);\n this.stepState.unsubscribe(unsubscribeScreenIdUpdates);\n },\n (state) => state.screenId,\n { forceUpdate: true },\n );\n };\n\n // we are listening to the next request status\n const unsubscribeNextRequestStatus = this.nextRequestStatus.subscribe(\n ({ isLoading }) => {\n if (isLoading) {\n this.addEventListener('popupclosed', restoreComponentsState, {\n once: true,\n });\n // if the next request is loading, we want to set loading state on the submitter, and disable all other enabled elements\n submitter.setAttribute('loading', 'true');\n enabledElements.forEach((ele) =>\n ele.setAttribute('disabled', 'true'),\n );\n } else {\n this.nextRequestStatus.unsubscribe(unsubscribeNextRequestStatus);\n // when next request is done, we want to listen to screenId updates\n handleScreenIdUpdates();\n }\n },\n );\n }\n\n // handle storing passwords in password managers\n #handleStoreCredentials(formData = {}) {\n const idFields = ['externalId', 'email', 'phone'];\n const passwordFields = ['newPassword', 'password'];\n\n const id = getFirstNonEmptyValue(formData, idFields);\n const password = getFirstNonEmptyValue(formData, passwordFields);\n\n // PasswordCredential not supported in Firefox\n if (id && password) {\n try {\n if (!globalThis.PasswordCredential) {\n return;\n }\n const cred = new globalThis.PasswordCredential({ id, password });\n\n navigator?.credentials?.store?.(cred);\n } catch (e) {\n this.loggerWrapper.error('Could not store credentials', e.message);\n }\n }\n }\n\n #updateExternalInputs() {\n // we need to clear external inputs that were created previously, so each screen has only\n // the slotted inputs it needs\n clearPreviousExternalInputs();\n\n const eles = this.contentRootElement.querySelectorAll(\n '[external-input=\"true\"]',\n );\n eles.forEach((ele) => this.#handleExternalInputs(ele));\n }\n\n #handleExternalInputs(ele: Element) {\n if (!ele) {\n return;\n }\n\n const origInputs = ele.querySelectorAll('input');\n\n origInputs.forEach((inp) => {\n const targetSlot = inp.getAttribute('slot');\n const id = `input-${ele.id}-${targetSlot}`;\n\n const slot = document.createElement('slot');\n slot.setAttribute('name', id);\n slot.setAttribute('slot', targetSlot);\n\n ele.appendChild(slot);\n\n inp.setAttribute('slot', id);\n this.appendChild(inp);\n });\n }\n\n // we are wrapping this function with a leading debounce,\n // to prevent a scenario where we are calling it multiple times\n // this can caused by focusing on a button and pressing enter\n // in this case, the button will be clicked, but because we have the auto-submit mechanism\n // it will submit the form once again and we will end up with 2 identical calls for next\n #handleSubmit = leadingDebounce(\n async (submitter: HTMLElement, next: NextFn) => {\n if (\n submitter.getAttribute('formnovalidate') === 'true' ||\n this.#validateInputs()\n ) {\n const submitterId = submitter?.getAttribute('id');\n this.#handleComponentsLoadingState(submitter);\n\n const formData = await this.#getFormData();\n const eleDescopeAttrs = getElementDescopeAttributes(submitter);\n\n this.nextRequestStatus.update({ isLoading: true });\n\n const actionArgs = {\n ...eleDescopeAttrs,\n ...formData,\n // 'origin' is required to start webauthn. For now we'll add it to every request.\n // When running in a native flow in a Android app the webauthn authentication\n // is performed in the native app, so a custom origin needs to be injected\n // into the webauthn request data.\n origin: this.nativeOptions?.origin || window.location.origin,\n };\n\n await next(submitterId, actionArgs);\n\n this.nextRequestStatus.update({ isLoading: false });\n\n this.#handleStoreCredentials(formData);\n }\n },\n );\n\n async #runSdkScriptsModules(screenScripts: ClientScript[]) {\n // ensure scripts are already loaded and if not, wait on the promise to get notified once loading completes\n if (this.#sdkScriptsLoading) {\n this.loggerWrapper.debug('Waiting for sdk scripts to load');\n const now = Date.now();\n await this.#sdkScriptsLoading;\n this.loggerWrapper.debug(\n 'Sdk scripts loaded for',\n (Date.now() - now).toString(),\n );\n }\n\n // get all script modules and refresh them before form submission\n const sdkScriptsModules = this.loadSdkScriptsModules();\n\n // check which scripts are active on the current screen, this only affects the modules\n // for which present is implemented\n const screenScriptIds = screenScripts.map((s) => s.id);\n\n // eslint-disable-next-line no-restricted-syntax\n for (const module of sdkScriptsModules) {\n // only present modules that are part of the current screen\n if (!screenScriptIds.includes(module.id)) {\n continue; // eslint-disable-line no-continue\n }\n // only attempt to present modules that actually have a present function\n try {\n if (typeof module.present === 'function') {\n const completed = await module.present(); // eslint-disable-line no-await-in-loop\n if (!completed) {\n this.loggerWrapper.debug(`Sdk script ${module.id} was cancelled`);\n }\n }\n } catch (e) {\n // Ignore error and let the backend handle the lack of token\n this.loggerWrapper.error(\n `Failed to present ${module.id} script module`,\n e.message,\n );\n }\n }\n\n // Run all module refresh calls concurrently\n const promises: Promise<void>[] = [];\n\n // eslint-disable-next-line no-restricted-syntax\n for (const module of sdkScriptsModules) {\n // only attempt to refresh modules that actually have a refresh function\n if (typeof module.refresh === 'function') {\n promises.push(module.refresh());\n }\n }\n\n if (promises.length > 0) {\n try {\n // use timeout to prevent hanging if refresh takes too long\n await timeoutPromise(\n SDK_SCRIPTS_LOAD_TIMEOUT,\n Promise.all(promises),\n null,\n );\n } catch (e) {\n // ignore error and let the backend handle the lack of token\n this.loggerWrapper.error('Failed to refresh script module', e.message);\n }\n }\n }\n\n #addPasscodeAutoSubmitListeners(next: NextFn) {\n this.contentRootElement\n .querySelectorAll(`descope-passcode[data-auto-submit=\"true\"]`)\n .forEach((passcode: HTMLInputElement) => {\n passcode.addEventListener('input', () => {\n const isValid = passcode.checkValidity?.();\n if (isValid) {\n this.#handleSubmit(passcode, next);\n }\n });\n });\n }\n\n #hydrate(next: NextFn) {\n // hydrating the page\n // Adding event listeners to all buttons without the exclude attribute\n this.contentRootElement\n .querySelectorAll(\n `descope-button:not([${DESCOPE_ATTRIBUTE_EXCLUDE_NEXT_BUTTON}]), [data-type=\"button\"]:not([${DESCOPE_ATTRIBUTE_EXCLUDE_NEXT_BUTTON}]`,\n )\n .forEach((button: HTMLButtonElement) => {\n // eslint-disable-next-line no-param-reassign\n button.onclick = () => {\n this.#handleSubmit(button, next);\n };\n });\n\n this.#addPasscodeAutoSubmitListeners(next);\n\n if (this.isDismissScreenErrorOnInput) {\n // listen to all input events in order to clear the global error state\n this.contentRootElement\n .querySelectorAll(`*[name]:not([${DESCOPE_ATTRIBUTE_EXCLUDE_FIELD}])`)\n .forEach((ele) => {\n ele.addEventListener('input', () => {\n this.stepState.update((state) => ({\n ...state,\n screenState: {\n ...state.screenState,\n errorText: '',\n errorType: '',\n },\n }));\n });\n });\n }\n }\n\n #dispatch(eventName: string, detail: any) {\n this.dispatchEvent(new CustomEvent(eventName, { detail }));\n }\n\n // Determine if we should use postMessage fallback (popup-origin attribute exists)\n protected shouldUsePopupPostMessage(): boolean {\n if (!this.popupOrigin) return false;\n try {\n // validate origin format\n // eslint-disable-next-line no-new\n new URL(this.popupOrigin);\n } catch {\n return false; // malformed origin -> ignore\n }\n return true;\n }\n\n // Notify opener with code/exchangeError using either BroadcastChannel or postMessage fallback\n #notifyOpener(executionId: string, code: string, exchangeError: string) {\n const [prefix, openerOrigin] = window.name?.split('|') || [];\n const usePostMessageFallback = prefix === 'descope-wc' && openerOrigin;\n\n const message = { data: { code, exchangeError }, action: 'code' };\n\n // PostMessage fallback path (for cross-origin popups)\n if (usePostMessageFallback) {\n this.loggerWrapper.debug(\n 'Using postMessage fallback to notify opener in origin',\n openerOrigin,\n );\n try {\n window.opener.postMessage(message, openerOrigin);\n } catch (err) {\n this.loggerWrapper.error(\n 'Failed to send postMessage fallback (likely COOP isolation)',\n (err as any)?.message,\n );\n // If blocked by COOP, we cannot communicate cross-origin; log & abort silently\n }\n } else {\n // BroadcastChannel path (original behavior)\n this.loggerWrapper.debug('Creating popup channel', executionId);\n const channel = new BroadcastChannel(executionId);\n channel.postMessage(message);\n channel.close();\n }\n\n try {\n window.close();\n } catch (_) {\n /* ignore */\n }\n }\n}\n\nexport default DescopeWc;\n"],"names":["document","hidden","setTimeout","this","flowState","update","deferredRedirect","_DescopeWc_nativeBeforeScreen","screen","context","next","_a","nativeOptions","bridgeVersion","Promise","resolve","nativeCallbacks","screenNext","screenResolve","__classPrivateFieldGet","_DescopeWc_instances","_DescopeWc_nativeNotifyBridge","call","type","payload","_DescopeWc_dispatch","_DescopeWc_handleGlobalErrors","errorText","errorType","updateGlobalError","transformedErrorText","errorTransformer","text","e","loggerWrapper","error","message","replaceElementMessage","contentRootElement","addEventListener","once","_DescopeWc_subscribeStepState","stepState","subscribe","onStepChange","bind","_b","screenState","_c","state","__rest","Object","assign","forceUpdate","_DescopeWc_handlePasscodeCleanup","querySelectorAll","forEach","passcodeEle","shadowRoot","input","value","handleAutoFocus","autoFocus","_DescopeWc_handleFlowRestart","debug","prevCompVersion","getComponentsVersion","reset","stepId","executionId","stepStateUpdate","current","stepName","transformStepStateForCustomScreen","isCustomScreen","Boolean","onScreenUpdate","isFirstScreen","htmlFilename","_DescopeWc_toggleScreenVisibility","_DescopeWc_isPrevCustomScreen","currentMode","prevMode","sort","__classPrivateFieldSet","unsubscribeAll","_DescopeWc_dispatchPageEvents","disableKeyPressHandler","handleKeyPress","onTransitionEnd","classList","remove","add","inputEle","origName","getAttribute","includes","conditionalUiSupportName","setAttribute","_DescopeWc_handleWebauthnConditionalUi","fragment","_DescopeWc_conditionalUiAbortController","abort","conditionalUiInput","querySelector","isConditionalLoginSupported","options","transactionId","_DescopeWc_handleConditionalUiInput","AbortController","sdk","webauthn","helpers","conditional","then","response","__awaiter","id","catch","err","name","_DescopeWc_nativeAfterScreen","screenName","_DescopeWc_validateInputs","isValid","Array","from","reverse","localName","contains","reportValidity","checkValidity","_DescopeWc_getFormData","inputs","getInputs","all","map","reduce","acc","val","submitter","enabledElements","filter","ele","restoreComponentsState","removeEventListener","removeAttribute","flowConfig","getFlowConfig","clientScripts","sdkScripts","loadSdkScripts","handleScreenIdUpdates","window","_DescopeWc_prevPageShowListener","persisted","logger","unsubscribeScreenIdUpdates","screenId","prevScreenId","unsubscribe","unsubscribeNextRequestStatus","nextRequestStatus","isLoading","_DescopeWc_handleStoreCredentials","formData","getFirstNonEmptyValue","password","globalThis","PasswordCredential","cred","navigator","credentials","store","_DescopeWc_updateExternalInputs","clearPreviousExternalInputs","inp","targetSlot","slot","createElement","appendChild","screenScripts","_DescopeWc_sdkScriptsLoading","now","Date","toString","sdkScriptsModules","loadSdkScriptsModules","screenScriptIds","s","module","present","promises","refresh","push","length","timeoutPromise","SDK_SCRIPTS_LOAD_TIMEOUT","passcode","DESCOPE_ATTRIBUTE_EXCLUDE_NEXT_BUTTON","button","onclick","_DescopeWc_addPasscodeAutoSubmitListeners","isDismissScreenErrorOnInput","DESCOPE_ATTRIBUTE_EXCLUDE_FIELD","eventName","detail","dispatchEvent","CustomEvent","_DescopeWc_notifyOpener","code","exchangeError","prefix","openerOrigin","split","data","action","opener","postMessage","channel","BroadcastChannel","close","_","BaseDescopeWc","sdkConfigOverrides","config","constructor","State","super","_DescopeWc_pollingTimeout","set","_DescopeWc_eventsCbRefs","visibilitychange","_DescopeWc_syncStateWithVisibility","handleRedirect","redirectTo","location","toggleVisibility","toggle","slotElement","innerHTML","hasChildNodes","_DescopeWc_handlePageSwitchTransition","_DescopeWc_handlePollingResponse","flowVersion","componentsVersion","rescheduled","stopOnErrors","FLOW_TIMED_OUT_ERROR_CODE","POLLING_STATUS_NOT_FOUND_ERROR_CODE","RESPONSE_ACTIONS","poll","scheduledAt","delay","nextCall","flow","CUSTOM_INTERACTIONS","polling","throttled","sdkResp","timeout","warn","errorCode","FETCH_EXCEPTION_ERROR_CODE","JSON","stringify","_DescopeWc_handleSdkResponse","_DescopeWc_resetPollingTimeout","clearTimeout","ok","defaultMessage","url","defaultDescription","status","statusText","FETCH_ERROR_RESPONSE_ERROR_CODE","errorDescription","errorMessage","_d","_e","_f","FLOW_REQUESTED_IS_IN_OLD_VERSION_ERROR_CODE","isRestartOnError","_h","_g","runnerLogs","l","level","title","log","info","_l","_k","_j","_m","description","authInfo","lastAuth","openInNewTabUrl","storeLastAuthenticatedUser","setLastAuth","output","keys","flowOutput","open","redirect","samlIdpResponse","nativeResponse","reqTimestamp","_o","redirectIsPopup","isPopup","webauthnTransactionId","webauthnOptions","samlIdpResponseUrl","samlIdpResponseSamlResponse","samlResponse","samlIdpResponseRelayState","relayState","nativeResponseType","nativePayload","_DescopeWc_getWebauthnConditionalUiStartParams","withMemCache","startResp","signIn","start","origin","_DescopeWc_handleSubmit","leadingDebounce","submitterId","_DescopeWc_handleComponentsLoadingState","eleDescopeAttrs","getElementDescopeAttributes","actionArgs","nativeResume","parse","exchangeCode","URL","searchParams","get","URL_CODE_PARAM_NAME","complete","idpInitiated","token","URL_TOKEN_PARAM_NAME","URL_RUN_IDS_PARAM_NAME","pop","undefined","override","interactionId","form","scriptElements","el","moduleRes","scripts","createScriptCallback","script","result","getScriptResultPath","resultKey","bubbles","composed","join","scriptElement","injectNpmLib","descope","reject","initArgs","baseUrl","ref","newScriptElement","stop","toPromise","race","init","descopeBridge","_init","lazyInit","isConnected","onFlowChange","_super","disconnectedCallback","getHtmlFilenameWithLocale","locale","filenameWithLocale","userLocale","getUserLocale","targetLocales","getTargetLocales","fallback","getPageContent","htmlLocaleFilename","body","fetchStaticResource","ex","currentState","prevState","isChanged","projectId","flowId","tenant","redirectUrl","redirectAuthCodeChallenge","redirectAuthCallbackUrl","redirectAuthBackupCallbackUri","redirectAuthInitiator","ssoQueryParams","startScreenId","startScreenName","conditionInteractionId","abTestingKey","getABTestingKey","outboundAppId","outboundAppScopes","loginId","getLastUserLoginId","projectConfig","getProjectConfig","flowVersions","entries","flows","key","version","redirectAuth","callbackUrl","codeChallenge","backupCallbackUri","platform","oauthProvider","oauthRedirect","magicLinkRedirect","ssoRedirect","conditionComponentsConfig","conditions","conditionScripts","componentsConfig","calculateConditions","getLastAuth","condition","calculateCondition","fingerprintEnabled","fingerprintKey","ensureFingerprintIds","clearFingerprintData","showFirstScreenOnExecutionInit","client","formConfigValues","descopeIdpInitiated","oidcLoginHint","externalId","isCodeChanged","isExchangeErrorChanged","submit","loadForm","some","samlProp","injectSamlIdpForm","submitForm","popup","openCenteredPopup","usePostMessageFallback","shouldUsePopupPostMessage","onPostMessage","event","expectedOrigin","popupOrigin","popupAction","cleanup","intervalId","setInterval","closed","clearInterval","onmessage","webauthnCreate","webauthnGet","failure","create","nativeBridge","readyScreenId","oidcPrompt","oidcErrorRedirectUri","oidcResource","samlIdpUsername","direction","getAnimationDirection","getLastUserDisplayName","_DescopeWc_runSdkScriptsModules","res","preview","getComponentsContext","transformScreenInputs","_DescopeWc_handleCustomScreen","stepTemplate","clone","content","cloneNode","loadDescopeUiComponents","isSupported","disableWebauthnButtons","email","updateTemplateFromScreenState","formConfig","geo","getExecutionContext","setPhoneAutoDetectDefaultCode","injectNextPage","rootElement","setTOTPVariable","totp","image","setNOTPVariable","notp","setCssVars","cssVars","replaceChildren","validateOnBlur","handleReportValidityOnBlur","updateScreenFromScreenState","_DescopeWc_hydrate","ELEMENT_TYPE_ATTRIBUTE"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DescopeWc.js","sources":["../../../src/lib/descope-wc/DescopeWc.ts"],"sourcesContent":["import {\n clearFingerprintData,\n ensureFingerprintIds,\n} from '@descope/web-js-sdk';\nimport {\n CUSTOM_INTERACTIONS,\n DESCOPE_ATTRIBUTE_EXCLUDE_FIELD,\n DESCOPE_ATTRIBUTE_EXCLUDE_NEXT_BUTTON,\n ELEMENT_TYPE_ATTRIBUTE,\n FETCH_ERROR_RESPONSE_ERROR_CODE,\n FETCH_EXCEPTION_ERROR_CODE,\n FLOW_REQUESTED_IS_IN_OLD_VERSION_ERROR_CODE,\n FLOW_TIMED_OUT_ERROR_CODE,\n POLLING_STATUS_NOT_FOUND_ERROR_CODE,\n RESPONSE_ACTIONS,\n SDK_SCRIPTS_LOAD_TIMEOUT,\n URL_CODE_PARAM_NAME,\n URL_RUN_IDS_PARAM_NAME,\n URL_TOKEN_PARAM_NAME,\n} from '../constants';\nimport {\n clearPreviousExternalInputs,\n getAnimationDirection,\n getElementDescopeAttributes,\n getFirstNonEmptyValue,\n getScriptResultPath,\n getUserLocale,\n handleAutoFocus,\n handleReportValidityOnBlur,\n injectSamlIdpForm,\n isConditionalLoginSupported,\n leadingDebounce,\n openCenteredPopup,\n setTOTPVariable,\n showFirstScreenOnExecutionInit,\n State,\n submitForm,\n timeoutPromise,\n transformScreenInputs,\n transformStepStateForCustomScreen,\n updateScreenFromScreenState,\n updateTemplateFromScreenState,\n withMemCache,\n} from '../helpers';\nimport { getABTestingKey } from '../helpers/abTestingKey';\nimport { calculateCondition, calculateConditions } from '../helpers/conditions';\nimport { getLastAuth, setLastAuth } from '../helpers/lastAuth';\nimport { IsChanged } from '../helpers/state';\nimport {\n disableWebauthnButtons,\n replaceElementMessage,\n setCssVars,\n setNOTPVariable,\n setPhoneAutoDetectDefaultCode,\n} from '../helpers/templates';\nimport {\n ClientScript,\n ComponentsConfig,\n CustomScreenState,\n FlowState,\n NextFn,\n NextFnReturnPromiseValue,\n ScriptElement,\n ScriptModule,\n SdkConfig,\n StepState,\n FlowJWTResponse,\n} from '../types';\nimport BaseDescopeWc from './BaseDescopeWc';\n\n// this class is responsible for WC flow execution\nclass DescopeWc extends BaseDescopeWc {\n errorTransformer:\n | ((error: { text: string; type: string }) => string)\n | undefined;\n\n static set sdkConfigOverrides(config: Partial<SdkConfig>) {\n BaseDescopeWc.sdkConfigOverrides = config;\n }\n\n static get sdkConfigOverrides() {\n return BaseDescopeWc.sdkConfigOverrides;\n }\n\n flowState: State<FlowState>;\n\n stepState = new State<StepState>({} as StepState);\n\n #pollingTimeout: NodeJS.Timeout;\n\n #conditionalUiAbortController = null;\n\n onScreenUpdate?: (\n screenName: string,\n context: CustomScreenState,\n next: StepState['next'],\n ref: typeof this,\n ) => boolean | Promise<boolean>;\n\n #sdkScriptsLoading = null;\n\n constructor() {\n const flowState = new State<FlowState>({\n deferredRedirect: false,\n } as FlowState);\n\n super(flowState.update.bind(flowState));\n\n this.flowState = flowState;\n }\n\n #eventsCbRefs = {\n visibilitychange: this.#syncStateWithVisibility.bind(this),\n };\n\n #syncStateWithVisibility() {\n if (!document.hidden) {\n // Defer the update a bit, it won't work otherwise\n setTimeout(() => {\n // Trigger state update that will redirect and pending deferred redirection\n this.flowState.update({ deferredRedirect: false });\n }, 300);\n }\n }\n\n // Native bridge version native / web syncing - change this when\n // a major change happens that requires some form of compatibility\n bridgeVersion = 2;\n\n // A collection of callbacks that are maintained as part of the web-component state\n // when it's connected to a native bridge.\n nativeCallbacks: {\n // This callback will be initialized once a 'nativeBridge' action is\n // received from a start or next request. It will then be called by\n // nativeResume if appropriate as part of handling some payload types.\n complete?: (input: Record<string, any>) => Promise<void>;\n\n // This callback is invoked when 'nativeResume' is called with a 'beforeScreen'\n // type, so the native bridge can resolve the async call to 'nativeBeforeScreen'\n // and tell the web-component whether it wants a custom screen or not.\n screenResolve?: (value: boolean) => void;\n\n // This callback it kept until 'nativeResume' is called with a 'resumeScreen'\n // type, so the native bridge can submit the result of a custom screen.\n screenNext?: StepState['next'];\n } = {};\n\n // Notifies the native bridge that we're about to show a new screen and lets it\n // override it by showing a native screen instead.\n async #nativeBeforeScreen(\n screen: string,\n context: CustomScreenState,\n next: StepState['next'],\n ): Promise<boolean> {\n if (this.nativeOptions?.bridgeVersion >= 2) {\n return new Promise<boolean>((resolve) => {\n this.nativeCallbacks.screenNext = next;\n this.nativeCallbacks.screenResolve = resolve;\n this.#nativeNotifyBridge('beforeScreen', { screen, context });\n });\n }\n return false;\n }\n\n // Notifies the native bridge that a screen has been shown.\n #nativeAfterScreen(screen: string) {\n if (this.nativeOptions?.bridgeVersion >= 2) {\n this.#nativeNotifyBridge('afterScreen', { screen });\n }\n }\n\n // This callback is called by the native layer to resume a flow\n // that's waiting for some external trigger, such as a magic link\n // redirect or native OAuth authentication.\n nativeResume(type: string, payload: string) {\n const response = JSON.parse(payload);\n if (type === 'oauthWeb' || type === 'sso') {\n let { exchangeCode } = response;\n if (!exchangeCode) {\n const url = new URL(response.url);\n exchangeCode = url.searchParams?.get(URL_CODE_PARAM_NAME);\n }\n this.nativeCallbacks.complete?.({\n exchangeCode,\n idpInitiated: true,\n });\n } else if (type === 'magicLink') {\n const url = new URL(response.url);\n const token = url.searchParams.get(URL_TOKEN_PARAM_NAME);\n const stepId = url.searchParams\n .get(URL_RUN_IDS_PARAM_NAME)\n .split('_')\n .pop();\n this.#resetPollingTimeout();\n // update the state along with cancelling out the action to abort the polling mechanism\n this.flowState.update({ token, stepId, action: undefined });\n } else if (type === 'beforeScreen') {\n const { screenResolve } = this.nativeCallbacks;\n this.nativeCallbacks.screenResolve = null;\n const { override } = response;\n if (!override) {\n this.nativeCallbacks.screenNext = null;\n }\n screenResolve?.(override);\n } else if (type === 'resumeScreen') {\n const { interactionId, form } = response;\n const { screenNext } = this.nativeCallbacks;\n this.nativeCallbacks.screenNext = null;\n screenNext?.(interactionId, form);\n } else {\n // expected: 'oauthNative', 'webauthnCreate', 'webauthnGet', 'failure'\n this.nativeCallbacks.complete?.(response);\n }\n }\n\n // Utility function for sending a generic message to the native bridge.\n #nativeNotifyBridge(type: string, payload: Record<string, any>) {\n this.#dispatch('bridge', {\n type,\n payload,\n });\n }\n\n // This object is set by the native layer to\n // inject native specific data into the 'flowState'.\n nativeOptions?: {\n platform: 'ios' | 'android';\n bridgeVersion: number;\n oauthProvider?: string;\n oauthRedirect?: string;\n magicLinkRedirect?: string;\n ssoRedirect?: string;\n origin?: string;\n };\n\n /**\n * Get all loaded SDK script modules from elements with data-script-id attribute\n * @returns Array of script modules that can be refreshed before form submission\n */\n loadSdkScriptsModules() {\n // Get all modules from the data-script-id elements\n const scriptElements = this.shadowRoot.querySelectorAll(\n 'div[data-script-id]',\n );\n\n // Filter out elements without moduleRes property\n return Array.from(scriptElements)\n .map((el) => (el as ScriptElement).moduleRes)\n .filter((module): module is ScriptModule => !!module);\n }\n\n loadSdkScripts(scripts: ClientScript[]) {\n if (!scripts?.length) {\n return null;\n }\n\n const createScriptCallback =\n (\n script: {\n id: string;\n resultKey?: string;\n },\n resolve: (value: any) => void,\n ) =>\n (result: string) => {\n this.dispatchEvent(\n // update the context with the result, under the `resultKey` key\n new CustomEvent('components-context', {\n detail: {\n // we store the result with script.id prefix to avoid conflicts with other scripts results\n // that may have the same key\n [getScriptResultPath(script.id, script.resultKey)]: result,\n },\n bubbles: true,\n composed: true,\n }),\n );\n resolve(script.id);\n };\n\n this.loggerWrapper.debug(\n `Preparing to load scripts: ${scripts.map((s) => s.id).join(', ')}`,\n );\n const promises = Promise.all(\n scripts?.map(async (script) => {\n const scriptElement = this.shadowRoot.querySelector(\n `[data-script-id=\"${script.id}\"]`,\n ) as ScriptElement;\n if (scriptElement) {\n this.loggerWrapper.debug('Script already loaded', script.id);\n const { moduleRes } = scriptElement;\n moduleRes?.start?.();\n return moduleRes;\n }\n await this.injectNpmLib(\n '@descope/flow-scripts',\n '1.0.13', // currently using a fixed version when loading scripts\n `dist/${script.id}.js`,\n );\n const module = globalThis.descope?.[script.id];\n return new Promise((resolve, reject) => {\n try {\n // call the module loading function\n const moduleRes = module(\n script.initArgs as any,\n { baseUrl: this.baseUrl, ref: this },\n createScriptCallback(script, resolve),\n this.loggerWrapper,\n );\n // some modules do not return a ScriptModule object\n if (moduleRes) {\n const newScriptElement = document.createElement(\n 'div',\n ) as ScriptElement;\n newScriptElement.setAttribute('data-script-id', script.id);\n newScriptElement.moduleRes = moduleRes;\n this.shadowRoot.appendChild(newScriptElement);\n this.nextRequestStatus.subscribe(() => {\n this.loggerWrapper.debug('Unloading script', script.id);\n moduleRes.stop?.();\n });\n }\n } catch (e) {\n reject(e);\n }\n });\n }),\n );\n\n const toPromise = new Promise((resolve) => {\n setTimeout(() => {\n this.loggerWrapper.warn('SDK scripts loading timeout');\n resolve(true);\n }, SDK_SCRIPTS_LOAD_TIMEOUT);\n });\n\n return Promise.race([promises, toPromise]);\n }\n\n get isDismissScreenErrorOnInput() {\n return this.getAttribute('dismiss-screen-error-on-input') === 'true';\n }\n\n #handleGlobalErrors({\n errorText,\n errorType,\n }: {\n errorText: string;\n errorType: string;\n }) {\n const updateGlobalError = () => {\n let transformedErrorText = errorText;\n try {\n transformedErrorText =\n this.errorTransformer?.({\n text: errorText,\n type: errorType,\n }) || errorText;\n } catch (e) {\n this.loggerWrapper.error('Error transforming error message', e.message);\n }\n replaceElementMessage(\n this.contentRootElement,\n 'error-message',\n transformedErrorText,\n );\n };\n\n // we do not know if the page is going to be updated or not,\n // so we are updating the error message component before and after the screen update\n this.addEventListener('screen-updated', updateGlobalError, { once: true });\n updateGlobalError();\n }\n\n init() {\n // when running in a webview (mobile SDK) we want to lazy init the component\n // so the mobile SDK will be able to register all the necessary callbacks\n // before the component will start loading the flow\n if (!(window as any).descopeBridge) {\n // eslint-disable-next-line no-underscore-dangle\n return this._init();\n }\n // eslint-disable-next-line no-underscore-dangle\n (this as any).lazyInit = this._init;\n return undefined;\n }\n\n #subscribeStepState() {\n this.stepState?.subscribe(\n this.onStepChange.bind(this),\n ({\n screenState: { errorText, errorType, ...screenState } = {},\n ...state\n }) => ({ ...state, screenState }),\n );\n\n this.stepState?.subscribe(\n this.#handleGlobalErrors.bind(this),\n (state) => ({\n errorText: state?.screenState?.errorText,\n errorType: state?.screenState?.errorType,\n }),\n { forceUpdate: true },\n );\n\n this.stepState?.subscribe(\n this.#handlePasscodeCleanup.bind(this),\n (state) => ({\n errorText: state?.screenState?.errorText,\n errorType: state?.screenState?.errorType,\n }),\n { forceUpdate: true },\n );\n }\n\n // because the screen does not re-render,\n // in case of an OTP code error, we want to clean the invalid code\n #handlePasscodeCleanup({ errorText, errorType }) {\n if (errorType || errorText) {\n this.contentRootElement\n .querySelectorAll('descope-passcode[data-auto-submit=\"true\"]')\n .forEach((passcodeEle: HTMLInputElement) => {\n // currently we do not have a way to reset the code value\n // so we are clearing the inputs\n passcodeEle.shadowRoot\n .querySelectorAll('descope-text-field[data-id]')\n .forEach((input: HTMLInputElement) => {\n // eslint-disable-next-line no-param-reassign\n input.value = '';\n });\n });\n\n // this should not be handled here, it's a workaround for focusing the code component on error\n // maybe it's about time to refactor this sdk\n handleAutoFocus(this.contentRootElement, this.autoFocus, false);\n }\n }\n\n // eslint-disable-next-line no-underscore-dangle\n async _init() {\n if (this.shadowRoot.isConnected) {\n this.flowState?.subscribe(this.onFlowChange.bind(this));\n this.#subscribeStepState();\n\n window.addEventListener(\n 'visibilitychange',\n this.#eventsCbRefs.visibilitychange,\n );\n }\n await super.init?.();\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n\n this.flowState.unsubscribeAll();\n this.stepState.unsubscribeAll();\n this.#resetPollingTimeout();\n this.#conditionalUiAbortController?.abort();\n this.#conditionalUiAbortController = null;\n\n window.removeEventListener(\n 'visibilitychange',\n this.#eventsCbRefs.visibilitychange,\n );\n }\n\n async getHtmlFilenameWithLocale(locale: string, screenId: string) {\n let filenameWithLocale: string;\n const userLocale = getUserLocale(locale); // use provided locals, otherwise use browser locale\n const targetLocales = await this.getTargetLocales();\n\n if (targetLocales.includes(userLocale.locale)) {\n filenameWithLocale = `${screenId}-${userLocale.locale}.html`;\n } else if (targetLocales.includes(userLocale.fallback)) {\n filenameWithLocale = `${screenId}-${userLocale.fallback}.html`;\n }\n return filenameWithLocale;\n }\n\n async getPageContent(htmlFilename: string, htmlLocaleFilename: string) {\n if (htmlLocaleFilename) {\n // try first locale url, if can't get for some reason, fallback to the original html url (the one without locale)\n try {\n const { body } = await this.fetchStaticResource(\n htmlLocaleFilename,\n 'text',\n );\n return body;\n } catch (ex) {\n this.loggerWrapper.error(\n `Failed to fetch flow page from ${htmlLocaleFilename}. Fallback to url ${htmlFilename}`,\n ex,\n );\n }\n }\n\n try {\n const { body } = await this.fetchStaticResource(htmlFilename, 'text');\n return body;\n } catch (ex) {\n this.loggerWrapper.error(`Failed to fetch flow page`, ex.message);\n }\n return null;\n }\n\n async #handleFlowRestart() {\n this.loggerWrapper.debug('Trying to restart the flow');\n const prevCompVersion = await this.getComponentsVersion();\n this.reset();\n const compVersion = await this.getComponentsVersion();\n\n if (prevCompVersion === compVersion) {\n this.loggerWrapper.debug(\n 'Components version was not changed, restarting flow',\n );\n this.flowState.update({\n stepId: null,\n executionId: null,\n });\n } else {\n this.loggerWrapper.error(\n 'Components version mismatch, please reload the page',\n );\n }\n }\n\n #isPrevCustomScreen = false;\n\n async #handleCustomScreen(stepStateUpdate: Partial<StepState>) {\n const { next, stepName, ...state } = {\n ...this.stepState.current,\n ...stepStateUpdate,\n };\n\n const context = transformStepStateForCustomScreen(state);\n\n // first check if we're running in a native bridge and the app wants a custom screen\n let isCustomScreen = await this.#nativeBeforeScreen(\n stepName,\n context,\n next,\n );\n if (!isCustomScreen) {\n // now check any custom callbacks that have been set on the component itself\n isCustomScreen = Boolean(\n await this.onScreenUpdate?.(stepName, context, next, this),\n );\n }\n\n const isFirstScreen = !this.stepState.current.htmlFilename;\n this.#toggleScreenVisibility(isCustomScreen);\n\n // Store the current custom screen state\n if (next) {\n next.isCustomScreen = isCustomScreen;\n }\n\n // if we switched from a custom screen to a regular screen or the other way around\n if (this.#isPrevCustomScreen !== isCustomScreen) {\n const [currentMode, prevMode] = ['flow', 'custom'].sort(() =>\n isCustomScreen ? -1 : 1,\n );\n this.loggerWrapper.debug(\n `Switching from ${prevMode} screen to ${currentMode} screen`,\n );\n\n this.#isPrevCustomScreen = isCustomScreen;\n\n if (isCustomScreen) {\n // we are unsubscribing all the listeners because we are going to render a custom screen\n // and we do not want that onStepChange will be called\n this.stepState.unsubscribeAll();\n } else {\n // we are subscribing to the step state again because we are going to render a regular screen\n this.#subscribeStepState();\n }\n }\n\n if (isCustomScreen) {\n this.loggerWrapper.debug('Showing a custom screen');\n this.#dispatchPageEvents({\n isFirstScreen,\n isCustomScreen,\n stepName: stepStateUpdate.stepName,\n });\n\n // disable key press handler\n this.disableKeyPressHandler();\n } else {\n // enable key press handler\n this.handleKeyPress();\n }\n\n this.stepState.forceUpdate = isCustomScreen;\n }\n\n async onFlowChange(\n currentState: FlowState,\n prevState: FlowState,\n isChanged: IsChanged<FlowState>,\n ) {\n const {\n projectId,\n flowId,\n tenant,\n stepId,\n executionId,\n action,\n screenId,\n screenState,\n redirectTo,\n redirectIsPopup,\n redirectUrl,\n token,\n code,\n isPopup,\n exchangeError,\n webauthnTransactionId,\n webauthnOptions,\n redirectAuthCodeChallenge,\n redirectAuthCallbackUrl,\n redirectAuthBackupCallbackUri,\n redirectAuthInitiator,\n locale,\n samlIdpResponseUrl,\n samlIdpResponseSamlResponse,\n samlIdpResponseRelayState,\n nativeResponseType,\n nativePayload,\n reqTimestamp,\n ...ssoQueryParams\n } = currentState;\n\n let startScreenId: string;\n let startScreenName: string;\n let conditionInteractionId: string;\n const abTestingKey = getABTestingKey();\n const { outboundAppId } = this;\n const { outboundAppScopes } = this;\n const loginId = this.sdk.getLastUserLoginId();\n const flowConfig = await this.getFlowConfig();\n const projectConfig = await this.getProjectConfig();\n const flowVersions = Object.entries(projectConfig.flows || {}).reduce(\n // pass also current versions for all flows, it may be used as a part of the current flow\n (acc, [key, value]) => {\n acc[key] = value.version;\n return acc;\n },\n {} as Record<string, number>,\n );\n const redirectAuth =\n redirectAuthCallbackUrl && redirectAuthCodeChallenge\n ? {\n callbackUrl: redirectAuthCallbackUrl,\n codeChallenge: redirectAuthCodeChallenge,\n backupCallbackUri: redirectAuthBackupCallbackUri,\n }\n : undefined;\n const nativeOptions = this.nativeOptions\n ? {\n platform: this.nativeOptions.platform,\n bridgeVersion: this.nativeOptions.bridgeVersion,\n oauthProvider: this.nativeOptions.oauthProvider,\n oauthRedirect: this.nativeOptions.oauthRedirect,\n magicLinkRedirect: this.nativeOptions.magicLinkRedirect,\n ssoRedirect: this.nativeOptions.ssoRedirect,\n }\n : undefined;\n let conditionComponentsConfig: ComponentsConfig = {};\n\n // if there is no execution id we should start a new flow\n if (!executionId) {\n const clientScripts = [\n ...(flowConfig.clientScripts || []),\n ...(flowConfig.sdkScripts || []),\n ];\n\n if (flowConfig.conditions) {\n let conditionScripts = [];\n ({\n startScreenId,\n conditionInteractionId,\n startScreenName,\n clientScripts: conditionScripts,\n componentsConfig: conditionComponentsConfig,\n } = calculateConditions(\n {\n loginId,\n code,\n token,\n abTestingKey,\n lastAuth: getLastAuth(loginId),\n },\n flowConfig.conditions,\n ));\n clientScripts.push(...(conditionScripts || []));\n } else if (flowConfig.condition) {\n ({ startScreenId, conditionInteractionId } = calculateCondition(\n flowConfig.condition,\n {\n loginId,\n code,\n token,\n abTestingKey,\n lastAuth: getLastAuth(loginId),\n },\n ));\n } else {\n startScreenName = flowConfig.startScreenName;\n startScreenId = flowConfig.startScreenId;\n }\n\n this.#sdkScriptsLoading = this.loadSdkScripts(clientScripts);\n if (flowConfig.fingerprintEnabled && flowConfig.fingerprintKey) {\n await ensureFingerprintIds(flowConfig.fingerprintKey, this.baseUrl);\n } else {\n clearFingerprintData();\n }\n\n // As an optimization - we want to show the first screen if it is possible\n if (!showFirstScreenOnExecutionInit(startScreenId, ssoQueryParams)) {\n const sdkResp = await this.sdk.flow.start(\n flowId,\n {\n tenant,\n redirectAuth,\n ...ssoQueryParams,\n client: this.client,\n ...(redirectUrl && { redirectUrl }),\n lastAuth: getLastAuth(loginId),\n abTestingKey,\n locale: getUserLocale(locale).locale,\n nativeOptions,\n outboundAppId,\n outboundAppScopes,\n },\n conditionInteractionId,\n '',\n projectConfig.componentsVersion,\n flowVersions,\n {\n ...this.formConfigValues,\n ...(code ? { exchangeCode: code, idpInitiated: true } : {}),\n ...(ssoQueryParams.descopeIdpInitiated && { idpInitiated: true }),\n ...(token ? { token } : {}),\n ...(ssoQueryParams.oidcLoginHint\n ? { externalId: ssoQueryParams.oidcLoginHint }\n : {}),\n },\n );\n\n this.#handleSdkResponse(sdkResp);\n if (sdkResp?.data?.status !== 'completed') {\n this.flowState.update({ code: undefined, token: undefined });\n }\n return;\n }\n }\n\n this.loggerWrapper.debug(\n 'Before popup postmessage send',\n JSON.stringify({\n isPopup,\n code,\n exchangeError,\n isCodeChanged: isChanged('code'),\n isExchangeErrorChanged: isChanged('exchangeError'),\n }),\n );\n if (\n isPopup &&\n ((isChanged('code') && code) ||\n (isChanged('exchangeError') && exchangeError))\n ) {\n // Sending data back from popup to opener (code / exchangeError)\n this.#notifyOpener(executionId, code, exchangeError);\n return;\n }\n\n // if there is a descope url param on the url its because the user clicked on email link or redirected back to the app\n // we should call next with the params\n if (\n executionId &&\n ((isChanged('token') && token) ||\n (isChanged('code') && code) ||\n (isChanged('exchangeError') && exchangeError))\n ) {\n const sdkResp = await this.sdk.flow.next(\n executionId,\n stepId,\n CUSTOM_INTERACTIONS.submit,\n flowConfig.version,\n projectConfig.componentsVersion,\n {\n token,\n exchangeCode: code,\n exchangeError,\n },\n );\n this.#handleSdkResponse(sdkResp);\n this.flowState.update({\n token: undefined,\n code: undefined,\n exchangeError: undefined,\n }); // should happen after handleSdkResponse, otherwise we will not have screen id on the next run\n return;\n }\n\n const samlProps = [\n 'samlIdpResponseUrl',\n 'samlIdpResponseSamlResponse',\n 'samlIdpResponseRelayState',\n ];\n if (\n action === RESPONSE_ACTIONS.loadForm &&\n samlProps.some((samlProp) => isChanged(samlProp))\n ) {\n if (!samlIdpResponseUrl || !samlIdpResponseSamlResponse) {\n this.loggerWrapper.error('Did not get saml idp params data to load');\n return;\n }\n\n // Handle SAML IDP end of flow (\"redirect like\" by using html form with hidden params)\n injectSamlIdpForm(\n samlIdpResponseUrl,\n samlIdpResponseSamlResponse,\n samlIdpResponseRelayState || '',\n submitForm,\n ); // will redirect us to the saml acs url\n }\n\n if (\n action === RESPONSE_ACTIONS.redirect &&\n (isChanged('redirectTo') || isChanged('deferredRedirect'))\n ) {\n if (!redirectTo) {\n this.loggerWrapper.error('Did not get redirect url');\n return;\n }\n if (redirectTo === 'no-op') {\n // this is part of the state update mechanism that allows multiple clicks\n // on the same button on mobile devices\n return;\n }\n if (redirectAuthInitiator === 'android' && document.hidden) {\n // on android native flows, defer redirects until in foreground\n this.flowState.update({\n deferredRedirect: true,\n });\n return;\n }\n\n this.loggerWrapper.debug(`Redirect is popup ${redirectIsPopup}`);\n if (redirectIsPopup) {\n // this width is below the breakpoint of most providers\n this.loggerWrapper.debug('Opening redirect in popup');\n const popup = openCenteredPopup(redirectTo, '?', 598, 700);\n const usePostMessageFallback = this.shouldUsePopupPostMessage();\n // mark popup so sending side knows to use postMessage and what origin to send to\n if (usePostMessageFallback) {\n popup.name = `descope-wc|${window.location.origin}`;\n }\n this.loggerWrapper.debug(\n `Popup communication method: ${\n usePostMessageFallback ? 'postMessage' : 'BroadcastChannel'\n }`,\n );\n\n const onPostMessage = (event: MessageEvent) => {\n this.loggerWrapper.debug(\n 'Received popup message',\n JSON.stringify(event.data),\n );\n const expectedOrigin = usePostMessageFallback\n ? this.popupOrigin\n : window.location.origin;\n\n if (event.origin !== expectedOrigin) {\n this.loggerWrapper.debug(\n `Ignoring message from unexpected origin. received: \"${event.origin}\", expected: \"${expectedOrigin}\"`,\n );\n return;\n }\n\n const { action: popupAction, data } = event.data || {};\n if (popupAction === 'code') {\n this.flowState.update({\n code: data.code,\n exchangeError: data.exchangeError,\n });\n }\n };\n\n let cleanup: () => void;\n\n this.loggerWrapper.debug('Starting popup closed detection');\n const intervalId = setInterval(() => {\n if (popup.closed) {\n this.loggerWrapper.debug(\n 'Popup closed, dispatching popupclosed event',\n );\n clearInterval(intervalId);\n this.#dispatch('popupclosed', {});\n\n this.loggerWrapper.debug('Cleaning up popup listeners');\n cleanup?.();\n }\n }, 1000);\n\n if (usePostMessageFallback) {\n window.addEventListener('message', onPostMessage);\n cleanup = () => {\n this.loggerWrapper.debug('Cleaning up popup postMessage listener');\n window.removeEventListener('message', onPostMessage);\n };\n } else {\n this.loggerWrapper.debug('Creating broadcast channel');\n const channel = new BroadcastChannel(executionId);\n channel.onmessage = onPostMessage;\n cleanup = () => {\n this.loggerWrapper.debug('Closing channel');\n channel.close();\n };\n }\n } else {\n this.handleRedirect(redirectTo);\n // on web we should not get here as when a redirect is performed the contents of the page immediately change,\n // but on mobile, there is usually no redirect in place, instead the url is opened in a new browser tab\n // while the flow continues to run inside a webview.\n // so we need to reset the loading state of the components, otherwise, they'll be stuck in loading state\n // and become unclickable, and we need to reset the flow state to allow the user to click the button more than once\n // otherwise consecutive next response will not cause any change to the state and thus will not be handled\n this.flowState.update({ redirectTo: 'no-op' });\n this.#dispatch('popupclosed', {});\n }\n return;\n }\n\n if (\n action === RESPONSE_ACTIONS.webauthnCreate ||\n action === RESPONSE_ACTIONS.webauthnGet\n ) {\n if (!webauthnTransactionId || !webauthnOptions) {\n this.loggerWrapper.error(\n 'Did not get webauthn transaction id or options',\n );\n return;\n }\n\n this.#conditionalUiAbortController?.abort();\n this.#conditionalUiAbortController = null;\n\n let response: string;\n let failure: string;\n\n try {\n response =\n action === RESPONSE_ACTIONS.webauthnCreate\n ? await this.sdk.webauthn.helpers.create(webauthnOptions)\n : await this.sdk.webauthn.helpers.get(webauthnOptions);\n } catch (e) {\n if (e.name === 'InvalidStateError') {\n // currently returned in Chrome when trying to register a WebAuthn device\n // that's already registered for the user\n this.loggerWrapper.warn('WebAuthn operation failed', e.message);\n } else if (e.name !== 'NotAllowedError') {\n // shouldn't happen in normal usage ('AbortError' is only when setting an AbortController)\n this.loggerWrapper.error(e.message);\n }\n failure = e.name;\n }\n // Call next with the transactionId and the response or failure\n const sdkResp = await this.sdk.flow.next(\n executionId,\n stepId,\n CUSTOM_INTERACTIONS.submit,\n flowConfig.version,\n projectConfig.componentsVersion,\n {\n transactionId: webauthnTransactionId,\n response,\n failure,\n },\n );\n this.#handleSdkResponse(sdkResp);\n }\n\n if (action === RESPONSE_ACTIONS.nativeBridge) {\n // prepare a callback with the current flow state, and accept\n // the input to be a JSON, passed down from the native layer.\n // this function will be called as an async response to a 'bridge' event\n this.nativeCallbacks.complete = async (input: Record<string, any>) => {\n const sdkResp = await this.sdk.flow.next(\n executionId,\n stepId,\n CUSTOM_INTERACTIONS.submit,\n flowConfig.version,\n projectConfig.componentsVersion,\n input,\n );\n this.#handleSdkResponse(sdkResp);\n };\n // notify the bridging native layer that a native action is requested via 'bridge' event.\n // the response will be in the form of calling the 'nativeCallbacks.complete' callback via\n // the 'nativeResume' function.\n this.#nativeNotifyBridge(nativeResponseType, nativePayload);\n // since the native bridge takes over and will display cancelable modal UI\n // we want to reset the loading state of button components to prevent\n // endless loading state in case the user cancels the native UI\n setTimeout(() => {\n this.dispatchEvent(new Event('popupclosed'));\n }, 500);\n return;\n }\n\n if (isChanged('action')) {\n this.#handlePollingResponse(\n executionId,\n stepId,\n flowConfig.version,\n projectConfig.componentsVersion,\n );\n }\n\n // if there is no screen id (possibly due to page refresh or no screen flow) we should get it from the server\n if (!screenId && !startScreenId) {\n this.loggerWrapper.warn('No screen was found to show');\n return;\n }\n\n const readyScreenId = startScreenId || screenId;\n\n // get the right filename according to the user locale and flow target locales\n const filenameWithLocale: string = await this.getHtmlFilenameWithLocale(\n locale,\n readyScreenId,\n );\n\n const {\n oidcLoginHint,\n oidcPrompt,\n oidcErrorRedirectUri,\n oidcResource,\n samlIdpUsername,\n } = ssoQueryParams;\n\n // generate step state update data\n const stepStateUpdate: Partial<StepState> = {\n direction: getAnimationDirection(stepId, prevState.stepId),\n screenState: {\n ...screenState,\n form: {\n ...this.formConfigValues,\n ...screenState?.form,\n },\n lastAuth: {\n loginId,\n name: this.sdk.getLastUserDisplayName() || loginId,\n },\n componentsConfig: {\n ...flowConfig.componentsConfig,\n ...conditionComponentsConfig,\n ...screenState?.componentsConfig,\n },\n },\n htmlFilename: `${readyScreenId}.html`,\n htmlLocaleFilename: filenameWithLocale,\n screenId: readyScreenId,\n stepName: currentState.stepName || startScreenName,\n samlIdpUsername,\n oidcLoginHint,\n oidcPrompt,\n oidcErrorRedirectUri,\n oidcResource,\n action,\n };\n\n const lastAuth = getLastAuth(loginId);\n\n // If there is a start screen id, next action should start the flow\n // But if any of the sso params are not empty, this optimization doesn't happen\n // because Descope may decide not to show the first screen (in cases like a user is already logged in) - this is more relevant for SSO scenarios\n if (showFirstScreenOnExecutionInit(startScreenId, ssoQueryParams)) {\n stepStateUpdate.next = async (interactionId, inputs) => {\n const screenScripts = flowConfig?.clientScripts || [];\n await this.#runSdkScriptsModules(screenScripts);\n\n const res = await this.sdk.flow.start(\n flowId,\n {\n tenant,\n redirectAuth,\n ...ssoQueryParams,\n lastAuth,\n preview: this.preview,\n abTestingKey,\n client: this.client,\n ...(redirectUrl && { redirectUrl }),\n locale: getUserLocale(locale).locale,\n nativeOptions,\n outboundAppId,\n outboundAppScopes,\n },\n conditionInteractionId,\n interactionId,\n projectConfig.componentsVersion,\n flowVersions,\n {\n ...this.formConfigValues,\n ...this.getComponentsContext(),\n ...transformScreenInputs(inputs),\n ...(code && { exchangeCode: code, idpInitiated: true }),\n ...(ssoQueryParams.descopeIdpInitiated && { idpInitiated: true }),\n ...(token && { token }),\n },\n stepStateUpdate.next.isCustomScreen,\n );\n\n this.#handleSdkResponse(res);\n\n return res;\n };\n } else if (\n isChanged('projectId') ||\n isChanged('baseUrl') ||\n isChanged('executionId') ||\n isChanged('stepId')\n ) {\n stepStateUpdate.next = async (interactionId, input) => {\n const screenScripts = screenState?.clientScripts || [];\n await this.#runSdkScriptsModules(screenScripts);\n\n const res = await this.sdk.flow.next(\n executionId,\n stepId,\n interactionId,\n flowConfig.version,\n projectConfig.componentsVersion,\n {\n ...this.getComponentsContext(),\n ...transformScreenInputs(input),\n },\n stepStateUpdate.next.isCustomScreen,\n );\n\n this.#handleSdkResponse(res);\n\n return res;\n };\n }\n\n this.loggerWrapper.debug('Got a screen with id', stepStateUpdate.screenId);\n\n await this.#handleCustomScreen(stepStateUpdate);\n\n this.stepState.update(stepStateUpdate);\n }\n\n // this function is used to handle redirects in the web component\n // it can be overridden by the user to handle redirects in a custom way\n // eslint-disable-next-line class-methods-use-this\n handleRedirect = (redirectTo: string) => {\n window.location.assign(redirectTo);\n };\n\n #toggleScreenVisibility = (isCustomScreen: boolean) => {\n const toggleVisibility = () => {\n this.contentRootElement.classList.toggle('hidden', isCustomScreen);\n this.slotElement.classList.toggle('hidden', !isCustomScreen);\n if (isCustomScreen) {\n this.contentRootElement.innerHTML = '';\n }\n };\n\n if (isCustomScreen && this.contentRootElement.hasChildNodes()) {\n this.#handlePageSwitchTransition(toggleVisibility);\n } else {\n toggleVisibility();\n }\n };\n\n #handlePageSwitchTransition(onTransitionEnd: () => void) {\n const transitionEndHandler = () => {\n this.loggerWrapper.debug('page switch transition end');\n this.contentRootElement.classList.remove('fade-out');\n onTransitionEnd();\n };\n this.contentRootElement.addEventListener(\n 'transitionend',\n transitionEndHandler,\n { once: true },\n );\n this.loggerWrapper.debug('page switch transition start');\n this.contentRootElement.classList.add('fade-out');\n }\n\n #handlePollingResponse = (\n executionId: string,\n stepId: string,\n flowVersion: number,\n componentsVersion: string,\n rescheduled: boolean = false,\n ) => {\n const pollingDefaultDelay = 2000;\n const pollingDefaultTimeout = 6000;\n const pollingThrottleDelay = 500;\n const pollingThrottleThreshold = 500;\n const pollingThrottleTimeout = 1000;\n const stopOnErrors = [\n FLOW_TIMED_OUT_ERROR_CODE,\n POLLING_STATUS_NOT_FOUND_ERROR_CODE,\n ];\n\n if (this.flowState.current.action === RESPONSE_ACTIONS.poll) {\n // schedule next polling request for 2 seconds from now\n this.logger.debug('polling - Scheduling polling request');\n const scheduledAt = Date.now();\n const delay = rescheduled ? pollingThrottleDelay : pollingDefaultDelay;\n this.#pollingTimeout = setTimeout(async () => {\n this.logger.debug('polling - Calling next');\n\n const nextCall = this.sdk.flow.next(\n executionId,\n stepId,\n CUSTOM_INTERACTIONS.polling,\n flowVersion,\n componentsVersion,\n {},\n );\n\n // Try to detect whether the tab is being throttled when running in a mobile browser, specifically on iOS.\n // We check whether the tab seems to hidden and the polling callback was called much later than expected,\n // in which case we allow a much shorter timeout for the polling request. The reschedule check ensures\n // this cannot happen twice consecutively.\n const throttled =\n document.hidden &&\n !rescheduled &&\n Date.now() - scheduledAt > delay + pollingThrottleThreshold;\n if (throttled) {\n this.logger.debug('polling - The polling seems to be throttled');\n }\n\n let sdkResp: Awaited<typeof nextCall>;\n try {\n const timeout = throttled\n ? pollingThrottleTimeout\n : pollingDefaultTimeout;\n sdkResp = await timeoutPromise(timeout, nextCall);\n } catch (err) {\n this.logger.warn(\n `polling - The ${\n throttled ? 'throttled fetch' : 'fetch'\n } call timed out or was aborted`,\n );\n this.#handlePollingResponse(\n executionId,\n stepId,\n flowVersion,\n componentsVersion,\n throttled,\n );\n return;\n }\n\n if (sdkResp?.error?.errorCode === FETCH_EXCEPTION_ERROR_CODE) {\n this.logger.debug(\n 'polling - Got a generic error due to exception in fetch call',\n );\n this.#handlePollingResponse(\n executionId,\n stepId,\n flowVersion,\n componentsVersion,\n );\n return;\n }\n\n this.logger.debug('polling - Got a response');\n if (sdkResp?.error) {\n this.logger.debug(\n 'polling - Response has an error',\n JSON.stringify(sdkResp.error, null, 4),\n );\n }\n\n // we want to stop polling for some errors\n if (\n !sdkResp?.error?.errorCode ||\n !stopOnErrors.includes(sdkResp.error.errorCode)\n ) {\n // will poll again if needed\n // handleSdkResponse will clear the timeout if the response action is not polling response\n this.#handlePollingResponse(\n executionId,\n stepId,\n flowVersion,\n componentsVersion,\n );\n } else {\n this.logger.debug('polling - Stopping polling due to error');\n }\n\n this.#handleSdkResponse(sdkResp);\n }, delay);\n }\n };\n\n #resetPollingTimeout = () => {\n clearTimeout(this.#pollingTimeout);\n this.#pollingTimeout = null;\n };\n\n #handleSdkResponse = (sdkResp: NextFnReturnPromiseValue) => {\n if (!sdkResp?.ok) {\n const defaultMessage = sdkResp?.response?.url;\n const defaultDescription = `${sdkResp?.response?.status} - ${sdkResp?.response?.statusText}`;\n\n this.#dispatch(\n 'error',\n sdkResp?.error || {\n errorCode: FETCH_ERROR_RESPONSE_ERROR_CODE,\n errorDescription: defaultDescription,\n errorMessage: defaultMessage,\n },\n );\n\n this.loggerWrapper.error(\n sdkResp?.error?.errorDescription || defaultMessage,\n sdkResp?.error?.errorMessage || defaultDescription,\n );\n\n const errorCode = sdkResp?.error?.errorCode;\n if (\n (errorCode === FLOW_REQUESTED_IS_IN_OLD_VERSION_ERROR_CODE ||\n errorCode === FLOW_TIMED_OUT_ERROR_CODE) &&\n this.isRestartOnError\n ) {\n this.#handleFlowRestart();\n }\n return;\n }\n\n sdkResp.data?.runnerLogs?.forEach((l) => {\n const { level, title, log } = l;\n if (level && this.loggerWrapper[level]) {\n this.loggerWrapper[level](title, log);\n } else {\n this.loggerWrapper.info(title, log);\n }\n });\n const errorText = sdkResp.data?.screen?.state?.errorText;\n if (sdkResp.data?.error) {\n this.loggerWrapper.error(\n `[${sdkResp.data.error.code}]: ${sdkResp.data.error.description}`,\n `${errorText ? `${errorText} - ` : ''}${sdkResp.data.error.message}`,\n );\n } else if (errorText) {\n this.loggerWrapper.error(errorText);\n }\n\n const { status, authInfo, lastAuth, action, openInNewTabUrl } =\n sdkResp.data;\n\n if (action !== RESPONSE_ACTIONS.poll) {\n this.#resetPollingTimeout();\n }\n\n if (status === 'completed') {\n if (this.storeLastAuthenticatedUser) {\n setLastAuth(lastAuth);\n }\n const payload: FlowJWTResponse = { ...authInfo };\n // add flow output onto the jwt response itself, as opposed to changed the response object,\n // to avoid breaking existing functionality\n if (sdkResp.data.output && Object.keys(sdkResp.data.output).length > 0) {\n payload.flowOutput = sdkResp.data.output;\n }\n this.#dispatch('success', payload);\n return;\n }\n\n if (this.storeLastAuthenticatedUser) {\n setLastAuth(lastAuth, true);\n }\n\n if (openInNewTabUrl) {\n window.open(openInNewTabUrl, '_blank');\n // we should not return here so the screen will be rendered\n }\n\n const {\n executionId,\n stepId,\n stepName,\n screen,\n redirect,\n webauthn,\n error,\n samlIdpResponse,\n nativeResponse,\n } = sdkResp.data;\n\n // this is used as a cache buster\n // we want to make sure the onScreenUpdate will be called after every next call even if the state was not changed\n const reqTimestamp = Date.now();\n\n if (action === RESPONSE_ACTIONS.poll) {\n // We only update action because the polling response action does not return extra information\n this.flowState.update({\n action,\n reqTimestamp,\n });\n return;\n }\n\n this.loggerWrapper.info(\n `Step \"${stepName || `#${stepId}`}\" is ${status}`,\n '',\n {\n screen,\n status,\n stepId,\n stepName,\n action,\n error,\n },\n );\n\n if (screen.state?.clientScripts) {\n this.#sdkScriptsLoading = this.loadSdkScripts(screen.state.clientScripts);\n }\n\n this.flowState.update({\n stepId,\n stepName,\n executionId,\n action,\n redirectTo: redirect?.url,\n redirectIsPopup: redirect?.isPopup,\n screenId: screen?.id,\n screenState: screen?.state,\n webauthnTransactionId: webauthn?.transactionId,\n webauthnOptions: webauthn?.options,\n samlIdpResponseUrl: samlIdpResponse?.url,\n samlIdpResponseSamlResponse: samlIdpResponse?.samlResponse,\n samlIdpResponseRelayState: samlIdpResponse?.relayState,\n nativeResponseType: nativeResponse?.type,\n nativePayload: nativeResponse?.payload,\n reqTimestamp,\n });\n };\n\n // we want to get the start params only if we don't have it already\n #getWebauthnConditionalUiStartParams = withMemCache(async () => {\n try {\n const startResp = await this.sdk.webauthn.signIn.start(\n '',\n window.location.origin,\n ); // when using conditional UI we need to call start without identifier\n if (!startResp.ok) {\n this.loggerWrapper.warn(\n 'Webauthn start failed',\n startResp?.error?.errorMessage,\n );\n }\n return startResp.data;\n } catch (err) {\n this.loggerWrapper.warn('Webauthn start failed', err.message);\n }\n\n return undefined;\n });\n\n /**\n * this is needed because Conditional UI does not work on all input names\n * we need to add a prefix to the input name so it will trigger the autocomplete dialog\n * but we want to remove it once the user starts typing because we want this field to be sent to the server with the correct name\n */\n\n // eslint-disable-next-line class-methods-use-this\n #handleConditionalUiInput(inputEle: HTMLInputElement) {\n const ignoreList = ['email'];\n const origName = inputEle.getAttribute('name');\n\n if (!ignoreList.includes(origName)) {\n const conditionalUiSupportName = `user-${origName}`;\n\n // eslint-disable-next-line no-param-reassign\n inputEle.setAttribute('name', conditionalUiSupportName);\n\n inputEle.addEventListener('input', () => {\n // eslint-disable-next-line no-param-reassign\n inputEle.setAttribute(\n 'name',\n inputEle.value ? origName : conditionalUiSupportName,\n );\n });\n }\n }\n\n async #handleWebauthnConditionalUi(fragment: DocumentFragment, next: NextFn) {\n this.#conditionalUiAbortController?.abort();\n\n const conditionalUiInput = fragment.querySelector(\n '*[autocomplete=\"webauthn\"]',\n ) as HTMLInputElement;\n\n if (conditionalUiInput && (await isConditionalLoginSupported())) {\n const { options, transactionId } =\n (await this.#getWebauthnConditionalUiStartParams()) || {};\n\n if (options && transactionId) {\n this.#handleConditionalUiInput(conditionalUiInput);\n\n // we need the abort controller so we can cancel the current webauthn session in case the user clicked on a webauthn button, and we need to start a new session\n this.#conditionalUiAbortController = new AbortController();\n\n // we should not wait for this fn, it will call next when the user uses his passkey on the input\n this.sdk.webauthn.helpers\n .conditional(options, this.#conditionalUiAbortController)\n .then(async (response) => {\n next(conditionalUiInput.id, {\n transactionId,\n response,\n });\n })\n .catch((err) => {\n if (err.name !== 'AbortError') {\n this.loggerWrapper.error('Conditional login failed', err.message);\n }\n });\n }\n }\n }\n\n #dispatchPageEvents({\n isFirstScreen,\n isCustomScreen,\n stepName,\n }: {\n isFirstScreen: boolean;\n isCustomScreen: boolean;\n stepName: string;\n }) {\n if (isFirstScreen) {\n // Dispatch when the first page is ready\n // So user can show a loader until his event is triggered\n this.#dispatch('ready', {});\n }\n\n if (!isCustomScreen) {\n this.#nativeAfterScreen(stepName);\n }\n\n this.#dispatch('page-updated', { screenName: stepName });\n this.#dispatch('screen-updated', { screenName: stepName });\n }\n\n async onStepChange(currentState: StepState, prevState: StepState) {\n const { htmlFilename, htmlLocaleFilename, direction, next, screenState } =\n currentState;\n\n this.loggerWrapper.debug('Rendering a flow screen');\n\n const stepTemplate = document.createElement('template');\n stepTemplate.innerHTML = await this.getPageContent(\n htmlFilename,\n htmlLocaleFilename,\n );\n\n const clone = stepTemplate.content.cloneNode(true) as DocumentFragment;\n\n const loadDescopeUiComponents = this.loadDescopeUiComponents(stepTemplate);\n\n // we want to disable the webauthn buttons if it's not supported on the browser\n if (!this.sdk.webauthn.helpers.isSupported()) {\n disableWebauthnButtons(clone);\n } else {\n await this.#handleWebauthnConditionalUi(clone, next);\n }\n\n if (\n currentState.samlIdpUsername &&\n !screenState.form?.loginId &&\n !screenState.form?.email\n ) {\n if (!screenState.form) {\n screenState.form = {};\n }\n screenState.form.loginId = currentState.samlIdpUsername;\n screenState.form.email = currentState.samlIdpUsername;\n }\n\n updateTemplateFromScreenState(\n clone,\n screenState,\n this.formConfig,\n this.loggerWrapper,\n );\n\n // set the default country code based on the locale value we got\n const { geo } = await this.getExecutionContext();\n setPhoneAutoDetectDefaultCode(clone, geo);\n\n const injectNextPage = async () => {\n await loadDescopeUiComponents;\n\n // put the totp and notp variable on the root element, which is the top level 'div' inside the shadowRoot\n const rootElement = this.contentRootElement;\n setTOTPVariable(rootElement, screenState?.totp?.image);\n\n setNOTPVariable(rootElement, screenState?.notp?.image);\n\n // set dynamic css variables that should be set at runtime\n setCssVars(rootElement, clone, screenState.cssVars, this.loggerWrapper);\n\n rootElement.replaceChildren(clone);\n\n // If before html url was empty, we deduce its the first time a screen is shown\n const isFirstScreen = !prevState.htmlFilename;\n\n // we need to wait for all components to render before we can set its value\n setTimeout(() => {\n this.#updateExternalInputs();\n\n if (this.validateOnBlur) {\n handleReportValidityOnBlur(rootElement);\n }\n\n // we need to wait for all components to render before we can set its value\n updateScreenFromScreenState(rootElement, screenState);\n\n this.#dispatchPageEvents({\n isFirstScreen,\n isCustomScreen: false,\n stepName: currentState.stepName,\n });\n\n handleAutoFocus(rootElement, this.autoFocus, isFirstScreen);\n });\n\n this.#hydrate(next);\n\n const loader = rootElement.querySelector(\n `[${ELEMENT_TYPE_ATTRIBUTE}=\"polling\"]`,\n );\n if (loader) {\n // Loader component in the screen triggers polling interaction\n next(CUSTOM_INTERACTIONS.polling, {});\n }\n };\n\n // no animation\n if (!direction) {\n injectNextPage();\n return;\n }\n\n this.#handlePageSwitchTransition(injectNextPage);\n }\n\n #validateInputs() {\n let isValid = true;\n Array.from(this.shadowRoot.querySelectorAll('*[name]'))\n .reverse()\n .forEach((input: HTMLInputElement) => {\n // We are hiding conditional components so we don't want to validate them\n if (input.localName === 'slot' || input.classList.contains('hidden')) {\n return;\n }\n input.reportValidity?.();\n if (isValid) {\n isValid = input.checkValidity?.();\n }\n });\n\n return isValid;\n }\n\n getInputs() {\n return Array.from(\n this.shadowRoot.querySelectorAll(\n `*:not(slot)[name]:not([${DESCOPE_ATTRIBUTE_EXCLUDE_FIELD}])`,\n ),\n ) as HTMLInputElement[];\n }\n\n async #getFormData() {\n const inputs = this.getInputs();\n\n // wait for all inputs\n const values = await Promise.all(\n inputs.map(async (input) => ({\n name: input.getAttribute('name'),\n value: input.value,\n })),\n );\n\n // reduce to object\n return values.reduce(\n (acc, val) => ({\n ...acc,\n [val.name]: val.value,\n }),\n {},\n );\n }\n\n #prevPageShowListener: ((e: PageTransitionEvent) => void) | null = null;\n\n #handleComponentsLoadingState(submitter: HTMLElement) {\n const enabledElements = Array.from(\n this.contentRootElement.querySelectorAll(\n ':not([disabled]), [disabled=\"false\"]',\n ),\n ).filter((ele) => ele !== submitter);\n\n const restoreComponentsState = async () => {\n this.loggerWrapper.debug('Restoring components state');\n this.removeEventListener('popupclosed', restoreComponentsState);\n submitter.removeAttribute('loading');\n enabledElements.forEach((ele) => {\n ele.removeAttribute('disabled');\n });\n // if there are client scripts, we want to reload them\n const flowConfig = await this.getFlowConfig();\n const clientScripts = [\n ...(flowConfig.clientScripts || []),\n ...(flowConfig.sdkScripts || []),\n ];\n this.loadSdkScripts(clientScripts);\n };\n\n const handleScreenIdUpdates = () => {\n // we want to remove the previous pageshow listener to avoid multiple listeners\n window.removeEventListener('pageshow', this.#prevPageShowListener);\n\n this.#prevPageShowListener = (e) => {\n if (e.persisted) {\n this.logger.debug(\n 'Page was loaded from cache, restoring components state',\n );\n restoreComponentsState();\n }\n };\n // we want to restore the components state when the page is shown from cache\n window.addEventListener('pageshow', this.#prevPageShowListener, {\n once: true,\n });\n\n // we want to restore the components state when the screenId is updated\n const unsubscribeScreenIdUpdates = this.stepState?.subscribe(\n (screenId, prevScreenId) => {\n // we want to restore components state only if we stay on the same screen\n // if we are rendering a new screen, the components state (disabled/loading) will remain until the new screen is rendered\n if (screenId === prevScreenId) {\n restoreComponentsState();\n }\n this.removeEventListener('popupclosed', restoreComponentsState);\n this.stepState.unsubscribe(unsubscribeScreenIdUpdates);\n },\n (state) => state.screenId,\n { forceUpdate: true },\n );\n };\n\n // we are listening to the next request status\n const unsubscribeNextRequestStatus = this.nextRequestStatus.subscribe(\n ({ isLoading }) => {\n if (isLoading) {\n this.addEventListener('popupclosed', restoreComponentsState, {\n once: true,\n });\n // if the next request is loading, we want to set loading state on the submitter, and disable all other enabled elements\n submitter.setAttribute('loading', 'true');\n enabledElements.forEach((ele) =>\n ele.setAttribute('disabled', 'true'),\n );\n } else {\n this.nextRequestStatus.unsubscribe(unsubscribeNextRequestStatus);\n // when next request is done, we want to listen to screenId updates\n handleScreenIdUpdates();\n }\n },\n );\n }\n\n // handle storing passwords in password managers\n #handleStoreCredentials(formData = {}) {\n const idFields = ['externalId', 'email', 'phone'];\n const passwordFields = ['newPassword', 'password'];\n\n const id = getFirstNonEmptyValue(formData, idFields);\n const password = getFirstNonEmptyValue(formData, passwordFields);\n\n // PasswordCredential not supported in Firefox\n if (id && password) {\n try {\n if (!globalThis.PasswordCredential) {\n return;\n }\n const cred = new globalThis.PasswordCredential({ id, password });\n\n navigator?.credentials?.store?.(cred);\n } catch (e) {\n this.loggerWrapper.error('Could not store credentials', e.message);\n }\n }\n }\n\n #updateExternalInputs() {\n // we need to clear external inputs that were created previously, so each screen has only\n // the slotted inputs it needs\n clearPreviousExternalInputs();\n\n const eles = this.contentRootElement.querySelectorAll(\n '[external-input=\"true\"]',\n );\n eles.forEach((ele) => this.#handleExternalInputs(ele));\n }\n\n #handleExternalInputs(ele: Element) {\n if (!ele) {\n return;\n }\n\n const origInputs = ele.querySelectorAll('input');\n\n origInputs.forEach((inp) => {\n const targetSlot = inp.getAttribute('slot');\n const id = `input-${ele.id}-${targetSlot}`;\n\n const slot = document.createElement('slot');\n slot.setAttribute('name', id);\n slot.setAttribute('slot', targetSlot);\n\n ele.appendChild(slot);\n\n inp.setAttribute('slot', id);\n this.appendChild(inp);\n });\n }\n\n // we are wrapping this function with a leading debounce,\n // to prevent a scenario where we are calling it multiple times\n // this can caused by focusing on a button and pressing enter\n // in this case, the button will be clicked, but because we have the auto-submit mechanism\n // it will submit the form once again and we will end up with 2 identical calls for next\n #handleSubmit = leadingDebounce(\n async (submitter: HTMLElement, next: NextFn) => {\n if (\n submitter.getAttribute('formnovalidate') === 'true' ||\n this.#validateInputs()\n ) {\n const submitterId = submitter?.getAttribute('id');\n this.#handleComponentsLoadingState(submitter);\n\n const formData = await this.#getFormData();\n const eleDescopeAttrs = getElementDescopeAttributes(submitter);\n\n this.nextRequestStatus.update({ isLoading: true });\n\n const actionArgs = {\n ...eleDescopeAttrs,\n ...formData,\n // 'origin' is required to start webauthn. For now we'll add it to every request.\n // When running in a native flow in a Android app the webauthn authentication\n // is performed in the native app, so a custom origin needs to be injected\n // into the webauthn request data.\n origin: this.nativeOptions?.origin || window.location.origin,\n };\n\n await next(submitterId, actionArgs);\n\n this.nextRequestStatus.update({ isLoading: false });\n\n this.#handleStoreCredentials(formData);\n }\n },\n );\n\n async #runSdkScriptsModules(screenScripts: ClientScript[]) {\n // ensure scripts are already loaded and if not, wait on the promise to get notified once loading completes\n if (this.#sdkScriptsLoading) {\n this.loggerWrapper.debug('Waiting for sdk scripts to load');\n const now = Date.now();\n await this.#sdkScriptsLoading;\n this.loggerWrapper.debug(\n 'Sdk scripts loaded for',\n (Date.now() - now).toString(),\n );\n }\n\n // get all script modules and refresh them before form submission\n const sdkScriptsModules = this.loadSdkScriptsModules();\n\n // check which scripts are active on the current screen, this only affects the modules\n // for which present is implemented\n const screenScriptIds = screenScripts.map((s) => s.id);\n\n // eslint-disable-next-line no-restricted-syntax\n for (const module of sdkScriptsModules) {\n // only present modules that are part of the current screen\n if (!screenScriptIds.includes(module.id)) {\n continue; // eslint-disable-line no-continue\n }\n // only attempt to present modules that actually have a present function\n try {\n if (typeof module.present === 'function') {\n const completed = await module.present(); // eslint-disable-line no-await-in-loop\n if (!completed) {\n this.loggerWrapper.debug(`Sdk script ${module.id} was cancelled`);\n }\n }\n } catch (e) {\n // Ignore error and let the backend handle the lack of token\n this.loggerWrapper.error(\n `Failed to present ${module.id} script module`,\n e.message,\n );\n }\n }\n\n // Run all module refresh calls concurrently\n const promises: Promise<void>[] = [];\n\n // eslint-disable-next-line no-restricted-syntax\n for (const module of sdkScriptsModules) {\n // only attempt to refresh modules that actually have a refresh function\n if (typeof module.refresh === 'function') {\n promises.push(module.refresh());\n }\n }\n\n if (promises.length > 0) {\n try {\n // use timeout to prevent hanging if refresh takes too long\n await timeoutPromise(\n SDK_SCRIPTS_LOAD_TIMEOUT,\n Promise.all(promises),\n null,\n );\n } catch (e) {\n // ignore error and let the backend handle the lack of token\n this.loggerWrapper.error('Failed to refresh script module', e.message);\n }\n }\n }\n\n #addPasscodeAutoSubmitListeners(next: NextFn) {\n this.contentRootElement\n .querySelectorAll(`descope-passcode[data-auto-submit=\"true\"]`)\n .forEach((passcode: HTMLInputElement) => {\n passcode.addEventListener('input', () => {\n const isValid = passcode.checkValidity?.();\n if (isValid) {\n this.#handleSubmit(passcode, next);\n }\n });\n });\n }\n\n #hydrate(next: NextFn) {\n // hydrating the page\n // Adding event listeners to all buttons without the exclude attribute\n this.contentRootElement\n .querySelectorAll(\n `descope-button:not([${DESCOPE_ATTRIBUTE_EXCLUDE_NEXT_BUTTON}]), [data-type=\"button\"]:not([${DESCOPE_ATTRIBUTE_EXCLUDE_NEXT_BUTTON}]`,\n )\n .forEach((button: HTMLButtonElement) => {\n // eslint-disable-next-line no-param-reassign\n button.onclick = () => {\n this.#handleSubmit(button, next);\n };\n });\n\n this.#addPasscodeAutoSubmitListeners(next);\n\n if (this.isDismissScreenErrorOnInput) {\n // listen to all input events in order to clear the global error state\n this.contentRootElement\n .querySelectorAll(`*[name]:not([${DESCOPE_ATTRIBUTE_EXCLUDE_FIELD}])`)\n .forEach((ele) => {\n ele.addEventListener('input', () => {\n this.stepState.update((state) => ({\n ...state,\n screenState: {\n ...state.screenState,\n errorText: '',\n errorType: '',\n },\n }));\n });\n });\n }\n }\n\n #dispatch(eventName: string, detail: any) {\n this.dispatchEvent(new CustomEvent(eventName, { detail }));\n }\n\n // Determine if we should use postMessage fallback (popup-origin attribute exists)\n protected shouldUsePopupPostMessage(): boolean {\n if (!this.popupOrigin) return false;\n try {\n // validate origin format\n // eslint-disable-next-line no-new\n new URL(this.popupOrigin);\n } catch {\n return false; // malformed origin -> ignore\n }\n return true;\n }\n\n // Notify opener with code/exchangeError using either BroadcastChannel or postMessage fallback\n #notifyOpener(executionId: string, code: string, exchangeError: string) {\n const [prefix, openerOrigin] = window.name?.split('|') || [];\n const usePostMessageFallback = prefix === 'descope-wc' && openerOrigin;\n\n const message = { data: { code, exchangeError }, action: 'code' };\n\n // PostMessage fallback path (for cross-origin popups)\n if (usePostMessageFallback) {\n this.loggerWrapper.debug(\n 'Using postMessage fallback to notify opener in origin',\n openerOrigin,\n );\n try {\n window.opener.postMessage(message, openerOrigin);\n } catch (err) {\n this.loggerWrapper.error(\n 'Failed to send postMessage fallback (likely COOP isolation)',\n (err as any)?.message,\n );\n // If blocked by COOP, we cannot communicate cross-origin; log & abort silently\n }\n } else {\n // BroadcastChannel path (original behavior)\n this.loggerWrapper.debug('Creating popup channel', executionId);\n const channel = new BroadcastChannel(executionId);\n channel.postMessage(message);\n channel.close();\n }\n\n try {\n window.close();\n } catch (_) {\n /* ignore */\n }\n }\n}\n\nexport default DescopeWc;\n"],"names":["document","hidden","setTimeout","this","flowState","update","deferredRedirect","_DescopeWc_nativeBeforeScreen","screen","context","next","_a","nativeOptions","bridgeVersion","Promise","resolve","nativeCallbacks","screenNext","screenResolve","__classPrivateFieldGet","_DescopeWc_instances","_DescopeWc_nativeNotifyBridge","call","type","payload","_DescopeWc_dispatch","_DescopeWc_handleGlobalErrors","errorText","errorType","updateGlobalError","transformedErrorText","errorTransformer","text","e","loggerWrapper","error","message","replaceElementMessage","contentRootElement","addEventListener","once","_DescopeWc_subscribeStepState","stepState","subscribe","onStepChange","bind","_b","screenState","_c","state","__rest","Object","assign","forceUpdate","_DescopeWc_handlePasscodeCleanup","querySelectorAll","forEach","passcodeEle","shadowRoot","input","value","handleAutoFocus","autoFocus","_DescopeWc_handleFlowRestart","debug","prevCompVersion","getComponentsVersion","reset","stepId","executionId","stepStateUpdate","current","stepName","transformStepStateForCustomScreen","isCustomScreen","Boolean","onScreenUpdate","isFirstScreen","htmlFilename","_DescopeWc_toggleScreenVisibility","_DescopeWc_isPrevCustomScreen","currentMode","prevMode","sort","__classPrivateFieldSet","unsubscribeAll","_DescopeWc_dispatchPageEvents","disableKeyPressHandler","handleKeyPress","onTransitionEnd","classList","remove","add","inputEle","origName","getAttribute","includes","conditionalUiSupportName","setAttribute","_DescopeWc_handleWebauthnConditionalUi","fragment","_DescopeWc_conditionalUiAbortController","abort","conditionalUiInput","querySelector","isConditionalLoginSupported","options","transactionId","_DescopeWc_handleConditionalUiInput","AbortController","sdk","webauthn","helpers","conditional","then","response","__awaiter","id","catch","err","name","_DescopeWc_nativeAfterScreen","screenName","_DescopeWc_validateInputs","isValid","Array","from","reverse","localName","contains","reportValidity","checkValidity","_DescopeWc_getFormData","inputs","getInputs","all","map","reduce","acc","val","submitter","enabledElements","filter","ele","restoreComponentsState","removeEventListener","removeAttribute","flowConfig","getFlowConfig","clientScripts","sdkScripts","loadSdkScripts","handleScreenIdUpdates","window","_DescopeWc_prevPageShowListener","persisted","logger","unsubscribeScreenIdUpdates","screenId","prevScreenId","unsubscribe","unsubscribeNextRequestStatus","nextRequestStatus","isLoading","_DescopeWc_handleStoreCredentials","formData","getFirstNonEmptyValue","password","globalThis","PasswordCredential","cred","navigator","credentials","store","_DescopeWc_updateExternalInputs","clearPreviousExternalInputs","inp","targetSlot","slot","createElement","appendChild","screenScripts","_DescopeWc_sdkScriptsLoading","now","Date","toString","sdkScriptsModules","loadSdkScriptsModules","screenScriptIds","s","module","present","promises","refresh","push","length","timeoutPromise","SDK_SCRIPTS_LOAD_TIMEOUT","passcode","DESCOPE_ATTRIBUTE_EXCLUDE_NEXT_BUTTON","button","onclick","_DescopeWc_addPasscodeAutoSubmitListeners","isDismissScreenErrorOnInput","DESCOPE_ATTRIBUTE_EXCLUDE_FIELD","eventName","detail","dispatchEvent","CustomEvent","_DescopeWc_notifyOpener","code","exchangeError","prefix","openerOrigin","split","data","action","opener","postMessage","channel","BroadcastChannel","close","_","BaseDescopeWc","sdkConfigOverrides","config","constructor","State","super","_DescopeWc_pollingTimeout","set","_DescopeWc_eventsCbRefs","visibilitychange","_DescopeWc_syncStateWithVisibility","handleRedirect","redirectTo","location","toggleVisibility","toggle","slotElement","innerHTML","hasChildNodes","_DescopeWc_handlePageSwitchTransition","_DescopeWc_handlePollingResponse","flowVersion","componentsVersion","rescheduled","stopOnErrors","FLOW_TIMED_OUT_ERROR_CODE","POLLING_STATUS_NOT_FOUND_ERROR_CODE","RESPONSE_ACTIONS","poll","scheduledAt","delay","nextCall","flow","CUSTOM_INTERACTIONS","polling","throttled","sdkResp","timeout","warn","errorCode","FETCH_EXCEPTION_ERROR_CODE","JSON","stringify","_DescopeWc_handleSdkResponse","_DescopeWc_resetPollingTimeout","clearTimeout","ok","defaultMessage","url","defaultDescription","status","statusText","FETCH_ERROR_RESPONSE_ERROR_CODE","errorDescription","errorMessage","_d","_e","_f","FLOW_REQUESTED_IS_IN_OLD_VERSION_ERROR_CODE","isRestartOnError","_h","_g","runnerLogs","l","level","title","log","info","_l","_k","_j","_m","description","authInfo","lastAuth","openInNewTabUrl","storeLastAuthenticatedUser","setLastAuth","output","keys","flowOutput","open","redirect","samlIdpResponse","nativeResponse","reqTimestamp","_o","redirectIsPopup","isPopup","webauthnTransactionId","webauthnOptions","samlIdpResponseUrl","samlIdpResponseSamlResponse","samlResponse","samlIdpResponseRelayState","relayState","nativeResponseType","nativePayload","_DescopeWc_getWebauthnConditionalUiStartParams","withMemCache","startResp","signIn","start","origin","_DescopeWc_handleSubmit","leadingDebounce","submitterId","_DescopeWc_handleComponentsLoadingState","eleDescopeAttrs","getElementDescopeAttributes","actionArgs","nativeResume","parse","exchangeCode","URL","searchParams","get","URL_CODE_PARAM_NAME","complete","idpInitiated","token","URL_TOKEN_PARAM_NAME","URL_RUN_IDS_PARAM_NAME","pop","undefined","override","interactionId","form","scriptElements","el","moduleRes","scripts","createScriptCallback","script","result","getScriptResultPath","resultKey","bubbles","composed","join","scriptElement","injectNpmLib","descope","reject","initArgs","baseUrl","ref","newScriptElement","stop","toPromise","race","init","descopeBridge","_init","lazyInit","isConnected","onFlowChange","_super","disconnectedCallback","getHtmlFilenameWithLocale","locale","filenameWithLocale","userLocale","getUserLocale","targetLocales","getTargetLocales","fallback","getPageContent","htmlLocaleFilename","body","fetchStaticResource","ex","currentState","prevState","isChanged","projectId","flowId","tenant","redirectUrl","redirectAuthCodeChallenge","redirectAuthCallbackUrl","redirectAuthBackupCallbackUri","redirectAuthInitiator","ssoQueryParams","startScreenId","startScreenName","conditionInteractionId","abTestingKey","getABTestingKey","outboundAppId","outboundAppScopes","loginId","getLastUserLoginId","projectConfig","getProjectConfig","flowVersions","entries","flows","key","version","redirectAuth","callbackUrl","codeChallenge","backupCallbackUri","platform","oauthProvider","oauthRedirect","magicLinkRedirect","ssoRedirect","conditionComponentsConfig","conditions","conditionScripts","componentsConfig","calculateConditions","getLastAuth","condition","calculateCondition","fingerprintEnabled","fingerprintKey","ensureFingerprintIds","clearFingerprintData","showFirstScreenOnExecutionInit","client","formConfigValues","descopeIdpInitiated","oidcLoginHint","externalId","isCodeChanged","isExchangeErrorChanged","submit","loadForm","some","samlProp","injectSamlIdpForm","submitForm","popup","openCenteredPopup","usePostMessageFallback","shouldUsePopupPostMessage","onPostMessage","event","expectedOrigin","popupOrigin","popupAction","cleanup","intervalId","setInterval","closed","clearInterval","onmessage","webauthnCreate","webauthnGet","failure","create","nativeBridge","Event","readyScreenId","oidcPrompt","oidcErrorRedirectUri","oidcResource","samlIdpUsername","direction","getAnimationDirection","getLastUserDisplayName","_DescopeWc_runSdkScriptsModules","res","preview","getComponentsContext","transformScreenInputs","_DescopeWc_handleCustomScreen","stepTemplate","clone","content","cloneNode","loadDescopeUiComponents","isSupported","disableWebauthnButtons","email","updateTemplateFromScreenState","formConfig","geo","getExecutionContext","setPhoneAutoDetectDefaultCode","injectNextPage","rootElement","setTOTPVariable","totp","image","setNOTPVariable","notp","setCssVars","cssVars","replaceChildren","validateOnBlur","handleReportValidityOnBlur","updateScreenFromScreenState","_DescopeWc_hydrate","ELEMENT_TYPE_ATTRIBUTE"],"mappings":"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"}
|