@thunderid/browser 0.2.0 → 0.3.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["HttpClient","url: string","qs: string","headers: Record<string, string>","body: BodyInit | undefined","fetchResponse: Response","networkError: any","responseData: T","responseHeaders: Record<string, string>","OIDCRequestConstants","url: URL","error: string | null","description: string | null","urlObject: URL","ThunderIDAuthException","refreshTokenError: Message<string>","SPAUtils","error: any","refreshAccessTokenResponse: User","refreshError: any","error","requests: Promise<HttpResponse<any>>[]","promptNoneIFrame: HTMLIFrameElement","data: Message<AuthorizationInfo | null>","targetUrl: URL","_clientID: string","_checkSessionEndpoint: string","_sessionState: () => Promise<string>","_interval: number","_redirectURL: string","_sessionRefreshInterval: number","_sessionRefreshIntervalTimeout: number","_checkSessionIntervalTimeout: number","_getSignInUrl: (params?: ExtendedAuthorizeRequestUrlParams) => Promise<string>","opIframe: HTMLIFrameElement","promptNoneIFrame: HTMLIFrameElement","SPAUtils","OIDCRequestConstants","code","message: Message<AuthorizationInfo>","message: Message<null>","byteLength","len","i","i","buffer","Buffer","i","len","buffer","byteLength","code","Buffer","Buffer","Buffer","jwtVerifyOptions: JWTVerifyOptions","ThunderIDAuthException","TokenConstants","refreshTimer: number","logger","BrowserStorage","LocalStore","MemoryStore","SessionStore","ThunderIDJavaScriptClient","SPACryptoUtils","store: Storage","SPAHelper","FetchHttpClient","createSessionManagementHelper","OIDCRequestConstants","AuthenticationHelper","ThunderIDAuthException","SPAUtils","resolvedAuthorizationCode: string","resolvedSessionState: string","resolvedState: string","resolvedTokenRequestConfig: {params: Record<string, unknown>}","pkceKey: string","authorizeUrl: URL","code","afterSignOut: ((url: string) => void) | undefined","timer: number","urlString: string","logger: ReturnType<typeof createPackageComponentLogger>","ThunderIDRuntimeError","decodedChallenge: any","currentDomain: string","challengeRpId: string","rpIdToUse: string","adjustedOptions: any","credential: PublicKeyCredential","authData: AuthenticatorAssertionResponse","tokenResponse: {credential: any; requestId: string}","emoji: string","altMatch: RegExpMatchArray | null","logger: ReturnType<typeof createPackageComponentLogger>","observer: MutationObserver","mediaQuery: MediaQueryList","DEFAULT_THEME"],"sources":["../../src/constants/SPAConstants.ts","../../src/FetchHttpClient.ts","../../src/models/BrowserStorage.ts","../../src/stores/LocalStore.ts","../../src/stores/MemoryStore.ts","../../src/stores/SessionStore.ts","../../src/utils/SPAUtils.ts","../../src/utils/AuthenticationHelper.ts","../../src/utils/navigate.ts","../../src/utils/SessionManagementHelper.ts","../../../../node_modules/.pnpm/base64-js@1.5.1/node_modules/base64-js/index.js","../../../../node_modules/.pnpm/ieee754@1.2.1/node_modules/ieee754/index.js","../../../../node_modules/.pnpm/buffer@6.0.3/node_modules/buffer/index.js","../../../../node_modules/.pnpm/safe-buffer@5.2.1/node_modules/safe-buffer/index.js","../../../../node_modules/.pnpm/randombytes@2.1.0/node_modules/randombytes/browser.js","../../src/utils/SPACryptoUtils.ts","../../src/utils/SPAHelper.ts","../../src/ThunderIDBrowserClient.ts","../../src/constants/Hooks.ts","../../src/utils/hasAuthParamsInUrl.ts","../../src/utils/hasCalledForThisInstanceInUrl.ts","../../src/utils/http.ts","../../src/utils/handleWebAuthnAuthentication.ts","../../src/utils/v2/resolveEmojiUrisInHtml.ts","../../src/theme/themeDetection.ts","../../src/theme/getActiveTheme.ts"],"sourcesContent":["/**\n * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nexport const ERROR = 'error';\nexport const ERROR_DESCRIPTION = 'error_description';\nexport const CUSTOM_GRANT_CONFIG = 'custom_grant_config';\nexport const STATE_QUERY = 'state';\n\nexport const OP_IFRAME = 'opIFrame';\nexport const RP_IFRAME = 'rpIFrame';\nexport const PROMPT_NONE_IFRAME = 'promptNoneIFrame';\nexport const STATE = 'Y2hlY2tTZXNzaW9u';\nexport const SILENT_SIGN_IN_STATE = 'sign-in-silently';\nexport const INITIALIZED_SILENT_SIGN_IN = 'initialized-silent-sign-in';\nexport const PROMPT_NONE_REQUEST_SENT = 'promptNoneRequestSent';\n\nexport const ACCESS_TOKEN_INVALID = 'Access token is invalid';\nexport const REFRESH_ACCESS_TOKEN_ERR0R = 'refresh-access-token-error';\nexport const TOKEN_REQUEST_CONFIG_KEY = 'token_request_config';\n\nexport const CHECK_SESSION_SIGNED_IN = 'check_session_signed_in';\nexport const CHECK_SESSION_SIGNED_OUT = 'check_session_signed_out';\nexport const SET_SESSION_STATE_FROM_IFRAME = 'set_session_state_from_iframe';\n","/**\n * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport {HttpClient, HttpError, HttpRequestConfig, HttpResponse} from '@thunderid/javascript';\n\n/**\n * Fetch-based HTTP client. Extends `HttpClient` and implements `transport()`\n * using the native Fetch API.\n *\n * To plug in a custom HTTP transport, extend `HttpClient` from `@thunderid/javascript`\n * and override `transport()`, then pass your implementation where `FetchHttpClient`\n * is currently used.\n */\nexport class FetchHttpClient extends HttpClient {\n private static instances: Map<number, FetchHttpClient> = new Map<number, FetchHttpClient>();\n\n static getInstance(\n instanceId = 0,\n isHandlerEnabled = true,\n attachToken: (request: HttpRequestConfig) => Promise<void> = (): Promise<void> => Promise.resolve(),\n ): FetchHttpClient {\n if (!this.instances.has(instanceId)) {\n this.instances.set(instanceId, new FetchHttpClient(isHandlerEnabled, attachToken));\n }\n return this.instances.get(instanceId)!;\n }\n\n static destroyInstance(instanceId = 0): void {\n this.instances.delete(instanceId);\n }\n\n protected async transport<T = any>(config: HttpRequestConfig): Promise<HttpResponse<T>> {\n const {\n attachToken,\n data,\n headers: configHeaders,\n method,\n params,\n shouldAttachIDPAccessToken,\n shouldEncodeToFormData,\n startTimeInMs,\n url: configUrl,\n ...fetchOptions\n } = config;\n\n let url: string = configUrl ?? '';\n\n if (params) {\n const qs: string = new URLSearchParams(params).toString();\n if (qs) {\n url = `${url}${url.includes('?') ? '&' : '?'}${qs}`;\n }\n }\n\n const headers: Record<string, string> = {...(configHeaders ?? {})};\n let body: BodyInit | undefined;\n\n if (data !== undefined) {\n if (data instanceof FormData) {\n body = data;\n } else {\n body = JSON.stringify(data);\n if (!headers['Content-Type'] && !headers['content-type']) {\n headers['Content-Type'] = 'application/json';\n }\n }\n }\n\n let fetchResponse: Response;\n\n try {\n fetchResponse = await fetch(url, {\n credentials: 'include',\n ...fetchOptions,\n body,\n headers,\n method: (method ?? 'GET').toUpperCase(),\n });\n } catch (networkError: any) {\n throw Object.assign(new Error(networkError.message), {\n code: 'NETWORK_ERROR',\n config,\n } as Partial<HttpError>);\n }\n\n const contentType: string = fetchResponse.headers.get('content-type') ?? '';\n const responseData: T = contentType.includes('application/json')\n ? await fetchResponse.json()\n : ((await fetchResponse.text()) as any);\n\n const responseHeaders: Record<string, string> = {};\n fetchResponse.headers.forEach((value: string, key: string) => {\n responseHeaders[key] = value;\n });\n\n if (!fetchResponse.ok) {\n throw Object.assign(new Error(fetchResponse.statusText), {\n config,\n response: {\n data: responseData,\n headers: responseHeaders,\n status: fetchResponse.status,\n statusText: fetchResponse.statusText,\n },\n } as Partial<HttpError>);\n }\n\n return {\n config,\n data: responseData,\n headers: responseHeaders,\n status: fetchResponse.status,\n statusText: fetchResponse.statusText,\n };\n }\n}\n\nexport default FetchHttpClient;\n","/**\n * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\n/**\n * Supported browser storage backends for auth session data.\n */\nexport enum BrowserStorage {\n /** Store session data in `localStorage` (persists across tabs and sessions). */\n LocalStorage = 'localStorage',\n /** Store session data in `sessionStorage` (cleared when the tab is closed). */\n SessionStorage = 'sessionStorage',\n /** Store session data in in-memory (cleared on page reload). */\n BrowserMemory = 'browserMemory',\n}\n\nexport default BrowserStorage;\n","/**\n * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport {Storage} from '@thunderid/javascript';\n\n/**\n * `Storage` implementation backed by the browser's `localStorage`.\n */\nclass LocalStore implements Storage {\n public async setData(key: string, value: string): Promise<void> {\n localStorage.setItem(key, value);\n }\n\n public async getData(key: string): Promise<string> {\n return localStorage.getItem(key) ?? '{}';\n }\n\n public async removeData(key: string): Promise<void> {\n localStorage.removeItem(key);\n }\n}\n\nexport default LocalStore;\n","/**\n * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport {Storage} from '@thunderid/javascript';\n\n/**\n * `Storage` implementation backed by an in-memory `Map`. Data does not survive page reloads.\n */\nclass MemoryStore implements Storage {\n private _data: Map<string, string>;\n\n public constructor() {\n this._data = new Map();\n }\n\n public async setData(key: string, value: string): Promise<void> {\n this._data.set(key, value);\n }\n\n public async getData(key: string): Promise<string> {\n return this._data?.get(key) ?? '{}';\n }\n\n public async removeData(key: string): Promise<void> {\n this._data.delete(key);\n }\n}\n\nexport default MemoryStore;\n","/**\n * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport {Storage} from '@thunderid/javascript';\n\n/**\n * `Storage` implementation backed by the browser's `sessionStorage`.\n */\nclass SessionStore implements Storage {\n public async setData(key: string, value: string): Promise<void> {\n sessionStorage.setItem(key, value);\n }\n\n public async getData(key: string): Promise<string> {\n return sessionStorage.getItem(key) ?? '{}';\n }\n\n public async removeData(key: string): Promise<void> {\n sessionStorage.removeItem(key);\n }\n}\n\nexport default SessionStore;\n","/**\n * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport {OIDCRequestConstants} from '@thunderid/javascript';\nimport {\n ERROR,\n ERROR_DESCRIPTION,\n INITIALIZED_SILENT_SIGN_IN,\n PROMPT_NONE_REQUEST_SENT,\n SILENT_SIGN_IN_STATE,\n STATE_QUERY,\n} from '../constants/SPAConstants';\nimport {SignOutError} from '../models/SignOutError';\n\n/**\n * Static utility methods for SPA authentication flows including PKCE storage,\n * sign-out URL management, and URL-based state detection.\n */\nclass SPAUtils {\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private constructor() {}\n\n /**\n * Removes the `code` search parameter from the current URL without a page reload.\n */\n public static removeAuthorizationCode(): void {\n const url = location.href;\n\n history.pushState({}, document.title, url.replace(/\\?code=.*$/, ''));\n }\n\n /**\n * Retrieves a PKCE verifier from storage.\n *\n * @param pkceKey - The storage key for the PKCE verifier.\n * @returns The stored verifier string, or an empty string if not found.\n */\n public static getPKCE(pkceKey: string): string {\n return localStorage.getItem(pkceKey) ?? '';\n }\n\n /**\n * Persists a PKCE verifier in storage.\n *\n * @param pkceKey - The storage key.\n * @param pkce - The PKCE verifier value.\n */\n public static setPKCE(pkceKey: string, pkce: string): void {\n localStorage.setItem(pkceKey, pkce);\n }\n\n /**\n * Persists the post-sign-out redirect URL for the given client and instance.\n *\n * @param url - The sign-out redirect URL.\n * @param clientId - The OAuth2 client ID.\n * @param instanceId - The client instance ID.\n */\n public static setSignOutURL(url: string, clientId: string, instanceId: number): void {\n sessionStorage.setItem(\n `${OIDCRequestConstants.SignOut.Storage.StorageKeys.SIGN_OUT_URL}-instance_${instanceId}-${clientId}`,\n url,\n );\n }\n\n /**\n * Retrieves the stored sign-out redirect URL for the given client and instance.\n *\n * @param clientId - The OAuth2 client ID.\n * @param instanceId - The client instance ID.\n * @returns The stored sign-out URL, or an empty string.\n */\n public static getSignOutUrl(clientId: string, instanceId: number): string {\n return (\n sessionStorage.getItem(\n `${OIDCRequestConstants.SignOut.Storage.StorageKeys.SIGN_OUT_URL}-instance_${instanceId}-${clientId}`,\n ) ?? ''\n );\n }\n\n /**\n * Removes a PKCE verifier from storage.\n *\n * @param pkceKey - The storage key to remove.\n */\n public static removePKCE(pkceKey: string): void {\n localStorage.removeItem(pkceKey);\n }\n\n /**\n * Determines whether the `signIn` method should continue based on the `callOnlyOnRedirect` flag.\n *\n * @param callOnlyOnRedirect - True if the call should only proceed when redirected back from the IdP.\n * @param authorizationCode - Authorization code passed directly (form_post mode).\n * @returns `true` if sign-in should proceed.\n */\n public static canContinueSignIn(callOnlyOnRedirect: boolean, authorizationCode?: string): boolean {\n if (callOnlyOnRedirect && !SPAUtils.hasErrorInURL() && !SPAUtils.hasAuthSearchParamsInURL() && !authorizationCode) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Returns `true` if silent sign-in is in progress (silent-state present in the URL).\n */\n public static isInitializedSilentSignIn(): boolean {\n return SPAUtils.isSilentStatePresentInURL();\n }\n\n /**\n * Returns `true` if the `signIn` method was already called this navigation\n * (auth code or error is present in the URL, but not a silent flow).\n */\n public static wasSignInCalled(): boolean {\n if (SPAUtils.hasErrorInURL() || SPAUtils.hasAuthSearchParamsInURL()) {\n if (!this.isSilentStatePresentInURL()) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Returns `true` if a silent sign-in was previously initialized in this session.\n */\n public static wasSilentSignInCalled(): boolean {\n const raw = sessionStorage.getItem(INITIALIZED_SILENT_SIGN_IN);\n\n return Boolean(raw ? JSON.parse(raw) : null);\n }\n\n /**\n * Checks whether the current URL indicates a successful sign-out redirect.\n * Clears the query string and session data if `true`.\n *\n * @param isSignOutSuccessful - Static method from the JS client for URL inspection.\n * @param clearSession - Callback to clear session data after successful sign-out.\n * @returns `true` if the sign-out completed successfully.\n */\n public static async isSignOutSuccessful(\n isSignOutSuccessfulFn: (url: string) => boolean,\n clearSession: () => Promise<void>,\n ): Promise<boolean> {\n if (isSignOutSuccessfulFn(window.location.href)) {\n const newUrl = window.location.href.split('?')[0];\n history.pushState({}, document.title, newUrl);\n await clearSession();\n\n return true;\n }\n\n return false;\n }\n\n /**\n * Checks whether the current URL indicates a sign-out failure.\n * Returns the error details if present, or `false` otherwise.\n *\n * @param didSignOutFailFn - Static method from the JS client for URL inspection.\n * @returns The `SignOutError` if sign-out failed, or `false`.\n */\n public static didSignOutFail(didSignOutFailFn: (url: string) => boolean): boolean | SignOutError {\n if (didSignOutFailFn(window.location.href)) {\n const url: URL = new URL(window.location.href);\n const error: string | null = url.searchParams.get(ERROR);\n const description: string | null = url.searchParams.get(ERROR_DESCRIPTION);\n const newUrl = window.location.href.split('?')[0];\n history.pushState({}, document.title, newUrl);\n\n return {\n description: description ?? '',\n error: error ?? '',\n };\n }\n\n return false;\n }\n\n /**\n * Returns `true` if the URL contains a silent sign-in state parameter.\n */\n public static isSilentStatePresentInURL(): boolean {\n const state = new URL(window.location.href).searchParams.get('state');\n\n return state?.includes(SILENT_SIGN_IN_STATE) ?? false;\n }\n\n /**\n * Returns `true` if the current URL contains an authorization code (`code` parameter).\n *\n * @param params - Search params string (defaults to `window.location.search`).\n */\n public static hasAuthSearchParamsInURL(params: string = window.location.search): boolean {\n const AUTH_CODE_REGEXP = /[?&]code=[^&]+/;\n\n return AUTH_CODE_REGEXP.test(params);\n }\n\n /**\n * Returns `true` if the current URL contains an OAuth2 error parameter\n * (but not a sign-out success state).\n *\n * @param url - URL to inspect (defaults to `window.location.href`).\n */\n public static hasErrorInURL(url: string = window.location.href): boolean {\n const urlObject: URL = new URL(url);\n\n return (\n !!urlObject.searchParams.get(ERROR) &&\n urlObject.searchParams.get(STATE_QUERY) !== OIDCRequestConstants.Params.SIGN_OUT_SUCCESS\n );\n }\n\n /**\n * Returns `true` if no prompt-none request has been sent yet this session.\n */\n public static canSendPromptNoneRequest(): boolean {\n const raw = sessionStorage.getItem(PROMPT_NONE_REQUEST_SENT);\n\n return !(raw ? JSON.parse(raw) : null);\n }\n\n /**\n * Records whether a prompt-none request has been sent.\n *\n * @param canSend - `true` marks the request as sent.\n */\n public static setPromptNoneRequestSent(canSend: boolean): void {\n sessionStorage.setItem(PROMPT_NONE_REQUEST_SENT, JSON.stringify(canSend));\n }\n\n /**\n * Waits until the browser has redirected (non-blocking delay).\n *\n * @param time - Time to wait in seconds (default: 3).\n */\n public static async waitTillPageRedirect(time?: number): Promise<void> {\n const timeToWait = time ?? 3000;\n\n await new Promise((resolve) => setTimeout(resolve, timeToWait * 1000));\n }\n\n /**\n * Returns a Promise that resolves when `condition()` returns `true`.\n *\n * @param condition - Predicate to poll.\n * @param timeout - Poll interval in milliseconds (default: 500).\n */\n public static until = (condition: () => boolean, timeout = 500): Promise<void> => {\n const poll = (done: () => void): void => {\n if (condition()) {\n done();\n } else {\n setTimeout(() => poll(done), timeout);\n }\n };\n\n return new Promise(poll);\n };\n}\n\nexport default SPAUtils;\n","/**\n * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport {\n ThunderIDAuthException,\n User,\n IsomorphicCrypto,\n StorageManager,\n IdToken,\n ExtendedAuthorizeRequestUrlParams,\n OIDCEndpoints,\n TokenResponse,\n Config,\n HttpClient,\n HttpError,\n HttpRequestConfig,\n HttpResponse,\n} from '@thunderid/javascript';\nimport SPAHelper from './SPAHelper';\nimport SPAUtils from './SPAUtils';\nimport {\n ACCESS_TOKEN_INVALID,\n CHECK_SESSION_SIGNED_IN,\n CHECK_SESSION_SIGNED_OUT,\n CUSTOM_GRANT_CONFIG,\n ERROR,\n ERROR_DESCRIPTION,\n PROMPT_NONE_IFRAME,\n REFRESH_ACCESS_TOKEN_ERR0R,\n RP_IFRAME,\n} from '../constants/SPAConstants';\nimport {SPATokenExchangeConfig} from '../models/TokenExchangeConfig';\n\ninterface AuthorizationInfo {\n code: string;\n sessionState: string;\n pkce?: string;\n state: string;\n tokenRequestConfig?: {params: Record<string, unknown>};\n}\n\ninterface Message<T> {\n type: string;\n data?: T;\n}\n\ninterface HttpRequestInterface {\n httpClient: HttpClient;\n requestConfig: HttpRequestConfig;\n isHttpHandlerEnabled?: boolean;\n httpErrorCallback?: (error: HttpError) => void | Promise<void>;\n httpFinishCallback?: () => void;\n enableRetrievingSignOutURLFromSession?: (config: SPATokenExchangeConfig) => void;\n}\n\ninterface SessionManagementHelperInterface {\n initialize(\n clientId: string,\n checkSessionEndpoint: string,\n getSessionState: () => Promise<string>,\n interval: number,\n sessionRefreshInterval: number,\n redirectURL: string,\n getSignInUrl: (params?: ExtendedAuthorizeRequestUrlParams) => Promise<string>,\n ): void;\n receivePromptNoneResponse(setSessionState?: (sessionState: string | null) => Promise<void>): Promise<boolean>;\n reset(): void;\n}\n\n/**\n * Browser-level authentication helper that orchestrates HTTP requests with token attachment,\n * automatic token refresh, session management, and the silent sign-in flow.\n *\n * @typeParam T - The browser client config extension type.\n */\nclass AuthenticationHelper<T> {\n private _storageManager: StorageManager<T>;\n private _spaHelper: SPAHelper<T>;\n private _instanceId: number;\n private _isTokenRefreshing: boolean;\n private _getUser: () => Promise<User>;\n private _refreshAccessToken: () => Promise<TokenResponse | User>;\n private _getAccessToken: (sessionId?: string) => Promise<string>;\n private _getIDPAccessToken: () => Promise<string>;\n private _isSignedIn: () => Promise<boolean>;\n private _getDecodedIdToken: (sessionId?: string) => Promise<IdToken>;\n private _getCrypto: () => Promise<IsomorphicCrypto>;\n private _getIdToken: () => Promise<string>;\n private _getOpenIDProviderEndpoints: () => Promise<OIDCEndpoints>;\n private _exchangeToken: (config: SPATokenExchangeConfig) => Promise<Response | TokenResponse | User>;\n private _setPKCECode: (pkceKey: string, state: string) => Promise<void>;\n\n /**\n * @param storageManager - Storage manager for reading config and session data.\n * @param spaHelper - Helper for managing token refresh timers.\n * @param instanceId - The instance ID used for signing out URL storage.\n * @param operations - Client operation callbacks to avoid circular dependency.\n */\n public constructor(\n storageManager: StorageManager<T>,\n spaHelper: SPAHelper<T>,\n instanceId: number,\n operations: {\n getUser: () => Promise<User>;\n refreshAccessToken: () => Promise<TokenResponse | User>;\n getAccessToken: (sessionId?: string) => Promise<string>;\n getIDPAccessToken: () => Promise<string>;\n isSignedIn: () => Promise<boolean>;\n getDecodedIdToken: (sessionId?: string) => Promise<IdToken>;\n getCrypto: () => Promise<IsomorphicCrypto>;\n getIdToken: () => Promise<string>;\n getOpenIDProviderEndpoints: () => Promise<OIDCEndpoints>;\n exchangeToken: (config: SPATokenExchangeConfig) => Promise<Response | TokenResponse | User>;\n setPKCECode: (pkceKey: string, state: string) => Promise<void>;\n },\n ) {\n this._storageManager = storageManager;\n this._spaHelper = spaHelper;\n this._instanceId = instanceId;\n this._isTokenRefreshing = false;\n this._getUser = operations.getUser;\n this._refreshAccessToken = operations.refreshAccessToken;\n this._getAccessToken = operations.getAccessToken;\n this._getIDPAccessToken = operations.getIDPAccessToken;\n this._isSignedIn = operations.isSignedIn;\n this._getDecodedIdToken = operations.getDecodedIdToken;\n this._getCrypto = operations.getCrypto;\n this._getIdToken = operations.getIdToken;\n this._getOpenIDProviderEndpoints = operations.getOpenIDProviderEndpoints;\n this._exchangeToken = operations.exchangeToken;\n this._setPKCECode = operations.setPKCECode;\n }\n\n /**\n * Enables request interception on the HTTP client.\n *\n * @param httpClient - The HTTP client to enable.\n */\n public enableHttpHandler(httpClient: HttpClient): void {\n httpClient?.enableHandler && httpClient.enableHandler();\n }\n\n /**\n * Disables request interception on the HTTP client.\n *\n * @param httpClient - The HTTP client to disable.\n */\n public disableHttpHandler(httpClient: HttpClient): void {\n httpClient?.disableHandler && httpClient.disableHandler();\n }\n\n /**\n * Initializes OIDC Session Management via an RP iframe.\n *\n * @param config - The current auth config.\n * @param oidcEndpoints - Resolved OIDC provider endpoints.\n * @param getSessionState - Returns the current session state from storage.\n * @param getAuthzURL - Builds an authorization URL with optional params.\n * @param sessionManagementHelper - The session management helper instance.\n */\n public initializeSessionManger(\n config: any,\n oidcEndpoints: OIDCEndpoints,\n getSessionState: () => Promise<string>,\n getAuthzURL: (params?: ExtendedAuthorizeRequestUrlParams) => Promise<string>,\n sessionManagementHelper: SessionManagementHelperInterface,\n ): void {\n sessionManagementHelper.initialize(\n config.clientId,\n oidcEndpoints.checkSessionIframe ?? '',\n getSessionState,\n config.checkSessionInterval ?? 3,\n config.sessionRefreshInterval ?? 300,\n config.afterSignInUrl,\n getAuthzURL,\n );\n }\n\n /**\n * Executes a custom token exchange grant, enforcing `allowedExternalUrls` rules when applicable.\n *\n * @param config - The token exchange configuration.\n * @param enableRetrievingSignOutURLFromSession - Callback invoked when `preventSignOutURLUpdate` is set.\n * @returns The user session or raw response.\n */\n public async exchangeToken(\n config: SPATokenExchangeConfig,\n enableRetrievingSignOutURLFromSession?: (config: SPATokenExchangeConfig) => void,\n ): Promise<User | Response> {\n const _config: Config = (await this._storageManager.getConfigData()) as Config;\n let useDefaultEndpoint = true;\n let matches = false;\n\n if (config?.tokenEndpoint) {\n useDefaultEndpoint = false;\n matches = true;\n }\n\n if (config.shouldReplayAfterRefresh) {\n this._storageManager.setTemporaryDataParameter(CUSTOM_GRANT_CONFIG, JSON.stringify(config));\n }\n\n if (useDefaultEndpoint || matches) {\n return this._exchangeToken(config)\n .then(async (response: Response | TokenResponse) => {\n if (enableRetrievingSignOutURLFromSession && typeof enableRetrievingSignOutURLFromSession === 'function') {\n enableRetrievingSignOutURLFromSession(config);\n }\n\n if (config.returnsSession) {\n await this._spaHelper.refreshAccessTokenAutomatically(() => this.refreshAccessToken());\n\n return this._getUser();\n } else {\n return response as Response;\n }\n })\n .catch((error) => {\n return Promise.reject(error);\n });\n } else {\n return Promise.reject(\n new ThunderIDAuthException(\n 'SPA-MAIN_THREAD_CLIENT-RCG-IV01',\n 'Request to the provided endpoint is prohibited.',\n 'Requests can only be sent to resource servers specified by the `allowedExternalUrls`' +\n ' attribute while initializing the SDK.',\n ),\n );\n }\n }\n\n /**\n * Returns the stored custom grant config if a replay-after-refresh was scheduled, or `null`.\n */\n public async getCustomGrantConfigData(): Promise<SPATokenExchangeConfig | null> {\n const configString = await this._storageManager.getTemporaryDataParameter(CUSTOM_GRANT_CONFIG);\n\n if (configString) {\n return JSON.parse(configString as string);\n } else {\n return null;\n }\n }\n\n /**\n * Refreshes the access token, replays any scheduled custom grant, and reschedules auto-refresh.\n *\n * @param enableRetrievingSignOutURLFromSession - Callback for custom grant sign-out URL handling.\n * @returns The updated user session.\n */\n public async refreshAccessToken(\n enableRetrievingSignOutURLFromSession?: (config: SPATokenExchangeConfig) => void,\n ): Promise<User> {\n try {\n await this._refreshAccessToken();\n const customGrantConfig = await this.getCustomGrantConfigData();\n if (customGrantConfig) {\n await this.exchangeToken(customGrantConfig, enableRetrievingSignOutURLFromSession);\n }\n await this._spaHelper.refreshAccessTokenAutomatically(() => this.refreshAccessToken());\n\n return this._getUser();\n } catch (error) {\n const refreshTokenError: Message<string> = {\n type: REFRESH_ACCESS_TOKEN_ERR0R,\n };\n\n window.postMessage(refreshTokenError);\n return Promise.reject(error);\n }\n }\n\n private async retryFailedRequests(failedRequest: HttpRequestInterface): Promise<HttpResponse> {\n const {httpClient, requestConfig, isHttpHandlerEnabled, httpErrorCallback, httpFinishCallback} = failedRequest;\n\n await SPAUtils.until(() => !this._isTokenRefreshing);\n\n try {\n return await httpClient.request(requestConfig);\n } catch (error: any) {\n if (isHttpHandlerEnabled) {\n if (typeof httpErrorCallback === 'function') {\n await httpErrorCallback(error);\n }\n if (typeof httpFinishCallback === 'function') {\n httpFinishCallback();\n }\n }\n\n return Promise.reject(error);\n }\n }\n\n /**\n * Sends an HTTP request via the provided client, automatically attaching the token,\n * and retries once after a token refresh on a 401 response.\n *\n * @param httpClient - The HTTP client to use.\n * @param requestConfig - The request configuration.\n * @param isHttpHandlerEnabled - Whether request callbacks are active.\n * @param httpErrorCallback - Called when a request fails.\n * @param httpFinishCallback - Called when a request finishes.\n * @param enableRetrievingSignOutURLFromSession - Callback for custom grant sign-out handling.\n * @returns The HTTP response.\n */\n public async httpRequest(\n httpClient: HttpClient,\n requestConfig: HttpRequestConfig,\n isHttpHandlerEnabled?: boolean,\n httpErrorCallback?: (error: HttpError) => void | Promise<void>,\n httpFinishCallback?: () => void,\n enableRetrievingSignOutURLFromSession?: (config: SPATokenExchangeConfig) => void,\n ): Promise<HttpResponse> {\n return httpClient\n .request(requestConfig)\n .then((response: HttpResponse) => {\n return Promise.resolve(response);\n })\n .catch(async (error: HttpError) => {\n if (error?.response?.status === 401 || !error?.response) {\n if (this._isTokenRefreshing) {\n return this.retryFailedRequests({\n enableRetrievingSignOutURLFromSession,\n httpClient,\n httpErrorCallback,\n httpFinishCallback,\n isHttpHandlerEnabled,\n requestConfig,\n });\n }\n\n this._isTokenRefreshing = true;\n let refreshAccessTokenResponse: User;\n try {\n refreshAccessTokenResponse = await this.refreshAccessToken(enableRetrievingSignOutURLFromSession);\n this._isTokenRefreshing = false;\n } catch (refreshError: any) {\n this._isTokenRefreshing = false;\n\n if (isHttpHandlerEnabled) {\n if (typeof httpErrorCallback === 'function') {\n await httpErrorCallback({...error, code: ACCESS_TOKEN_INVALID});\n }\n if (typeof httpFinishCallback === 'function') {\n httpFinishCallback();\n }\n }\n\n throw new ThunderIDAuthException(\n 'SPA-AUTH_HELPER-HR-SE01',\n refreshError?.name ?? 'Refresh token request failed.',\n refreshError?.message ?? 'An error occurred while trying to refresh the access token.',\n );\n }\n\n if (refreshAccessTokenResponse) {\n try {\n return await httpClient.request(requestConfig);\n } catch (error: any) {\n if (isHttpHandlerEnabled) {\n if (typeof httpErrorCallback === 'function') {\n await httpErrorCallback(error);\n }\n if (typeof httpFinishCallback === 'function') {\n httpFinishCallback();\n }\n }\n return Promise.reject(error);\n }\n }\n }\n\n if (isHttpHandlerEnabled) {\n if (typeof httpErrorCallback === 'function') {\n await httpErrorCallback(error);\n }\n if (typeof httpFinishCallback === 'function') {\n httpFinishCallback();\n }\n }\n\n return Promise.reject(error);\n });\n }\n\n /**\n * Sends multiple HTTP requests in parallel via the provided client,\n * retrying all on a 401 after a token refresh.\n *\n * @param requestConfigs - Array of request configurations.\n * @param httpClient - The HTTP client to use.\n * @param isHttpHandlerEnabled - Whether request callbacks are active.\n * @param httpErrorCallback - Called when a batch fails.\n * @param httpFinishCallback - Called when the batch finishes.\n * @returns Array of responses.\n */\n public async httpRequestAll(\n requestConfigs: HttpRequestConfig[],\n httpClient: HttpClient,\n isHttpHandlerEnabled?: boolean,\n httpErrorCallback?: (error: HttpError) => void | Promise<void>,\n httpFinishCallback?: () => void,\n ): Promise<HttpResponse[] | undefined> {\n const requests: Promise<HttpResponse<any>>[] = requestConfigs.map((req) => httpClient.request(req));\n\n return (\n httpClient?.all &&\n httpClient\n .all(requests)\n .then((responses: HttpResponse[]) => {\n return Promise.resolve(responses);\n })\n .catch(async (error: HttpError) => {\n if (error?.response?.status === 401 || !error?.response) {\n try {\n await this._refreshAccessToken();\n } catch (refreshError: any) {\n if (isHttpHandlerEnabled) {\n if (typeof httpErrorCallback === 'function') {\n await httpErrorCallback({...error, code: ACCESS_TOKEN_INVALID});\n }\n if (typeof httpFinishCallback === 'function') {\n httpFinishCallback();\n }\n }\n\n throw new ThunderIDAuthException(\n 'SPA-AUTH_HELPER-HRA-SE01',\n refreshError?.name ?? 'Refresh token request failed.',\n refreshError?.message ?? 'An error occurred while trying to refresh the access token.',\n );\n }\n\n return (\n httpClient.all &&\n httpClient\n .all(requests)\n .then((response) => Promise.resolve(response))\n .catch(async (error) => {\n if (isHttpHandlerEnabled) {\n if (typeof httpErrorCallback === 'function') {\n await httpErrorCallback(error);\n }\n if (typeof httpFinishCallback === 'function') {\n httpFinishCallback();\n }\n }\n return Promise.reject(error);\n })\n );\n }\n\n if (isHttpHandlerEnabled) {\n if (typeof httpErrorCallback === 'function') {\n await httpErrorCallback(error);\n }\n if (typeof httpFinishCallback === 'function') {\n httpFinishCallback();\n }\n }\n\n return Promise.reject(error);\n })\n );\n }\n\n /**\n * Executes the silent sign-in flow using a prompt-none request via an iFrame.\n *\n * @param constructSilentSignInUrl - Builds the prompt-none authorize URL.\n * @param requestAccessToken - Exchanges the returned code for tokens.\n * @param sessionManagementHelper - Handles the iFrame prompt-none response.\n * @param additionalParams - Extra authorize request params.\n * @param tokenRequestConfig - Additional params for the token request.\n * @returns The user session, or `false` if the user is not signed in.\n */\n public async signInSilently(\n constructSilentSignInUrl: (additionalParams?: Record<string, string | boolean>) => Promise<string>,\n requestAccessToken: (\n authzCode: string,\n sessionState: string,\n state: string,\n tokenRequestConfig?: {params: Record<string, unknown>},\n ) => Promise<User>,\n sessionManagementHelper: SessionManagementHelperInterface,\n additionalParams?: Record<string, string | boolean>,\n tokenRequestConfig?: {params: Record<string, unknown>},\n ): Promise<User | boolean> {\n if (SPAUtils.isInitializedSilentSignIn()) {\n await sessionManagementHelper.receivePromptNoneResponse();\n\n return Promise.resolve({\n allowedScopes: '',\n displayName: '',\n email: '',\n sessionState: '',\n sub: '',\n tenantDomain: '',\n username: '',\n });\n }\n\n const rpIFrame = document.getElementById(RP_IFRAME) as HTMLIFrameElement;\n const promptNoneIFrame: HTMLIFrameElement = rpIFrame?.contentDocument?.getElementById(\n PROMPT_NONE_IFRAME,\n ) as HTMLIFrameElement;\n\n try {\n const url = await constructSilentSignInUrl(additionalParams);\n promptNoneIFrame.src = url;\n } catch (error) {\n return Promise.reject(error);\n }\n\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n resolve(false);\n }, 10000);\n\n const listenToPromptNoneIFrame = async (e: MessageEvent) => {\n const data: Message<AuthorizationInfo | null> = e.data;\n\n if (data?.type == CHECK_SESSION_SIGNED_OUT) {\n window.removeEventListener('message', listenToPromptNoneIFrame);\n clearTimeout(timer);\n resolve(false);\n }\n\n if (data?.type == CHECK_SESSION_SIGNED_IN && (data?.data)?.code) {\n const authInfo = data.data;\n requestAccessToken(authInfo.code, authInfo.sessionState, authInfo.state, tokenRequestConfig)\n .then((response: User) => {\n window.removeEventListener('message', listenToPromptNoneIFrame);\n resolve(response);\n })\n .catch((error) => {\n window.removeEventListener('message', listenToPromptNoneIFrame);\n reject(error);\n })\n .finally(() => {\n clearTimeout(timer);\n });\n }\n };\n\n window.addEventListener('message', listenToPromptNoneIFrame);\n });\n }\n\n /**\n * Handles the early-return path of `signIn()` when a session already exists\n * or the page is handling a prompt-none response.\n *\n * @param shouldStopAuthn - Returns `true` if we should short-circuit and return early.\n * @param checkSession - Callback to initialize OIDC session management.\n * @returns The current user if already signed in, or `undefined` to continue normal sign-in.\n */\n public async handleSignIn(\n shouldStopAuthn: () => Promise<boolean>,\n checkSession: () => Promise<void>,\n ): Promise<User | undefined> {\n const config = await this._storageManager.getConfigData();\n const configAny = config as any;\n\n if (await shouldStopAuthn()) {\n return Promise.resolve({\n allowedScopes: '',\n displayName: '',\n email: '',\n sessionState: '',\n sub: '',\n tenantDomain: '',\n username: '',\n });\n }\n\n if (await this._isSignedIn()) {\n await this._spaHelper.clearRefreshTokenTimeout();\n await this._spaHelper.refreshAccessTokenAutomatically(() => this.refreshAccessToken());\n\n if (configAny.syncSession) {\n checkSession();\n }\n\n return Promise.resolve(await this._getUser());\n }\n\n const error = new URL(window.location.href).searchParams.get(ERROR);\n const errorDescription = new URL(window.location.href).searchParams.get(ERROR_DESCRIPTION);\n\n if (error) {\n const url = new URL(window.location.href);\n url.searchParams.delete(ERROR);\n url.searchParams.delete(ERROR_DESCRIPTION);\n\n history.pushState(null, document.title, url.toString());\n\n throw new ThunderIDAuthException('SPA-AUTH_HELPER-SI-SE01', error, errorDescription ?? '');\n }\n\n return Promise.resolve(undefined);\n }\n\n /**\n * Attaches the access token (or IDP token) to an HTTP request config's `Authorization` header.\n *\n * @param request - The request config to mutate.\n */\n public async attachTokenToRequestConfig(request: HttpRequestConfig): Promise<void> {\n const requestConfig = {attachToken: true, ...request};\n if (requestConfig.attachToken) {\n if (requestConfig.shouldAttachIDPAccessToken) {\n request.headers = {\n ...request.headers,\n Authorization: `Bearer ${await this._getIDPAccessToken()}`,\n };\n } else {\n request.headers = {\n ...request.headers,\n Authorization: `Bearer ${await this._getAccessToken()}`,\n };\n }\n }\n }\n\n /** Returns the current authenticated user from the ID token. */\n public async getUser(): Promise<User> {\n return this._getUser();\n }\n\n /**\n * Returns the decoded ID token payload.\n *\n * @param sessionId - Optional session ID.\n */\n public async getDecodedIdToken(sessionId?: string): Promise<IdToken> {\n return this._getDecodedIdToken(sessionId);\n }\n\n /** Returns the IsomorphicCrypto instance used by the client. */\n public async getCrypto(): Promise<IsomorphicCrypto> {\n return this._getCrypto();\n }\n\n /** Returns the raw ID token string. */\n public async getIdToken(): Promise<string> {\n return this._getIdToken();\n }\n\n /** Returns the resolved OIDC provider endpoints. */\n public async getOpenIDProviderEndpoints(): Promise<OIDCEndpoints> {\n return this._getOpenIDProviderEndpoints();\n }\n\n /**\n * Returns the current access token.\n *\n * @param sessionId - Optional session ID.\n */\n public async getAccessToken(sessionId?: string): Promise<string> {\n return this._getAccessToken(sessionId);\n }\n\n /** Returns the IDP access token from the session. */\n public async getIDPAccessToken(): Promise<string> {\n return (await this._storageManager.getSessionData())?.access_token;\n }\n\n /** Returns the storage manager. */\n public getStorageManager(): StorageManager<T> {\n return this._storageManager;\n }\n\n /** Returns whether the user is currently signed in. */\n public async isSignedIn(): Promise<boolean> {\n return this._isSignedIn();\n }\n}\n\nexport default AuthenticationHelper;\n","/**\n * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\n/**\n * Navigates to a new URL within the browser.\n *\n * - For same-origin URLs (relative paths or absolute URLs with the same origin),\n * uses the History API and dispatches a `popstate` event (SPA navigation).\n * - For cross-origin URLs, performs a full page load using `window.location.assign`.\n *\n * This allows seamless navigation for both SPA routes and external links.\n *\n * @param url - The target URL to navigate to. Can be a path, query, or absolute URL.\n *\n * @example\n * ```typescript\n * // SPA navigation (same origin)\n * navigate('/dashboard');\n *\n * // SPA navigation with query\n * navigate('/search?q=thunderid');\n *\n * // Cross-origin navigation (full page load)\n * navigate('https://localhost:8090/accountrecoveryendpoint/register.do');\n * ```\n */\nconst navigate = (url: string): void => {\n try {\n const targetUrl: URL = new URL(url, window.location.origin);\n if (targetUrl.origin === window.location.origin) {\n window.history.pushState(null, '', targetUrl.pathname + targetUrl.search + targetUrl.hash);\n window.dispatchEvent(new PopStateEvent('popstate', {state: null}));\n } else {\n window.location.assign(targetUrl.href);\n }\n } catch {\n // If URL constructor fails (e.g., malformed URL), fallback to location.assign\n window.location.assign(url);\n }\n};\n\nexport default navigate;\n","/**\n * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport {ExtendedAuthorizeRequestUrlParams, OIDCRequestConstants} from '@thunderid/javascript';\nimport SPAUtils from './SPAUtils';\nimport {\n CHECK_SESSION_SIGNED_IN,\n CHECK_SESSION_SIGNED_OUT,\n INITIALIZED_SILENT_SIGN_IN,\n OP_IFRAME,\n PROMPT_NONE_IFRAME,\n RP_IFRAME,\n SET_SESSION_STATE_FROM_IFRAME,\n SILENT_SIGN_IN_STATE,\n STATE,\n STATE_QUERY,\n} from '../constants/SPAConstants';\n\ninterface AuthorizationInfo {\n code: string;\n sessionState: string;\n state: string;\n}\n\ninterface Message<T> {\n type: string;\n data?: T;\n}\n\n/**\n * Interface for the session management helper returned by {@link createSessionManagementHelper}.\n */\nexport interface SessionManagementHelperInterface {\n /** Starts session polling and sets up the RP iframe. */\n initialize(\n clientId: string,\n checkSessionEndpoint: string,\n getSessionState: () => Promise<string>,\n interval: number,\n sessionRefreshInterval: number,\n redirectURL: string,\n getSignInUrl: (params?: ExtendedAuthorizeRequestUrlParams) => Promise<string>,\n ): void;\n /**\n * Processes a prompt-none response when the page is loaded inside the prompt-none iframe.\n * Returns `true` if the current page load was a prompt-none response.\n */\n receivePromptNoneResponse(setSessionState?: (sessionState: string | null) => Promise<void>): Promise<boolean>;\n /** Clears the session check and refresh intervals. */\n reset(): void;\n}\n\n/**\n * Factory that creates an OIDC Session Management helper using an RP iframe and polling.\n * Appends a hidden RP iframe to the document and returns the helper interface.\n *\n * @param signOut - Returns the sign-out URL for the current session.\n * @param setSessionState - Stores a new session state from a prompt-none response.\n * @returns A `SessionManagementHelperInterface` instance.\n */\nexport const createSessionManagementHelper = async (\n signOut: () => Promise<string>,\n setSessionState: (sessionState: string) => void,\n): Promise<SessionManagementHelperInterface> => {\n let _clientID: string;\n let _checkSessionEndpoint: string;\n let _sessionState: () => Promise<string>;\n let _interval: number;\n let _redirectURL: string;\n let _sessionRefreshInterval: number;\n let _sessionRefreshIntervalTimeout: number;\n let _checkSessionIntervalTimeout: number;\n let _getSignInUrl: (params?: ExtendedAuthorizeRequestUrlParams) => Promise<string>;\n\n const initialize = (\n clientId: string,\n checkSessionEndpoint: string,\n getSessionState: () => Promise<string>,\n interval: number,\n sessionRefreshInterval: number,\n redirectURL: string,\n getSignInUrl: (params?: ExtendedAuthorizeRequestUrlParams) => Promise<string>,\n ): void => {\n _clientID = clientId;\n _checkSessionEndpoint = checkSessionEndpoint;\n _sessionState = getSessionState;\n _interval = interval;\n _redirectURL = redirectURL;\n _sessionRefreshInterval = sessionRefreshInterval;\n _getSignInUrl = getSignInUrl;\n\n if (_interval > -1) {\n initiateCheckSession();\n }\n\n if (_sessionRefreshInterval > -1) {\n _sessionRefreshIntervalTimeout = setInterval(() => {\n sendPromptNoneRequest();\n }, _sessionRefreshInterval * 1000) as unknown as number;\n }\n };\n\n const initiateCheckSession = async (): Promise<void> => {\n if (!_checkSessionEndpoint || !_clientID || !_redirectURL) {\n return;\n }\n\n async function checkSession(): Promise<void> {\n const sessionState = await _sessionState();\n if (Boolean(_clientID) && Boolean(sessionState)) {\n const message = `${_clientID} ${sessionState}`;\n const rpIFrame = document.getElementById(RP_IFRAME) as HTMLIFrameElement;\n const opIframe: HTMLIFrameElement = rpIFrame?.contentDocument?.getElementById(OP_IFRAME) as HTMLIFrameElement;\n const win: Window | null = opIframe.contentWindow;\n win?.postMessage(message, _checkSessionEndpoint);\n }\n }\n\n const rpIFrame = document.getElementById(RP_IFRAME) as HTMLIFrameElement;\n const opIframe: HTMLIFrameElement = rpIFrame?.contentDocument?.getElementById(OP_IFRAME) as HTMLIFrameElement;\n opIframe.src = _checkSessionEndpoint + '?client_id=' + _clientID + '&redirect_uri=' + _redirectURL;\n\n _checkSessionIntervalTimeout = setInterval(checkSession, _interval * 1000) as unknown as number;\n\n listenToResponseFromOPIFrame();\n };\n\n const reset = (): void => {\n clearInterval(_checkSessionIntervalTimeout);\n clearInterval(_sessionRefreshIntervalTimeout);\n };\n\n const listenToResponseFromOPIFrame = (): void => {\n async function receiveMessage(e: MessageEvent) {\n const targetOrigin = _checkSessionEndpoint;\n\n if (!targetOrigin || targetOrigin?.indexOf(e.origin) < 0 || e?.data?.type === SET_SESSION_STATE_FROM_IFRAME) {\n return;\n }\n\n if (e.data === 'unchanged') {\n // session state has not changed\n } else if (e.data === 'error') {\n window.location.href = await signOut();\n } else if (e.data === 'changed') {\n sendPromptNoneRequest();\n }\n }\n\n window?.addEventListener('message', receiveMessage, false);\n };\n\n const sendPromptNoneRequest = async () => {\n const rpIFrame = document.getElementById(RP_IFRAME) as HTMLIFrameElement;\n const promptNoneIFrame: HTMLIFrameElement = rpIFrame?.contentDocument?.getElementById(\n PROMPT_NONE_IFRAME,\n ) as HTMLIFrameElement;\n\n if (SPAUtils.canSendPromptNoneRequest()) {\n SPAUtils.setPromptNoneRequestSent(true);\n\n const receiveMessageListener = (e: MessageEvent<Message<string>>) => {\n if (e?.data?.type === SET_SESSION_STATE_FROM_IFRAME) {\n setSessionState(e?.data?.data ?? '');\n window?.removeEventListener('message', receiveMessageListener);\n }\n };\n\n window?.addEventListener('message', receiveMessageListener);\n\n const promptNoneURL: string = await _getSignInUrl({\n prompt: 'none',\n response_mode: 'query',\n state: STATE,\n });\n\n promptNoneIFrame.src = promptNoneURL;\n }\n };\n\n const receivePromptNoneResponse = async (\n setSessionStateFn?: (sessionState: string | null) => Promise<void>,\n ): Promise<boolean> => {\n const state = new URL(window.location.href).searchParams.get(STATE_QUERY);\n const sessionState = new URL(window.location.href).searchParams.get(OIDCRequestConstants.Params.SESSION_STATE);\n const parent = window.parent.parent;\n\n if (state !== null && (state.includes(STATE) || state.includes(SILENT_SIGN_IN_STATE))) {\n const code = new URL(window.location.href).searchParams.get('code');\n\n if (code !== null && code.length !== 0) {\n if (state.includes(SILENT_SIGN_IN_STATE)) {\n const message: Message<AuthorizationInfo> = {\n data: {\n code,\n sessionState: sessionState ?? '',\n state,\n },\n type: CHECK_SESSION_SIGNED_IN,\n };\n\n sessionStorage.setItem(INITIALIZED_SILENT_SIGN_IN, 'false');\n parent.postMessage(message, parent.origin);\n SPAUtils.setPromptNoneRequestSent(false);\n\n window.location.href = 'about:blank';\n\n await SPAUtils.waitTillPageRedirect();\n\n return true;\n }\n\n const newSessionState = new URL(window.location.href).searchParams.get('session_state');\n\n setSessionStateFn && (await setSessionStateFn(newSessionState));\n\n SPAUtils.setPromptNoneRequestSent(false);\n\n window.location.href = 'about:blank';\n\n await SPAUtils.waitTillPageRedirect();\n\n return true;\n } else {\n if (state.includes(SILENT_SIGN_IN_STATE)) {\n const message: Message<null> = {\n type: CHECK_SESSION_SIGNED_OUT,\n };\n\n window.parent.parent.postMessage(message, parent.origin);\n SPAUtils.setPromptNoneRequestSent(false);\n\n window.location.href = 'about:blank';\n\n await SPAUtils.waitTillPageRedirect();\n\n return true;\n }\n\n SPAUtils.setPromptNoneRequestSent(false);\n\n const signOutURL = await signOut();\n parent.location.href = signOutURL;\n window.location.href = 'about:blank';\n\n await SPAUtils.waitTillPageRedirect();\n\n return true;\n }\n }\n\n return false;\n };\n\n let rpIFrame = document.createElement('iframe');\n rpIFrame.setAttribute('id', RP_IFRAME);\n rpIFrame.style.display = 'none';\n\n let rpIframeLoaded = false;\n rpIFrame.onload = () => {\n rpIFrame = document.getElementById(RP_IFRAME) as HTMLIFrameElement;\n\n const rpDoc = rpIFrame?.contentDocument;\n\n const opIFrame = rpDoc?.createElement('iframe');\n if (opIFrame) {\n opIFrame.setAttribute('id', OP_IFRAME);\n opIFrame.style.display = 'none';\n }\n\n const promptNoneIFrame = rpDoc?.createElement('iframe');\n if (promptNoneIFrame) {\n promptNoneIFrame.setAttribute('id', PROMPT_NONE_IFRAME);\n promptNoneIFrame.style.display = 'none';\n }\n\n opIFrame && rpIFrame?.contentDocument?.body?.appendChild(opIFrame);\n promptNoneIFrame && rpIFrame?.contentDocument?.body?.appendChild(promptNoneIFrame);\n\n rpIframeLoaded = true;\n };\n\n document?.body?.appendChild(rpIFrame);\n\n const sleep = (): Promise<void> => new Promise((resolve) => setTimeout(resolve, 1));\n while (!rpIframeLoaded) {\n await sleep();\n }\n\n return {\n initialize,\n receivePromptNoneResponse,\n reset,\n };\n};\n\nexport default createSessionManagementHelper;\n","'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n var i\n for (i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n","/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n var e, m\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var nBits = -7\n var i = isLE ? (nBytes - 1) : 0\n var d = isLE ? -1 : 1\n var s = buffer[offset + i]\n\n i += d\n\n e = s & ((1 << (-nBits)) - 1)\n s >>= (-nBits)\n nBits += eLen\n for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & ((1 << (-nBits)) - 1)\n e >>= (-nBits)\n nBits += mLen\n for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen)\n e = e - eBias\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n var i = isLE ? 0 : (nBytes - 1)\n var d = isLE ? 1 : -1\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n value = Math.abs(value)\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0\n e = eMax\n } else {\n e = Math.floor(Math.log(value) / Math.LN2)\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--\n c *= 2\n }\n if (e + eBias >= 1) {\n value += rt / c\n } else {\n value += rt * Math.pow(2, 1 - eBias)\n }\n if (value * c >= 2) {\n e++\n c /= 2\n }\n\n if (e + eBias >= eMax) {\n m = 0\n e = eMax\n } else if (e + eBias >= 1) {\n m = ((value * c) - 1) * Math.pow(2, mLen)\n e = e + eBias\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n e = 0\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = (e << mLen) | m\n eLen += mLen\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128\n}\n","/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh <https://feross.org>\n * @license MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nconst base64 = require('base64-js')\nconst ieee754 = require('ieee754')\nconst customInspectSymbol =\n (typeof Symbol === 'function' && typeof Symbol['for'] === 'function') // eslint-disable-line dot-notation\n ? Symbol['for']('nodejs.util.inspect.custom') // eslint-disable-line dot-notation\n : null\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\nconst K_MAX_LENGTH = 0x7fffffff\nexports.kMaxLength = K_MAX_LENGTH\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n * === true Use Uint8Array implementation (fastest)\n * === false Print warning and recommend using `buffer` v4.x which has an Object\n * implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * We report that the browser does not support typed arrays if the are not subclassable\n * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`\n * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support\n * for __proto__ and has a buggy typed array implementation.\n */\nBuffer.TYPED_ARRAY_SUPPORT = typedArraySupport()\n\nif (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&\n typeof console.error === 'function') {\n console.error(\n 'This browser lacks typed array (Uint8Array) support which is required by ' +\n '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'\n )\n}\n\nfunction typedArraySupport () {\n // Can typed array instances can be augmented?\n try {\n const arr = new Uint8Array(1)\n const proto = { foo: function () { return 42 } }\n Object.setPrototypeOf(proto, Uint8Array.prototype)\n Object.setPrototypeOf(arr, proto)\n return arr.foo() === 42\n } catch (e) {\n return false\n }\n}\n\nObject.defineProperty(Buffer.prototype, 'parent', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.buffer\n }\n})\n\nObject.defineProperty(Buffer.prototype, 'offset', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.byteOffset\n }\n})\n\nfunction createBuffer (length) {\n if (length > K_MAX_LENGTH) {\n throw new RangeError('The value \"' + length + '\" is invalid for option \"size\"')\n }\n // Return an augmented `Uint8Array` instance\n const buf = new Uint8Array(length)\n Object.setPrototypeOf(buf, Buffer.prototype)\n return buf\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n // Common case.\n if (typeof arg === 'number') {\n if (typeof encodingOrOffset === 'string') {\n throw new TypeError(\n 'The \"string\" argument must be of type string. Received type number'\n )\n }\n return allocUnsafe(arg)\n }\n return from(arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\nfunction from (value, encodingOrOffset, length) {\n if (typeof value === 'string') {\n return fromString(value, encodingOrOffset)\n }\n\n if (ArrayBuffer.isView(value)) {\n return fromArrayView(value)\n }\n\n if (value == null) {\n throw new TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n }\n\n if (isInstance(value, ArrayBuffer) ||\n (value && isInstance(value.buffer, ArrayBuffer))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof SharedArrayBuffer !== 'undefined' &&\n (isInstance(value, SharedArrayBuffer) ||\n (value && isInstance(value.buffer, SharedArrayBuffer)))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof value === 'number') {\n throw new TypeError(\n 'The \"value\" argument must not be of type number. Received type number'\n )\n }\n\n const valueOf = value.valueOf && value.valueOf()\n if (valueOf != null && valueOf !== value) {\n return Buffer.from(valueOf, encodingOrOffset, length)\n }\n\n const b = fromObject(value)\n if (b) return b\n\n if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null &&\n typeof value[Symbol.toPrimitive] === 'function') {\n return Buffer.from(value[Symbol.toPrimitive]('string'), encodingOrOffset, length)\n }\n\n throw new TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n return from(value, encodingOrOffset, length)\n}\n\n// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:\n// https://github.com/feross/buffer/pull/148\nObject.setPrototypeOf(Buffer.prototype, Uint8Array.prototype)\nObject.setPrototypeOf(Buffer, Uint8Array)\n\nfunction assertSize (size) {\n if (typeof size !== 'number') {\n throw new TypeError('\"size\" argument must be of type number')\n } else if (size < 0) {\n throw new RangeError('The value \"' + size + '\" is invalid for option \"size\"')\n }\n}\n\nfunction alloc (size, fill, encoding) {\n assertSize(size)\n if (size <= 0) {\n return createBuffer(size)\n }\n if (fill !== undefined) {\n // Only pay attention to encoding if it's a string. This\n // prevents accidentally sending in a number that would\n // be interpreted as a start offset.\n return typeof encoding === 'string'\n ? createBuffer(size).fill(fill, encoding)\n : createBuffer(size).fill(fill)\n }\n return createBuffer(size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n return alloc(size, fill, encoding)\n}\n\nfunction allocUnsafe (size) {\n assertSize(size)\n return createBuffer(size < 0 ? 0 : checked(size) | 0)\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n return allocUnsafe(size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n return allocUnsafe(size)\n}\n\nfunction fromString (string, encoding) {\n if (typeof encoding !== 'string' || encoding === '') {\n encoding = 'utf8'\n }\n\n if (!Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n\n const length = byteLength(string, encoding) | 0\n let buf = createBuffer(length)\n\n const actual = buf.write(string, encoding)\n\n if (actual !== length) {\n // Writing a hex string, for example, that contains invalid characters will\n // cause everything after the first invalid character to be ignored. (e.g.\n // 'abxxcd' will be treated as 'ab')\n buf = buf.slice(0, actual)\n }\n\n return buf\n}\n\nfunction fromArrayLike (array) {\n const length = array.length < 0 ? 0 : checked(array.length) | 0\n const buf = createBuffer(length)\n for (let i = 0; i < length; i += 1) {\n buf[i] = array[i] & 255\n }\n return buf\n}\n\nfunction fromArrayView (arrayView) {\n if (isInstance(arrayView, Uint8Array)) {\n const copy = new Uint8Array(arrayView)\n return fromArrayBuffer(copy.buffer, copy.byteOffset, copy.byteLength)\n }\n return fromArrayLike(arrayView)\n}\n\nfunction fromArrayBuffer (array, byteOffset, length) {\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\"offset\" is outside of buffer bounds')\n }\n\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\"length\" is outside of buffer bounds')\n }\n\n let buf\n if (byteOffset === undefined && length === undefined) {\n buf = new Uint8Array(array)\n } else if (length === undefined) {\n buf = new Uint8Array(array, byteOffset)\n } else {\n buf = new Uint8Array(array, byteOffset, length)\n }\n\n // Return an augmented `Uint8Array` instance\n Object.setPrototypeOf(buf, Buffer.prototype)\n\n return buf\n}\n\nfunction fromObject (obj) {\n if (Buffer.isBuffer(obj)) {\n const len = checked(obj.length) | 0\n const buf = createBuffer(len)\n\n if (buf.length === 0) {\n return buf\n }\n\n obj.copy(buf, 0, 0, len)\n return buf\n }\n\n if (obj.length !== undefined) {\n if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {\n return createBuffer(0)\n }\n return fromArrayLike(obj)\n }\n\n if (obj.type === 'Buffer' && Array.isArray(obj.data)) {\n return fromArrayLike(obj.data)\n }\n}\n\nfunction checked (length) {\n // Note: cannot use `length < K_MAX_LENGTH` here because that fails when\n // length is NaN (which is otherwise coerced to zero.)\n if (length >= K_MAX_LENGTH) {\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')\n }\n return length | 0\n}\n\nfunction SlowBuffer (length) {\n if (+length != length) { // eslint-disable-line eqeqeq\n length = 0\n }\n return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n return b != null && b._isBuffer === true &&\n b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false\n}\n\nBuffer.compare = function compare (a, b) {\n if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength)\n if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength)\n if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n throw new TypeError(\n 'The \"buf1\", \"buf2\" arguments must be one of type Buffer or Uint8Array'\n )\n }\n\n if (a === b) return 0\n\n let x = a.length\n let y = b.length\n\n for (let i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i]\n y = b[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return true\n default:\n return false\n }\n}\n\nBuffer.concat = function concat (list, length) {\n if (!Array.isArray(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n\n if (list.length === 0) {\n return Buffer.alloc(0)\n }\n\n let i\n if (length === undefined) {\n length = 0\n for (i = 0; i < list.length; ++i) {\n length += list[i].length\n }\n }\n\n const buffer = Buffer.allocUnsafe(length)\n let pos = 0\n for (i = 0; i < list.length; ++i) {\n let buf = list[i]\n if (isInstance(buf, Uint8Array)) {\n if (pos + buf.length > buffer.length) {\n if (!Buffer.isBuffer(buf)) buf = Buffer.from(buf)\n buf.copy(buffer, pos)\n } else {\n Uint8Array.prototype.set.call(\n buffer,\n buf,\n pos\n )\n }\n } else if (!Buffer.isBuffer(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n } else {\n buf.copy(buffer, pos)\n }\n pos += buf.length\n }\n return buffer\n}\n\nfunction byteLength (string, encoding) {\n if (Buffer.isBuffer(string)) {\n return string.length\n }\n if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) {\n return string.byteLength\n }\n if (typeof string !== 'string') {\n throw new TypeError(\n 'The \"string\" argument must be one of type string, Buffer, or ArrayBuffer. ' +\n 'Received type ' + typeof string\n )\n }\n\n const len = string.length\n const mustMatch = (arguments.length > 2 && arguments[2] === true)\n if (!mustMatch && len === 0) return 0\n\n // Use a for loop to avoid recursion\n let loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'ascii':\n case 'latin1':\n case 'binary':\n return len\n case 'utf8':\n case 'utf-8':\n return utf8ToBytes(string).length\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return len * 2\n case 'hex':\n return len >>> 1\n case 'base64':\n return base64ToBytes(string).length\n default:\n if (loweredCase) {\n return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8\n }\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n let loweredCase = false\n\n // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n // property of a typed array.\n\n // This behaves neither like String nor Uint8Array in that we set start/end\n // to their upper/lower bounds if the value passed is out of range.\n // undefined is handled specially as per ECMA-262 6th Edition,\n // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n if (start === undefined || start < 0) {\n start = 0\n }\n // Return early if start > this.length. Done here to prevent potential uint32\n // coercion fail below.\n if (start > this.length) {\n return ''\n }\n\n if (end === undefined || end > this.length) {\n end = this.length\n }\n\n if (end <= 0) {\n return ''\n }\n\n // Force coercion to uint32. This will also coerce falsey/NaN values to 0.\n end >>>= 0\n start >>>= 0\n\n if (end <= start) {\n return ''\n }\n\n if (!encoding) encoding = 'utf8'\n\n while (true) {\n switch (encoding) {\n case 'hex':\n return hexSlice(this, start, end)\n\n case 'utf8':\n case 'utf-8':\n return utf8Slice(this, start, end)\n\n case 'ascii':\n return asciiSlice(this, start, end)\n\n case 'latin1':\n case 'binary':\n return latin1Slice(this, start, end)\n\n case 'base64':\n return base64Slice(this, start, end)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return utf16leSlice(this, start, end)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = (encoding + '').toLowerCase()\n loweredCase = true\n }\n }\n}\n\n// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)\n// to detect a Buffer instance. It's not possible to use `instanceof Buffer`\n// reliably in a browserify context because there could be multiple different\n// copies of the 'buffer' package in use. This method works even for Buffer\n// instances that were created from another copy of the `buffer` package.\n// See: https://github.com/feross/buffer/issues/154\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n const i = b[n]\n b[n] = b[m]\n b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n const len = this.length\n if (len % 2 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 16-bits')\n }\n for (let i = 0; i < len; i += 2) {\n swap(this, i, i + 1)\n }\n return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n const len = this.length\n if (len % 4 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 32-bits')\n }\n for (let i = 0; i < len; i += 4) {\n swap(this, i, i + 3)\n swap(this, i + 1, i + 2)\n }\n return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n const len = this.length\n if (len % 8 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 64-bits')\n }\n for (let i = 0; i < len; i += 8) {\n swap(this, i, i + 7)\n swap(this, i + 1, i + 6)\n swap(this, i + 2, i + 5)\n swap(this, i + 3, i + 4)\n }\n return this\n}\n\nBuffer.prototype.toString = function toString () {\n const length = this.length\n if (length === 0) return ''\n if (arguments.length === 0) return utf8Slice(this, 0, length)\n return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.toLocaleString = Buffer.prototype.toString\n\nBuffer.prototype.equals = function equals (b) {\n if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n if (this === b) return true\n return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n let str = ''\n const max = exports.INSPECT_MAX_BYTES\n str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim()\n if (this.length > max) str += ' ... '\n return '<Buffer ' + str + '>'\n}\nif (customInspectSymbol) {\n Buffer.prototype[customInspectSymbol] = Buffer.prototype.inspect\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n if (isInstance(target, Uint8Array)) {\n target = Buffer.from(target, target.offset, target.byteLength)\n }\n if (!Buffer.isBuffer(target)) {\n throw new TypeError(\n 'The \"target\" argument must be one of type Buffer or Uint8Array. ' +\n 'Received type ' + (typeof target)\n )\n }\n\n if (start === undefined) {\n start = 0\n }\n if (end === undefined) {\n end = target ? target.length : 0\n }\n if (thisStart === undefined) {\n thisStart = 0\n }\n if (thisEnd === undefined) {\n thisEnd = this.length\n }\n\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n throw new RangeError('out of range index')\n }\n\n if (thisStart >= thisEnd && start >= end) {\n return 0\n }\n if (thisStart >= thisEnd) {\n return -1\n }\n if (start >= end) {\n return 1\n }\n\n start >>>= 0\n end >>>= 0\n thisStart >>>= 0\n thisEnd >>>= 0\n\n if (this === target) return 0\n\n let x = thisEnd - thisStart\n let y = end - start\n const len = Math.min(x, y)\n\n const thisCopy = this.slice(thisStart, thisEnd)\n const targetCopy = target.slice(start, end)\n\n for (let i = 0; i < len; ++i) {\n if (thisCopy[i] !== targetCopy[i]) {\n x = thisCopy[i]\n y = targetCopy[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n // Empty buffer means no match\n if (buffer.length === 0) return -1\n\n // Normalize byteOffset\n if (typeof byteOffset === 'string') {\n encoding = byteOffset\n byteOffset = 0\n } else if (byteOffset > 0x7fffffff) {\n byteOffset = 0x7fffffff\n } else if (byteOffset < -0x80000000) {\n byteOffset = -0x80000000\n }\n byteOffset = +byteOffset // Coerce to Number.\n if (numberIsNaN(byteOffset)) {\n // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n byteOffset = dir ? 0 : (buffer.length - 1)\n }\n\n // Normalize byteOffset: negative offsets start from the end of the buffer\n if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n if (byteOffset >= buffer.length) {\n if (dir) return -1\n else byteOffset = buffer.length - 1\n } else if (byteOffset < 0) {\n if (dir) byteOffset = 0\n else return -1\n }\n\n // Normalize val\n if (typeof val === 'string') {\n val = Buffer.from(val, encoding)\n }\n\n // Finally, search either indexOf (if dir is true) or lastIndexOf\n if (Buffer.isBuffer(val)) {\n // Special case: looking for empty string/buffer always fails\n if (val.length === 0) {\n return -1\n }\n return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n } else if (typeof val === 'number') {\n val = val & 0xFF // Search for a byte value [0-255]\n if (typeof Uint8Array.prototype.indexOf === 'function') {\n if (dir) {\n return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n } else {\n return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n }\n }\n return arrayIndexOf(buffer, [val], byteOffset, encoding, dir)\n }\n\n throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n let indexSize = 1\n let arrLength = arr.length\n let valLength = val.length\n\n if (encoding !== undefined) {\n encoding = String(encoding).toLowerCase()\n if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n encoding === 'utf16le' || encoding === 'utf-16le') {\n if (arr.length < 2 || val.length < 2) {\n return -1\n }\n indexSize = 2\n arrLength /= 2\n valLength /= 2\n byteOffset /= 2\n }\n }\n\n function read (buf, i) {\n if (indexSize === 1) {\n return buf[i]\n } else {\n return buf.readUInt16BE(i * indexSize)\n }\n }\n\n let i\n if (dir) {\n let foundIndex = -1\n for (i = byteOffset; i < arrLength; i++) {\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n if (foundIndex === -1) foundIndex = i\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n } else {\n if (foundIndex !== -1) i -= i - foundIndex\n foundIndex = -1\n }\n }\n } else {\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n for (i = byteOffset; i >= 0; i--) {\n let found = true\n for (let j = 0; j < valLength; j++) {\n if (read(arr, i + j) !== read(val, j)) {\n found = false\n break\n }\n }\n if (found) return i\n }\n }\n\n return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n offset = Number(offset) || 0\n const remaining = buf.length - offset\n if (!length) {\n length = remaining\n } else {\n length = Number(length)\n if (length > remaining) {\n length = remaining\n }\n }\n\n const strLen = string.length\n\n if (length > strLen / 2) {\n length = strLen / 2\n }\n let i\n for (i = 0; i < length; ++i) {\n const parsed = parseInt(string.substr(i * 2, 2), 16)\n if (numberIsNaN(parsed)) return i\n buf[offset + i] = parsed\n }\n return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n // Buffer#write(string)\n if (offset === undefined) {\n encoding = 'utf8'\n length = this.length\n offset = 0\n // Buffer#write(string, encoding)\n } else if (length === undefined && typeof offset === 'string') {\n encoding = offset\n length = this.length\n offset = 0\n // Buffer#write(string, offset[, length][, encoding])\n } else if (isFinite(offset)) {\n offset = offset >>> 0\n if (isFinite(length)) {\n length = length >>> 0\n if (encoding === undefined) encoding = 'utf8'\n } else {\n encoding = length\n length = undefined\n }\n } else {\n throw new Error(\n 'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n )\n }\n\n const remaining = this.length - offset\n if (length === undefined || length > remaining) length = remaining\n\n if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n throw new RangeError('Attempt to write outside buffer bounds')\n }\n\n if (!encoding) encoding = 'utf8'\n\n let loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'hex':\n return hexWrite(this, string, offset, length)\n\n case 'utf8':\n case 'utf-8':\n return utf8Write(this, string, offset, length)\n\n case 'ascii':\n case 'latin1':\n case 'binary':\n return asciiWrite(this, string, offset, length)\n\n case 'base64':\n // Warning: maxLength not taken into account in base64Write\n return base64Write(this, string, offset, length)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return ucs2Write(this, string, offset, length)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n return {\n type: 'Buffer',\n data: Array.prototype.slice.call(this._arr || this, 0)\n }\n}\n\nfunction base64Slice (buf, start, end) {\n if (start === 0 && end === buf.length) {\n return base64.fromByteArray(buf)\n } else {\n return base64.fromByteArray(buf.slice(start, end))\n }\n}\n\nfunction utf8Slice (buf, start, end) {\n end = Math.min(buf.length, end)\n const res = []\n\n let i = start\n while (i < end) {\n const firstByte = buf[i]\n let codePoint = null\n let bytesPerSequence = (firstByte > 0xEF)\n ? 4\n : (firstByte > 0xDF)\n ? 3\n : (firstByte > 0xBF)\n ? 2\n : 1\n\n if (i + bytesPerSequence <= end) {\n let secondByte, thirdByte, fourthByte, tempCodePoint\n\n switch (bytesPerSequence) {\n case 1:\n if (firstByte < 0x80) {\n codePoint = firstByte\n }\n break\n case 2:\n secondByte = buf[i + 1]\n if ((secondByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n if (tempCodePoint > 0x7F) {\n codePoint = tempCodePoint\n }\n }\n break\n case 3:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n codePoint = tempCodePoint\n }\n }\n break\n case 4:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n fourthByte = buf[i + 3]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n codePoint = tempCodePoint\n }\n }\n }\n }\n\n if (codePoint === null) {\n // we did not generate a valid codePoint so insert a\n // replacement char (U+FFFD) and advance only 1 byte\n codePoint = 0xFFFD\n bytesPerSequence = 1\n } else if (codePoint > 0xFFFF) {\n // encode to utf16 (surrogate pair dance)\n codePoint -= 0x10000\n res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n codePoint = 0xDC00 | codePoint & 0x3FF\n }\n\n res.push(codePoint)\n i += bytesPerSequence\n }\n\n return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nconst MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n const len = codePoints.length\n if (len <= MAX_ARGUMENTS_LENGTH) {\n return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n }\n\n // Decode in chunks to avoid \"call stack size exceeded\".\n let res = ''\n let i = 0\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n )\n }\n return res\n}\n\nfunction asciiSlice (buf, start, end) {\n let ret = ''\n end = Math.min(buf.length, end)\n\n for (let i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i] & 0x7F)\n }\n return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n let ret = ''\n end = Math.min(buf.length, end)\n\n for (let i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i])\n }\n return ret\n}\n\nfunction hexSlice (buf, start, end) {\n const len = buf.length\n\n if (!start || start < 0) start = 0\n if (!end || end < 0 || end > len) end = len\n\n let out = ''\n for (let i = start; i < end; ++i) {\n out += hexSliceLookupTable[buf[i]]\n }\n return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n const bytes = buf.slice(start, end)\n let res = ''\n // If bytes.length is odd, the last 8 bits must be ignored (same as node.js)\n for (let i = 0; i < bytes.length - 1; i += 2) {\n res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))\n }\n return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n const len = this.length\n start = ~~start\n end = end === undefined ? len : ~~end\n\n if (start < 0) {\n start += len\n if (start < 0) start = 0\n } else if (start > len) {\n start = len\n }\n\n if (end < 0) {\n end += len\n if (end < 0) end = 0\n } else if (end > len) {\n end = len\n }\n\n if (end < start) end = start\n\n const newBuf = this.subarray(start, end)\n // Return an augmented `Uint8Array` instance\n Object.setPrototypeOf(newBuf, Buffer.prototype)\n\n return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUintLE =\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let val = this[offset]\n let mul = 1\n let i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUintBE =\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n checkOffset(offset, byteLength, this.length)\n }\n\n let val = this[offset + --byteLength]\n let mul = 1\n while (byteLength > 0 && (mul *= 0x100)) {\n val += this[offset + --byteLength] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUint8 =\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n return this[offset]\n}\n\nBuffer.prototype.readUint16LE =\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUint16BE =\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUint32LE =\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return ((this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16)) +\n (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUint32BE =\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] * 0x1000000) +\n ((this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n this[offset + 3])\n}\n\nBuffer.prototype.readBigUInt64LE = defineBigIntMethod(function readBigUInt64LE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const lo = first +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 24\n\n const hi = this[++offset] +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n last * 2 ** 24\n\n return BigInt(lo) + (BigInt(hi) << BigInt(32))\n})\n\nBuffer.prototype.readBigUInt64BE = defineBigIntMethod(function readBigUInt64BE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const hi = first * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n this[++offset]\n\n const lo = this[++offset] * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n last\n\n return (BigInt(hi) << BigInt(32)) + BigInt(lo)\n})\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let val = this[offset]\n let mul = 1\n let i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let i = byteLength\n let mul = 1\n let val = this[offset + --i]\n while (i > 0 && (mul *= 0x100)) {\n val += this[offset + --i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n if (!(this[offset] & 0x80)) return (this[offset])\n return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n const val = this[offset] | (this[offset + 1] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n const val = this[offset + 1] | (this[offset] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16) |\n (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] << 24) |\n (this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n (this[offset + 3])\n}\n\nBuffer.prototype.readBigInt64LE = defineBigIntMethod(function readBigInt64LE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const val = this[offset + 4] +\n this[offset + 5] * 2 ** 8 +\n this[offset + 6] * 2 ** 16 +\n (last << 24) // Overflow\n\n return (BigInt(val) << BigInt(32)) +\n BigInt(first +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 24)\n})\n\nBuffer.prototype.readBigInt64BE = defineBigIntMethod(function readBigInt64BE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const val = (first << 24) + // Overflow\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n this[++offset]\n\n return (BigInt(val) << BigInt(32)) +\n BigInt(this[++offset] * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n last)\n})\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUintLE =\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n const maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n let mul = 1\n let i = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUintBE =\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n const maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n let i = byteLength - 1\n let mul = 1\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUint8 =\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeUint16LE =\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeUint16BE =\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeUint32LE =\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset + 3] = (value >>> 24)\n this[offset + 2] = (value >>> 16)\n this[offset + 1] = (value >>> 8)\n this[offset] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeUint32BE =\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nfunction wrtBigUInt64LE (buf, value, offset, min, max) {\n checkIntBI(value, min, max, buf, offset, 7)\n\n let lo = Number(value & BigInt(0xffffffff))\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n return offset\n}\n\nfunction wrtBigUInt64BE (buf, value, offset, min, max) {\n checkIntBI(value, min, max, buf, offset, 7)\n\n let lo = Number(value & BigInt(0xffffffff))\n buf[offset + 7] = lo\n lo = lo >> 8\n buf[offset + 6] = lo\n lo = lo >> 8\n buf[offset + 5] = lo\n lo = lo >> 8\n buf[offset + 4] = lo\n let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n buf[offset + 3] = hi\n hi = hi >> 8\n buf[offset + 2] = hi\n hi = hi >> 8\n buf[offset + 1] = hi\n hi = hi >> 8\n buf[offset] = hi\n return offset + 8\n}\n\nBuffer.prototype.writeBigUInt64LE = defineBigIntMethod(function writeBigUInt64LE (value, offset = 0) {\n return wrtBigUInt64LE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeBigUInt64BE = defineBigIntMethod(function writeBigUInt64BE (value, offset = 0) {\n return wrtBigUInt64BE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n const limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n let i = 0\n let mul = 1\n let sub = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n const limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n let i = byteLength - 1\n let mul = 1\n let sub = 0\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n if (value < 0) value = 0xff + value + 1\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n this[offset + 2] = (value >>> 16)\n this[offset + 3] = (value >>> 24)\n return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (value < 0) value = 0xffffffff + value + 1\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeBigInt64LE = defineBigIntMethod(function writeBigInt64LE (value, offset = 0) {\n return wrtBigUInt64LE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\n})\n\nBuffer.prototype.writeBigInt64BE = defineBigIntMethod(function writeBigInt64BE (value, offset = 0) {\n return wrtBigUInt64BE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\n})\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n }\n ieee754.write(buf, value, offset, littleEndian, 23, 4)\n return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n }\n ieee754.write(buf, value, offset, littleEndian, 52, 8)\n return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')\n if (!start) start = 0\n if (!end && end !== 0) end = this.length\n if (targetStart >= target.length) targetStart = target.length\n if (!targetStart) targetStart = 0\n if (end > 0 && end < start) end = start\n\n // Copy 0 bytes; we're done\n if (end === start) return 0\n if (target.length === 0 || this.length === 0) return 0\n\n // Fatal error conditions\n if (targetStart < 0) {\n throw new RangeError('targetStart out of bounds')\n }\n if (start < 0 || start >= this.length) throw new RangeError('Index out of range')\n if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n // Are we oob?\n if (end > this.length) end = this.length\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start\n }\n\n const len = end - start\n\n if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {\n // Use built-in when available, missing from IE11\n this.copyWithin(targetStart, start, end)\n } else {\n Uint8Array.prototype.set.call(\n target,\n this.subarray(start, end),\n targetStart\n )\n }\n\n return len\n}\n\n// Usage:\n// buffer.fill(number[, offset[, end]])\n// buffer.fill(buffer[, offset[, end]])\n// buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n // Handle string cases:\n if (typeof val === 'string') {\n if (typeof start === 'string') {\n encoding = start\n start = 0\n end = this.length\n } else if (typeof end === 'string') {\n encoding = end\n end = this.length\n }\n if (encoding !== undefined && typeof encoding !== 'string') {\n throw new TypeError('encoding must be a string')\n }\n if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n if (val.length === 1) {\n const code = val.charCodeAt(0)\n if ((encoding === 'utf8' && code < 128) ||\n encoding === 'latin1') {\n // Fast path: If `val` fits into a single byte, use that numeric value.\n val = code\n }\n }\n } else if (typeof val === 'number') {\n val = val & 255\n } else if (typeof val === 'boolean') {\n val = Number(val)\n }\n\n // Invalid ranges are not set to a default, so can range check early.\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError('Out of range index')\n }\n\n if (end <= start) {\n return this\n }\n\n start = start >>> 0\n end = end === undefined ? this.length : end >>> 0\n\n if (!val) val = 0\n\n let i\n if (typeof val === 'number') {\n for (i = start; i < end; ++i) {\n this[i] = val\n }\n } else {\n const bytes = Buffer.isBuffer(val)\n ? val\n : Buffer.from(val, encoding)\n const len = bytes.length\n if (len === 0) {\n throw new TypeError('The value \"' + val +\n '\" is invalid for argument \"value\"')\n }\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len]\n }\n }\n\n return this\n}\n\n// CUSTOM ERRORS\n// =============\n\n// Simplified versions from Node, changed for Buffer-only usage\nconst errors = {}\nfunction E (sym, getMessage, Base) {\n errors[sym] = class NodeError extends Base {\n constructor () {\n super()\n\n Object.defineProperty(this, 'message', {\n value: getMessage.apply(this, arguments),\n writable: true,\n configurable: true\n })\n\n // Add the error code to the name to include it in the stack trace.\n this.name = `${this.name} [${sym}]`\n // Access the stack to generate the error message including the error code\n // from the name.\n this.stack // eslint-disable-line no-unused-expressions\n // Reset the name to the actual name.\n delete this.name\n }\n\n get code () {\n return sym\n }\n\n set code (value) {\n Object.defineProperty(this, 'code', {\n configurable: true,\n enumerable: true,\n value,\n writable: true\n })\n }\n\n toString () {\n return `${this.name} [${sym}]: ${this.message}`\n }\n }\n}\n\nE('ERR_BUFFER_OUT_OF_BOUNDS',\n function (name) {\n if (name) {\n return `${name} is outside of buffer bounds`\n }\n\n return 'Attempt to access memory outside buffer bounds'\n }, RangeError)\nE('ERR_INVALID_ARG_TYPE',\n function (name, actual) {\n return `The \"${name}\" argument must be of type number. Received type ${typeof actual}`\n }, TypeError)\nE('ERR_OUT_OF_RANGE',\n function (str, range, input) {\n let msg = `The value of \"${str}\" is out of range.`\n let received = input\n if (Number.isInteger(input) && Math.abs(input) > 2 ** 32) {\n received = addNumericalSeparator(String(input))\n } else if (typeof input === 'bigint') {\n received = String(input)\n if (input > BigInt(2) ** BigInt(32) || input < -(BigInt(2) ** BigInt(32))) {\n received = addNumericalSeparator(received)\n }\n received += 'n'\n }\n msg += ` It must be ${range}. Received ${received}`\n return msg\n }, RangeError)\n\nfunction addNumericalSeparator (val) {\n let res = ''\n let i = val.length\n const start = val[0] === '-' ? 1 : 0\n for (; i >= start + 4; i -= 3) {\n res = `_${val.slice(i - 3, i)}${res}`\n }\n return `${val.slice(0, i)}${res}`\n}\n\n// CHECK FUNCTIONS\n// ===============\n\nfunction checkBounds (buf, offset, byteLength) {\n validateNumber(offset, 'offset')\n if (buf[offset] === undefined || buf[offset + byteLength] === undefined) {\n boundsError(offset, buf.length - (byteLength + 1))\n }\n}\n\nfunction checkIntBI (value, min, max, buf, offset, byteLength) {\n if (value > max || value < min) {\n const n = typeof min === 'bigint' ? 'n' : ''\n let range\n if (byteLength > 3) {\n if (min === 0 || min === BigInt(0)) {\n range = `>= 0${n} and < 2${n} ** ${(byteLength + 1) * 8}${n}`\n } else {\n range = `>= -(2${n} ** ${(byteLength + 1) * 8 - 1}${n}) and < 2 ** ` +\n `${(byteLength + 1) * 8 - 1}${n}`\n }\n } else {\n range = `>= ${min}${n} and <= ${max}${n}`\n }\n throw new errors.ERR_OUT_OF_RANGE('value', range, value)\n }\n checkBounds(buf, offset, byteLength)\n}\n\nfunction validateNumber (value, name) {\n if (typeof value !== 'number') {\n throw new errors.ERR_INVALID_ARG_TYPE(name, 'number', value)\n }\n}\n\nfunction boundsError (value, length, type) {\n if (Math.floor(value) !== value) {\n validateNumber(value, type)\n throw new errors.ERR_OUT_OF_RANGE(type || 'offset', 'an integer', value)\n }\n\n if (length < 0) {\n throw new errors.ERR_BUFFER_OUT_OF_BOUNDS()\n }\n\n throw new errors.ERR_OUT_OF_RANGE(type || 'offset',\n `>= ${type ? 1 : 0} and <= ${length}`,\n value)\n}\n\n// HELPER FUNCTIONS\n// ================\n\nconst INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n // Node takes equal signs as end of the Base64 encoding\n str = str.split('=')[0]\n // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n str = str.trim().replace(INVALID_BASE64_RE, '')\n // Node converts strings with length < 2 to ''\n if (str.length < 2) return ''\n // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n while (str.length % 4 !== 0) {\n str = str + '='\n }\n return str\n}\n\nfunction utf8ToBytes (string, units) {\n units = units || Infinity\n let codePoint\n const length = string.length\n let leadSurrogate = null\n const bytes = []\n\n for (let i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i)\n\n // is surrogate component\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\n // last char was a lead\n if (!leadSurrogate) {\n // no lead yet\n if (codePoint > 0xDBFF) {\n // unexpected trail\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n } else if (i + 1 === length) {\n // unpaired lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n }\n\n // valid lead\n leadSurrogate = codePoint\n\n continue\n }\n\n // 2 leads in a row\n if (codePoint < 0xDC00) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n leadSurrogate = codePoint\n continue\n }\n\n // valid surrogate pair\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n } else if (leadSurrogate) {\n // valid bmp char, but last char was a lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n }\n\n leadSurrogate = null\n\n // encode utf8\n if (codePoint < 0x80) {\n if ((units -= 1) < 0) break\n bytes.push(codePoint)\n } else if (codePoint < 0x800) {\n if ((units -= 2) < 0) break\n bytes.push(\n codePoint >> 0x6 | 0xC0,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x10000) {\n if ((units -= 3) < 0) break\n bytes.push(\n codePoint >> 0xC | 0xE0,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x110000) {\n if ((units -= 4) < 0) break\n bytes.push(\n codePoint >> 0x12 | 0xF0,\n codePoint >> 0xC & 0x3F | 0x80,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else {\n throw new Error('Invalid code point')\n }\n }\n\n return bytes\n}\n\nfunction asciiToBytes (str) {\n const byteArray = []\n for (let i = 0; i < str.length; ++i) {\n // Node's code seems to be doing this and not & 0x7F..\n byteArray.push(str.charCodeAt(i) & 0xFF)\n }\n return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n let c, hi, lo\n const byteArray = []\n for (let i = 0; i < str.length; ++i) {\n if ((units -= 2) < 0) break\n\n c = str.charCodeAt(i)\n hi = c >> 8\n lo = c % 256\n byteArray.push(lo)\n byteArray.push(hi)\n }\n\n return byteArray\n}\n\nfunction base64ToBytes (str) {\n return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n let i\n for (i = 0; i < length; ++i) {\n if ((i + offset >= dst.length) || (i >= src.length)) break\n dst[i + offset] = src[i]\n }\n return i\n}\n\n// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass\n// the `instanceof` check but they should be treated as of that type.\n// See: https://github.com/feross/buffer/issues/166\nfunction isInstance (obj, type) {\n return obj instanceof type ||\n (obj != null && obj.constructor != null && obj.constructor.name != null &&\n obj.constructor.name === type.name)\n}\nfunction numberIsNaN (obj) {\n // For IE11 support\n return obj !== obj // eslint-disable-line no-self-compare\n}\n\n// Create lookup table for `toString('hex')`\n// See: https://github.com/feross/buffer/issues/219\nconst hexSliceLookupTable = (function () {\n const alphabet = '0123456789abcdef'\n const table = new Array(256)\n for (let i = 0; i < 16; ++i) {\n const i16 = i * 16\n for (let j = 0; j < 16; ++j) {\n table[i16 + j] = alphabet[i] + alphabet[j]\n }\n }\n return table\n})()\n\n// Return not function with Error if BigInt not supported\nfunction defineBigIntMethod (fn) {\n return typeof BigInt === 'undefined' ? BufferBigIntNotDefined : fn\n}\n\nfunction BufferBigIntNotDefined () {\n throw new Error('BigInt not supported')\n}\n","/*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */\n/* eslint-disable node/no-deprecated-api */\nvar buffer = require('buffer')\nvar Buffer = buffer.Buffer\n\n// alternative to using Object.keys for old browsers\nfunction copyProps (src, dst) {\n for (var key in src) {\n dst[key] = src[key]\n }\n}\nif (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {\n module.exports = buffer\n} else {\n // Copy properties from require('buffer')\n copyProps(buffer, exports)\n exports.Buffer = SafeBuffer\n}\n\nfunction SafeBuffer (arg, encodingOrOffset, length) {\n return Buffer(arg, encodingOrOffset, length)\n}\n\nSafeBuffer.prototype = Object.create(Buffer.prototype)\n\n// Copy static methods from Buffer\ncopyProps(Buffer, SafeBuffer)\n\nSafeBuffer.from = function (arg, encodingOrOffset, length) {\n if (typeof arg === 'number') {\n throw new TypeError('Argument must not be a number')\n }\n return Buffer(arg, encodingOrOffset, length)\n}\n\nSafeBuffer.alloc = function (size, fill, encoding) {\n if (typeof size !== 'number') {\n throw new TypeError('Argument must be a number')\n }\n var buf = Buffer(size)\n if (fill !== undefined) {\n if (typeof encoding === 'string') {\n buf.fill(fill, encoding)\n } else {\n buf.fill(fill)\n }\n } else {\n buf.fill(0)\n }\n return buf\n}\n\nSafeBuffer.allocUnsafe = function (size) {\n if (typeof size !== 'number') {\n throw new TypeError('Argument must be a number')\n }\n return Buffer(size)\n}\n\nSafeBuffer.allocUnsafeSlow = function (size) {\n if (typeof size !== 'number') {\n throw new TypeError('Argument must be a number')\n }\n return buffer.SlowBuffer(size)\n}\n","'use strict'\n\n// limit of Crypto.getRandomValues()\n// https://developer.mozilla.org/en-US/docs/Web/API/Crypto/getRandomValues\nvar MAX_BYTES = 65536\n\n// Node supports requesting up to this number of bytes\n// https://github.com/nodejs/node/blob/master/lib/internal/crypto/random.js#L48\nvar MAX_UINT32 = 4294967295\n\nfunction oldBrowser () {\n throw new Error('Secure random number generation is not supported by this browser.\\nUse Chrome, Firefox or Internet Explorer 11')\n}\n\nvar Buffer = require('safe-buffer').Buffer\nvar crypto = global.crypto || global.msCrypto\n\nif (crypto && crypto.getRandomValues) {\n module.exports = randomBytes\n} else {\n module.exports = oldBrowser\n}\n\nfunction randomBytes (size, cb) {\n // phantomjs needs to throw\n if (size > MAX_UINT32) throw new RangeError('requested too many random bytes')\n\n var bytes = Buffer.allocUnsafe(size)\n\n if (size > 0) { // getRandomValues fails on IE if size == 0\n if (size > MAX_BYTES) { // this is the max bytes crypto.getRandomValues\n // can do at once see https://developer.mozilla.org/en-US/docs/Web/API/window.crypto.getRandomValues\n for (var generated = 0; generated < size; generated += MAX_BYTES) {\n // buffer.slice automatically checks if the end is past the end of\n // the buffer so we don't have to here\n crypto.getRandomValues(bytes.slice(generated, generated + MAX_BYTES))\n }\n } else {\n crypto.getRandomValues(bytes)\n }\n }\n\n if (typeof cb === 'function') {\n return process.nextTick(function () {\n cb(null, bytes)\n })\n }\n\n return bytes\n}\n","/**\n * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport {Buffer} from 'buffer';\nimport {ThunderIDAuthException, Crypto, JWKInterface} from '@thunderid/javascript';\nimport base64url from 'base64url';\nimport sha256 from 'fast-sha256';\nimport {createLocalJWKSet, jwtVerify, JWTVerifyOptions} from 'jose';\nimport randombytes from 'randombytes';\n\n/**\n * Browser-side `Crypto` implementation using native Web Crypto APIs and `jose` for JWT verification.\n */\nclass SPACryptoUtils implements Crypto<Buffer | string> {\n /**\n * Base64URL-encodes a buffer or string value.\n *\n * @param value - The value to encode.\n * @returns The base64url-encoded string with padding stripped.\n */\n public base64URLEncode(value: Buffer | string): string {\n return base64url.encode(value).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n }\n\n /**\n * Decodes a base64url-encoded string.\n *\n * @param value - The base64url string to decode.\n * @returns The decoded UTF-8 string.\n */\n public base64URLDecode(value: string): string {\n return base64url.decode(value).toString();\n }\n\n /**\n * Computes the SHA-256 hash of a string.\n *\n * @param data - The input string to hash.\n * @returns A `Buffer` containing the raw hash bytes.\n */\n public hashSha256(data: string): string | Buffer {\n return Buffer.from(sha256(new TextEncoder().encode(data)));\n }\n\n /**\n * Generates a buffer of cryptographically random bytes.\n *\n * @param length - Number of bytes to generate.\n * @returns A `Buffer` of random bytes.\n */\n public generateRandomBytes(length: number): string | Buffer {\n return randombytes(length);\n }\n\n /**\n * Verifies a JWT against a JWK using `jose`.\n *\n * @param idToken - The raw JWT string.\n * @param jwk - The JSON Web Key to verify against.\n * @param algorithms - Allowed signature algorithms (e.g., `['RS256']`).\n * @param clientId - Expected audience claim value.\n * @param issuer - Expected issuer claim value.\n * @param subject - Expected subject claim value.\n * @param clockTolerance - Allowed clock skew in seconds.\n * @param validateJwtIssuer - Whether to validate the issuer claim.\n * @returns `true` if the token is valid.\n */\n public verifyJwt(\n idToken: string,\n jwk: Partial<JWKInterface>,\n algorithms: string[],\n clientId: string,\n issuer: string,\n subject: string,\n clockTolerance?: number,\n validateJwtIssuer?: boolean,\n ): Promise<boolean> {\n const jwtVerifyOptions: JWTVerifyOptions = {\n algorithms: algorithms,\n audience: [clientId],\n clockTolerance: clockTolerance,\n subject: subject,\n };\n\n if (validateJwtIssuer ?? true) {\n jwtVerifyOptions.issuer = issuer;\n }\n\n return jwtVerify(\n idToken,\n createLocalJWKSet({\n keys: [jwk],\n }),\n jwtVerifyOptions,\n )\n .then(() => {\n return Promise.resolve(true);\n })\n .catch((error) => {\n return Promise.reject(\n new ThunderIDAuthException(\n 'SPA-CRYPTO-UTILS-VJ-IV01',\n error?.reason ?? JSON.stringify(error),\n `${error?.code} ${error?.claim}`,\n ),\n );\n });\n }\n}\n\nexport default SPACryptoUtils;\n","/**\n * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport {StorageManager, TokenConstants} from '@thunderid/javascript';\n\n/**\n * Helper that manages automatic access-token refresh scheduling via `setTimeout`.\n *\n * @typeParam T - Browser client config type.\n */\nclass SPAHelper<T> {\n private _storageManager: StorageManager<T>;\n private _isTokenRefreshLoading = false;\n\n /**\n * @param storageManager - The storage manager instance used to read config and session data.\n */\n public constructor(storageManager: StorageManager<T>) {\n this._storageManager = storageManager;\n }\n\n /**\n * Schedules an automatic access-token refresh if `periodicTokenRefresh` is enabled in config.\n * No-op if the feature is disabled or there is no refresh token.\n *\n * @param refreshAccessToken - Async callback that performs the refresh.\n */\n public async refreshAccessTokenAutomatically(refreshAccessToken: () => Promise<any>): Promise<void> {\n const config = await this._storageManager.getConfigData();\n const shouldRefreshAutomatically: boolean = (config as any)?.periodicTokenRefresh ?? false;\n\n if (!shouldRefreshAutomatically) {\n return;\n }\n\n const sessionData = await this._storageManager.getSessionData();\n\n if (sessionData?.refresh_token) {\n if (sessionData.created_at == null || sessionData.expires_in == null) {\n return;\n }\n\n const TOKEN_REFRESH_BUFFER_MS = 10_000;\n const expiryTime = Number(sessionData.expires_in) * 1000;\n const absoluteExpiryTime: number = sessionData.created_at + expiryTime;\n const timeUntilRefresh = absoluteExpiryTime - Date.now() - TOKEN_REFRESH_BUFFER_MS;\n\n if (timeUntilRefresh <= 0) {\n if (this._isTokenRefreshLoading) return;\n\n this._isTokenRefreshLoading = true;\n try {\n await refreshAccessToken();\n } finally {\n this._isTokenRefreshLoading = false;\n }\n return;\n }\n\n const timer = setTimeout(async () => {\n if (this._isTokenRefreshLoading) return;\n\n this._isTokenRefreshLoading = true;\n try {\n await refreshAccessToken();\n } finally {\n this._isTokenRefreshLoading = false;\n }\n }, timeUntilRefresh);\n\n await this._storageManager.setTemporaryDataParameter(\n TokenConstants.Storage.StorageKeys.REFRESH_TOKEN_TIMER,\n JSON.stringify(timer),\n );\n }\n }\n\n /**\n * Returns the current refresh timer ID from storage, or `-1` if none is set.\n */\n public async getRefreshTimeoutTimer(): Promise<number> {\n const raw = await this._storageManager.getTemporaryDataParameter(\n TokenConstants.Storage.StorageKeys.REFRESH_TOKEN_TIMER,\n );\n\n if (raw) {\n return JSON.parse(raw as string);\n }\n\n return -1;\n }\n\n /**\n * Clears the automatic-refresh timer.\n *\n * @param timer - Timer ID to clear. If omitted, the stored timer ID is used.\n */\n public async clearRefreshTokenTimeout(timer?: number): Promise<void> {\n if (timer) {\n clearTimeout(timer);\n\n return;\n }\n\n const refreshTimer: number = await this.getRefreshTimeoutTimer();\n\n if (refreshTimer !== -1) {\n clearTimeout(refreshTimer);\n }\n }\n}\n\nexport default SPAHelper;\n","/**\n * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport {\n ThunderIDJavaScriptClient,\n ThunderIDAuthException,\n User,\n IsomorphicCrypto,\n IdToken,\n OIDCEndpoints,\n OIDCRequestConstants,\n SessionData,\n Storage,\n TokenResponse,\n extractPkceStorageKeyFromState,\n initializeEmbeddedSignInFlow,\n HttpError,\n HttpRequestConfig,\n HttpResponse,\n createPackageComponentLogger,\n} from '@thunderid/javascript';\nimport {REFRESH_ACCESS_TOKEN_ERR0R, SILENT_SIGN_IN_STATE, TOKEN_REQUEST_CONFIG_KEY} from './constants/SPAConstants';\nimport FetchHttpClient from './FetchHttpClient';\nimport {BrowserAuthConfig} from './models/BrowserConfig';\nimport BrowserStorage from './models/BrowserStorage';\nimport SignInConfig from './models/SignInConfig';\nimport SignOutError from './models/SignOutError';\nimport {SPATokenExchangeConfig} from './models/TokenExchangeConfig';\nimport LocalStore from './stores/LocalStore';\nimport MemoryStore from './stores/MemoryStore';\nimport SessionStore from './stores/SessionStore';\nimport AuthenticationHelper from './utils/AuthenticationHelper';\nimport navigate from './utils/navigate';\nimport createSessionManagementHelper, {SessionManagementHelperInterface} from './utils/SessionManagementHelper';\nimport SPACryptoUtils from './utils/SPACryptoUtils';\nimport SPAHelper from './utils/SPAHelper';\nimport SPAUtils from './utils/SPAUtils';\n\nconst logger = createPackageComponentLogger('@thunderid/browser', 'ThunderIDBrowserClient');\n\nconst BROWSER_DEFAULT_CONFIG = {\n autoLogoutOnTokenRefreshError: false,\n checkSessionInterval: 3,\n periodicTokenRefresh: false,\n sessionRefreshInterval: 300,\n syncSession: false,\n};\n\nconst initiateStore = (storage: BrowserStorage | string | undefined): Storage => {\n switch (storage) {\n case BrowserStorage.LocalStorage:\n case 'localStorage':\n return new LocalStore();\n case BrowserStorage.BrowserMemory:\n case 'browserMemory':\n return new MemoryStore();\n default:\n return new SessionStore();\n }\n};\n\nclass ThunderIDBrowserClient<T = BrowserAuthConfig> extends ThunderIDJavaScriptClient<T> {\n private _browserInstanceId = 0;\n private _httpClient: FetchHttpClient | undefined;\n private _spaHelper: SPAHelper<T> | undefined;\n private _sessionManagementHelper: SessionManagementHelperInterface | undefined;\n private _authHelper: AuthenticationHelper<T> | undefined;\n private _storage: BrowserStorage | string = BrowserStorage.SessionStorage;\n private _getSignOutURLFromSessionStorage = false;\n private _isHttpHandlerEnabled = true;\n private _httpErrorCallback: ((error: HttpError) => void | Promise<void>) | undefined;\n private _httpFinishCallback: (() => void) | undefined;\n private _onSignInCallback: (response: User) => void = () => null;\n private _onSignOutCallback: () => void = () => null;\n private _onSignOutFailedCallback: (error: SignOutError) => void = () => null;\n private _onEndUserSession: (response: any) => void = () => null;\n private _onInitialize: (response: boolean) => void = () => null;\n private _onCustomGrant = new Map<string, (response: any) => void>();\n private _initialized = false;\n private _startedInitialize = false;\n\n public constructor(instanceId = 0) {\n super(undefined, new SPACryptoUtils());\n this._browserInstanceId = instanceId;\n }\n\n public override async initialize(config: T, storage?: Storage): Promise<boolean> {\n this._startedInitialize = true;\n this._initialized = false;\n\n const configAny = config as any;\n this._storage = configAny.storage ?? BrowserStorage.SessionStorage;\n\n const merged = {\n afterSignInUrl: window.location.origin,\n afterSignOutUrl: window.location.origin,\n ...BROWSER_DEFAULT_CONFIG,\n ...configAny,\n instanceId: this._browserInstanceId,\n };\n const store: Storage = storage ?? initiateStore(this._storage as BrowserStorage);\n\n await super.initialize(merged as unknown as T, store);\n\n const sm = this.getStorageManager();\n this._spaHelper = new SPAHelper<T>(sm);\n\n const attachToken = async (request: HttpRequestConfig): Promise<void> => {\n await this._authHelper?.attachTokenToRequestConfig(request);\n };\n\n this._httpClient = FetchHttpClient.getInstance(this._browserInstanceId, true, attachToken);\n\n this._sessionManagementHelper = await createSessionManagementHelper(\n async () => this.getSignOutUrl(),\n (sessionState: string) =>\n (sm as any).setSessionDataParameter(\n OIDCRequestConstants.Params.SESSION_STATE as keyof SessionData,\n sessionState,\n ),\n );\n\n this._authHelper = new AuthenticationHelper<T>(sm, this._spaHelper, this._browserInstanceId, {\n exchangeToken: (cfg: SPATokenExchangeConfig) => super.exchangeToken(cfg as any),\n getAccessToken: (sessionId?: string) => this.getAccessToken(sessionId),\n getCrypto: async () => this.getCryptoHelper() as unknown as IsomorphicCrypto,\n getDecodedIdToken: (sessionId?: string) => this.getDecodedIdToken(sessionId),\n getIDPAccessToken: async () => ((await sm.getSessionData()) as any)?.access_token,\n getIdToken: () => this.getIdToken(),\n getOpenIDProviderEndpoints: async () => this.getOpenIDProviderEndpoints() as Promise<OIDCEndpoints>,\n getUser: () => this.getUser(),\n isSignedIn: () => this.isSignedIn(),\n refreshAccessToken: () => super.refreshAccessToken(),\n setPKCECode: (pkceKey: string, state: string) => this.setPKCECode(pkceKey, state),\n });\n\n this._initialized = true;\n\n if (this._onInitialize) {\n this._onInitialize(true);\n }\n\n if (!merged.autoLogoutOnTokenRefreshError) {\n return true;\n }\n\n window.addEventListener('message', (event) => {\n if (event?.data?.type === REFRESH_ACCESS_TOKEN_ERR0R) {\n this.signOut();\n }\n });\n\n return true;\n }\n\n public async isInitialized(): Promise<boolean> {\n if (!this._startedInitialize) {\n return false;\n }\n\n const sleep = (): Promise<void> => new Promise((resolve) => setTimeout(resolve, 1));\n let iterations = 0;\n\n while (!this._initialized) {\n if (iterations === 1e4) {\n logger.warn('Initialization is taking longer than expected');\n }\n await sleep();\n iterations++;\n }\n\n return true;\n }\n\n private async _validateMethod(validateAuthentication = true): Promise<boolean> {\n if (!(await this.isInitialized())) {\n return Promise.reject(\n new ThunderIDAuthException(\n 'SPA-AUTH_CLIENT-VM-NF01',\n 'The SDK is not initialized.',\n 'The SDK must be initialized first.',\n ),\n );\n }\n\n if (validateAuthentication && !(await this.isSignedIn())) {\n return Promise.reject(\n new ThunderIDAuthException(\n 'SPA-AUTH_CLIENT-VM-IV02',\n 'The user is not authenticated.',\n 'The user must be authenticated first.',\n ),\n );\n }\n\n return true;\n }\n\n public override isLoading(): boolean {\n return false;\n }\n\n public override async signIn(\n config?: SignInConfig,\n authorizationCode?: string,\n sessionState?: string,\n state?: string,\n tokenRequestConfig?: {params: Record<string, unknown>},\n ): Promise<User | undefined> {\n await this.isInitialized();\n\n if (!SPAUtils.canContinueSignIn(Boolean(config?.callOnlyOnRedirect), authorizationCode)) {\n return undefined;\n }\n\n delete config?.callOnlyOnRedirect;\n\n const user = await this._signInInternal(config, authorizationCode, sessionState, state, tokenRequestConfig);\n\n if (user && this._onSignInCallback) {\n this._onSignInCallback(user);\n }\n\n return user;\n }\n\n private async _signInInternal(\n signInConfig?: SignInConfig,\n authorizationCode?: string,\n sessionState?: string,\n state?: string,\n tokenRequestConfig?: {params: Record<string, unknown>},\n ): Promise<User> {\n const sm = this.getStorageManager();\n const config = await (sm as any).getConfigData();\n\n const basicUserInfo = await this._authHelper!.handleSignIn(\n () => this._shouldStopAuthn(),\n () => this._checkSession(),\n );\n\n if (basicUserInfo) {\n return basicUserInfo;\n }\n\n let resolvedAuthorizationCode: string;\n let resolvedSessionState: string;\n let resolvedState: string;\n let resolvedTokenRequestConfig: {params: Record<string, unknown>} = {params: {}};\n\n if (config?.responseMode === 'form_post' && authorizationCode) {\n resolvedAuthorizationCode = authorizationCode;\n resolvedSessionState = sessionState ?? '';\n resolvedState = state ?? '';\n } else {\n resolvedAuthorizationCode =\n new URL(window.location.href).searchParams.get(OIDCRequestConstants.Params.AUTHORIZATION_CODE) ?? '';\n resolvedSessionState =\n new URL(window.location.href).searchParams.get(OIDCRequestConstants.Params.SESSION_STATE) ?? '';\n resolvedState = new URL(window.location.href).searchParams.get(OIDCRequestConstants.Params.STATE) ?? '';\n\n SPAUtils.removeAuthorizationCode();\n }\n\n if (resolvedAuthorizationCode && resolvedState) {\n (sm as any).setSessionStatus('true');\n const storedTokenRequestConfig = await (sm as any).getTemporaryDataParameter(TOKEN_REQUEST_CONFIG_KEY);\n if (storedTokenRequestConfig && typeof storedTokenRequestConfig === 'string') {\n resolvedTokenRequestConfig = JSON.parse(storedTokenRequestConfig);\n }\n return this._exchangeCodeForTokens(\n resolvedAuthorizationCode,\n resolvedSessionState,\n resolvedState,\n resolvedTokenRequestConfig,\n );\n }\n\n return this.getSignInUrl(signInConfig as any).then(async (url: string) => {\n if (this._storage === BrowserStorage.BrowserMemory && config.enablePKCE) {\n const pkceKey: string = extractPkceStorageKeyFromState(resolvedState);\n SPAUtils.setPKCE(pkceKey, await this.getPKCECode(resolvedState));\n }\n\n if (tokenRequestConfig) {\n (sm as any).setTemporaryDataParameter(TOKEN_REQUEST_CONFIG_KEY, JSON.stringify(tokenRequestConfig));\n }\n\n if ((signInConfig as any)?.response_mode === 'direct') {\n const authorizeUrl: URL = new URL(url);\n return initializeEmbeddedSignInFlow({\n url: `${authorizeUrl.origin}${authorizeUrl.pathname}`,\n payload: Object.fromEntries(authorizeUrl.searchParams.entries()),\n });\n }\n\n location.href = url;\n await SPAUtils.waitTillPageRedirect();\n\n return {allowedScopes: '', displayName: '', email: '', sessionState: '', sub: '', tenantDomain: '', username: ''};\n });\n }\n\n private async _exchangeCodeForTokens(\n authorizationCode: string,\n sessionState: string,\n state: string,\n tokenRequestConfig?: {params: Record<string, unknown>},\n ): Promise<User> {\n const sm = this.getStorageManager();\n const config = await (sm as any).getConfigData();\n\n if (this._storage === BrowserStorage.BrowserMemory && config.enablePKCE && sessionState) {\n const pkceKey = extractPkceStorageKeyFromState(sessionState);\n const pkce = SPAUtils.getPKCE(pkceKey);\n await this.setPKCECode(pkce, pkceKey);\n }\n\n await this.requestAccessToken(authorizationCode, sessionState ?? '', state ?? '', undefined, tokenRequestConfig);\n\n try {\n const signOutUrl = await this.getSignOutUrl();\n SPAUtils.setSignOutURL(signOutUrl, config.clientId, this._browserInstanceId);\n } catch {\n // end_session_endpoint absent — signOut() falls back to signInUrl navigation.\n }\n\n await this._spaHelper!.clearRefreshTokenTimeout();\n await this._spaHelper!.refreshAccessTokenAutomatically(() => this.refreshAccessToken() as any);\n\n if (config.syncSession) {\n this._checkSession();\n }\n\n return this.getUser();\n }\n\n public override async signInSilently(\n additionalParams?: Record<string, string | boolean>,\n tokenRequestConfig?: {params: Record<string, unknown>},\n ): Promise<User | boolean | undefined> {\n await this.isInitialized();\n\n if (SPAUtils.wasSignInCalled()) {\n return undefined;\n }\n\n const response = await this._authHelper!.signInSilently(\n (params) => this._constructSilentSignInUrl(params),\n (code, ss, s, trc) => this._exchangeCodeForTokens(code, ss, s, trc),\n this._sessionManagementHelper!,\n additionalParams,\n tokenRequestConfig,\n );\n\n if (this._onSignInCallback && response) {\n this._onSignInCallback(response as User);\n }\n\n return response;\n }\n\n public override async signOut(\n _options?: any,\n sessionIdOrAfterSignOut?: string | ((url: string) => void),\n afterSignOutParam?: (url: string) => void,\n ): Promise<string> {\n let afterSignOut: ((url: string) => void) | undefined;\n\n if (typeof sessionIdOrAfterSignOut === 'function') {\n afterSignOut = sessionIdOrAfterSignOut;\n } else if (typeof sessionIdOrAfterSignOut === 'string') {\n afterSignOut = afterSignOutParam;\n }\n\n const sm = this.getStorageManager();\n const config = await (sm as any).getConfigData();\n\n // TEMPORARY: Handle sign-out by clearing the session and navigating back to sign-in,\n // until the OIDC end-session flow is fully supported.\n this.clearSession();\n\n if (config?.signInUrl) {\n navigate(config.signInUrl);\n } else {\n this.signIn(config?.signInOptions);\n }\n\n afterSignOut?.(config?.afterSignOutUrl || '');\n\n return config?.afterSignOutUrl || '';\n }\n\n public async httpRequest(requestConfig: HttpRequestConfig): Promise<HttpResponse | undefined> {\n await this._validateMethod(false);\n\n return this._authHelper!.httpRequest(\n this._httpClient!,\n requestConfig,\n this._isHttpHandlerEnabled,\n this._httpErrorCallback,\n this._httpFinishCallback,\n );\n }\n\n public async httpRequestAll(configs: HttpRequestConfig[]): Promise<HttpResponse[] | undefined> {\n await this._validateMethod(false);\n\n return this._authHelper!.httpRequestAll(\n configs,\n this._httpClient!,\n this._isHttpHandlerEnabled,\n this._httpErrorCallback,\n this._httpFinishCallback,\n );\n }\n\n public override async getUser(userId?: string): Promise<User> {\n await this._validateMethod();\n\n return super.getUser(userId);\n }\n\n public override async getAccessToken(sessionId?: string): Promise<string> {\n return super.getAccessToken(sessionId);\n }\n\n public override async getDecodedIdToken(userId?: string, idToken?: string): Promise<IdToken> {\n await this._validateMethod();\n\n return super.getDecodedIdToken(userId, idToken);\n }\n\n public override async getIdToken(userId?: string): Promise<string> {\n await this._validateMethod();\n\n return super.getIdToken(userId);\n }\n\n public override async getOpenIDProviderEndpoints(): Promise<Partial<OIDCEndpoints>> {\n await this.isInitialized();\n\n return super.getOpenIDProviderEndpoints();\n }\n\n public async getCrypto(): Promise<IsomorphicCrypto | undefined> {\n await this._validateMethod();\n\n return this.getCryptoHelper() as any;\n }\n\n public getHttpClient(): FetchHttpClient {\n if (!this._httpClient) {\n throw new ThunderIDAuthException(\n 'SPA-AUTH_CLIENT-GHC-NF02',\n 'The SDK is not initialized.',\n 'Call initialize() before getHttpClient().',\n );\n }\n\n return this._httpClient;\n }\n\n public override async isSignedIn(userId?: string): Promise<boolean> {\n await this.isInitialized();\n\n return super.isSignedIn(userId);\n }\n\n protected notifySignIn(user: User): void {\n this._onSignInCallback(user);\n }\n\n public async isSessionActive(): Promise<boolean | undefined> {\n await this.isInitialized();\n\n return (await (this.getStorageManager() as any).getSessionStatus()) === 'true';\n }\n\n public override async refreshAccessToken(userId?: string): Promise<User | TokenResponse> {\n await this._validateMethod(false);\n\n try {\n return await this._authHelper!.refreshAccessToken((cfg) => this._enableRetrievingSignOutURLFromSession(cfg));\n } catch (error) {\n return Promise.reject(error);\n }\n }\n\n public override async revokeAccessToken(userId?: string): Promise<boolean | Response> {\n await this._validateMethod();\n\n const timer: number = await this._spaHelper!.getRefreshTimeoutTimer();\n await super.revokeAccessToken(userId);\n\n this._sessionManagementHelper?.reset();\n await this._spaHelper!.clearRefreshTokenTimeout(timer);\n\n this._onEndUserSession && (await this._onEndUserSession(true));\n\n return true;\n }\n\n public override async exchangeToken(config: SPATokenExchangeConfig): Promise<Response | User> {\n if (config.signInRequired) {\n await this._validateMethod();\n }\n\n if (!config.id) {\n return Promise.reject(\n new ThunderIDAuthException(\n 'SPA-AUTH_CLIENT-RCG-NF01',\n 'The custom grant request id not found.',\n 'Set the `id` attribute on the token exchange config.',\n ),\n );\n }\n\n const response = await this._authHelper!.exchangeToken(config, (cfg) =>\n this._enableRetrievingSignOutURLFromSession(cfg),\n );\n\n const cb = this._onCustomGrant.get(config.id);\n cb?.(response);\n\n return response;\n }\n\n public override async reInitialize(config: Partial<T>): Promise<boolean> {\n await this.isInitialized();\n\n const sm = this.getStorageManager();\n const existingConfig = await (sm as any).getConfigData();\n const isCheckSessionIframeDifferent = !(\n existingConfig?.endpoints?.checkSessionIframe &&\n (config as any)?.endpoints?.checkSessionIframe &&\n existingConfig.endpoints.checkSessionIframe === (config as any).endpoints.checkSessionIframe\n );\n const result = await super.reInitialize(config);\n\n const merged = {...existingConfig, ...config};\n if (merged.syncSession && isCheckSessionIframeDifferent) {\n this._sessionManagementHelper?.reset();\n this._checkSession();\n }\n\n return result;\n }\n\n public async startAutoRefreshToken(): Promise<void> {\n await this.isInitialized();\n\n await this._spaHelper!.clearRefreshTokenTimeout();\n await this._spaHelper!.refreshAccessTokenAutomatically(() => this.refreshAccessToken() as any);\n }\n\n public async enableHttpHandler(): Promise<boolean | undefined> {\n await this.isInitialized();\n\n this._authHelper?.enableHttpHandler(this._httpClient!);\n this._isHttpHandlerEnabled = true;\n\n return true;\n }\n\n public async disableHttpHandler(): Promise<boolean | undefined> {\n await this.isInitialized();\n\n this._authHelper?.disableHttpHandler(this._httpClient!);\n this._isHttpHandlerEnabled = false;\n\n return true;\n }\n\n public override async decodeJwtToken<R = Record<string, unknown>>(token: string): Promise<R> {\n return this.getCryptoHelper().decodeJwtToken<R>(token);\n }\n\n public async on(hook: string, callback: (response?: any) => void | Promise<void>, id?: string): Promise<void> {\n await this.isInitialized();\n\n if (!callback || typeof callback !== 'function') {\n throw new ThunderIDAuthException(\n 'SPA-AUTH_CLIENT-ON-IV02',\n 'Invalid callback function.',\n 'The provided callback must be a function.',\n );\n }\n\n switch (hook) {\n case 'sign-in':\n this._onSignInCallback = callback;\n break;\n case 'sign-out':\n this._onSignOutCallback = callback;\n if (\n await SPAUtils.isSignOutSuccessful(\n ThunderIDBrowserClient.isSignOutSuccessful.bind(ThunderIDBrowserClient),\n () => ThunderIDBrowserClient.clearSession(),\n )\n ) {\n this._onSignOutCallback();\n }\n break;\n case 'revoke-access-token':\n this._onEndUserSession = callback;\n break;\n case 'initialize':\n this._onInitialize = callback;\n break;\n case 'http-request-error':\n this._httpErrorCallback = callback;\n break;\n case 'http-request-finish':\n this._httpFinishCallback = callback;\n break;\n case 'http-request-start':\n this._httpClient?.setHttpRequestStartCallback?.(callback);\n break;\n case 'http-request-success':\n this._httpClient?.setHttpRequestSuccessCallback?.(callback);\n break;\n case 'custom-grant':\n id && this._onCustomGrant.set(id, callback);\n break;\n case 'sign-out-failed': {\n this._onSignOutFailedCallback = callback;\n const signOutFail = SPAUtils.didSignOutFail(ThunderIDBrowserClient.didSignOutFail.bind(ThunderIDBrowserClient));\n if (signOutFail) {\n this._onSignOutFailedCallback(signOutFail as SignOutError);\n }\n break;\n }\n default:\n throw new ThunderIDAuthException('SPA-AUTH_CLIENT-ON-IV01', 'Invalid hook.', `Unknown hook: \"${hook}\"`);\n }\n }\n\n private async _checkSession(): Promise<void> {\n const oidcEndpoints = (await this.getOpenIDProviderEndpoints()) as OIDCEndpoints;\n const sm = this.getStorageManager();\n const config = await (sm as any).getConfigData();\n\n this._authHelper!.initializeSessionManger(\n config,\n oidcEndpoints,\n async () => (await (sm as any).getSessionData())?.session_state ?? '',\n async (params?: any): Promise<string> => this.getSignInUrl(params),\n this._sessionManagementHelper!,\n );\n }\n\n private async _shouldStopAuthn(): Promise<boolean> {\n const sm = this.getStorageManager();\n\n return this._sessionManagementHelper!.receivePromptNoneResponse(async (sessionState: string | null) => {\n await (sm as any).setSessionDataParameter(\n OIDCRequestConstants.Params.SESSION_STATE as keyof SessionData,\n sessionState ?? '',\n );\n });\n }\n\n private _enableRetrievingSignOutURLFromSession(config: SPATokenExchangeConfig): void {\n if (config.preventSignOutURLUpdate) {\n this._getSignOutURLFromSessionStorage = true;\n }\n }\n\n private async _constructSilentSignInUrl(additionalParams: Record<string, string | boolean> = {}): Promise<string> {\n const sm = this.getStorageManager();\n const config = await (sm as any).getConfigData();\n\n const urlString: string = await this.getSignInUrl({\n prompt: 'none',\n state: SILENT_SIGN_IN_STATE,\n ...additionalParams,\n } as any);\n\n const urlObject = new URL(urlString);\n urlObject.searchParams.set('response_mode', 'query');\n\n if (this._storage === BrowserStorage.BrowserMemory && config.enablePKCE) {\n const state = urlObject.searchParams.get(OIDCRequestConstants.Params.STATE);\n SPAUtils.setPKCE(extractPkceStorageKeyFromState(state ?? ''), await this.getPKCECode(state ?? ''));\n }\n\n return urlObject.toString();\n }\n\n public override getInstanceId(): number {\n return this._browserInstanceId;\n }\n\n public static async clearSession(): Promise<void> {\n // Static clear: no-op at base level; session data is cleared by instance signOut\n }\n}\n\nexport default ThunderIDBrowserClient;\n","/**\n * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\n/**\n * Event hook names for attaching callbacks via `ThunderIDBrowserClient.on()`.\n */\nexport enum Hooks {\n SignIn = 'sign-in',\n SignOut = 'sign-out',\n Initialize = 'initialize',\n HttpRequestStart = 'http-request-start',\n HttpRequestFinish = 'http-request-finish',\n HttpRequestError = 'http-request-error',\n HttpRequestSuccess = 'http-request-success',\n RevokeAccessToken = 'revoke-access-token',\n CustomGrant = 'custom-grant',\n SignOutFailed = 'sign-out-failed',\n}\n\nexport default Hooks;\n","/**\n * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\n/**\n * Utility to check if `code` and `session_state` are available in the URL as search params.\n *\n * @param params - The URL search params to check. Defaults to `window.location.search`.\n * @return `true` if the URL contains `code` and `session_state` search params, otherwise `false`.\n */\nconst hasAuthParamsInUrl = (params: string = window.location.search): boolean => {\n const MATCHER = /[?&]code=[^&]+/;\n\n return MATCHER.test(params);\n};\n\nexport default hasAuthParamsInUrl;\n","/**\n * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\n/**\n * Utility to check if `state` is available in the URL as a search param and matches the provided instance.\n *\n * @param params - The URL search params to check. Defaults to `window.location.search`.\n * @param instanceId - The instance ID to match against the `state` param.\n * @return `true` if the URL contains a matching `state` search param, otherwise `false`.\n */\nconst hasCalledForThisInstanceInUrl = (instanceId: number, params: string = window.location.search): boolean => {\n const MATCHER = new RegExp(`[?&]state=instance_${instanceId}_[^&]+`);\n\n return MATCHER.test(params);\n};\n\nexport default hasCalledForThisInstanceInUrl;\n","/**\n * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport ThunderIDBrowserClient from '../ThunderIDBrowserClient';\n\n/**\n * Creates an HTTP utility for making authenticated requests using a `ThunderIDBrowserClient` instance.\n *\n * @param client - The browser client instance to use for requests.\n * @returns An object with `request` and `requestAll` methods bound to the provided client.\n *\n * @example\n * ```typescript\n * const auth = new ThunderIDBrowserClient();\n * await auth.initialize(config);\n * const httpClient = http(auth);\n * const response = await httpClient.request({ url: '/api/data', method: 'GET' });\n * ```\n */\nconst http = (\n client: ThunderIDBrowserClient,\n): {\n request: typeof ThunderIDBrowserClient.prototype.httpRequest;\n requestAll: typeof ThunderIDBrowserClient.prototype.httpRequestAll;\n} => {\n return {\n request: client.httpRequest.bind(client),\n requestAll: client.httpRequestAll.bind(client),\n };\n};\n\nexport default http;\n","/**\n * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport {\n arrayBufferToBase64url,\n base64urlToArrayBuffer,\n ThunderIDRuntimeError,\n createPackageComponentLogger,\n} from '@thunderid/javascript';\n\nconst logger: ReturnType<typeof createPackageComponentLogger> = createPackageComponentLogger(\n '@thunderid/browser',\n 'WebAuthn',\n);\n\n/**\n * Handles WebAuthn/Passkey authentication flow for browser environments.\n *\n * This function processes a WebAuthn challenge, performs the authentication ceremony,\n * and returns the authentication response that can be sent to the server for verification.\n *\n * The function handles various aspects of WebAuthn authentication including:\n * - Browser compatibility checks for WebAuthn support\n * - HTTPS requirement validation (except for localhost development)\n * - Relying Party ID validation and domain compatibility\n * - Challenge data decoding and credential request options processing\n * - User authentication ceremony via navigator.credentials.get()\n * - Response formatting for server consumption\n *\n * @param challengeData - Base64-encoded challenge data containing WebAuthn request options.\n * This data typically includes the challenge, RP ID, allowed credentials,\n * user verification requirements, and other authentication parameters.\n *\n * @returns Promise that resolves to a JSON string containing the WebAuthn authentication response.\n * The response includes the credential ID, authenticator data, client data JSON,\n * signature, and optional user handle that can be verified by the server.\n *\n * @throws {ThunderIDRuntimeError} When WebAuthn is not supported in the current browser\n * @throws {ThunderIDRuntimeError} When the page is not served over HTTPS (except localhost)\n * @throws {ThunderIDRuntimeError} When the user cancels or times out the authentication\n * @throws {ThunderIDRuntimeError} When there's a domain/RP ID mismatch\n * @throws {ThunderIDRuntimeError} When no valid passkey is found for the account\n * @throws {ThunderIDRuntimeError} When WebAuthn is not supported on the device/browser\n * @throws {ThunderIDRuntimeError} When there's a network error during authentication\n * @throws {ThunderIDRuntimeError} For any other authentication failures\n *\n * @example\n * ```typescript\n * try {\n * const challengeData = 'eyJwdWJsaWNLZXlDcmVkZW50aWFsUmVxdWVzdE9wdGlvbnMiOi4uLn0=';\n * const authResponse = await handleWebAuthnAuthentication(challengeData);\n *\n * // Send the response to your server for verification\n * const result = await fetch('/api/verify-webauthn', {\n * method: 'POST',\n * headers: { 'Content-Type': 'application/json' },\n * body: authResponse\n * });\n * } catch (error) {\n * if (error instanceof ThunderIDRuntimeError) {\n * console.error('WebAuthn authentication failed:', error.message);\n * }\n * }\n * ```\n *\n * @example\n * ```typescript\n * // Usage in an authentication flow\n * const authenticateWithPasskey = async (challengeFromServer: string) => {\n * try {\n * const response = await handleWebAuthnAuthentication(challengeFromServer);\n * return JSON.parse(response);\n * } catch (error) {\n * // Handle specific error cases\n * if (error instanceof ThunderIDRuntimeError) {\n * switch (error.code) {\n * case 'browser-webauthn-not-supported':\n * showFallbackAuth();\n * break;\n * case 'browser-webauthn-user-cancelled':\n * showRetryOption();\n * break;\n * default:\n * showGenericError();\n * }\n * }\n * }\n * };\n * ```\n *\n * @see {@link https://webauthn.guide/} - WebAuthn specification guide\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Web_Authentication_API} - MDN WebAuthn API documentation\n */\nconst handleWebAuthnAuthentication = async (challengeData: string): Promise<string> => {\n if (!window.navigator.credentials?.get) {\n throw new ThunderIDRuntimeError(\n 'WebAuthn is not supported in this browser. Please use a modern browser or try a different authentication method.',\n 'browser-webauthn-not-supported',\n 'browser',\n 'WebAuthn/Passkey authentication requires a browser that supports the Web Authentication API.',\n );\n }\n\n if (window.location.protocol !== 'https:' && window.location.hostname !== 'localhost') {\n throw new ThunderIDRuntimeError(\n 'Passkey authentication requires a secure connection (HTTPS). Please ensure you are accessing this site over HTTPS.',\n 'browser-webauthn-insecure-connection',\n 'browser',\n 'WebAuthn authentication requires HTTPS for security reasons, except when running on localhost for development.',\n );\n }\n\n try {\n const decodedChallenge: any = JSON.parse(atob(challengeData));\n const {publicKeyCredentialRequestOptions} = decodedChallenge;\n\n const currentDomain: string = window.location.hostname;\n const challengeRpId: string = publicKeyCredentialRequestOptions.rpId;\n\n let rpIdToUse: string = challengeRpId;\n\n if (challengeRpId && !currentDomain.endsWith(challengeRpId) && challengeRpId !== currentDomain) {\n logger.warn(`RP ID mismatch detected. Challenge RP ID: ${challengeRpId}, Current domain: ${currentDomain}`);\n rpIdToUse = currentDomain;\n }\n\n const adjustedOptions: any = {\n ...publicKeyCredentialRequestOptions,\n challenge: base64urlToArrayBuffer(publicKeyCredentialRequestOptions.challenge),\n rpId: rpIdToUse,\n ...(publicKeyCredentialRequestOptions.userVerification && {\n userVerification: publicKeyCredentialRequestOptions.userVerification,\n }),\n ...(publicKeyCredentialRequestOptions.allowCredentials && {\n allowCredentials: publicKeyCredentialRequestOptions.allowCredentials.map((cred: any) => ({\n ...cred,\n id: base64urlToArrayBuffer(cred.id),\n })),\n }),\n };\n\n const credential: PublicKeyCredential = (await navigator.credentials.get({\n publicKey: adjustedOptions,\n })) as PublicKeyCredential;\n\n if (!credential) {\n throw new ThunderIDRuntimeError(\n 'No credential returned from WebAuthn authentication',\n 'browser-webauthn-no-credential',\n 'browser',\n 'The WebAuthn authentication ceremony completed but did not return a valid credential.',\n );\n }\n\n const authData: AuthenticatorAssertionResponse = credential.response as AuthenticatorAssertionResponse;\n\n const tokenResponse: {credential: any; requestId: string} = {\n credential: {\n id: credential.id,\n rawId: arrayBufferToBase64url(credential.rawId),\n response: {\n authenticatorData: arrayBufferToBase64url(authData.authenticatorData),\n clientDataJSON: arrayBufferToBase64url(authData.clientDataJSON),\n signature: arrayBufferToBase64url(authData.signature),\n ...(authData.userHandle && {\n userHandle: arrayBufferToBase64url(authData.userHandle),\n }),\n },\n type: credential.type,\n },\n requestId: decodedChallenge.requestId,\n };\n\n return JSON.stringify(tokenResponse);\n } catch (error) {\n logger.error('WebAuthn authentication failed:');\n\n if (error instanceof ThunderIDRuntimeError) {\n throw error;\n }\n\n if (error instanceof Error) {\n switch (error.name) {\n case 'NotAllowedError':\n throw new ThunderIDRuntimeError(\n 'Passkey authentication was cancelled or timed out. Please try again.',\n 'browser-webauthn-user-cancelled',\n 'browser',\n 'The user cancelled the WebAuthn authentication request or the request timed out.',\n );\n\n case 'SecurityError':\n if (error.message.includes('relying party ID') || error.message.includes('RP ID')) {\n throw new ThunderIDRuntimeError(\n 'Domain mismatch error. The passkey was registered for a different domain. Please contact support or try a different authentication method.',\n 'browser-webauthn-domain-mismatch',\n 'browser',\n 'The WebAuthn relying party ID does not match the current domain.',\n );\n }\n throw new ThunderIDRuntimeError(\n 'Passkey authentication failed due to a security error. Please ensure you are using HTTPS and that your browser supports passkeys.',\n 'browser-webauthn-security-error',\n 'browser',\n 'A security error occurred during WebAuthn authentication.',\n );\n\n case 'InvalidStateError':\n throw new ThunderIDRuntimeError(\n 'No valid passkey found for this account. Please register a passkey first or use a different authentication method.',\n 'browser-webauthn-no-passkey',\n 'browser',\n 'No registered passkey credentials were found for the current user account.',\n );\n\n case 'NotSupportedError':\n throw new ThunderIDRuntimeError(\n 'Passkey authentication is not supported on this device or browser. Please use a different authentication method.',\n 'browser-webauthn-not-supported',\n 'browser',\n 'WebAuthn is not supported on the current device or browser configuration.',\n );\n\n case 'NetworkError':\n throw new ThunderIDRuntimeError(\n 'Network error during passkey authentication. Please check your connection and try again.',\n 'browser-webauthn-network-error',\n 'browser',\n 'A network error occurred while communicating with the authenticator.',\n );\n\n case 'UnknownError':\n throw new ThunderIDRuntimeError(\n 'An unknown error occurred during passkey authentication. Please try again or use a different authentication method.',\n 'browser-webauthn-unknown-error',\n 'browser',\n 'An unidentified error occurred during the WebAuthn authentication process.',\n );\n\n default:\n throw new ThunderIDRuntimeError(\n `Passkey authentication failed: ${error.message}`,\n 'browser-webauthn-general-error',\n 'browser',\n `WebAuthn authentication failed with error: ${error.name}`,\n );\n }\n }\n\n throw new ThunderIDRuntimeError(\n 'Passkey authentication failed due to an unexpected error.',\n 'browser-webauthn-unexpected-error',\n 'browser',\n 'An unexpected error occurred during WebAuthn authentication.',\n );\n }\n};\n\nexport default handleWebAuthnAuthentication;\n","/**\n * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport {extractEmojiFromUri, isEmojiUri} from '@thunderid/javascript';\n\n/**\n * Resolves `emoji:` URIs in an HTML string.\n *\n * Handles two forms:\n * - `<img src=\"emoji:🐯\" alt=\"tiger\">` → `<span role=\"img\" aria-label=\"tiger\">🐯</span>`\n * - Bare `emoji:🐯` text references → `🐯`\n *\n * @param html - The HTML string that may contain `emoji:` URIs.\n * @returns The HTML string with all `emoji:` URIs replaced.\n */\nconst resolveEmojiUrisInHtml = (html: string): string => {\n const withEmojiImages: string = html.replace(\n /<img([^>]*)src=\"(emoji:[^\"]+)\"([^>]*)\\/?>/gi,\n (_match: string, pre: string, src: string, post: string): string => {\n const emoji: string = extractEmojiFromUri(src);\n if (!emoji) {\n return _match;\n }\n const altMatch: RegExpMatchArray | null = /alt=\"([^\"]*)\"/i.exec(pre + post);\n const label: string = altMatch ? altMatch[1] : emoji;\n return `<span role=\"img\" aria-label=\"${label}\">${emoji}</span>`;\n },\n );\n return withEmojiImages.replace(/emoji:([^\\s\"<>&]+)/g, (_: string, rest: string): string =>\n isEmojiUri(`emoji:${rest}`) ? rest : `emoji:${rest}`,\n );\n};\n\nexport default resolveEmojiUrisInHtml;\n","/**\n * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport {ThemeDetection, ThemeMode, createPackageComponentLogger} from '@thunderid/javascript';\n\nconst logger: ReturnType<typeof createPackageComponentLogger> = createPackageComponentLogger(\n '@thunderid/browser',\n 'ThemeDetection',\n);\n\n/**\n * Extended theme detection config that includes DOM-specific options\n */\nexport interface BrowserThemeDetection extends ThemeDetection {\n /**\n * The element to observe for class changes\n * @default document.documentElement (html element)\n */\n targetElement?: HTMLElement;\n}\n\n/**\n * Detects the current theme mode based on the specified method\n */\nexport const detectThemeMode = (mode: ThemeMode, config: BrowserThemeDetection = {}): 'light' | 'dark' => {\n const {\n darkClass = 'dark',\n lightClass = 'light',\n targetElement = typeof document !== 'undefined' ? document.documentElement : null,\n } = config;\n\n if (mode === 'light') return 'light';\n if (mode === 'dark') return 'dark';\n\n if (mode === 'system') {\n if (typeof window !== 'undefined' && window.matchMedia) {\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }\n return 'light';\n }\n\n if (mode === 'class') {\n if (!targetElement) {\n logger.warn('ThemeDetection: targetElement is required for class-based detection, falling back to light mode');\n return 'light';\n }\n\n const {classList} = targetElement;\n\n // Check for explicit dark class first\n if (classList.contains(darkClass)) {\n return 'dark';\n }\n\n // Check for explicit light class\n if (classList.contains(lightClass)) {\n return 'light';\n }\n\n // If neither class is present, default to light\n return 'light';\n }\n\n return 'light';\n};\n\n/**\n * Creates a MutationObserver to watch for class changes on the target element\n */\nexport const createClassObserver = (\n targetElement: HTMLElement,\n callback: (isDark: boolean) => void,\n config: BrowserThemeDetection = {},\n): MutationObserver => {\n const {darkClass = 'dark', lightClass = 'light'} = config;\n\n const observer: MutationObserver = new MutationObserver((mutations: MutationRecord[]) => {\n mutations.forEach((mutation: MutationRecord) => {\n if (mutation.type === 'attributes' && mutation.attributeName === 'class') {\n const {classList} = targetElement;\n\n if (classList.contains(darkClass)) {\n callback(true);\n } else if (classList.contains(lightClass)) {\n callback(false);\n }\n // If neither class is present, we don't trigger the callback\n // to avoid unnecessary re-renders\n }\n });\n });\n\n observer.observe(targetElement, {\n attributeFilter: ['class'],\n attributes: true,\n });\n\n return observer;\n};\n\n/**\n * Creates a media query listener for system theme changes\n */\nexport const createMediaQueryListener = (callback: (isDark: boolean) => void): MediaQueryList | null => {\n if (typeof window === 'undefined' || !window.matchMedia) {\n return null;\n }\n\n const mediaQuery: MediaQueryList = window.matchMedia('(prefers-color-scheme: dark)');\n\n const handleChange = (e: MediaQueryListEvent): void => {\n callback(e.matches);\n };\n\n // Modern browsers\n if (mediaQuery.addEventListener) {\n mediaQuery.addEventListener('change', handleChange);\n } else {\n // Fallback for older browsers\n mediaQuery.addListener(handleChange);\n }\n\n return mediaQuery;\n};\n","/**\n * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport {DEFAULT_THEME, ThemeMode} from '@thunderid/javascript';\nimport {BrowserThemeDetection, detectThemeMode} from './themeDetection';\n\n/**\n * Gets the active theme based on the theme mode preference\n * @param mode - The theme mode preference ('light', 'dark', 'system', or 'class')\n * @param config - Additional configuration for theme detection\n * @returns 'light' or 'dark' based on the resolved theme\n */\nconst getActiveTheme = (mode: ThemeMode, config: BrowserThemeDetection = {}): ThemeMode => {\n if (mode === 'dark') {\n return 'dark';\n }\n\n if (mode === 'light') {\n return 'light';\n }\n\n if (mode === 'system') {\n if (typeof window !== 'undefined' && window.matchMedia) {\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }\n\n // Default to light mode if system detection is not available\n return DEFAULT_THEME;\n }\n\n if (mode === 'class') {\n return detectThemeMode(mode, config);\n }\n\n // Default to light mode for any unknown mode\n return DEFAULT_THEME;\n};\n\nexport default getActiveTheme;\n"],"x_google_ignoreList":[10,11,12,13,14],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["HttpClient","url: string","qs: string","headers: Record<string, string>","body: BodyInit | undefined","fetchResponse: Response","networkError: any","responseData: T","responseHeaders: Record<string, string>","OIDCRequestConstants","url: URL","error: string | null","description: string | null","urlObject: URL","ThunderIDAuthException","refreshTokenError: Message<string>","SPAUtils","error: any","refreshAccessTokenResponse: User","refreshError: any","error","requests: Promise<HttpResponse<any>>[]","promptNoneIFrame: HTMLIFrameElement","data: Message<AuthorizationInfo | null>","targetUrl: URL","_clientID: string","_checkSessionEndpoint: string","_sessionState: () => Promise<string>","_interval: number","_redirectURL: string","_sessionRefreshInterval: number","_sessionRefreshIntervalTimeout: number","_checkSessionIntervalTimeout: number","_getSignInUrl: (params?: ExtendedAuthorizeRequestUrlParams) => Promise<string>","opIframe: HTMLIFrameElement","promptNoneIFrame: HTMLIFrameElement","SPAUtils","OIDCRequestConstants","code","message: Message<AuthorizationInfo>","message: Message<null>","byteLength","len","i","i","buffer","Buffer","i","len","buffer","byteLength","code","Buffer","Buffer","Buffer","jwtVerifyOptions: JWTVerifyOptions","ThunderIDAuthException","TokenConstants","refreshTimer: number","logger","BrowserStorage","LocalStore","MemoryStore","SessionStore","ThunderIDJavaScriptClient","SPACryptoUtils","store: Storage","SPAHelper","FetchHttpClient","createSessionManagementHelper","OIDCRequestConstants","AuthenticationHelper","ThunderIDAuthException","SPAUtils","resolvedAuthorizationCode: string","resolvedSessionState: string","resolvedState: string","resolvedTokenRequestConfig: {params: Record<string, unknown>}","pkceKey: string","code","afterSignOut: ((url: string) => void) | undefined","timer: number","urlString: string","logger: ReturnType<typeof createPackageComponentLogger>","ThunderIDRuntimeError","decodedChallenge: any","currentDomain: string","challengeRpId: string","rpIdToUse: string","adjustedOptions: any","credential: PublicKeyCredential","authData: AuthenticatorAssertionResponse","tokenResponse: {credential: any; requestId: string}","emoji: string","altMatch: RegExpMatchArray | null","logger: ReturnType<typeof createPackageComponentLogger>","observer: MutationObserver","mediaQuery: MediaQueryList","DEFAULT_THEME"],"sources":["../../src/constants/SPAConstants.ts","../../src/FetchHttpClient.ts","../../src/models/BrowserStorage.ts","../../src/stores/LocalStore.ts","../../src/stores/MemoryStore.ts","../../src/stores/SessionStore.ts","../../src/utils/SPAUtils.ts","../../src/utils/AuthenticationHelper.ts","../../src/utils/navigate.ts","../../src/utils/SessionManagementHelper.ts","../../../../node_modules/.pnpm/base64-js@1.5.1/node_modules/base64-js/index.js","../../../../node_modules/.pnpm/ieee754@1.2.1/node_modules/ieee754/index.js","../../../../node_modules/.pnpm/buffer@6.0.3/node_modules/buffer/index.js","../../../../node_modules/.pnpm/safe-buffer@5.2.1/node_modules/safe-buffer/index.js","../../../../node_modules/.pnpm/randombytes@2.1.0/node_modules/randombytes/browser.js","../../src/utils/SPACryptoUtils.ts","../../src/utils/SPAHelper.ts","../../src/ThunderIDBrowserClient.ts","../../src/constants/Hooks.ts","../../src/utils/hasAuthParamsInUrl.ts","../../src/utils/hasCalledForThisInstanceInUrl.ts","../../src/utils/http.ts","../../src/utils/handleWebAuthnAuthentication.ts","../../src/utils/resolveEmojiUrisInHtml.ts","../../src/theme/themeDetection.ts","../../src/theme/getActiveTheme.ts"],"sourcesContent":["/**\n * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nexport const ERROR = 'error';\nexport const ERROR_DESCRIPTION = 'error_description';\nexport const CUSTOM_GRANT_CONFIG = 'custom_grant_config';\nexport const STATE_QUERY = 'state';\n\nexport const OP_IFRAME = 'opIFrame';\nexport const RP_IFRAME = 'rpIFrame';\nexport const PROMPT_NONE_IFRAME = 'promptNoneIFrame';\nexport const STATE = 'Y2hlY2tTZXNzaW9u';\nexport const SILENT_SIGN_IN_STATE = 'sign-in-silently';\nexport const INITIALIZED_SILENT_SIGN_IN = 'initialized-silent-sign-in';\nexport const PROMPT_NONE_REQUEST_SENT = 'promptNoneRequestSent';\n\nexport const ACCESS_TOKEN_INVALID = 'Access token is invalid';\nexport const REFRESH_ACCESS_TOKEN_ERR0R = 'refresh-access-token-error';\nexport const TOKEN_REQUEST_CONFIG_KEY = 'token_request_config';\n\nexport const CHECK_SESSION_SIGNED_IN = 'check_session_signed_in';\nexport const CHECK_SESSION_SIGNED_OUT = 'check_session_signed_out';\nexport const SET_SESSION_STATE_FROM_IFRAME = 'set_session_state_from_iframe';\n","/**\n * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport {HttpClient, HttpError, HttpRequestConfig, HttpResponse} from '@thunderid/javascript';\n\n/**\n * Fetch-based HTTP client. Extends `HttpClient` and implements `transport()`\n * using the native Fetch API.\n *\n * To plug in a custom HTTP transport, extend `HttpClient` from `@thunderid/javascript`\n * and override `transport()`, then pass your implementation where `FetchHttpClient`\n * is currently used.\n */\nexport class FetchHttpClient extends HttpClient {\n private static instances: Map<number, FetchHttpClient> = new Map<number, FetchHttpClient>();\n\n static getInstance(\n instanceId = 0,\n isHandlerEnabled = true,\n attachToken: (request: HttpRequestConfig) => Promise<void> = (): Promise<void> => Promise.resolve(),\n ): FetchHttpClient {\n if (!this.instances.has(instanceId)) {\n this.instances.set(instanceId, new FetchHttpClient(isHandlerEnabled, attachToken));\n }\n return this.instances.get(instanceId)!;\n }\n\n static destroyInstance(instanceId = 0): void {\n this.instances.delete(instanceId);\n }\n\n protected async transport<T = any>(config: HttpRequestConfig): Promise<HttpResponse<T>> {\n const {\n attachToken,\n data,\n headers: configHeaders,\n method,\n params,\n shouldAttachIDPAccessToken,\n shouldEncodeToFormData,\n startTimeInMs,\n url: configUrl,\n ...fetchOptions\n } = config;\n\n let url: string = configUrl ?? '';\n\n if (params) {\n const qs: string = new URLSearchParams(params).toString();\n if (qs) {\n url = `${url}${url.includes('?') ? '&' : '?'}${qs}`;\n }\n }\n\n const headers: Record<string, string> = {...(configHeaders ?? {})};\n let body: BodyInit | undefined;\n\n if (data !== undefined) {\n if (data instanceof FormData) {\n body = data;\n } else {\n body = JSON.stringify(data);\n if (!headers['Content-Type'] && !headers['content-type']) {\n headers['Content-Type'] = 'application/json';\n }\n }\n }\n\n let fetchResponse: Response;\n\n try {\n fetchResponse = await fetch(url, {\n credentials: 'include',\n ...fetchOptions,\n body,\n headers,\n method: (method ?? 'GET').toUpperCase(),\n });\n } catch (networkError: any) {\n throw Object.assign(new Error(networkError.message), {\n code: 'NETWORK_ERROR',\n config,\n } as Partial<HttpError>);\n }\n\n const contentType: string = fetchResponse.headers.get('content-type') ?? '';\n const responseData: T = contentType.includes('application/json')\n ? await fetchResponse.json()\n : ((await fetchResponse.text()) as any);\n\n const responseHeaders: Record<string, string> = {};\n fetchResponse.headers.forEach((value: string, key: string) => {\n responseHeaders[key] = value;\n });\n\n if (!fetchResponse.ok) {\n throw Object.assign(new Error(fetchResponse.statusText), {\n config,\n response: {\n data: responseData,\n headers: responseHeaders,\n status: fetchResponse.status,\n statusText: fetchResponse.statusText,\n },\n } as Partial<HttpError>);\n }\n\n return {\n config,\n data: responseData,\n headers: responseHeaders,\n status: fetchResponse.status,\n statusText: fetchResponse.statusText,\n };\n }\n}\n\nexport default FetchHttpClient;\n","/**\n * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\n/**\n * Supported browser storage backends for auth session data.\n */\nexport enum BrowserStorage {\n /** Store session data in `localStorage` (persists across tabs and sessions). */\n LocalStorage = 'localStorage',\n /** Store session data in `sessionStorage` (cleared when the tab is closed). */\n SessionStorage = 'sessionStorage',\n /** Store session data in in-memory (cleared on page reload). */\n BrowserMemory = 'browserMemory',\n}\n\nexport default BrowserStorage;\n","/**\n * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport {Storage} from '@thunderid/javascript';\n\n/**\n * `Storage` implementation backed by the browser's `localStorage`.\n */\nclass LocalStore implements Storage {\n public async setData(key: string, value: string): Promise<void> {\n localStorage.setItem(key, value);\n }\n\n public async getData(key: string): Promise<string> {\n return localStorage.getItem(key) ?? '{}';\n }\n\n public async removeData(key: string): Promise<void> {\n localStorage.removeItem(key);\n }\n}\n\nexport default LocalStore;\n","/**\n * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport {Storage} from '@thunderid/javascript';\n\n/**\n * `Storage` implementation backed by an in-memory `Map`. Data does not survive page reloads.\n */\nclass MemoryStore implements Storage {\n private _data: Map<string, string>;\n\n public constructor() {\n this._data = new Map();\n }\n\n public async setData(key: string, value: string): Promise<void> {\n this._data.set(key, value);\n }\n\n public async getData(key: string): Promise<string> {\n return this._data?.get(key) ?? '{}';\n }\n\n public async removeData(key: string): Promise<void> {\n this._data.delete(key);\n }\n}\n\nexport default MemoryStore;\n","/**\n * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport {Storage} from '@thunderid/javascript';\n\n/**\n * `Storage` implementation backed by the browser's `sessionStorage`.\n */\nclass SessionStore implements Storage {\n public async setData(key: string, value: string): Promise<void> {\n sessionStorage.setItem(key, value);\n }\n\n public async getData(key: string): Promise<string> {\n return sessionStorage.getItem(key) ?? '{}';\n }\n\n public async removeData(key: string): Promise<void> {\n sessionStorage.removeItem(key);\n }\n}\n\nexport default SessionStore;\n","/**\n * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport {OIDCRequestConstants} from '@thunderid/javascript';\nimport {\n ERROR,\n ERROR_DESCRIPTION,\n INITIALIZED_SILENT_SIGN_IN,\n PROMPT_NONE_REQUEST_SENT,\n SILENT_SIGN_IN_STATE,\n STATE_QUERY,\n} from '../constants/SPAConstants';\nimport {SignOutError} from '../models/SignOutError';\n\n/**\n * Static utility methods for SPA authentication flows including PKCE storage,\n * sign-out URL management, and URL-based state detection.\n */\nclass SPAUtils {\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private constructor() {}\n\n /**\n * Removes the `code` search parameter from the current URL without a page reload.\n */\n public static removeAuthorizationCode(): void {\n const url = location.href;\n\n history.pushState({}, document.title, url.replace(/\\?code=.*$/, ''));\n }\n\n /**\n * Retrieves a PKCE verifier from storage.\n *\n * @param pkceKey - The storage key for the PKCE verifier.\n * @returns The stored verifier string, or an empty string if not found.\n */\n public static getPKCE(pkceKey: string): string {\n return localStorage.getItem(pkceKey) ?? '';\n }\n\n /**\n * Persists a PKCE verifier in storage.\n *\n * @param pkceKey - The storage key.\n * @param pkce - The PKCE verifier value.\n */\n public static setPKCE(pkceKey: string, pkce: string): void {\n localStorage.setItem(pkceKey, pkce);\n }\n\n /**\n * Persists the post-sign-out redirect URL for the given client and instance.\n *\n * @param url - The sign-out redirect URL.\n * @param clientId - The OAuth2 client ID.\n * @param instanceId - The client instance ID.\n */\n public static setSignOutURL(url: string, clientId: string, instanceId: number): void {\n sessionStorage.setItem(\n `${OIDCRequestConstants.SignOut.Storage.StorageKeys.SIGN_OUT_URL}-instance_${instanceId}-${clientId}`,\n url,\n );\n }\n\n /**\n * Retrieves the stored sign-out redirect URL for the given client and instance.\n *\n * @param clientId - The OAuth2 client ID.\n * @param instanceId - The client instance ID.\n * @returns The stored sign-out URL, or an empty string.\n */\n public static getSignOutUrl(clientId: string, instanceId: number): string {\n return (\n sessionStorage.getItem(\n `${OIDCRequestConstants.SignOut.Storage.StorageKeys.SIGN_OUT_URL}-instance_${instanceId}-${clientId}`,\n ) ?? ''\n );\n }\n\n /**\n * Removes a PKCE verifier from storage.\n *\n * @param pkceKey - The storage key to remove.\n */\n public static removePKCE(pkceKey: string): void {\n localStorage.removeItem(pkceKey);\n }\n\n /**\n * Determines whether the `signIn` method should continue based on the `callOnlyOnRedirect` flag.\n *\n * @param callOnlyOnRedirect - True if the call should only proceed when redirected back from the IdP.\n * @param authorizationCode - Authorization code passed directly (form_post mode).\n * @returns `true` if sign-in should proceed.\n */\n public static canContinueSignIn(callOnlyOnRedirect: boolean, authorizationCode?: string): boolean {\n if (callOnlyOnRedirect && !SPAUtils.hasErrorInURL() && !SPAUtils.hasAuthSearchParamsInURL() && !authorizationCode) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Returns `true` if silent sign-in is in progress (silent-state present in the URL).\n */\n public static isInitializedSilentSignIn(): boolean {\n return SPAUtils.isSilentStatePresentInURL();\n }\n\n /**\n * Returns `true` if the `signIn` method was already called this navigation\n * (auth code or error is present in the URL, but not a silent flow).\n */\n public static wasSignInCalled(): boolean {\n if (SPAUtils.hasErrorInURL() || SPAUtils.hasAuthSearchParamsInURL()) {\n if (!this.isSilentStatePresentInURL()) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Returns `true` if a silent sign-in was previously initialized in this session.\n */\n public static wasSilentSignInCalled(): boolean {\n const raw = sessionStorage.getItem(INITIALIZED_SILENT_SIGN_IN);\n\n return Boolean(raw ? JSON.parse(raw) : null);\n }\n\n /**\n * Checks whether the current URL indicates a successful sign-out redirect.\n * Clears the query string and session data if `true`.\n *\n * @param isSignOutSuccessful - Static method from the JS client for URL inspection.\n * @param clearSession - Callback to clear session data after successful sign-out.\n * @returns `true` if the sign-out completed successfully.\n */\n public static async isSignOutSuccessful(\n isSignOutSuccessfulFn: (url: string) => boolean,\n clearSession: () => Promise<void>,\n ): Promise<boolean> {\n if (isSignOutSuccessfulFn(window.location.href)) {\n const newUrl = window.location.href.split('?')[0];\n history.pushState({}, document.title, newUrl);\n await clearSession();\n\n return true;\n }\n\n return false;\n }\n\n /**\n * Checks whether the current URL indicates a sign-out failure.\n * Returns the error details if present, or `false` otherwise.\n *\n * @param didSignOutFailFn - Static method from the JS client for URL inspection.\n * @returns The `SignOutError` if sign-out failed, or `false`.\n */\n public static didSignOutFail(didSignOutFailFn: (url: string) => boolean): boolean | SignOutError {\n if (didSignOutFailFn(window.location.href)) {\n const url: URL = new URL(window.location.href);\n const error: string | null = url.searchParams.get(ERROR);\n const description: string | null = url.searchParams.get(ERROR_DESCRIPTION);\n const newUrl = window.location.href.split('?')[0];\n history.pushState({}, document.title, newUrl);\n\n return {\n description: description ?? '',\n error: error ?? '',\n };\n }\n\n return false;\n }\n\n /**\n * Returns `true` if the URL contains a silent sign-in state parameter.\n */\n public static isSilentStatePresentInURL(): boolean {\n const state = new URL(window.location.href).searchParams.get('state');\n\n return state?.includes(SILENT_SIGN_IN_STATE) ?? false;\n }\n\n /**\n * Returns `true` if the current URL contains an authorization code (`code` parameter).\n *\n * @param params - Search params string (defaults to `window.location.search`).\n */\n public static hasAuthSearchParamsInURL(params: string = window.location.search): boolean {\n const AUTH_CODE_REGEXP = /[?&]code=[^&]+/;\n\n return AUTH_CODE_REGEXP.test(params);\n }\n\n /**\n * Returns `true` if the current URL contains an OAuth2 error parameter\n * (but not a sign-out success state).\n *\n * @param url - URL to inspect (defaults to `window.location.href`).\n */\n public static hasErrorInURL(url: string = window.location.href): boolean {\n const urlObject: URL = new URL(url);\n\n return (\n !!urlObject.searchParams.get(ERROR) &&\n urlObject.searchParams.get(STATE_QUERY) !== OIDCRequestConstants.Params.SIGN_OUT_SUCCESS\n );\n }\n\n /**\n * Returns `true` if no prompt-none request has been sent yet this session.\n */\n public static canSendPromptNoneRequest(): boolean {\n const raw = sessionStorage.getItem(PROMPT_NONE_REQUEST_SENT);\n\n return !(raw ? JSON.parse(raw) : null);\n }\n\n /**\n * Records whether a prompt-none request has been sent.\n *\n * @param canSend - `true` marks the request as sent.\n */\n public static setPromptNoneRequestSent(canSend: boolean): void {\n sessionStorage.setItem(PROMPT_NONE_REQUEST_SENT, JSON.stringify(canSend));\n }\n\n /**\n * Waits until the browser has redirected (non-blocking delay).\n *\n * @param time - Time to wait in seconds (default: 3).\n */\n public static async waitTillPageRedirect(time?: number): Promise<void> {\n const timeToWait = time ?? 3000;\n\n await new Promise((resolve) => setTimeout(resolve, timeToWait * 1000));\n }\n\n /**\n * Returns a Promise that resolves when `condition()` returns `true`.\n *\n * @param condition - Predicate to poll.\n * @param timeout - Poll interval in milliseconds (default: 500).\n */\n public static until = (condition: () => boolean, timeout = 500): Promise<void> => {\n const poll = (done: () => void): void => {\n if (condition()) {\n done();\n } else {\n setTimeout(() => poll(done), timeout);\n }\n };\n\n return new Promise(poll);\n };\n}\n\nexport default SPAUtils;\n","/**\n * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport {\n ThunderIDAuthException,\n User,\n IsomorphicCrypto,\n StorageManager,\n IdToken,\n ExtendedAuthorizeRequestUrlParams,\n OIDCEndpoints,\n TokenResponse,\n Config,\n HttpClient,\n HttpError,\n HttpRequestConfig,\n HttpResponse,\n} from '@thunderid/javascript';\nimport SPAHelper from './SPAHelper';\nimport SPAUtils from './SPAUtils';\nimport {\n ACCESS_TOKEN_INVALID,\n CHECK_SESSION_SIGNED_IN,\n CHECK_SESSION_SIGNED_OUT,\n CUSTOM_GRANT_CONFIG,\n ERROR,\n ERROR_DESCRIPTION,\n PROMPT_NONE_IFRAME,\n REFRESH_ACCESS_TOKEN_ERR0R,\n RP_IFRAME,\n} from '../constants/SPAConstants';\nimport {SPATokenExchangeConfig} from '../models/TokenExchangeConfig';\n\ninterface AuthorizationInfo {\n code: string;\n sessionState: string;\n pkce?: string;\n state: string;\n tokenRequestConfig?: {params: Record<string, unknown>};\n}\n\ninterface Message<T> {\n type: string;\n data?: T;\n}\n\ninterface HttpRequestInterface {\n httpClient: HttpClient;\n requestConfig: HttpRequestConfig;\n isHttpHandlerEnabled?: boolean;\n httpErrorCallback?: (error: HttpError) => void | Promise<void>;\n httpFinishCallback?: () => void;\n enableRetrievingSignOutURLFromSession?: (config: SPATokenExchangeConfig) => void;\n}\n\ninterface SessionManagementHelperInterface {\n initialize(\n clientId: string,\n checkSessionEndpoint: string,\n getSessionState: () => Promise<string>,\n interval: number,\n sessionRefreshInterval: number,\n redirectURL: string,\n getSignInUrl: (params?: ExtendedAuthorizeRequestUrlParams) => Promise<string>,\n ): void;\n receivePromptNoneResponse(setSessionState?: (sessionState: string | null) => Promise<void>): Promise<boolean>;\n reset(): void;\n}\n\n/**\n * Browser-level authentication helper that orchestrates HTTP requests with token attachment,\n * automatic token refresh, session management, and the silent sign-in flow.\n *\n * @typeParam T - The browser client config extension type.\n */\nclass AuthenticationHelper<T> {\n private _storageManager: StorageManager<T>;\n private _spaHelper: SPAHelper<T>;\n private _instanceId: number;\n private _isTokenRefreshing: boolean;\n private _getUser: () => Promise<User>;\n private _refreshAccessToken: () => Promise<TokenResponse | User>;\n private _getAccessToken: (sessionId?: string) => Promise<string>;\n private _getIDPAccessToken: () => Promise<string>;\n private _isSignedIn: () => Promise<boolean>;\n private _getDecodedIdToken: (sessionId?: string) => Promise<IdToken>;\n private _getCrypto: () => Promise<IsomorphicCrypto>;\n private _getIdToken: () => Promise<string>;\n private _getOpenIDProviderEndpoints: () => Promise<OIDCEndpoints>;\n private _exchangeToken: (config: SPATokenExchangeConfig) => Promise<Response | TokenResponse | User>;\n private _setPKCECode: (pkceKey: string, state: string) => Promise<void>;\n\n /**\n * @param storageManager - Storage manager for reading config and session data.\n * @param spaHelper - Helper for managing token refresh timers.\n * @param instanceId - The instance ID used for signing out URL storage.\n * @param operations - Client operation callbacks to avoid circular dependency.\n */\n public constructor(\n storageManager: StorageManager<T>,\n spaHelper: SPAHelper<T>,\n instanceId: number,\n operations: {\n getUser: () => Promise<User>;\n refreshAccessToken: () => Promise<TokenResponse | User>;\n getAccessToken: (sessionId?: string) => Promise<string>;\n getIDPAccessToken: () => Promise<string>;\n isSignedIn: () => Promise<boolean>;\n getDecodedIdToken: (sessionId?: string) => Promise<IdToken>;\n getCrypto: () => Promise<IsomorphicCrypto>;\n getIdToken: () => Promise<string>;\n getOpenIDProviderEndpoints: () => Promise<OIDCEndpoints>;\n exchangeToken: (config: SPATokenExchangeConfig) => Promise<Response | TokenResponse | User>;\n setPKCECode: (pkceKey: string, state: string) => Promise<void>;\n },\n ) {\n this._storageManager = storageManager;\n this._spaHelper = spaHelper;\n this._instanceId = instanceId;\n this._isTokenRefreshing = false;\n this._getUser = operations.getUser;\n this._refreshAccessToken = operations.refreshAccessToken;\n this._getAccessToken = operations.getAccessToken;\n this._getIDPAccessToken = operations.getIDPAccessToken;\n this._isSignedIn = operations.isSignedIn;\n this._getDecodedIdToken = operations.getDecodedIdToken;\n this._getCrypto = operations.getCrypto;\n this._getIdToken = operations.getIdToken;\n this._getOpenIDProviderEndpoints = operations.getOpenIDProviderEndpoints;\n this._exchangeToken = operations.exchangeToken;\n this._setPKCECode = operations.setPKCECode;\n }\n\n /**\n * Enables request interception on the HTTP client.\n *\n * @param httpClient - The HTTP client to enable.\n */\n public enableHttpHandler(httpClient: HttpClient): void {\n httpClient?.enableHandler && httpClient.enableHandler();\n }\n\n /**\n * Disables request interception on the HTTP client.\n *\n * @param httpClient - The HTTP client to disable.\n */\n public disableHttpHandler(httpClient: HttpClient): void {\n httpClient?.disableHandler && httpClient.disableHandler();\n }\n\n /**\n * Initializes OIDC Session Management via an RP iframe.\n *\n * @param config - The current auth config.\n * @param oidcEndpoints - Resolved OIDC provider endpoints.\n * @param getSessionState - Returns the current session state from storage.\n * @param getAuthzURL - Builds an authorization URL with optional params.\n * @param sessionManagementHelper - The session management helper instance.\n */\n public initializeSessionManger(\n config: any,\n oidcEndpoints: OIDCEndpoints,\n getSessionState: () => Promise<string>,\n getAuthzURL: (params?: ExtendedAuthorizeRequestUrlParams) => Promise<string>,\n sessionManagementHelper: SessionManagementHelperInterface,\n ): void {\n sessionManagementHelper.initialize(\n config.clientId,\n oidcEndpoints.checkSessionIframe ?? '',\n getSessionState,\n config.checkSessionInterval ?? 3,\n config.sessionRefreshInterval ?? 300,\n config.afterSignInUrl,\n getAuthzURL,\n );\n }\n\n /**\n * Executes a custom token exchange grant, enforcing `allowedExternalUrls` rules when applicable.\n *\n * @param config - The token exchange configuration.\n * @param enableRetrievingSignOutURLFromSession - Callback invoked when `preventSignOutURLUpdate` is set.\n * @returns The user session or raw response.\n */\n public async exchangeToken(\n config: SPATokenExchangeConfig,\n enableRetrievingSignOutURLFromSession?: (config: SPATokenExchangeConfig) => void,\n ): Promise<User | Response> {\n const _config: Config = (await this._storageManager.getConfigData()) as Config;\n let useDefaultEndpoint = true;\n let matches = false;\n\n if (config?.tokenEndpoint) {\n useDefaultEndpoint = false;\n matches = true;\n }\n\n if (config.shouldReplayAfterRefresh) {\n this._storageManager.setTemporaryDataParameter(CUSTOM_GRANT_CONFIG, JSON.stringify(config));\n }\n\n if (useDefaultEndpoint || matches) {\n return this._exchangeToken(config)\n .then(async (response: Response | TokenResponse) => {\n if (enableRetrievingSignOutURLFromSession && typeof enableRetrievingSignOutURLFromSession === 'function') {\n enableRetrievingSignOutURLFromSession(config);\n }\n\n if (config.returnsSession) {\n await this._spaHelper.refreshAccessTokenAutomatically(() => this.refreshAccessToken());\n\n return this._getUser();\n } else {\n return response as Response;\n }\n })\n .catch((error) => {\n return Promise.reject(error);\n });\n } else {\n return Promise.reject(\n new ThunderIDAuthException(\n 'SPA-MAIN_THREAD_CLIENT-RCG-IV01',\n 'Request to the provided endpoint is prohibited.',\n 'Requests can only be sent to resource servers specified by the `allowedExternalUrls`' +\n ' attribute while initializing the SDK.',\n ),\n );\n }\n }\n\n /**\n * Returns the stored custom grant config if a replay-after-refresh was scheduled, or `null`.\n */\n public async getCustomGrantConfigData(): Promise<SPATokenExchangeConfig | null> {\n const configString = await this._storageManager.getTemporaryDataParameter(CUSTOM_GRANT_CONFIG);\n\n if (configString) {\n return JSON.parse(configString as string);\n } else {\n return null;\n }\n }\n\n /**\n * Refreshes the access token, replays any scheduled custom grant, and reschedules auto-refresh.\n *\n * @param enableRetrievingSignOutURLFromSession - Callback for custom grant sign-out URL handling.\n * @returns The updated user session.\n */\n public async refreshAccessToken(\n enableRetrievingSignOutURLFromSession?: (config: SPATokenExchangeConfig) => void,\n ): Promise<User> {\n try {\n await this._refreshAccessToken();\n const customGrantConfig = await this.getCustomGrantConfigData();\n if (customGrantConfig) {\n await this.exchangeToken(customGrantConfig, enableRetrievingSignOutURLFromSession);\n }\n await this._spaHelper.refreshAccessTokenAutomatically(() => this.refreshAccessToken());\n\n return this._getUser();\n } catch (error) {\n const refreshTokenError: Message<string> = {\n type: REFRESH_ACCESS_TOKEN_ERR0R,\n };\n\n window.postMessage(refreshTokenError);\n return Promise.reject(error);\n }\n }\n\n private async retryFailedRequests(failedRequest: HttpRequestInterface): Promise<HttpResponse> {\n const {httpClient, requestConfig, isHttpHandlerEnabled, httpErrorCallback, httpFinishCallback} = failedRequest;\n\n await SPAUtils.until(() => !this._isTokenRefreshing);\n\n try {\n return await httpClient.request(requestConfig);\n } catch (error: any) {\n if (isHttpHandlerEnabled) {\n if (typeof httpErrorCallback === 'function') {\n await httpErrorCallback(error);\n }\n if (typeof httpFinishCallback === 'function') {\n httpFinishCallback();\n }\n }\n\n return Promise.reject(error);\n }\n }\n\n /**\n * Sends an HTTP request via the provided client, automatically attaching the token,\n * and retries once after a token refresh on a 401 response.\n *\n * @param httpClient - The HTTP client to use.\n * @param requestConfig - The request configuration.\n * @param isHttpHandlerEnabled - Whether request callbacks are active.\n * @param httpErrorCallback - Called when a request fails.\n * @param httpFinishCallback - Called when a request finishes.\n * @param enableRetrievingSignOutURLFromSession - Callback for custom grant sign-out handling.\n * @returns The HTTP response.\n */\n public async httpRequest(\n httpClient: HttpClient,\n requestConfig: HttpRequestConfig,\n isHttpHandlerEnabled?: boolean,\n httpErrorCallback?: (error: HttpError) => void | Promise<void>,\n httpFinishCallback?: () => void,\n enableRetrievingSignOutURLFromSession?: (config: SPATokenExchangeConfig) => void,\n ): Promise<HttpResponse> {\n return httpClient\n .request(requestConfig)\n .then((response: HttpResponse) => {\n return Promise.resolve(response);\n })\n .catch(async (error: HttpError) => {\n if (error?.response?.status === 401 || !error?.response) {\n if (this._isTokenRefreshing) {\n return this.retryFailedRequests({\n enableRetrievingSignOutURLFromSession,\n httpClient,\n httpErrorCallback,\n httpFinishCallback,\n isHttpHandlerEnabled,\n requestConfig,\n });\n }\n\n this._isTokenRefreshing = true;\n let refreshAccessTokenResponse: User;\n try {\n refreshAccessTokenResponse = await this.refreshAccessToken(enableRetrievingSignOutURLFromSession);\n this._isTokenRefreshing = false;\n } catch (refreshError: any) {\n this._isTokenRefreshing = false;\n\n if (isHttpHandlerEnabled) {\n if (typeof httpErrorCallback === 'function') {\n await httpErrorCallback({...error, code: ACCESS_TOKEN_INVALID});\n }\n if (typeof httpFinishCallback === 'function') {\n httpFinishCallback();\n }\n }\n\n throw new ThunderIDAuthException(\n 'SPA-AUTH_HELPER-HR-SE01',\n refreshError?.name ?? 'Refresh token request failed.',\n refreshError?.message ?? 'An error occurred while trying to refresh the access token.',\n );\n }\n\n if (refreshAccessTokenResponse) {\n try {\n return await httpClient.request(requestConfig);\n } catch (error: any) {\n if (isHttpHandlerEnabled) {\n if (typeof httpErrorCallback === 'function') {\n await httpErrorCallback(error);\n }\n if (typeof httpFinishCallback === 'function') {\n httpFinishCallback();\n }\n }\n return Promise.reject(error);\n }\n }\n }\n\n if (isHttpHandlerEnabled) {\n if (typeof httpErrorCallback === 'function') {\n await httpErrorCallback(error);\n }\n if (typeof httpFinishCallback === 'function') {\n httpFinishCallback();\n }\n }\n\n return Promise.reject(error);\n });\n }\n\n /**\n * Sends multiple HTTP requests in parallel via the provided client,\n * retrying all on a 401 after a token refresh.\n *\n * @param requestConfigs - Array of request configurations.\n * @param httpClient - The HTTP client to use.\n * @param isHttpHandlerEnabled - Whether request callbacks are active.\n * @param httpErrorCallback - Called when a batch fails.\n * @param httpFinishCallback - Called when the batch finishes.\n * @returns Array of responses.\n */\n public async httpRequestAll(\n requestConfigs: HttpRequestConfig[],\n httpClient: HttpClient,\n isHttpHandlerEnabled?: boolean,\n httpErrorCallback?: (error: HttpError) => void | Promise<void>,\n httpFinishCallback?: () => void,\n ): Promise<HttpResponse[] | undefined> {\n const requests: Promise<HttpResponse<any>>[] = requestConfigs.map((req) => httpClient.request(req));\n\n return (\n httpClient?.all &&\n httpClient\n .all(requests)\n .then((responses: HttpResponse[]) => {\n return Promise.resolve(responses);\n })\n .catch(async (error: HttpError) => {\n if (error?.response?.status === 401 || !error?.response) {\n try {\n await this._refreshAccessToken();\n } catch (refreshError: any) {\n if (isHttpHandlerEnabled) {\n if (typeof httpErrorCallback === 'function') {\n await httpErrorCallback({...error, code: ACCESS_TOKEN_INVALID});\n }\n if (typeof httpFinishCallback === 'function') {\n httpFinishCallback();\n }\n }\n\n throw new ThunderIDAuthException(\n 'SPA-AUTH_HELPER-HRA-SE01',\n refreshError?.name ?? 'Refresh token request failed.',\n refreshError?.message ?? 'An error occurred while trying to refresh the access token.',\n );\n }\n\n return (\n httpClient.all &&\n httpClient\n .all(requests)\n .then((response) => Promise.resolve(response))\n .catch(async (error) => {\n if (isHttpHandlerEnabled) {\n if (typeof httpErrorCallback === 'function') {\n await httpErrorCallback(error);\n }\n if (typeof httpFinishCallback === 'function') {\n httpFinishCallback();\n }\n }\n return Promise.reject(error);\n })\n );\n }\n\n if (isHttpHandlerEnabled) {\n if (typeof httpErrorCallback === 'function') {\n await httpErrorCallback(error);\n }\n if (typeof httpFinishCallback === 'function') {\n httpFinishCallback();\n }\n }\n\n return Promise.reject(error);\n })\n );\n }\n\n /**\n * Executes the silent sign-in flow using a prompt-none request via an iFrame.\n *\n * @param constructSilentSignInUrl - Builds the prompt-none authorize URL.\n * @param requestAccessToken - Exchanges the returned code for tokens.\n * @param sessionManagementHelper - Handles the iFrame prompt-none response.\n * @param additionalParams - Extra authorize request params.\n * @param tokenRequestConfig - Additional params for the token request.\n * @returns The user session, or `false` if the user is not signed in.\n */\n public async signInSilently(\n constructSilentSignInUrl: (additionalParams?: Record<string, string | boolean>) => Promise<string>,\n requestAccessToken: (\n authzCode: string,\n sessionState: string,\n state: string,\n tokenRequestConfig?: {params: Record<string, unknown>},\n ) => Promise<User>,\n sessionManagementHelper: SessionManagementHelperInterface,\n additionalParams?: Record<string, string | boolean>,\n tokenRequestConfig?: {params: Record<string, unknown>},\n ): Promise<User | boolean> {\n if (SPAUtils.isInitializedSilentSignIn()) {\n await sessionManagementHelper.receivePromptNoneResponse();\n\n return Promise.resolve({\n allowedScopes: '',\n displayName: '',\n email: '',\n sessionState: '',\n sub: '',\n tenantDomain: '',\n username: '',\n });\n }\n\n const rpIFrame = document.getElementById(RP_IFRAME) as HTMLIFrameElement;\n const promptNoneIFrame: HTMLIFrameElement = rpIFrame?.contentDocument?.getElementById(\n PROMPT_NONE_IFRAME,\n ) as HTMLIFrameElement;\n\n try {\n const url = await constructSilentSignInUrl(additionalParams);\n promptNoneIFrame.src = url;\n } catch (error) {\n return Promise.reject(error);\n }\n\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n resolve(false);\n }, 10000);\n\n const listenToPromptNoneIFrame = async (e: MessageEvent) => {\n const data: Message<AuthorizationInfo | null> = e.data;\n\n if (data?.type == CHECK_SESSION_SIGNED_OUT) {\n window.removeEventListener('message', listenToPromptNoneIFrame);\n clearTimeout(timer);\n resolve(false);\n }\n\n if (data?.type == CHECK_SESSION_SIGNED_IN && data?.data?.code) {\n const authInfo = data.data;\n requestAccessToken(authInfo.code, authInfo.sessionState, authInfo.state, tokenRequestConfig)\n .then((response: User) => {\n window.removeEventListener('message', listenToPromptNoneIFrame);\n resolve(response);\n })\n .catch((error) => {\n window.removeEventListener('message', listenToPromptNoneIFrame);\n reject(error);\n })\n .finally(() => {\n clearTimeout(timer);\n });\n }\n };\n\n window.addEventListener('message', listenToPromptNoneIFrame);\n });\n }\n\n /**\n * Handles the early-return path of `signIn()` when a session already exists\n * or the page is handling a prompt-none response.\n *\n * @param shouldStopAuthn - Returns `true` if we should short-circuit and return early.\n * @param checkSession - Callback to initialize OIDC session management.\n * @returns The current user if already signed in, or `undefined` to continue normal sign-in.\n */\n public async handleSignIn(\n shouldStopAuthn: () => Promise<boolean>,\n checkSession: () => Promise<void>,\n ): Promise<User | undefined> {\n const config = await this._storageManager.getConfigData();\n const configAny = config as any;\n\n if (await shouldStopAuthn()) {\n return Promise.resolve({\n allowedScopes: '',\n displayName: '',\n email: '',\n sessionState: '',\n sub: '',\n tenantDomain: '',\n username: '',\n });\n }\n\n if (await this._isSignedIn()) {\n await this._spaHelper.clearRefreshTokenTimeout();\n await this._spaHelper.refreshAccessTokenAutomatically(() => this.refreshAccessToken());\n\n if (configAny.syncSession) {\n checkSession();\n }\n\n return Promise.resolve(await this._getUser());\n }\n\n const error = new URL(window.location.href).searchParams.get(ERROR);\n const errorDescription = new URL(window.location.href).searchParams.get(ERROR_DESCRIPTION);\n\n if (error) {\n const url = new URL(window.location.href);\n url.searchParams.delete(ERROR);\n url.searchParams.delete(ERROR_DESCRIPTION);\n\n history.pushState(null, document.title, url.toString());\n\n throw new ThunderIDAuthException('SPA-AUTH_HELPER-SI-SE01', error, errorDescription ?? '');\n }\n\n return Promise.resolve(undefined);\n }\n\n /**\n * Attaches the access token (or IDP token) to an HTTP request config's `Authorization` header.\n *\n * @param request - The request config to mutate.\n */\n public async attachTokenToRequestConfig(request: HttpRequestConfig): Promise<void> {\n const requestConfig = {attachToken: true, ...request};\n if (requestConfig.attachToken) {\n if (requestConfig.shouldAttachIDPAccessToken) {\n request.headers = {\n ...request.headers,\n Authorization: `Bearer ${await this._getIDPAccessToken()}`,\n };\n } else {\n request.headers = {\n ...request.headers,\n Authorization: `Bearer ${await this._getAccessToken()}`,\n };\n }\n }\n }\n\n /** Returns the current authenticated user from the ID token. */\n public async getUser(): Promise<User> {\n return this._getUser();\n }\n\n /**\n * Returns the decoded ID token payload.\n *\n * @param sessionId - Optional session ID.\n */\n public async getDecodedIdToken(sessionId?: string): Promise<IdToken> {\n return this._getDecodedIdToken(sessionId);\n }\n\n /** Returns the IsomorphicCrypto instance used by the client. */\n public async getCrypto(): Promise<IsomorphicCrypto> {\n return this._getCrypto();\n }\n\n /** Returns the raw ID token string. */\n public async getIdToken(): Promise<string> {\n return this._getIdToken();\n }\n\n /** Returns the resolved OIDC provider endpoints. */\n public async getOpenIDProviderEndpoints(): Promise<OIDCEndpoints> {\n return this._getOpenIDProviderEndpoints();\n }\n\n /**\n * Returns the current access token.\n *\n * @param sessionId - Optional session ID.\n */\n public async getAccessToken(sessionId?: string): Promise<string> {\n return this._getAccessToken(sessionId);\n }\n\n /** Returns the IDP access token from the session. */\n public async getIDPAccessToken(): Promise<string> {\n return (await this._storageManager.getSessionData())?.access_token;\n }\n\n /** Returns the storage manager. */\n public getStorageManager(): StorageManager<T> {\n return this._storageManager;\n }\n\n /** Returns whether the user is currently signed in. */\n public async isSignedIn(): Promise<boolean> {\n return this._isSignedIn();\n }\n}\n\nexport default AuthenticationHelper;\n","/**\n * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\n/**\n * Navigates to a new URL within the browser.\n *\n * - For same-origin URLs (relative paths or absolute URLs with the same origin),\n * uses the History API and dispatches a `popstate` event (SPA navigation).\n * - For cross-origin URLs, performs a full page load using `window.location.assign`.\n *\n * This allows seamless navigation for both SPA routes and external links.\n *\n * @param url - The target URL to navigate to. Can be a path, query, or absolute URL.\n *\n * @example\n * ```typescript\n * // SPA navigation (same origin)\n * navigate('/dashboard');\n *\n * // SPA navigation with query\n * navigate('/search?q=thunderid');\n *\n * // Cross-origin navigation (full page load)\n * navigate('https://localhost:8090/accountrecoveryendpoint/register.do');\n * ```\n */\nconst navigate = (url: string): void => {\n try {\n const targetUrl: URL = new URL(url, window.location.origin);\n if (targetUrl.origin === window.location.origin) {\n window.history.pushState(null, '', targetUrl.pathname + targetUrl.search + targetUrl.hash);\n window.dispatchEvent(new PopStateEvent('popstate', {state: null}));\n } else {\n window.location.assign(targetUrl.href);\n }\n } catch {\n // If URL constructor fails (e.g., malformed URL), fallback to location.assign\n window.location.assign(url);\n }\n};\n\nexport default navigate;\n","/**\n * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport {ExtendedAuthorizeRequestUrlParams, OIDCRequestConstants} from '@thunderid/javascript';\nimport SPAUtils from './SPAUtils';\nimport {\n CHECK_SESSION_SIGNED_IN,\n CHECK_SESSION_SIGNED_OUT,\n INITIALIZED_SILENT_SIGN_IN,\n OP_IFRAME,\n PROMPT_NONE_IFRAME,\n RP_IFRAME,\n SET_SESSION_STATE_FROM_IFRAME,\n SILENT_SIGN_IN_STATE,\n STATE,\n STATE_QUERY,\n} from '../constants/SPAConstants';\n\ninterface AuthorizationInfo {\n code: string;\n sessionState: string;\n state: string;\n}\n\ninterface Message<T> {\n type: string;\n data?: T;\n}\n\n/**\n * Interface for the session management helper returned by {@link createSessionManagementHelper}.\n */\nexport interface SessionManagementHelperInterface {\n /** Starts session polling and sets up the RP iframe. */\n initialize(\n clientId: string,\n checkSessionEndpoint: string,\n getSessionState: () => Promise<string>,\n interval: number,\n sessionRefreshInterval: number,\n redirectURL: string,\n getSignInUrl: (params?: ExtendedAuthorizeRequestUrlParams) => Promise<string>,\n ): void;\n /**\n * Processes a prompt-none response when the page is loaded inside the prompt-none iframe.\n * Returns `true` if the current page load was a prompt-none response.\n */\n receivePromptNoneResponse(setSessionState?: (sessionState: string | null) => Promise<void>): Promise<boolean>;\n /** Clears the session check and refresh intervals. */\n reset(): void;\n}\n\n/**\n * Factory that creates an OIDC Session Management helper using an RP iframe and polling.\n * Appends a hidden RP iframe to the document and returns the helper interface.\n *\n * @param signOut - Returns the sign-out URL for the current session.\n * @param setSessionState - Stores a new session state from a prompt-none response.\n * @returns A `SessionManagementHelperInterface` instance.\n */\nexport const createSessionManagementHelper = async (\n signOut: () => Promise<string>,\n setSessionState: (sessionState: string) => void,\n): Promise<SessionManagementHelperInterface> => {\n let _clientID: string;\n let _checkSessionEndpoint: string;\n let _sessionState: () => Promise<string>;\n let _interval: number;\n let _redirectURL: string;\n let _sessionRefreshInterval: number;\n let _sessionRefreshIntervalTimeout: number;\n let _checkSessionIntervalTimeout: number;\n let _getSignInUrl: (params?: ExtendedAuthorizeRequestUrlParams) => Promise<string>;\n\n const initialize = (\n clientId: string,\n checkSessionEndpoint: string,\n getSessionState: () => Promise<string>,\n interval: number,\n sessionRefreshInterval: number,\n redirectURL: string,\n getSignInUrl: (params?: ExtendedAuthorizeRequestUrlParams) => Promise<string>,\n ): void => {\n _clientID = clientId;\n _checkSessionEndpoint = checkSessionEndpoint;\n _sessionState = getSessionState;\n _interval = interval;\n _redirectURL = redirectURL;\n _sessionRefreshInterval = sessionRefreshInterval;\n _getSignInUrl = getSignInUrl;\n\n if (_interval > -1) {\n initiateCheckSession();\n }\n\n if (_sessionRefreshInterval > -1) {\n _sessionRefreshIntervalTimeout = setInterval(() => {\n sendPromptNoneRequest();\n }, _sessionRefreshInterval * 1000) as unknown as number;\n }\n };\n\n const initiateCheckSession = async (): Promise<void> => {\n if (!_checkSessionEndpoint || !_clientID || !_redirectURL) {\n return;\n }\n\n async function checkSession(): Promise<void> {\n const sessionState = await _sessionState();\n if (Boolean(_clientID) && Boolean(sessionState)) {\n const message = `${_clientID} ${sessionState}`;\n const rpIFrame = document.getElementById(RP_IFRAME) as HTMLIFrameElement;\n const opIframe: HTMLIFrameElement = rpIFrame?.contentDocument?.getElementById(OP_IFRAME) as HTMLIFrameElement;\n const win: Window | null = opIframe.contentWindow;\n win?.postMessage(message, _checkSessionEndpoint);\n }\n }\n\n const rpIFrame = document.getElementById(RP_IFRAME) as HTMLIFrameElement;\n const opIframe: HTMLIFrameElement = rpIFrame?.contentDocument?.getElementById(OP_IFRAME) as HTMLIFrameElement;\n opIframe.src = _checkSessionEndpoint + '?client_id=' + _clientID + '&redirect_uri=' + _redirectURL;\n\n _checkSessionIntervalTimeout = setInterval(checkSession, _interval * 1000) as unknown as number;\n\n listenToResponseFromOPIFrame();\n };\n\n const reset = (): void => {\n clearInterval(_checkSessionIntervalTimeout);\n clearInterval(_sessionRefreshIntervalTimeout);\n };\n\n const listenToResponseFromOPIFrame = (): void => {\n async function receiveMessage(e: MessageEvent) {\n const targetOrigin = _checkSessionEndpoint;\n\n if (!targetOrigin || targetOrigin?.indexOf(e.origin) < 0 || e?.data?.type === SET_SESSION_STATE_FROM_IFRAME) {\n return;\n }\n\n if (e.data === 'unchanged') {\n // session state has not changed\n } else if (e.data === 'error') {\n window.location.href = await signOut();\n } else if (e.data === 'changed') {\n sendPromptNoneRequest();\n }\n }\n\n window?.addEventListener('message', receiveMessage, false);\n };\n\n const sendPromptNoneRequest = async () => {\n const rpIFrame = document.getElementById(RP_IFRAME) as HTMLIFrameElement;\n const promptNoneIFrame: HTMLIFrameElement = rpIFrame?.contentDocument?.getElementById(\n PROMPT_NONE_IFRAME,\n ) as HTMLIFrameElement;\n\n if (SPAUtils.canSendPromptNoneRequest()) {\n SPAUtils.setPromptNoneRequestSent(true);\n\n const receiveMessageListener = (e: MessageEvent<Message<string>>) => {\n if (e?.data?.type === SET_SESSION_STATE_FROM_IFRAME) {\n setSessionState(e?.data?.data ?? '');\n window?.removeEventListener('message', receiveMessageListener);\n }\n };\n\n window?.addEventListener('message', receiveMessageListener);\n\n const promptNoneURL: string = await _getSignInUrl({\n prompt: 'none',\n response_mode: 'query',\n state: STATE,\n });\n\n promptNoneIFrame.src = promptNoneURL;\n }\n };\n\n const receivePromptNoneResponse = async (\n setSessionStateFn?: (sessionState: string | null) => Promise<void>,\n ): Promise<boolean> => {\n const state = new URL(window.location.href).searchParams.get(STATE_QUERY);\n const sessionState = new URL(window.location.href).searchParams.get(OIDCRequestConstants.Params.SESSION_STATE);\n const parent = window.parent.parent;\n\n if (state !== null && (state.includes(STATE) || state.includes(SILENT_SIGN_IN_STATE))) {\n const code = new URL(window.location.href).searchParams.get('code');\n\n if (code !== null && code.length !== 0) {\n if (state.includes(SILENT_SIGN_IN_STATE)) {\n const message: Message<AuthorizationInfo> = {\n data: {\n code,\n sessionState: sessionState ?? '',\n state,\n },\n type: CHECK_SESSION_SIGNED_IN,\n };\n\n sessionStorage.setItem(INITIALIZED_SILENT_SIGN_IN, 'false');\n parent.postMessage(message, parent.origin);\n SPAUtils.setPromptNoneRequestSent(false);\n\n window.location.href = 'about:blank';\n\n await SPAUtils.waitTillPageRedirect();\n\n return true;\n }\n\n const newSessionState = new URL(window.location.href).searchParams.get('session_state');\n\n setSessionStateFn && (await setSessionStateFn(newSessionState));\n\n SPAUtils.setPromptNoneRequestSent(false);\n\n window.location.href = 'about:blank';\n\n await SPAUtils.waitTillPageRedirect();\n\n return true;\n } else {\n if (state.includes(SILENT_SIGN_IN_STATE)) {\n const message: Message<null> = {\n type: CHECK_SESSION_SIGNED_OUT,\n };\n\n window.parent.parent.postMessage(message, parent.origin);\n SPAUtils.setPromptNoneRequestSent(false);\n\n window.location.href = 'about:blank';\n\n await SPAUtils.waitTillPageRedirect();\n\n return true;\n }\n\n SPAUtils.setPromptNoneRequestSent(false);\n\n const signOutURL = await signOut();\n parent.location.href = signOutURL;\n window.location.href = 'about:blank';\n\n await SPAUtils.waitTillPageRedirect();\n\n return true;\n }\n }\n\n return false;\n };\n\n let rpIFrame = document.createElement('iframe');\n rpIFrame.setAttribute('id', RP_IFRAME);\n rpIFrame.style.display = 'none';\n\n let rpIframeLoaded = false;\n rpIFrame.onload = () => {\n rpIFrame = document.getElementById(RP_IFRAME) as HTMLIFrameElement;\n\n const rpDoc = rpIFrame?.contentDocument;\n\n const opIFrame = rpDoc?.createElement('iframe');\n if (opIFrame) {\n opIFrame.setAttribute('id', OP_IFRAME);\n opIFrame.style.display = 'none';\n }\n\n const promptNoneIFrame = rpDoc?.createElement('iframe');\n if (promptNoneIFrame) {\n promptNoneIFrame.setAttribute('id', PROMPT_NONE_IFRAME);\n promptNoneIFrame.style.display = 'none';\n }\n\n opIFrame && rpIFrame?.contentDocument?.body?.appendChild(opIFrame);\n promptNoneIFrame && rpIFrame?.contentDocument?.body?.appendChild(promptNoneIFrame);\n\n rpIframeLoaded = true;\n };\n\n document?.body?.appendChild(rpIFrame);\n\n const sleep = (): Promise<void> => new Promise((resolve) => setTimeout(resolve, 1));\n while (!rpIframeLoaded) {\n await sleep();\n }\n\n return {\n initialize,\n receivePromptNoneResponse,\n reset,\n };\n};\n\nexport default createSessionManagementHelper;\n","'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n var i\n for (i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n","/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n var e, m\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var nBits = -7\n var i = isLE ? (nBytes - 1) : 0\n var d = isLE ? -1 : 1\n var s = buffer[offset + i]\n\n i += d\n\n e = s & ((1 << (-nBits)) - 1)\n s >>= (-nBits)\n nBits += eLen\n for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & ((1 << (-nBits)) - 1)\n e >>= (-nBits)\n nBits += mLen\n for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen)\n e = e - eBias\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n var i = isLE ? 0 : (nBytes - 1)\n var d = isLE ? 1 : -1\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n value = Math.abs(value)\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0\n e = eMax\n } else {\n e = Math.floor(Math.log(value) / Math.LN2)\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--\n c *= 2\n }\n if (e + eBias >= 1) {\n value += rt / c\n } else {\n value += rt * Math.pow(2, 1 - eBias)\n }\n if (value * c >= 2) {\n e++\n c /= 2\n }\n\n if (e + eBias >= eMax) {\n m = 0\n e = eMax\n } else if (e + eBias >= 1) {\n m = ((value * c) - 1) * Math.pow(2, mLen)\n e = e + eBias\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n e = 0\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = (e << mLen) | m\n eLen += mLen\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128\n}\n","/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh <https://feross.org>\n * @license MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nconst base64 = require('base64-js')\nconst ieee754 = require('ieee754')\nconst customInspectSymbol =\n (typeof Symbol === 'function' && typeof Symbol['for'] === 'function') // eslint-disable-line dot-notation\n ? Symbol['for']('nodejs.util.inspect.custom') // eslint-disable-line dot-notation\n : null\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\nconst K_MAX_LENGTH = 0x7fffffff\nexports.kMaxLength = K_MAX_LENGTH\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n * === true Use Uint8Array implementation (fastest)\n * === false Print warning and recommend using `buffer` v4.x which has an Object\n * implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * We report that the browser does not support typed arrays if the are not subclassable\n * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`\n * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support\n * for __proto__ and has a buggy typed array implementation.\n */\nBuffer.TYPED_ARRAY_SUPPORT = typedArraySupport()\n\nif (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&\n typeof console.error === 'function') {\n console.error(\n 'This browser lacks typed array (Uint8Array) support which is required by ' +\n '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'\n )\n}\n\nfunction typedArraySupport () {\n // Can typed array instances can be augmented?\n try {\n const arr = new Uint8Array(1)\n const proto = { foo: function () { return 42 } }\n Object.setPrototypeOf(proto, Uint8Array.prototype)\n Object.setPrototypeOf(arr, proto)\n return arr.foo() === 42\n } catch (e) {\n return false\n }\n}\n\nObject.defineProperty(Buffer.prototype, 'parent', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.buffer\n }\n})\n\nObject.defineProperty(Buffer.prototype, 'offset', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.byteOffset\n }\n})\n\nfunction createBuffer (length) {\n if (length > K_MAX_LENGTH) {\n throw new RangeError('The value \"' + length + '\" is invalid for option \"size\"')\n }\n // Return an augmented `Uint8Array` instance\n const buf = new Uint8Array(length)\n Object.setPrototypeOf(buf, Buffer.prototype)\n return buf\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n // Common case.\n if (typeof arg === 'number') {\n if (typeof encodingOrOffset === 'string') {\n throw new TypeError(\n 'The \"string\" argument must be of type string. Received type number'\n )\n }\n return allocUnsafe(arg)\n }\n return from(arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\nfunction from (value, encodingOrOffset, length) {\n if (typeof value === 'string') {\n return fromString(value, encodingOrOffset)\n }\n\n if (ArrayBuffer.isView(value)) {\n return fromArrayView(value)\n }\n\n if (value == null) {\n throw new TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n }\n\n if (isInstance(value, ArrayBuffer) ||\n (value && isInstance(value.buffer, ArrayBuffer))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof SharedArrayBuffer !== 'undefined' &&\n (isInstance(value, SharedArrayBuffer) ||\n (value && isInstance(value.buffer, SharedArrayBuffer)))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof value === 'number') {\n throw new TypeError(\n 'The \"value\" argument must not be of type number. Received type number'\n )\n }\n\n const valueOf = value.valueOf && value.valueOf()\n if (valueOf != null && valueOf !== value) {\n return Buffer.from(valueOf, encodingOrOffset, length)\n }\n\n const b = fromObject(value)\n if (b) return b\n\n if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null &&\n typeof value[Symbol.toPrimitive] === 'function') {\n return Buffer.from(value[Symbol.toPrimitive]('string'), encodingOrOffset, length)\n }\n\n throw new TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n return from(value, encodingOrOffset, length)\n}\n\n// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:\n// https://github.com/feross/buffer/pull/148\nObject.setPrototypeOf(Buffer.prototype, Uint8Array.prototype)\nObject.setPrototypeOf(Buffer, Uint8Array)\n\nfunction assertSize (size) {\n if (typeof size !== 'number') {\n throw new TypeError('\"size\" argument must be of type number')\n } else if (size < 0) {\n throw new RangeError('The value \"' + size + '\" is invalid for option \"size\"')\n }\n}\n\nfunction alloc (size, fill, encoding) {\n assertSize(size)\n if (size <= 0) {\n return createBuffer(size)\n }\n if (fill !== undefined) {\n // Only pay attention to encoding if it's a string. This\n // prevents accidentally sending in a number that would\n // be interpreted as a start offset.\n return typeof encoding === 'string'\n ? createBuffer(size).fill(fill, encoding)\n : createBuffer(size).fill(fill)\n }\n return createBuffer(size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n return alloc(size, fill, encoding)\n}\n\nfunction allocUnsafe (size) {\n assertSize(size)\n return createBuffer(size < 0 ? 0 : checked(size) | 0)\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n return allocUnsafe(size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n return allocUnsafe(size)\n}\n\nfunction fromString (string, encoding) {\n if (typeof encoding !== 'string' || encoding === '') {\n encoding = 'utf8'\n }\n\n if (!Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n\n const length = byteLength(string, encoding) | 0\n let buf = createBuffer(length)\n\n const actual = buf.write(string, encoding)\n\n if (actual !== length) {\n // Writing a hex string, for example, that contains invalid characters will\n // cause everything after the first invalid character to be ignored. (e.g.\n // 'abxxcd' will be treated as 'ab')\n buf = buf.slice(0, actual)\n }\n\n return buf\n}\n\nfunction fromArrayLike (array) {\n const length = array.length < 0 ? 0 : checked(array.length) | 0\n const buf = createBuffer(length)\n for (let i = 0; i < length; i += 1) {\n buf[i] = array[i] & 255\n }\n return buf\n}\n\nfunction fromArrayView (arrayView) {\n if (isInstance(arrayView, Uint8Array)) {\n const copy = new Uint8Array(arrayView)\n return fromArrayBuffer(copy.buffer, copy.byteOffset, copy.byteLength)\n }\n return fromArrayLike(arrayView)\n}\n\nfunction fromArrayBuffer (array, byteOffset, length) {\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\"offset\" is outside of buffer bounds')\n }\n\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\"length\" is outside of buffer bounds')\n }\n\n let buf\n if (byteOffset === undefined && length === undefined) {\n buf = new Uint8Array(array)\n } else if (length === undefined) {\n buf = new Uint8Array(array, byteOffset)\n } else {\n buf = new Uint8Array(array, byteOffset, length)\n }\n\n // Return an augmented `Uint8Array` instance\n Object.setPrototypeOf(buf, Buffer.prototype)\n\n return buf\n}\n\nfunction fromObject (obj) {\n if (Buffer.isBuffer(obj)) {\n const len = checked(obj.length) | 0\n const buf = createBuffer(len)\n\n if (buf.length === 0) {\n return buf\n }\n\n obj.copy(buf, 0, 0, len)\n return buf\n }\n\n if (obj.length !== undefined) {\n if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {\n return createBuffer(0)\n }\n return fromArrayLike(obj)\n }\n\n if (obj.type === 'Buffer' && Array.isArray(obj.data)) {\n return fromArrayLike(obj.data)\n }\n}\n\nfunction checked (length) {\n // Note: cannot use `length < K_MAX_LENGTH` here because that fails when\n // length is NaN (which is otherwise coerced to zero.)\n if (length >= K_MAX_LENGTH) {\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')\n }\n return length | 0\n}\n\nfunction SlowBuffer (length) {\n if (+length != length) { // eslint-disable-line eqeqeq\n length = 0\n }\n return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n return b != null && b._isBuffer === true &&\n b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false\n}\n\nBuffer.compare = function compare (a, b) {\n if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength)\n if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength)\n if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n throw new TypeError(\n 'The \"buf1\", \"buf2\" arguments must be one of type Buffer or Uint8Array'\n )\n }\n\n if (a === b) return 0\n\n let x = a.length\n let y = b.length\n\n for (let i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i]\n y = b[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return true\n default:\n return false\n }\n}\n\nBuffer.concat = function concat (list, length) {\n if (!Array.isArray(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n\n if (list.length === 0) {\n return Buffer.alloc(0)\n }\n\n let i\n if (length === undefined) {\n length = 0\n for (i = 0; i < list.length; ++i) {\n length += list[i].length\n }\n }\n\n const buffer = Buffer.allocUnsafe(length)\n let pos = 0\n for (i = 0; i < list.length; ++i) {\n let buf = list[i]\n if (isInstance(buf, Uint8Array)) {\n if (pos + buf.length > buffer.length) {\n if (!Buffer.isBuffer(buf)) buf = Buffer.from(buf)\n buf.copy(buffer, pos)\n } else {\n Uint8Array.prototype.set.call(\n buffer,\n buf,\n pos\n )\n }\n } else if (!Buffer.isBuffer(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n } else {\n buf.copy(buffer, pos)\n }\n pos += buf.length\n }\n return buffer\n}\n\nfunction byteLength (string, encoding) {\n if (Buffer.isBuffer(string)) {\n return string.length\n }\n if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) {\n return string.byteLength\n }\n if (typeof string !== 'string') {\n throw new TypeError(\n 'The \"string\" argument must be one of type string, Buffer, or ArrayBuffer. ' +\n 'Received type ' + typeof string\n )\n }\n\n const len = string.length\n const mustMatch = (arguments.length > 2 && arguments[2] === true)\n if (!mustMatch && len === 0) return 0\n\n // Use a for loop to avoid recursion\n let loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'ascii':\n case 'latin1':\n case 'binary':\n return len\n case 'utf8':\n case 'utf-8':\n return utf8ToBytes(string).length\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return len * 2\n case 'hex':\n return len >>> 1\n case 'base64':\n return base64ToBytes(string).length\n default:\n if (loweredCase) {\n return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8\n }\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n let loweredCase = false\n\n // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n // property of a typed array.\n\n // This behaves neither like String nor Uint8Array in that we set start/end\n // to their upper/lower bounds if the value passed is out of range.\n // undefined is handled specially as per ECMA-262 6th Edition,\n // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n if (start === undefined || start < 0) {\n start = 0\n }\n // Return early if start > this.length. Done here to prevent potential uint32\n // coercion fail below.\n if (start > this.length) {\n return ''\n }\n\n if (end === undefined || end > this.length) {\n end = this.length\n }\n\n if (end <= 0) {\n return ''\n }\n\n // Force coercion to uint32. This will also coerce falsey/NaN values to 0.\n end >>>= 0\n start >>>= 0\n\n if (end <= start) {\n return ''\n }\n\n if (!encoding) encoding = 'utf8'\n\n while (true) {\n switch (encoding) {\n case 'hex':\n return hexSlice(this, start, end)\n\n case 'utf8':\n case 'utf-8':\n return utf8Slice(this, start, end)\n\n case 'ascii':\n return asciiSlice(this, start, end)\n\n case 'latin1':\n case 'binary':\n return latin1Slice(this, start, end)\n\n case 'base64':\n return base64Slice(this, start, end)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return utf16leSlice(this, start, end)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = (encoding + '').toLowerCase()\n loweredCase = true\n }\n }\n}\n\n// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)\n// to detect a Buffer instance. It's not possible to use `instanceof Buffer`\n// reliably in a browserify context because there could be multiple different\n// copies of the 'buffer' package in use. This method works even for Buffer\n// instances that were created from another copy of the `buffer` package.\n// See: https://github.com/feross/buffer/issues/154\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n const i = b[n]\n b[n] = b[m]\n b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n const len = this.length\n if (len % 2 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 16-bits')\n }\n for (let i = 0; i < len; i += 2) {\n swap(this, i, i + 1)\n }\n return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n const len = this.length\n if (len % 4 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 32-bits')\n }\n for (let i = 0; i < len; i += 4) {\n swap(this, i, i + 3)\n swap(this, i + 1, i + 2)\n }\n return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n const len = this.length\n if (len % 8 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 64-bits')\n }\n for (let i = 0; i < len; i += 8) {\n swap(this, i, i + 7)\n swap(this, i + 1, i + 6)\n swap(this, i + 2, i + 5)\n swap(this, i + 3, i + 4)\n }\n return this\n}\n\nBuffer.prototype.toString = function toString () {\n const length = this.length\n if (length === 0) return ''\n if (arguments.length === 0) return utf8Slice(this, 0, length)\n return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.toLocaleString = Buffer.prototype.toString\n\nBuffer.prototype.equals = function equals (b) {\n if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n if (this === b) return true\n return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n let str = ''\n const max = exports.INSPECT_MAX_BYTES\n str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim()\n if (this.length > max) str += ' ... '\n return '<Buffer ' + str + '>'\n}\nif (customInspectSymbol) {\n Buffer.prototype[customInspectSymbol] = Buffer.prototype.inspect\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n if (isInstance(target, Uint8Array)) {\n target = Buffer.from(target, target.offset, target.byteLength)\n }\n if (!Buffer.isBuffer(target)) {\n throw new TypeError(\n 'The \"target\" argument must be one of type Buffer or Uint8Array. ' +\n 'Received type ' + (typeof target)\n )\n }\n\n if (start === undefined) {\n start = 0\n }\n if (end === undefined) {\n end = target ? target.length : 0\n }\n if (thisStart === undefined) {\n thisStart = 0\n }\n if (thisEnd === undefined) {\n thisEnd = this.length\n }\n\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n throw new RangeError('out of range index')\n }\n\n if (thisStart >= thisEnd && start >= end) {\n return 0\n }\n if (thisStart >= thisEnd) {\n return -1\n }\n if (start >= end) {\n return 1\n }\n\n start >>>= 0\n end >>>= 0\n thisStart >>>= 0\n thisEnd >>>= 0\n\n if (this === target) return 0\n\n let x = thisEnd - thisStart\n let y = end - start\n const len = Math.min(x, y)\n\n const thisCopy = this.slice(thisStart, thisEnd)\n const targetCopy = target.slice(start, end)\n\n for (let i = 0; i < len; ++i) {\n if (thisCopy[i] !== targetCopy[i]) {\n x = thisCopy[i]\n y = targetCopy[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n // Empty buffer means no match\n if (buffer.length === 0) return -1\n\n // Normalize byteOffset\n if (typeof byteOffset === 'string') {\n encoding = byteOffset\n byteOffset = 0\n } else if (byteOffset > 0x7fffffff) {\n byteOffset = 0x7fffffff\n } else if (byteOffset < -0x80000000) {\n byteOffset = -0x80000000\n }\n byteOffset = +byteOffset // Coerce to Number.\n if (numberIsNaN(byteOffset)) {\n // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n byteOffset = dir ? 0 : (buffer.length - 1)\n }\n\n // Normalize byteOffset: negative offsets start from the end of the buffer\n if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n if (byteOffset >= buffer.length) {\n if (dir) return -1\n else byteOffset = buffer.length - 1\n } else if (byteOffset < 0) {\n if (dir) byteOffset = 0\n else return -1\n }\n\n // Normalize val\n if (typeof val === 'string') {\n val = Buffer.from(val, encoding)\n }\n\n // Finally, search either indexOf (if dir is true) or lastIndexOf\n if (Buffer.isBuffer(val)) {\n // Special case: looking for empty string/buffer always fails\n if (val.length === 0) {\n return -1\n }\n return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n } else if (typeof val === 'number') {\n val = val & 0xFF // Search for a byte value [0-255]\n if (typeof Uint8Array.prototype.indexOf === 'function') {\n if (dir) {\n return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n } else {\n return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n }\n }\n return arrayIndexOf(buffer, [val], byteOffset, encoding, dir)\n }\n\n throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n let indexSize = 1\n let arrLength = arr.length\n let valLength = val.length\n\n if (encoding !== undefined) {\n encoding = String(encoding).toLowerCase()\n if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n encoding === 'utf16le' || encoding === 'utf-16le') {\n if (arr.length < 2 || val.length < 2) {\n return -1\n }\n indexSize = 2\n arrLength /= 2\n valLength /= 2\n byteOffset /= 2\n }\n }\n\n function read (buf, i) {\n if (indexSize === 1) {\n return buf[i]\n } else {\n return buf.readUInt16BE(i * indexSize)\n }\n }\n\n let i\n if (dir) {\n let foundIndex = -1\n for (i = byteOffset; i < arrLength; i++) {\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n if (foundIndex === -1) foundIndex = i\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n } else {\n if (foundIndex !== -1) i -= i - foundIndex\n foundIndex = -1\n }\n }\n } else {\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n for (i = byteOffset; i >= 0; i--) {\n let found = true\n for (let j = 0; j < valLength; j++) {\n if (read(arr, i + j) !== read(val, j)) {\n found = false\n break\n }\n }\n if (found) return i\n }\n }\n\n return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n offset = Number(offset) || 0\n const remaining = buf.length - offset\n if (!length) {\n length = remaining\n } else {\n length = Number(length)\n if (length > remaining) {\n length = remaining\n }\n }\n\n const strLen = string.length\n\n if (length > strLen / 2) {\n length = strLen / 2\n }\n let i\n for (i = 0; i < length; ++i) {\n const parsed = parseInt(string.substr(i * 2, 2), 16)\n if (numberIsNaN(parsed)) return i\n buf[offset + i] = parsed\n }\n return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n // Buffer#write(string)\n if (offset === undefined) {\n encoding = 'utf8'\n length = this.length\n offset = 0\n // Buffer#write(string, encoding)\n } else if (length === undefined && typeof offset === 'string') {\n encoding = offset\n length = this.length\n offset = 0\n // Buffer#write(string, offset[, length][, encoding])\n } else if (isFinite(offset)) {\n offset = offset >>> 0\n if (isFinite(length)) {\n length = length >>> 0\n if (encoding === undefined) encoding = 'utf8'\n } else {\n encoding = length\n length = undefined\n }\n } else {\n throw new Error(\n 'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n )\n }\n\n const remaining = this.length - offset\n if (length === undefined || length > remaining) length = remaining\n\n if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n throw new RangeError('Attempt to write outside buffer bounds')\n }\n\n if (!encoding) encoding = 'utf8'\n\n let loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'hex':\n return hexWrite(this, string, offset, length)\n\n case 'utf8':\n case 'utf-8':\n return utf8Write(this, string, offset, length)\n\n case 'ascii':\n case 'latin1':\n case 'binary':\n return asciiWrite(this, string, offset, length)\n\n case 'base64':\n // Warning: maxLength not taken into account in base64Write\n return base64Write(this, string, offset, length)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return ucs2Write(this, string, offset, length)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n return {\n type: 'Buffer',\n data: Array.prototype.slice.call(this._arr || this, 0)\n }\n}\n\nfunction base64Slice (buf, start, end) {\n if (start === 0 && end === buf.length) {\n return base64.fromByteArray(buf)\n } else {\n return base64.fromByteArray(buf.slice(start, end))\n }\n}\n\nfunction utf8Slice (buf, start, end) {\n end = Math.min(buf.length, end)\n const res = []\n\n let i = start\n while (i < end) {\n const firstByte = buf[i]\n let codePoint = null\n let bytesPerSequence = (firstByte > 0xEF)\n ? 4\n : (firstByte > 0xDF)\n ? 3\n : (firstByte > 0xBF)\n ? 2\n : 1\n\n if (i + bytesPerSequence <= end) {\n let secondByte, thirdByte, fourthByte, tempCodePoint\n\n switch (bytesPerSequence) {\n case 1:\n if (firstByte < 0x80) {\n codePoint = firstByte\n }\n break\n case 2:\n secondByte = buf[i + 1]\n if ((secondByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n if (tempCodePoint > 0x7F) {\n codePoint = tempCodePoint\n }\n }\n break\n case 3:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n codePoint = tempCodePoint\n }\n }\n break\n case 4:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n fourthByte = buf[i + 3]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n codePoint = tempCodePoint\n }\n }\n }\n }\n\n if (codePoint === null) {\n // we did not generate a valid codePoint so insert a\n // replacement char (U+FFFD) and advance only 1 byte\n codePoint = 0xFFFD\n bytesPerSequence = 1\n } else if (codePoint > 0xFFFF) {\n // encode to utf16 (surrogate pair dance)\n codePoint -= 0x10000\n res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n codePoint = 0xDC00 | codePoint & 0x3FF\n }\n\n res.push(codePoint)\n i += bytesPerSequence\n }\n\n return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nconst MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n const len = codePoints.length\n if (len <= MAX_ARGUMENTS_LENGTH) {\n return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n }\n\n // Decode in chunks to avoid \"call stack size exceeded\".\n let res = ''\n let i = 0\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n )\n }\n return res\n}\n\nfunction asciiSlice (buf, start, end) {\n let ret = ''\n end = Math.min(buf.length, end)\n\n for (let i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i] & 0x7F)\n }\n return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n let ret = ''\n end = Math.min(buf.length, end)\n\n for (let i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i])\n }\n return ret\n}\n\nfunction hexSlice (buf, start, end) {\n const len = buf.length\n\n if (!start || start < 0) start = 0\n if (!end || end < 0 || end > len) end = len\n\n let out = ''\n for (let i = start; i < end; ++i) {\n out += hexSliceLookupTable[buf[i]]\n }\n return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n const bytes = buf.slice(start, end)\n let res = ''\n // If bytes.length is odd, the last 8 bits must be ignored (same as node.js)\n for (let i = 0; i < bytes.length - 1; i += 2) {\n res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))\n }\n return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n const len = this.length\n start = ~~start\n end = end === undefined ? len : ~~end\n\n if (start < 0) {\n start += len\n if (start < 0) start = 0\n } else if (start > len) {\n start = len\n }\n\n if (end < 0) {\n end += len\n if (end < 0) end = 0\n } else if (end > len) {\n end = len\n }\n\n if (end < start) end = start\n\n const newBuf = this.subarray(start, end)\n // Return an augmented `Uint8Array` instance\n Object.setPrototypeOf(newBuf, Buffer.prototype)\n\n return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUintLE =\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let val = this[offset]\n let mul = 1\n let i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUintBE =\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n checkOffset(offset, byteLength, this.length)\n }\n\n let val = this[offset + --byteLength]\n let mul = 1\n while (byteLength > 0 && (mul *= 0x100)) {\n val += this[offset + --byteLength] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUint8 =\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n return this[offset]\n}\n\nBuffer.prototype.readUint16LE =\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUint16BE =\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUint32LE =\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return ((this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16)) +\n (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUint32BE =\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] * 0x1000000) +\n ((this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n this[offset + 3])\n}\n\nBuffer.prototype.readBigUInt64LE = defineBigIntMethod(function readBigUInt64LE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const lo = first +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 24\n\n const hi = this[++offset] +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n last * 2 ** 24\n\n return BigInt(lo) + (BigInt(hi) << BigInt(32))\n})\n\nBuffer.prototype.readBigUInt64BE = defineBigIntMethod(function readBigUInt64BE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const hi = first * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n this[++offset]\n\n const lo = this[++offset] * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n last\n\n return (BigInt(hi) << BigInt(32)) + BigInt(lo)\n})\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let val = this[offset]\n let mul = 1\n let i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let i = byteLength\n let mul = 1\n let val = this[offset + --i]\n while (i > 0 && (mul *= 0x100)) {\n val += this[offset + --i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n if (!(this[offset] & 0x80)) return (this[offset])\n return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n const val = this[offset] | (this[offset + 1] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n const val = this[offset + 1] | (this[offset] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16) |\n (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] << 24) |\n (this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n (this[offset + 3])\n}\n\nBuffer.prototype.readBigInt64LE = defineBigIntMethod(function readBigInt64LE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const val = this[offset + 4] +\n this[offset + 5] * 2 ** 8 +\n this[offset + 6] * 2 ** 16 +\n (last << 24) // Overflow\n\n return (BigInt(val) << BigInt(32)) +\n BigInt(first +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 24)\n})\n\nBuffer.prototype.readBigInt64BE = defineBigIntMethod(function readBigInt64BE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const val = (first << 24) + // Overflow\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n this[++offset]\n\n return (BigInt(val) << BigInt(32)) +\n BigInt(this[++offset] * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n last)\n})\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUintLE =\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n const maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n let mul = 1\n let i = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUintBE =\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n const maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n let i = byteLength - 1\n let mul = 1\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUint8 =\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeUint16LE =\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeUint16BE =\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeUint32LE =\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset + 3] = (value >>> 24)\n this[offset + 2] = (value >>> 16)\n this[offset + 1] = (value >>> 8)\n this[offset] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeUint32BE =\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nfunction wrtBigUInt64LE (buf, value, offset, min, max) {\n checkIntBI(value, min, max, buf, offset, 7)\n\n let lo = Number(value & BigInt(0xffffffff))\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n return offset\n}\n\nfunction wrtBigUInt64BE (buf, value, offset, min, max) {\n checkIntBI(value, min, max, buf, offset, 7)\n\n let lo = Number(value & BigInt(0xffffffff))\n buf[offset + 7] = lo\n lo = lo >> 8\n buf[offset + 6] = lo\n lo = lo >> 8\n buf[offset + 5] = lo\n lo = lo >> 8\n buf[offset + 4] = lo\n let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n buf[offset + 3] = hi\n hi = hi >> 8\n buf[offset + 2] = hi\n hi = hi >> 8\n buf[offset + 1] = hi\n hi = hi >> 8\n buf[offset] = hi\n return offset + 8\n}\n\nBuffer.prototype.writeBigUInt64LE = defineBigIntMethod(function writeBigUInt64LE (value, offset = 0) {\n return wrtBigUInt64LE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeBigUInt64BE = defineBigIntMethod(function writeBigUInt64BE (value, offset = 0) {\n return wrtBigUInt64BE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n const limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n let i = 0\n let mul = 1\n let sub = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n const limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n let i = byteLength - 1\n let mul = 1\n let sub = 0\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n if (value < 0) value = 0xff + value + 1\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n this[offset + 2] = (value >>> 16)\n this[offset + 3] = (value >>> 24)\n return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (value < 0) value = 0xffffffff + value + 1\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeBigInt64LE = defineBigIntMethod(function writeBigInt64LE (value, offset = 0) {\n return wrtBigUInt64LE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\n})\n\nBuffer.prototype.writeBigInt64BE = defineBigIntMethod(function writeBigInt64BE (value, offset = 0) {\n return wrtBigUInt64BE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\n})\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n }\n ieee754.write(buf, value, offset, littleEndian, 23, 4)\n return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n }\n ieee754.write(buf, value, offset, littleEndian, 52, 8)\n return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')\n if (!start) start = 0\n if (!end && end !== 0) end = this.length\n if (targetStart >= target.length) targetStart = target.length\n if (!targetStart) targetStart = 0\n if (end > 0 && end < start) end = start\n\n // Copy 0 bytes; we're done\n if (end === start) return 0\n if (target.length === 0 || this.length === 0) return 0\n\n // Fatal error conditions\n if (targetStart < 0) {\n throw new RangeError('targetStart out of bounds')\n }\n if (start < 0 || start >= this.length) throw new RangeError('Index out of range')\n if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n // Are we oob?\n if (end > this.length) end = this.length\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start\n }\n\n const len = end - start\n\n if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {\n // Use built-in when available, missing from IE11\n this.copyWithin(targetStart, start, end)\n } else {\n Uint8Array.prototype.set.call(\n target,\n this.subarray(start, end),\n targetStart\n )\n }\n\n return len\n}\n\n// Usage:\n// buffer.fill(number[, offset[, end]])\n// buffer.fill(buffer[, offset[, end]])\n// buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n // Handle string cases:\n if (typeof val === 'string') {\n if (typeof start === 'string') {\n encoding = start\n start = 0\n end = this.length\n } else if (typeof end === 'string') {\n encoding = end\n end = this.length\n }\n if (encoding !== undefined && typeof encoding !== 'string') {\n throw new TypeError('encoding must be a string')\n }\n if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n if (val.length === 1) {\n const code = val.charCodeAt(0)\n if ((encoding === 'utf8' && code < 128) ||\n encoding === 'latin1') {\n // Fast path: If `val` fits into a single byte, use that numeric value.\n val = code\n }\n }\n } else if (typeof val === 'number') {\n val = val & 255\n } else if (typeof val === 'boolean') {\n val = Number(val)\n }\n\n // Invalid ranges are not set to a default, so can range check early.\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError('Out of range index')\n }\n\n if (end <= start) {\n return this\n }\n\n start = start >>> 0\n end = end === undefined ? this.length : end >>> 0\n\n if (!val) val = 0\n\n let i\n if (typeof val === 'number') {\n for (i = start; i < end; ++i) {\n this[i] = val\n }\n } else {\n const bytes = Buffer.isBuffer(val)\n ? val\n : Buffer.from(val, encoding)\n const len = bytes.length\n if (len === 0) {\n throw new TypeError('The value \"' + val +\n '\" is invalid for argument \"value\"')\n }\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len]\n }\n }\n\n return this\n}\n\n// CUSTOM ERRORS\n// =============\n\n// Simplified versions from Node, changed for Buffer-only usage\nconst errors = {}\nfunction E (sym, getMessage, Base) {\n errors[sym] = class NodeError extends Base {\n constructor () {\n super()\n\n Object.defineProperty(this, 'message', {\n value: getMessage.apply(this, arguments),\n writable: true,\n configurable: true\n })\n\n // Add the error code to the name to include it in the stack trace.\n this.name = `${this.name} [${sym}]`\n // Access the stack to generate the error message including the error code\n // from the name.\n this.stack // eslint-disable-line no-unused-expressions\n // Reset the name to the actual name.\n delete this.name\n }\n\n get code () {\n return sym\n }\n\n set code (value) {\n Object.defineProperty(this, 'code', {\n configurable: true,\n enumerable: true,\n value,\n writable: true\n })\n }\n\n toString () {\n return `${this.name} [${sym}]: ${this.message}`\n }\n }\n}\n\nE('ERR_BUFFER_OUT_OF_BOUNDS',\n function (name) {\n if (name) {\n return `${name} is outside of buffer bounds`\n }\n\n return 'Attempt to access memory outside buffer bounds'\n }, RangeError)\nE('ERR_INVALID_ARG_TYPE',\n function (name, actual) {\n return `The \"${name}\" argument must be of type number. Received type ${typeof actual}`\n }, TypeError)\nE('ERR_OUT_OF_RANGE',\n function (str, range, input) {\n let msg = `The value of \"${str}\" is out of range.`\n let received = input\n if (Number.isInteger(input) && Math.abs(input) > 2 ** 32) {\n received = addNumericalSeparator(String(input))\n } else if (typeof input === 'bigint') {\n received = String(input)\n if (input > BigInt(2) ** BigInt(32) || input < -(BigInt(2) ** BigInt(32))) {\n received = addNumericalSeparator(received)\n }\n received += 'n'\n }\n msg += ` It must be ${range}. Received ${received}`\n return msg\n }, RangeError)\n\nfunction addNumericalSeparator (val) {\n let res = ''\n let i = val.length\n const start = val[0] === '-' ? 1 : 0\n for (; i >= start + 4; i -= 3) {\n res = `_${val.slice(i - 3, i)}${res}`\n }\n return `${val.slice(0, i)}${res}`\n}\n\n// CHECK FUNCTIONS\n// ===============\n\nfunction checkBounds (buf, offset, byteLength) {\n validateNumber(offset, 'offset')\n if (buf[offset] === undefined || buf[offset + byteLength] === undefined) {\n boundsError(offset, buf.length - (byteLength + 1))\n }\n}\n\nfunction checkIntBI (value, min, max, buf, offset, byteLength) {\n if (value > max || value < min) {\n const n = typeof min === 'bigint' ? 'n' : ''\n let range\n if (byteLength > 3) {\n if (min === 0 || min === BigInt(0)) {\n range = `>= 0${n} and < 2${n} ** ${(byteLength + 1) * 8}${n}`\n } else {\n range = `>= -(2${n} ** ${(byteLength + 1) * 8 - 1}${n}) and < 2 ** ` +\n `${(byteLength + 1) * 8 - 1}${n}`\n }\n } else {\n range = `>= ${min}${n} and <= ${max}${n}`\n }\n throw new errors.ERR_OUT_OF_RANGE('value', range, value)\n }\n checkBounds(buf, offset, byteLength)\n}\n\nfunction validateNumber (value, name) {\n if (typeof value !== 'number') {\n throw new errors.ERR_INVALID_ARG_TYPE(name, 'number', value)\n }\n}\n\nfunction boundsError (value, length, type) {\n if (Math.floor(value) !== value) {\n validateNumber(value, type)\n throw new errors.ERR_OUT_OF_RANGE(type || 'offset', 'an integer', value)\n }\n\n if (length < 0) {\n throw new errors.ERR_BUFFER_OUT_OF_BOUNDS()\n }\n\n throw new errors.ERR_OUT_OF_RANGE(type || 'offset',\n `>= ${type ? 1 : 0} and <= ${length}`,\n value)\n}\n\n// HELPER FUNCTIONS\n// ================\n\nconst INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n // Node takes equal signs as end of the Base64 encoding\n str = str.split('=')[0]\n // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n str = str.trim().replace(INVALID_BASE64_RE, '')\n // Node converts strings with length < 2 to ''\n if (str.length < 2) return ''\n // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n while (str.length % 4 !== 0) {\n str = str + '='\n }\n return str\n}\n\nfunction utf8ToBytes (string, units) {\n units = units || Infinity\n let codePoint\n const length = string.length\n let leadSurrogate = null\n const bytes = []\n\n for (let i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i)\n\n // is surrogate component\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\n // last char was a lead\n if (!leadSurrogate) {\n // no lead yet\n if (codePoint > 0xDBFF) {\n // unexpected trail\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n } else if (i + 1 === length) {\n // unpaired lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n }\n\n // valid lead\n leadSurrogate = codePoint\n\n continue\n }\n\n // 2 leads in a row\n if (codePoint < 0xDC00) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n leadSurrogate = codePoint\n continue\n }\n\n // valid surrogate pair\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n } else if (leadSurrogate) {\n // valid bmp char, but last char was a lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n }\n\n leadSurrogate = null\n\n // encode utf8\n if (codePoint < 0x80) {\n if ((units -= 1) < 0) break\n bytes.push(codePoint)\n } else if (codePoint < 0x800) {\n if ((units -= 2) < 0) break\n bytes.push(\n codePoint >> 0x6 | 0xC0,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x10000) {\n if ((units -= 3) < 0) break\n bytes.push(\n codePoint >> 0xC | 0xE0,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x110000) {\n if ((units -= 4) < 0) break\n bytes.push(\n codePoint >> 0x12 | 0xF0,\n codePoint >> 0xC & 0x3F | 0x80,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else {\n throw new Error('Invalid code point')\n }\n }\n\n return bytes\n}\n\nfunction asciiToBytes (str) {\n const byteArray = []\n for (let i = 0; i < str.length; ++i) {\n // Node's code seems to be doing this and not & 0x7F..\n byteArray.push(str.charCodeAt(i) & 0xFF)\n }\n return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n let c, hi, lo\n const byteArray = []\n for (let i = 0; i < str.length; ++i) {\n if ((units -= 2) < 0) break\n\n c = str.charCodeAt(i)\n hi = c >> 8\n lo = c % 256\n byteArray.push(lo)\n byteArray.push(hi)\n }\n\n return byteArray\n}\n\nfunction base64ToBytes (str) {\n return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n let i\n for (i = 0; i < length; ++i) {\n if ((i + offset >= dst.length) || (i >= src.length)) break\n dst[i + offset] = src[i]\n }\n return i\n}\n\n// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass\n// the `instanceof` check but they should be treated as of that type.\n// See: https://github.com/feross/buffer/issues/166\nfunction isInstance (obj, type) {\n return obj instanceof type ||\n (obj != null && obj.constructor != null && obj.constructor.name != null &&\n obj.constructor.name === type.name)\n}\nfunction numberIsNaN (obj) {\n // For IE11 support\n return obj !== obj // eslint-disable-line no-self-compare\n}\n\n// Create lookup table for `toString('hex')`\n// See: https://github.com/feross/buffer/issues/219\nconst hexSliceLookupTable = (function () {\n const alphabet = '0123456789abcdef'\n const table = new Array(256)\n for (let i = 0; i < 16; ++i) {\n const i16 = i * 16\n for (let j = 0; j < 16; ++j) {\n table[i16 + j] = alphabet[i] + alphabet[j]\n }\n }\n return table\n})()\n\n// Return not function with Error if BigInt not supported\nfunction defineBigIntMethod (fn) {\n return typeof BigInt === 'undefined' ? BufferBigIntNotDefined : fn\n}\n\nfunction BufferBigIntNotDefined () {\n throw new Error('BigInt not supported')\n}\n","/*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */\n/* eslint-disable node/no-deprecated-api */\nvar buffer = require('buffer')\nvar Buffer = buffer.Buffer\n\n// alternative to using Object.keys for old browsers\nfunction copyProps (src, dst) {\n for (var key in src) {\n dst[key] = src[key]\n }\n}\nif (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {\n module.exports = buffer\n} else {\n // Copy properties from require('buffer')\n copyProps(buffer, exports)\n exports.Buffer = SafeBuffer\n}\n\nfunction SafeBuffer (arg, encodingOrOffset, length) {\n return Buffer(arg, encodingOrOffset, length)\n}\n\nSafeBuffer.prototype = Object.create(Buffer.prototype)\n\n// Copy static methods from Buffer\ncopyProps(Buffer, SafeBuffer)\n\nSafeBuffer.from = function (arg, encodingOrOffset, length) {\n if (typeof arg === 'number') {\n throw new TypeError('Argument must not be a number')\n }\n return Buffer(arg, encodingOrOffset, length)\n}\n\nSafeBuffer.alloc = function (size, fill, encoding) {\n if (typeof size !== 'number') {\n throw new TypeError('Argument must be a number')\n }\n var buf = Buffer(size)\n if (fill !== undefined) {\n if (typeof encoding === 'string') {\n buf.fill(fill, encoding)\n } else {\n buf.fill(fill)\n }\n } else {\n buf.fill(0)\n }\n return buf\n}\n\nSafeBuffer.allocUnsafe = function (size) {\n if (typeof size !== 'number') {\n throw new TypeError('Argument must be a number')\n }\n return Buffer(size)\n}\n\nSafeBuffer.allocUnsafeSlow = function (size) {\n if (typeof size !== 'number') {\n throw new TypeError('Argument must be a number')\n }\n return buffer.SlowBuffer(size)\n}\n","'use strict'\n\n// limit of Crypto.getRandomValues()\n// https://developer.mozilla.org/en-US/docs/Web/API/Crypto/getRandomValues\nvar MAX_BYTES = 65536\n\n// Node supports requesting up to this number of bytes\n// https://github.com/nodejs/node/blob/master/lib/internal/crypto/random.js#L48\nvar MAX_UINT32 = 4294967295\n\nfunction oldBrowser () {\n throw new Error('Secure random number generation is not supported by this browser.\\nUse Chrome, Firefox or Internet Explorer 11')\n}\n\nvar Buffer = require('safe-buffer').Buffer\nvar crypto = global.crypto || global.msCrypto\n\nif (crypto && crypto.getRandomValues) {\n module.exports = randomBytes\n} else {\n module.exports = oldBrowser\n}\n\nfunction randomBytes (size, cb) {\n // phantomjs needs to throw\n if (size > MAX_UINT32) throw new RangeError('requested too many random bytes')\n\n var bytes = Buffer.allocUnsafe(size)\n\n if (size > 0) { // getRandomValues fails on IE if size == 0\n if (size > MAX_BYTES) { // this is the max bytes crypto.getRandomValues\n // can do at once see https://developer.mozilla.org/en-US/docs/Web/API/window.crypto.getRandomValues\n for (var generated = 0; generated < size; generated += MAX_BYTES) {\n // buffer.slice automatically checks if the end is past the end of\n // the buffer so we don't have to here\n crypto.getRandomValues(bytes.slice(generated, generated + MAX_BYTES))\n }\n } else {\n crypto.getRandomValues(bytes)\n }\n }\n\n if (typeof cb === 'function') {\n return process.nextTick(function () {\n cb(null, bytes)\n })\n }\n\n return bytes\n}\n","/**\n * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport {Buffer} from 'buffer';\nimport {ThunderIDAuthException, Crypto, JWKInterface} from '@thunderid/javascript';\nimport base64url from 'base64url';\nimport sha256 from 'fast-sha256';\nimport {createLocalJWKSet, jwtVerify, JWTVerifyOptions} from 'jose';\nimport randombytes from 'randombytes';\n\n/**\n * Browser-side `Crypto` implementation using native Web Crypto APIs and `jose` for JWT verification.\n */\nclass SPACryptoUtils implements Crypto<Buffer | string> {\n /**\n * Base64URL-encodes a buffer or string value.\n *\n * @param value - The value to encode.\n * @returns The base64url-encoded string with padding stripped.\n */\n public base64URLEncode(value: Buffer | string): string {\n return base64url.encode(value).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n }\n\n /**\n * Decodes a base64url-encoded string.\n *\n * @param value - The base64url string to decode.\n * @returns The decoded UTF-8 string.\n */\n public base64URLDecode(value: string): string {\n return base64url.decode(value).toString();\n }\n\n /**\n * Computes the SHA-256 hash of a string.\n *\n * @param data - The input string to hash.\n * @returns A `Buffer` containing the raw hash bytes.\n */\n public hashSha256(data: string): string | Buffer {\n return Buffer.from(sha256(new TextEncoder().encode(data)));\n }\n\n /**\n * Generates a buffer of cryptographically random bytes.\n *\n * @param length - Number of bytes to generate.\n * @returns A `Buffer` of random bytes.\n */\n public generateRandomBytes(length: number): string | Buffer {\n return randombytes(length);\n }\n\n /**\n * Verifies a JWT against a JWK using `jose`.\n *\n * @param idToken - The raw JWT string.\n * @param jwk - The JSON Web Key to verify against.\n * @param algorithms - Allowed signature algorithms (e.g., `['RS256']`).\n * @param clientId - Expected audience claim value.\n * @param issuer - Expected issuer claim value.\n * @param subject - Expected subject claim value.\n * @param clockTolerance - Allowed clock skew in seconds.\n * @param validateJwtIssuer - Whether to validate the issuer claim.\n * @returns `true` if the token is valid.\n */\n public verifyJwt(\n idToken: string,\n jwk: Partial<JWKInterface>,\n algorithms: string[],\n clientId: string,\n issuer: string,\n subject: string,\n clockTolerance?: number,\n validateJwtIssuer?: boolean,\n ): Promise<boolean> {\n const jwtVerifyOptions: JWTVerifyOptions = {\n algorithms: algorithms,\n audience: [clientId],\n clockTolerance: clockTolerance,\n subject: subject,\n };\n\n if (validateJwtIssuer ?? true) {\n jwtVerifyOptions.issuer = issuer;\n }\n\n return jwtVerify(\n idToken,\n createLocalJWKSet({\n keys: [jwk],\n }),\n jwtVerifyOptions,\n )\n .then(() => {\n return Promise.resolve(true);\n })\n .catch((error) => {\n return Promise.reject(\n new ThunderIDAuthException(\n 'SPA-CRYPTO-UTILS-VJ-IV01',\n error?.reason ?? JSON.stringify(error),\n `${error?.code} ${error?.claim}`,\n ),\n );\n });\n }\n}\n\nexport default SPACryptoUtils;\n","/**\n * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport {StorageManager, TokenConstants} from '@thunderid/javascript';\n\n/**\n * Helper that manages automatic access-token refresh scheduling via `setTimeout`.\n *\n * @typeParam T - Browser client config type.\n */\nclass SPAHelper<T> {\n private _storageManager: StorageManager<T>;\n private _isTokenRefreshLoading = false;\n\n /**\n * @param storageManager - The storage manager instance used to read config and session data.\n */\n public constructor(storageManager: StorageManager<T>) {\n this._storageManager = storageManager;\n }\n\n /**\n * Schedules an automatic access-token refresh if `periodicTokenRefresh` is enabled in config.\n * No-op if the feature is disabled or there is no refresh token.\n *\n * @param refreshAccessToken - Async callback that performs the refresh.\n */\n public async refreshAccessTokenAutomatically(refreshAccessToken: () => Promise<any>): Promise<void> {\n const config = await this._storageManager.getConfigData();\n const shouldRefreshAutomatically: boolean = (config as any)?.periodicTokenRefresh ?? false;\n\n if (!shouldRefreshAutomatically) {\n return;\n }\n\n const sessionData = await this._storageManager.getSessionData();\n\n if (sessionData?.refresh_token) {\n if (sessionData.created_at == null || sessionData.expires_in == null) {\n return;\n }\n\n const TOKEN_REFRESH_BUFFER_MS = 10_000;\n const expiryTime = Number(sessionData.expires_in) * 1000;\n const absoluteExpiryTime: number = sessionData.created_at + expiryTime;\n const timeUntilRefresh = absoluteExpiryTime - Date.now() - TOKEN_REFRESH_BUFFER_MS;\n\n if (timeUntilRefresh <= 0) {\n if (this._isTokenRefreshLoading) return;\n\n this._isTokenRefreshLoading = true;\n try {\n await refreshAccessToken();\n } finally {\n this._isTokenRefreshLoading = false;\n }\n return;\n }\n\n const timer = setTimeout(async () => {\n if (this._isTokenRefreshLoading) return;\n\n this._isTokenRefreshLoading = true;\n try {\n await refreshAccessToken();\n } finally {\n this._isTokenRefreshLoading = false;\n }\n }, timeUntilRefresh);\n\n await this._storageManager.setTemporaryDataParameter(\n TokenConstants.Storage.StorageKeys.REFRESH_TOKEN_TIMER,\n JSON.stringify(timer),\n );\n }\n }\n\n /**\n * Returns the current refresh timer ID from storage, or `-1` if none is set.\n */\n public async getRefreshTimeoutTimer(): Promise<number> {\n const raw = await this._storageManager.getTemporaryDataParameter(\n TokenConstants.Storage.StorageKeys.REFRESH_TOKEN_TIMER,\n );\n\n if (raw) {\n return JSON.parse(raw as string);\n }\n\n return -1;\n }\n\n /**\n * Clears the automatic-refresh timer.\n *\n * @param timer - Timer ID to clear. If omitted, the stored timer ID is used.\n */\n public async clearRefreshTokenTimeout(timer?: number): Promise<void> {\n if (timer) {\n clearTimeout(timer);\n\n return;\n }\n\n const refreshTimer: number = await this.getRefreshTimeoutTimer();\n\n if (refreshTimer !== -1) {\n clearTimeout(refreshTimer);\n }\n }\n}\n\nexport default SPAHelper;\n","/**\n * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport {\n ThunderIDJavaScriptClient,\n ThunderIDAuthException,\n User,\n IsomorphicCrypto,\n IdToken,\n OIDCEndpoints,\n OIDCRequestConstants,\n SessionData,\n Storage,\n TokenResponse,\n extractPkceStorageKeyFromState,\n HttpError,\n HttpRequestConfig,\n HttpResponse,\n createPackageComponentLogger,\n} from '@thunderid/javascript';\nimport {REFRESH_ACCESS_TOKEN_ERR0R, SILENT_SIGN_IN_STATE, TOKEN_REQUEST_CONFIG_KEY} from './constants/SPAConstants';\nimport FetchHttpClient from './FetchHttpClient';\nimport {BrowserAuthConfig} from './models/BrowserConfig';\nimport BrowserStorage from './models/BrowserStorage';\nimport SignInConfig from './models/SignInConfig';\nimport SignOutError from './models/SignOutError';\nimport {SPATokenExchangeConfig} from './models/TokenExchangeConfig';\nimport LocalStore from './stores/LocalStore';\nimport MemoryStore from './stores/MemoryStore';\nimport SessionStore from './stores/SessionStore';\nimport AuthenticationHelper from './utils/AuthenticationHelper';\nimport navigate from './utils/navigate';\nimport createSessionManagementHelper, {SessionManagementHelperInterface} from './utils/SessionManagementHelper';\nimport SPACryptoUtils from './utils/SPACryptoUtils';\nimport SPAHelper from './utils/SPAHelper';\nimport SPAUtils from './utils/SPAUtils';\n\nconst logger = createPackageComponentLogger('@thunderid/browser', 'ThunderIDBrowserClient');\n\nconst BROWSER_DEFAULT_CONFIG = {\n autoLogoutOnTokenRefreshError: false,\n checkSessionInterval: 3,\n periodicTokenRefresh: false,\n sessionRefreshInterval: 300,\n syncSession: false,\n};\n\nconst initiateStore = (storage: BrowserStorage | string | undefined): Storage => {\n switch (storage) {\n case BrowserStorage.LocalStorage:\n case 'localStorage':\n return new LocalStore();\n case BrowserStorage.BrowserMemory:\n case 'browserMemory':\n return new MemoryStore();\n default:\n return new SessionStore();\n }\n};\n\nclass ThunderIDBrowserClient<T = BrowserAuthConfig> extends ThunderIDJavaScriptClient<T> {\n private _browserInstanceId = 0;\n private _httpClient: FetchHttpClient | undefined;\n private _spaHelper: SPAHelper<T> | undefined;\n private _sessionManagementHelper: SessionManagementHelperInterface | undefined;\n private _authHelper: AuthenticationHelper<T> | undefined;\n private _storage: BrowserStorage | string = BrowserStorage.SessionStorage;\n private _getSignOutURLFromSessionStorage = false;\n private _isHttpHandlerEnabled = true;\n private _httpErrorCallback: ((error: HttpError) => void | Promise<void>) | undefined;\n private _httpFinishCallback: (() => void) | undefined;\n private _onSignInCallback: (response: User) => void = () => null;\n private _onSignOutCallback: () => void = () => null;\n private _onSignOutFailedCallback: (error: SignOutError) => void = () => null;\n private _onEndUserSession: (response: any) => void = () => null;\n private _onInitialize: (response: boolean) => void = () => null;\n private _onCustomGrant = new Map<string, (response: any) => void>();\n private _initialized = false;\n private _startedInitialize = false;\n\n public constructor(instanceId = 0) {\n super(undefined, new SPACryptoUtils());\n this._browserInstanceId = instanceId;\n }\n\n public override async initialize(config: T, storage?: Storage): Promise<boolean> {\n this._startedInitialize = true;\n this._initialized = false;\n\n const configAny = config as any;\n this._storage = configAny.storage ?? BrowserStorage.SessionStorage;\n\n const merged = {\n afterSignInUrl: window.location.origin,\n afterSignOutUrl: window.location.origin,\n ...BROWSER_DEFAULT_CONFIG,\n ...configAny,\n instanceId: this._browserInstanceId,\n };\n const store: Storage = storage ?? initiateStore(this._storage as BrowserStorage);\n\n await super.initialize(merged as unknown as T, store);\n\n const sm = this.getStorageManager();\n this._spaHelper = new SPAHelper<T>(sm);\n\n const attachToken = async (request: HttpRequestConfig): Promise<void> => {\n await this._authHelper?.attachTokenToRequestConfig(request);\n };\n\n this._httpClient = FetchHttpClient.getInstance(this._browserInstanceId, true, attachToken);\n\n this._sessionManagementHelper = await createSessionManagementHelper(\n async () => this.getSignOutUrl(),\n (sessionState: string) =>\n (sm as any).setSessionDataParameter(\n OIDCRequestConstants.Params.SESSION_STATE as keyof SessionData,\n sessionState,\n ),\n );\n\n this._authHelper = new AuthenticationHelper<T>(sm, this._spaHelper, this._browserInstanceId, {\n exchangeToken: (cfg: SPATokenExchangeConfig) => super.exchangeToken(cfg as any),\n getAccessToken: (sessionId?: string) => this.getAccessToken(sessionId),\n getCrypto: async () => this.getCryptoHelper() as unknown as IsomorphicCrypto,\n getDecodedIdToken: (sessionId?: string) => this.getDecodedIdToken(sessionId),\n getIDPAccessToken: async () => ((await sm.getSessionData()) as any)?.access_token,\n getIdToken: () => this.getIdToken(),\n getOpenIDProviderEndpoints: async () => this.getOpenIDProviderEndpoints() as Promise<OIDCEndpoints>,\n getUser: () => this.getUser(),\n isSignedIn: () => this.isSignedIn(),\n refreshAccessToken: () => super.refreshAccessToken(),\n setPKCECode: (pkceKey: string, state: string) => this.setPKCECode(pkceKey, state),\n });\n\n this._initialized = true;\n\n if (this._onInitialize) {\n this._onInitialize(true);\n }\n\n if (!merged.autoLogoutOnTokenRefreshError) {\n return true;\n }\n\n window.addEventListener('message', (event) => {\n if (event?.data?.type === REFRESH_ACCESS_TOKEN_ERR0R) {\n this.signOut();\n }\n });\n\n return true;\n }\n\n public async isInitialized(): Promise<boolean> {\n if (!this._startedInitialize) {\n return false;\n }\n\n const sleep = (): Promise<void> => new Promise((resolve) => setTimeout(resolve, 1));\n let iterations = 0;\n\n while (!this._initialized) {\n if (iterations === 1e4) {\n logger.warn('Initialization is taking longer than expected');\n }\n await sleep();\n iterations++;\n }\n\n return true;\n }\n\n private async _validateMethod(validateAuthentication = true): Promise<boolean> {\n if (!(await this.isInitialized())) {\n return Promise.reject(\n new ThunderIDAuthException(\n 'SPA-AUTH_CLIENT-VM-NF01',\n 'The SDK is not initialized.',\n 'The SDK must be initialized first.',\n ),\n );\n }\n\n if (validateAuthentication && !(await this.isSignedIn())) {\n return Promise.reject(\n new ThunderIDAuthException(\n 'SPA-AUTH_CLIENT-VM-IV02',\n 'The user is not authenticated.',\n 'The user must be authenticated first.',\n ),\n );\n }\n\n return true;\n }\n\n public override isLoading(): boolean {\n return false;\n }\n\n public override async signIn(\n config?: SignInConfig,\n authorizationCode?: string,\n sessionState?: string,\n state?: string,\n tokenRequestConfig?: {params: Record<string, unknown>},\n ): Promise<User | undefined> {\n await this.isInitialized();\n\n if (!SPAUtils.canContinueSignIn(Boolean(config?.callOnlyOnRedirect), authorizationCode)) {\n return undefined;\n }\n\n delete config?.callOnlyOnRedirect;\n\n const user = await this._signInInternal(config, authorizationCode, sessionState, state, tokenRequestConfig);\n\n if (user && this._onSignInCallback) {\n this._onSignInCallback(user);\n }\n\n return user;\n }\n\n private async _signInInternal(\n signInConfig?: SignInConfig,\n authorizationCode?: string,\n sessionState?: string,\n state?: string,\n tokenRequestConfig?: {params: Record<string, unknown>},\n ): Promise<User> {\n const sm = this.getStorageManager();\n const config = await (sm as any).getConfigData();\n\n const basicUserInfo = await this._authHelper!.handleSignIn(\n () => this._shouldStopAuthn(),\n () => this._checkSession(),\n );\n\n if (basicUserInfo) {\n return basicUserInfo;\n }\n\n let resolvedAuthorizationCode: string;\n let resolvedSessionState: string;\n let resolvedState: string;\n let resolvedTokenRequestConfig: {params: Record<string, unknown>} = {params: {}};\n\n if (config?.responseMode === 'form_post' && authorizationCode) {\n resolvedAuthorizationCode = authorizationCode;\n resolvedSessionState = sessionState ?? '';\n resolvedState = state ?? '';\n } else {\n resolvedAuthorizationCode =\n new URL(window.location.href).searchParams.get(OIDCRequestConstants.Params.AUTHORIZATION_CODE) ?? '';\n resolvedSessionState =\n new URL(window.location.href).searchParams.get(OIDCRequestConstants.Params.SESSION_STATE) ?? '';\n resolvedState = new URL(window.location.href).searchParams.get(OIDCRequestConstants.Params.STATE) ?? '';\n\n SPAUtils.removeAuthorizationCode();\n }\n\n if (resolvedAuthorizationCode && resolvedState) {\n (sm as any).setSessionStatus('true');\n const storedTokenRequestConfig = await (sm as any).getTemporaryDataParameter(TOKEN_REQUEST_CONFIG_KEY);\n if (storedTokenRequestConfig && typeof storedTokenRequestConfig === 'string') {\n resolvedTokenRequestConfig = JSON.parse(storedTokenRequestConfig);\n }\n return this._exchangeCodeForTokens(\n resolvedAuthorizationCode,\n resolvedSessionState,\n resolvedState,\n resolvedTokenRequestConfig,\n );\n }\n\n return this.getSignInUrl(signInConfig as any).then(async (url: string) => {\n if (this._storage === BrowserStorage.BrowserMemory && config.enablePKCE) {\n const pkceKey: string = extractPkceStorageKeyFromState(resolvedState);\n SPAUtils.setPKCE(pkceKey, await this.getPKCECode(resolvedState));\n }\n\n if (tokenRequestConfig) {\n (sm as any).setTemporaryDataParameter(TOKEN_REQUEST_CONFIG_KEY, JSON.stringify(tokenRequestConfig));\n }\n\n location.href = url;\n await SPAUtils.waitTillPageRedirect();\n\n return {allowedScopes: '', displayName: '', email: '', sessionState: '', sub: '', tenantDomain: '', username: ''};\n });\n }\n\n private async _exchangeCodeForTokens(\n authorizationCode: string,\n sessionState: string,\n state: string,\n tokenRequestConfig?: {params: Record<string, unknown>},\n ): Promise<User> {\n const sm = this.getStorageManager();\n const config = await (sm as any).getConfigData();\n\n if (this._storage === BrowserStorage.BrowserMemory && config.enablePKCE && sessionState) {\n const pkceKey = extractPkceStorageKeyFromState(sessionState);\n const pkce = SPAUtils.getPKCE(pkceKey);\n await this.setPKCECode(pkce, pkceKey);\n }\n\n await this.requestAccessToken(authorizationCode, sessionState ?? '', state ?? '', undefined, tokenRequestConfig);\n\n try {\n const signOutUrl = await this.getSignOutUrl();\n SPAUtils.setSignOutURL(signOutUrl, config.clientId, this._browserInstanceId);\n } catch {\n // end_session_endpoint absent — signOut() falls back to signInUrl navigation.\n }\n\n await this._spaHelper!.clearRefreshTokenTimeout();\n await this._spaHelper!.refreshAccessTokenAutomatically(() => this.refreshAccessToken() as any);\n\n if (config.syncSession) {\n this._checkSession();\n }\n\n return this.getUser();\n }\n\n public override async signInSilently(\n additionalParams?: Record<string, string | boolean>,\n tokenRequestConfig?: {params: Record<string, unknown>},\n ): Promise<User | boolean | undefined> {\n await this.isInitialized();\n\n if (SPAUtils.wasSignInCalled()) {\n return undefined;\n }\n\n const response = await this._authHelper!.signInSilently(\n (params) => this._constructSilentSignInUrl(params),\n (code, ss, s, trc) => this._exchangeCodeForTokens(code, ss, s, trc),\n this._sessionManagementHelper!,\n additionalParams,\n tokenRequestConfig,\n );\n\n if (this._onSignInCallback && response) {\n this._onSignInCallback(response as User);\n }\n\n return response;\n }\n\n public override async signOut(\n _options?: any,\n sessionIdOrAfterSignOut?: string | ((url: string) => void),\n afterSignOutParam?: (url: string) => void,\n ): Promise<string> {\n let afterSignOut: ((url: string) => void) | undefined;\n\n if (typeof sessionIdOrAfterSignOut === 'function') {\n afterSignOut = sessionIdOrAfterSignOut;\n } else if (typeof sessionIdOrAfterSignOut === 'string') {\n afterSignOut = afterSignOutParam;\n }\n\n const sm = this.getStorageManager();\n const config = await (sm as any).getConfigData();\n\n // TEMPORARY: Handle sign-out by clearing the session and navigating back to sign-in,\n // until the OIDC end-session flow is fully supported.\n this.clearSession();\n\n if (config?.signInUrl) {\n navigate(config.signInUrl);\n } else {\n this.signIn(config?.signInOptions);\n }\n\n afterSignOut?.(config?.afterSignOutUrl || '');\n\n return config?.afterSignOutUrl || '';\n }\n\n public async httpRequest(requestConfig: HttpRequestConfig): Promise<HttpResponse | undefined> {\n await this._validateMethod(false);\n\n return this._authHelper!.httpRequest(\n this._httpClient!,\n requestConfig,\n this._isHttpHandlerEnabled,\n this._httpErrorCallback,\n this._httpFinishCallback,\n );\n }\n\n public async httpRequestAll(configs: HttpRequestConfig[]): Promise<HttpResponse[] | undefined> {\n await this._validateMethod(false);\n\n return this._authHelper!.httpRequestAll(\n configs,\n this._httpClient!,\n this._isHttpHandlerEnabled,\n this._httpErrorCallback,\n this._httpFinishCallback,\n );\n }\n\n public override async getUser(userId?: string): Promise<User> {\n await this._validateMethod();\n\n return super.getUser(userId);\n }\n\n public override async getAccessToken(sessionId?: string): Promise<string> {\n return super.getAccessToken(sessionId);\n }\n\n public override async getDecodedIdToken(userId?: string, idToken?: string): Promise<IdToken> {\n await this._validateMethod();\n\n return super.getDecodedIdToken(userId, idToken);\n }\n\n public override async getIdToken(userId?: string): Promise<string> {\n await this._validateMethod();\n\n return super.getIdToken(userId);\n }\n\n public override async getOpenIDProviderEndpoints(): Promise<Partial<OIDCEndpoints>> {\n await this.isInitialized();\n\n return super.getOpenIDProviderEndpoints();\n }\n\n public async getCrypto(): Promise<IsomorphicCrypto | undefined> {\n await this._validateMethod();\n\n return this.getCryptoHelper() as any;\n }\n\n public getHttpClient(): FetchHttpClient {\n if (!this._httpClient) {\n throw new ThunderIDAuthException(\n 'SPA-AUTH_CLIENT-GHC-NF02',\n 'The SDK is not initialized.',\n 'Call initialize() before getHttpClient().',\n );\n }\n\n return this._httpClient;\n }\n\n public override async isSignedIn(userId?: string): Promise<boolean> {\n await this.isInitialized();\n\n return super.isSignedIn(userId);\n }\n\n protected notifySignIn(user: User): void {\n this._onSignInCallback(user);\n }\n\n public async isSessionActive(): Promise<boolean | undefined> {\n await this.isInitialized();\n\n return (await (this.getStorageManager() as any).getSessionStatus()) === 'true';\n }\n\n public override async refreshAccessToken(userId?: string): Promise<User | TokenResponse> {\n await this._validateMethod(false);\n\n try {\n return await this._authHelper!.refreshAccessToken((cfg) => this._enableRetrievingSignOutURLFromSession(cfg));\n } catch (error) {\n return Promise.reject(error);\n }\n }\n\n public override async revokeAccessToken(userId?: string): Promise<boolean | Response> {\n await this._validateMethod();\n\n const timer: number = await this._spaHelper!.getRefreshTimeoutTimer();\n await super.revokeAccessToken(userId);\n\n this._sessionManagementHelper?.reset();\n await this._spaHelper!.clearRefreshTokenTimeout(timer);\n\n this._onEndUserSession && (await this._onEndUserSession(true));\n\n return true;\n }\n\n public override async exchangeToken(config: SPATokenExchangeConfig): Promise<Response | User> {\n if (config.signInRequired) {\n await this._validateMethod();\n }\n\n if (!config.id) {\n return Promise.reject(\n new ThunderIDAuthException(\n 'SPA-AUTH_CLIENT-RCG-NF01',\n 'The custom grant request id not found.',\n 'Set the `id` attribute on the token exchange config.',\n ),\n );\n }\n\n const response = await this._authHelper!.exchangeToken(config, (cfg) =>\n this._enableRetrievingSignOutURLFromSession(cfg),\n );\n\n const cb = this._onCustomGrant.get(config.id);\n cb?.(response);\n\n return response;\n }\n\n public override async reInitialize(config: Partial<T>): Promise<boolean> {\n await this.isInitialized();\n\n const sm = this.getStorageManager();\n const existingConfig = await (sm as any).getConfigData();\n const isCheckSessionIframeDifferent = !(\n existingConfig?.endpoints?.checkSessionIframe &&\n (config as any)?.endpoints?.checkSessionIframe &&\n existingConfig.endpoints.checkSessionIframe === (config as any).endpoints.checkSessionIframe\n );\n const result = await super.reInitialize(config);\n\n const merged = {...existingConfig, ...config};\n if (merged.syncSession && isCheckSessionIframeDifferent) {\n this._sessionManagementHelper?.reset();\n this._checkSession();\n }\n\n return result;\n }\n\n public async startAutoRefreshToken(): Promise<void> {\n await this.isInitialized();\n\n await this._spaHelper!.clearRefreshTokenTimeout();\n await this._spaHelper!.refreshAccessTokenAutomatically(() => this.refreshAccessToken() as any);\n }\n\n public async enableHttpHandler(): Promise<boolean | undefined> {\n await this.isInitialized();\n\n this._authHelper?.enableHttpHandler(this._httpClient!);\n this._isHttpHandlerEnabled = true;\n\n return true;\n }\n\n public async disableHttpHandler(): Promise<boolean | undefined> {\n await this.isInitialized();\n\n this._authHelper?.disableHttpHandler(this._httpClient!);\n this._isHttpHandlerEnabled = false;\n\n return true;\n }\n\n public override async decodeJwtToken<R = Record<string, unknown>>(token: string): Promise<R> {\n return this.getCryptoHelper().decodeJwtToken<R>(token);\n }\n\n public async on(hook: string, callback: (response?: any) => void | Promise<void>, id?: string): Promise<void> {\n await this.isInitialized();\n\n if (!callback || typeof callback !== 'function') {\n throw new ThunderIDAuthException(\n 'SPA-AUTH_CLIENT-ON-IV02',\n 'Invalid callback function.',\n 'The provided callback must be a function.',\n );\n }\n\n switch (hook) {\n case 'sign-in':\n this._onSignInCallback = callback;\n break;\n case 'sign-out':\n this._onSignOutCallback = callback;\n if (\n await SPAUtils.isSignOutSuccessful(\n ThunderIDBrowserClient.isSignOutSuccessful.bind(ThunderIDBrowserClient),\n () => ThunderIDBrowserClient.clearSession(),\n )\n ) {\n this._onSignOutCallback();\n }\n break;\n case 'revoke-access-token':\n this._onEndUserSession = callback;\n break;\n case 'initialize':\n this._onInitialize = callback;\n break;\n case 'http-request-error':\n this._httpErrorCallback = callback;\n break;\n case 'http-request-finish':\n this._httpFinishCallback = callback;\n break;\n case 'http-request-start':\n this._httpClient?.setHttpRequestStartCallback?.(callback);\n break;\n case 'http-request-success':\n this._httpClient?.setHttpRequestSuccessCallback?.(callback);\n break;\n case 'custom-grant':\n id && this._onCustomGrant.set(id, callback);\n break;\n case 'sign-out-failed': {\n this._onSignOutFailedCallback = callback;\n const signOutFail = SPAUtils.didSignOutFail(ThunderIDBrowserClient.didSignOutFail.bind(ThunderIDBrowserClient));\n if (signOutFail) {\n this._onSignOutFailedCallback(signOutFail as SignOutError);\n }\n break;\n }\n default:\n throw new ThunderIDAuthException('SPA-AUTH_CLIENT-ON-IV01', 'Invalid hook.', `Unknown hook: \"${hook}\"`);\n }\n }\n\n private async _checkSession(): Promise<void> {\n const oidcEndpoints = (await this.getOpenIDProviderEndpoints()) as OIDCEndpoints;\n const sm = this.getStorageManager();\n const config = await (sm as any).getConfigData();\n\n this._authHelper!.initializeSessionManger(\n config,\n oidcEndpoints,\n async () => (await (sm as any).getSessionData())?.session_state ?? '',\n async (params?: any): Promise<string> => this.getSignInUrl(params),\n this._sessionManagementHelper!,\n );\n }\n\n private async _shouldStopAuthn(): Promise<boolean> {\n const sm = this.getStorageManager();\n\n return this._sessionManagementHelper!.receivePromptNoneResponse(async (sessionState: string | null) => {\n await (sm as any).setSessionDataParameter(\n OIDCRequestConstants.Params.SESSION_STATE as keyof SessionData,\n sessionState ?? '',\n );\n });\n }\n\n private _enableRetrievingSignOutURLFromSession(config: SPATokenExchangeConfig): void {\n if (config.preventSignOutURLUpdate) {\n this._getSignOutURLFromSessionStorage = true;\n }\n }\n\n private async _constructSilentSignInUrl(additionalParams: Record<string, string | boolean> = {}): Promise<string> {\n const sm = this.getStorageManager();\n const config = await (sm as any).getConfigData();\n\n const urlString: string = await this.getSignInUrl({\n prompt: 'none',\n state: SILENT_SIGN_IN_STATE,\n ...additionalParams,\n } as any);\n\n const urlObject = new URL(urlString);\n urlObject.searchParams.set('response_mode', 'query');\n\n if (this._storage === BrowserStorage.BrowserMemory && config.enablePKCE) {\n const state = urlObject.searchParams.get(OIDCRequestConstants.Params.STATE);\n SPAUtils.setPKCE(extractPkceStorageKeyFromState(state ?? ''), await this.getPKCECode(state ?? ''));\n }\n\n return urlObject.toString();\n }\n\n public override getInstanceId(): number {\n return this._browserInstanceId;\n }\n\n public static async clearSession(): Promise<void> {\n // Static clear: no-op at base level; session data is cleared by instance signOut\n }\n}\n\nexport default ThunderIDBrowserClient;\n","/**\n * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\n/**\n * Event hook names for attaching callbacks via `ThunderIDBrowserClient.on()`.\n */\nexport enum Hooks {\n SignIn = 'sign-in',\n SignOut = 'sign-out',\n Initialize = 'initialize',\n HttpRequestStart = 'http-request-start',\n HttpRequestFinish = 'http-request-finish',\n HttpRequestError = 'http-request-error',\n HttpRequestSuccess = 'http-request-success',\n RevokeAccessToken = 'revoke-access-token',\n CustomGrant = 'custom-grant',\n SignOutFailed = 'sign-out-failed',\n}\n\nexport default Hooks;\n","/**\n * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\n/**\n * Utility to check if `code` and `session_state` are available in the URL as search params.\n *\n * @param params - The URL search params to check. Defaults to `window.location.search`.\n * @return `true` if the URL contains `code` and `session_state` search params, otherwise `false`.\n */\nconst hasAuthParamsInUrl = (params: string = window.location.search): boolean => {\n const MATCHER = /[?&]code=[^&]+/;\n\n return MATCHER.test(params);\n};\n\nexport default hasAuthParamsInUrl;\n","/**\n * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\n/**\n * Utility to check if `state` is available in the URL as a search param and matches the provided instance.\n *\n * @param params - The URL search params to check. Defaults to `window.location.search`.\n * @param instanceId - The instance ID to match against the `state` param.\n * @return `true` if the URL contains a matching `state` search param, otherwise `false`.\n */\nconst hasCalledForThisInstanceInUrl = (instanceId: number, params: string = window.location.search): boolean => {\n const MATCHER = new RegExp(`[?&]state=instance_${instanceId}_[^&]+`);\n\n return MATCHER.test(params);\n};\n\nexport default hasCalledForThisInstanceInUrl;\n","/**\n * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport ThunderIDBrowserClient from '../ThunderIDBrowserClient';\n\n/**\n * Creates an HTTP utility for making authenticated requests using a `ThunderIDBrowserClient` instance.\n *\n * @param client - The browser client instance to use for requests.\n * @returns An object with `request` and `requestAll` methods bound to the provided client.\n *\n * @example\n * ```typescript\n * const auth = new ThunderIDBrowserClient();\n * await auth.initialize(config);\n * const httpClient = http(auth);\n * const response = await httpClient.request({ url: '/api/data', method: 'GET' });\n * ```\n */\nconst http = (\n client: ThunderIDBrowserClient,\n): {\n request: typeof ThunderIDBrowserClient.prototype.httpRequest;\n requestAll: typeof ThunderIDBrowserClient.prototype.httpRequestAll;\n} => {\n return {\n request: client.httpRequest.bind(client),\n requestAll: client.httpRequestAll.bind(client),\n };\n};\n\nexport default http;\n","/**\n * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport {\n arrayBufferToBase64url,\n base64urlToArrayBuffer,\n ThunderIDRuntimeError,\n createPackageComponentLogger,\n} from '@thunderid/javascript';\n\nconst logger: ReturnType<typeof createPackageComponentLogger> = createPackageComponentLogger(\n '@thunderid/browser',\n 'WebAuthn',\n);\n\n/**\n * Handles WebAuthn/Passkey authentication flow for browser environments.\n *\n * This function processes a WebAuthn challenge, performs the authentication ceremony,\n * and returns the authentication response that can be sent to the server for verification.\n *\n * The function handles various aspects of WebAuthn authentication including:\n * - Browser compatibility checks for WebAuthn support\n * - HTTPS requirement validation (except for localhost development)\n * - Relying Party ID validation and domain compatibility\n * - Challenge data decoding and credential request options processing\n * - User authentication ceremony via navigator.credentials.get()\n * - Response formatting for server consumption\n *\n * @param challengeData - Base64-encoded challenge data containing WebAuthn request options.\n * This data typically includes the challenge, RP ID, allowed credentials,\n * user verification requirements, and other authentication parameters.\n *\n * @returns Promise that resolves to a JSON string containing the WebAuthn authentication response.\n * The response includes the credential ID, authenticator data, client data JSON,\n * signature, and optional user handle that can be verified by the server.\n *\n * @throws {ThunderIDRuntimeError} When WebAuthn is not supported in the current browser\n * @throws {ThunderIDRuntimeError} When the page is not served over HTTPS (except localhost)\n * @throws {ThunderIDRuntimeError} When the user cancels or times out the authentication\n * @throws {ThunderIDRuntimeError} When there's a domain/RP ID mismatch\n * @throws {ThunderIDRuntimeError} When no valid passkey is found for the account\n * @throws {ThunderIDRuntimeError} When WebAuthn is not supported on the device/browser\n * @throws {ThunderIDRuntimeError} When there's a network error during authentication\n * @throws {ThunderIDRuntimeError} For any other authentication failures\n *\n * @example\n * ```typescript\n * try {\n * const challengeData = 'eyJwdWJsaWNLZXlDcmVkZW50aWFsUmVxdWVzdE9wdGlvbnMiOi4uLn0=';\n * const authResponse = await handleWebAuthnAuthentication(challengeData);\n *\n * // Send the response to your server for verification\n * const result = await fetch('/api/verify-webauthn', {\n * method: 'POST',\n * headers: { 'Content-Type': 'application/json' },\n * body: authResponse\n * });\n * } catch (error) {\n * if (error instanceof ThunderIDRuntimeError) {\n * console.error('WebAuthn authentication failed:', error.message);\n * }\n * }\n * ```\n *\n * @example\n * ```typescript\n * // Usage in an authentication flow\n * const authenticateWithPasskey = async (challengeFromServer: string) => {\n * try {\n * const response = await handleWebAuthnAuthentication(challengeFromServer);\n * return JSON.parse(response);\n * } catch (error) {\n * // Handle specific error cases\n * if (error instanceof ThunderIDRuntimeError) {\n * switch (error.code) {\n * case 'browser-webauthn-not-supported':\n * showFallbackAuth();\n * break;\n * case 'browser-webauthn-user-cancelled':\n * showRetryOption();\n * break;\n * default:\n * showGenericError();\n * }\n * }\n * }\n * };\n * ```\n *\n * @see {@link https://webauthn.guide/} - WebAuthn specification guide\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Web_Authentication_API} - MDN WebAuthn API documentation\n */\nconst handleWebAuthnAuthentication = async (challengeData: string): Promise<string> => {\n if (!window.navigator.credentials?.get) {\n throw new ThunderIDRuntimeError(\n 'WebAuthn is not supported in this browser. Please use a modern browser or try a different authentication method.',\n 'browser-webauthn-not-supported',\n 'browser',\n 'WebAuthn/Passkey authentication requires a browser that supports the Web Authentication API.',\n );\n }\n\n if (window.location.protocol !== 'https:' && window.location.hostname !== 'localhost') {\n throw new ThunderIDRuntimeError(\n 'Passkey authentication requires a secure connection (HTTPS). Please ensure you are accessing this site over HTTPS.',\n 'browser-webauthn-insecure-connection',\n 'browser',\n 'WebAuthn authentication requires HTTPS for security reasons, except when running on localhost for development.',\n );\n }\n\n try {\n const decodedChallenge: any = JSON.parse(atob(challengeData));\n const {publicKeyCredentialRequestOptions} = decodedChallenge;\n\n const currentDomain: string = window.location.hostname;\n const challengeRpId: string = publicKeyCredentialRequestOptions.rpId;\n\n let rpIdToUse: string = challengeRpId;\n\n if (challengeRpId && !currentDomain.endsWith(challengeRpId) && challengeRpId !== currentDomain) {\n logger.warn(`RP ID mismatch detected. Challenge RP ID: ${challengeRpId}, Current domain: ${currentDomain}`);\n rpIdToUse = currentDomain;\n }\n\n const adjustedOptions: any = {\n ...publicKeyCredentialRequestOptions,\n challenge: base64urlToArrayBuffer(publicKeyCredentialRequestOptions.challenge),\n rpId: rpIdToUse,\n ...(publicKeyCredentialRequestOptions.userVerification && {\n userVerification: publicKeyCredentialRequestOptions.userVerification,\n }),\n ...(publicKeyCredentialRequestOptions.allowCredentials && {\n allowCredentials: publicKeyCredentialRequestOptions.allowCredentials.map((cred: any) => ({\n ...cred,\n id: base64urlToArrayBuffer(cred.id),\n })),\n }),\n };\n\n const credential: PublicKeyCredential = (await navigator.credentials.get({\n publicKey: adjustedOptions,\n })) as PublicKeyCredential;\n\n if (!credential) {\n throw new ThunderIDRuntimeError(\n 'No credential returned from WebAuthn authentication',\n 'browser-webauthn-no-credential',\n 'browser',\n 'The WebAuthn authentication ceremony completed but did not return a valid credential.',\n );\n }\n\n const authData: AuthenticatorAssertionResponse = credential.response as AuthenticatorAssertionResponse;\n\n const tokenResponse: {credential: any; requestId: string} = {\n credential: {\n id: credential.id,\n rawId: arrayBufferToBase64url(credential.rawId),\n response: {\n authenticatorData: arrayBufferToBase64url(authData.authenticatorData),\n clientDataJSON: arrayBufferToBase64url(authData.clientDataJSON),\n signature: arrayBufferToBase64url(authData.signature),\n ...(authData.userHandle && {\n userHandle: arrayBufferToBase64url(authData.userHandle),\n }),\n },\n type: credential.type,\n },\n requestId: decodedChallenge.requestId,\n };\n\n return JSON.stringify(tokenResponse);\n } catch (error) {\n logger.error('WebAuthn authentication failed:');\n\n if (error instanceof ThunderIDRuntimeError) {\n throw error;\n }\n\n if (error instanceof Error) {\n switch (error.name) {\n case 'NotAllowedError':\n throw new ThunderIDRuntimeError(\n 'Passkey authentication was cancelled or timed out. Please try again.',\n 'browser-webauthn-user-cancelled',\n 'browser',\n 'The user cancelled the WebAuthn authentication request or the request timed out.',\n );\n\n case 'SecurityError':\n if (error.message.includes('relying party ID') || error.message.includes('RP ID')) {\n throw new ThunderIDRuntimeError(\n 'Domain mismatch error. The passkey was registered for a different domain. Please contact support or try a different authentication method.',\n 'browser-webauthn-domain-mismatch',\n 'browser',\n 'The WebAuthn relying party ID does not match the current domain.',\n );\n }\n throw new ThunderIDRuntimeError(\n 'Passkey authentication failed due to a security error. Please ensure you are using HTTPS and that your browser supports passkeys.',\n 'browser-webauthn-security-error',\n 'browser',\n 'A security error occurred during WebAuthn authentication.',\n );\n\n case 'InvalidStateError':\n throw new ThunderIDRuntimeError(\n 'No valid passkey found for this account. Please register a passkey first or use a different authentication method.',\n 'browser-webauthn-no-passkey',\n 'browser',\n 'No registered passkey credentials were found for the current user account.',\n );\n\n case 'NotSupportedError':\n throw new ThunderIDRuntimeError(\n 'Passkey authentication is not supported on this device or browser. Please use a different authentication method.',\n 'browser-webauthn-not-supported',\n 'browser',\n 'WebAuthn is not supported on the current device or browser configuration.',\n );\n\n case 'NetworkError':\n throw new ThunderIDRuntimeError(\n 'Network error during passkey authentication. Please check your connection and try again.',\n 'browser-webauthn-network-error',\n 'browser',\n 'A network error occurred while communicating with the authenticator.',\n );\n\n case 'UnknownError':\n throw new ThunderIDRuntimeError(\n 'An unknown error occurred during passkey authentication. Please try again or use a different authentication method.',\n 'browser-webauthn-unknown-error',\n 'browser',\n 'An unidentified error occurred during the WebAuthn authentication process.',\n );\n\n default:\n throw new ThunderIDRuntimeError(\n `Passkey authentication failed: ${error.message}`,\n 'browser-webauthn-general-error',\n 'browser',\n `WebAuthn authentication failed with error: ${error.name}`,\n );\n }\n }\n\n throw new ThunderIDRuntimeError(\n 'Passkey authentication failed due to an unexpected error.',\n 'browser-webauthn-unexpected-error',\n 'browser',\n 'An unexpected error occurred during WebAuthn authentication.',\n );\n }\n};\n\nexport default handleWebAuthnAuthentication;\n","/**\n * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport {extractEmojiFromUri, isEmojiUri} from '@thunderid/javascript';\n\n/**\n * Resolves `emoji:` URIs in an HTML string.\n *\n * Handles two forms:\n * - `<img src=\"emoji:🐯\" alt=\"tiger\">` → `<span role=\"img\" aria-label=\"tiger\">🐯</span>`\n * - Bare `emoji:🐯` text references → `🐯`\n *\n * @param html - The HTML string that may contain `emoji:` URIs.\n * @returns The HTML string with all `emoji:` URIs replaced.\n */\nconst resolveEmojiUrisInHtml = (html: string): string => {\n const withEmojiImages: string = html.replace(\n /<img([^>]*)src=\"(emoji:[^\"]+)\"([^>]*)\\/?>/gi,\n (_match: string, pre: string, src: string, post: string): string => {\n const emoji: string = extractEmojiFromUri(src);\n if (!emoji) {\n return _match;\n }\n const altMatch: RegExpMatchArray | null = /alt=\"([^\"]*)\"/i.exec(pre + post);\n const label: string = altMatch ? altMatch[1] : emoji;\n return `<span role=\"img\" aria-label=\"${label}\">${emoji}</span>`;\n },\n );\n return withEmojiImages.replace(/emoji:([^\\s\"<>&]+)/g, (_: string, rest: string): string =>\n isEmojiUri(`emoji:${rest}`) ? rest : `emoji:${rest}`,\n );\n};\n\nexport default resolveEmojiUrisInHtml;\n","/**\n * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport {ThemeDetection, ThemeMode, createPackageComponentLogger} from '@thunderid/javascript';\n\nconst logger: ReturnType<typeof createPackageComponentLogger> = createPackageComponentLogger(\n '@thunderid/browser',\n 'ThemeDetection',\n);\n\n/**\n * Extended theme detection config that includes DOM-specific options\n */\nexport interface BrowserThemeDetection extends ThemeDetection {\n /**\n * The element to observe for class changes\n * @default document.documentElement (html element)\n */\n targetElement?: HTMLElement;\n}\n\n/**\n * Detects the current theme mode based on the specified method\n */\nexport const detectThemeMode = (mode: ThemeMode, config: BrowserThemeDetection = {}): 'light' | 'dark' => {\n const {\n darkClass = 'dark',\n lightClass = 'light',\n targetElement = typeof document !== 'undefined' ? document.documentElement : null,\n } = config;\n\n if (mode === 'light') return 'light';\n if (mode === 'dark') return 'dark';\n\n if (mode === 'system') {\n if (typeof window !== 'undefined' && window.matchMedia) {\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }\n return 'light';\n }\n\n if (mode === 'class') {\n if (!targetElement) {\n logger.warn('ThemeDetection: targetElement is required for class-based detection, falling back to light mode');\n return 'light';\n }\n\n const {classList} = targetElement;\n\n // Check for explicit dark class first\n if (classList.contains(darkClass)) {\n return 'dark';\n }\n\n // Check for explicit light class\n if (classList.contains(lightClass)) {\n return 'light';\n }\n\n // If neither class is present, default to light\n return 'light';\n }\n\n return 'light';\n};\n\n/**\n * Creates a MutationObserver to watch for class changes on the target element\n */\nexport const createClassObserver = (\n targetElement: HTMLElement,\n callback: (isDark: boolean) => void,\n config: BrowserThemeDetection = {},\n): MutationObserver => {\n const {darkClass = 'dark', lightClass = 'light'} = config;\n\n const observer: MutationObserver = new MutationObserver((mutations: MutationRecord[]) => {\n mutations.forEach((mutation: MutationRecord) => {\n if (mutation.type === 'attributes' && mutation.attributeName === 'class') {\n const {classList} = targetElement;\n\n if (classList.contains(darkClass)) {\n callback(true);\n } else if (classList.contains(lightClass)) {\n callback(false);\n }\n // If neither class is present, we don't trigger the callback\n // to avoid unnecessary re-renders\n }\n });\n });\n\n observer.observe(targetElement, {\n attributeFilter: ['class'],\n attributes: true,\n });\n\n return observer;\n};\n\n/**\n * Creates a media query listener for system theme changes\n */\nexport const createMediaQueryListener = (callback: (isDark: boolean) => void): MediaQueryList | null => {\n if (typeof window === 'undefined' || !window.matchMedia) {\n return null;\n }\n\n const mediaQuery: MediaQueryList = window.matchMedia('(prefers-color-scheme: dark)');\n\n const handleChange = (e: MediaQueryListEvent): void => {\n callback(e.matches);\n };\n\n // Modern browsers\n if (mediaQuery.addEventListener) {\n mediaQuery.addEventListener('change', handleChange);\n } else {\n // Fallback for older browsers\n mediaQuery.addListener(handleChange);\n }\n\n return mediaQuery;\n};\n","/**\n * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport {DEFAULT_THEME, ThemeMode} from '@thunderid/javascript';\nimport {BrowserThemeDetection, detectThemeMode} from './themeDetection';\n\n/**\n * Gets the active theme based on the theme mode preference\n * @param mode - The theme mode preference ('light', 'dark', 'system', or 'class')\n * @param config - Additional configuration for theme detection\n * @returns 'light' or 'dark' based on the resolved theme\n */\nconst getActiveTheme = (mode: ThemeMode, config: BrowserThemeDetection = {}): ThemeMode => {\n if (mode === 'dark') {\n return 'dark';\n }\n\n if (mode === 'light') {\n return 'light';\n }\n\n if (mode === 'system') {\n if (typeof window !== 'undefined' && window.matchMedia) {\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }\n\n // Default to light mode if system detection is not available\n return DEFAULT_THEME;\n }\n\n if (mode === 'class') {\n return detectThemeMode(mode, config);\n }\n\n // Default to light mode for any unknown mode\n return DEFAULT_THEME;\n};\n\nexport default getActiveTheme;\n"],"x_google_ignoreList":[10,11,12,13,14],"mappings":"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"}