@thunderid/browser 1.14.1 → 1.16.0

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.cjs","names":["endpoints: ResolvedBackendEndpoints","response: Response","timer: ReturnType<typeof setInterval> | undefined","ThunderIDAuthException","origin: string","absoluteProxy: string","proxyPath: string | undefined","session: BackendSession","HttpClient","url: string","qs: string","headers: Record<string, string>","body: BodyInit | undefined","fetchResponse: Response","networkError: any","isAbort: boolean","responseData: T","responseHeaders: Record<string, string>","code","FetchHttpClient","backend: BackendClient","getAccessToken: (renew: boolean) => Promise<string>","proxyUrl: string | undefined","BackendClient","OIDCRequestConstants","url: URL","error: string | null","description: string | null","urlObject: URL","RETRY_SAFE_HTTP_METHODS: string[]","ThunderIDAuthException","refreshTokenError: Message<string>","SPAUtils","error: any","refreshAccessTokenResponse: User","refreshError: any","error","requests: Promise<HttpResponse<any>>[]","url: string","silentSignInIFrame: HTMLIFrameElement","data: Message<AuthorizationInfo | null>","url: URL","state: string | null","code: string | null","message: Message<AuthorizationInfo | null>","code","httpClient: FetchHttpClient","FetchHttpClient","response: HttpResponse<any>","httpError: HttpError","targetUrl: URL","byteLength","len","i","i","Buffer","i","len","byteLength","code","Buffer","bytes: Uint8Array","jwtVerifyOptions: JWTVerifyOptions","ThunderIDAuthException","TokenConstants","refreshTimer: number","INTERACTION_ERRORS: string[]","UNUSABLE_DEVICE_SECRET_ERRORS: string[]","logger","BrowserStorage","LocalStore","MemoryStore","SessionStore","ThunderIDJavaScriptClient","SPACryptoUtils","store: Storage","SPAHelper","backendEndpoints: ResolvedBackendEndpoints | undefined","BackendClient","Hooks","BackendHttpClient","FetchHttpClient","AuthenticationHelper","ThunderIDAuthException","backendOuId: unknown","SPAUtils","switchedUser: User | undefined","resolvedAuthorizationCode: string","resolvedState: string","resolvedTokenRequestConfig: {params: Record<string, unknown>}","OIDCRequestConstants","silentUser: User | boolean","pkceKey: string","ThunderIDAPIError","OrganizationUnitSwitchErrorCodes","sm: StorageManager<T>","config: AuthClientConfig<T>","exchangedUser: User | false | undefined","silentError: string | undefined","code","url: string","result: DeviceSecretSwitchResult | undefined","user: User","code: string","serverCode: string","response: EmbeddedSignInFlowResponse","sessionData: EmbeddedFlowSessionData[]","EmbeddedFlowType","serverCode: string | undefined","EmbeddedSignInFlowStatus","claims: Record<string, unknown>","iat: number | undefined","exp: number | undefined","url: URL","code: string | null","state: string | null","error: string | null","afterSignOut: ((url: string) => void) | undefined","sessionId: string | undefined","backendSignOutUrl: string","response: HttpResponse","responses: HttpResponse[] | undefined","profile: User","createHttpClientFetcher","session: Partial<SessionData> | undefined","expiresAt: number","TokenConstants","timer: number","callbacks: Set<HookCallback>","urlString: string","textArea: HTMLTextAreaElement","stored: string | null","parsed: unknown","key: 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","DEFAULT_PARAMS: AvatarParams","isAvatarUri","raw: string","params: Record<string, string>","shape: AvatarShape","variant: AvatarVariant","colors: number","ANONYMOUS_ANIMAL_ICONS: Record<string, AnonymousAnimalIcon>","ANONYMOUS_ENTITY_ICONS: Record<string, AnonymousEntityIcon>","i","ANONYMOUS_AVATAR_NAMES: string[]","hashStr","ANONYMOUS_ENTITY_NAMES: string[]","hashStr","AVATAR_PALETTES: [string, string][]","AVATAR_GRADIENT_COUNT: number","XML_ESCAPES: Record<string, string>","pickAnonymousAvatarName","pickAnonymousEntityName","letterCount: 1 | 2","background: string","h: number","hashStr","initials: string","color: string","markup: string","isAvatarUri","params: AvatarParams","extractAvatarParamsFromUri","content: string","generateAvatarDataUri","logger: ReturnType<typeof createPackageComponentLogger>","observer: MutationObserver","mediaQuery: MediaQueryList","DEFAULT_THEME","trimmed: string","radiusStr: string"],"sources":["../../src/BackendClient.ts","../../src/FetchHttpClient.ts","../../src/BackendHttpClient.ts","../../src/constants/Hooks.ts","../../src/constants/SPAConstants.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/createHttpClientFetcher.ts","../../src/utils/navigate.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","../../src/utils/SPACryptoUtils.ts","../../src/utils/SPAHelper.ts","../../src/ThunderIDBrowserClient.ts","../../src/utils/hasAuthParamsInUrl.ts","../../src/utils/hasCalledForThisInstanceInUrl.ts","../../src/utils/http.ts","../../src/utils/copyTextToClipboard.ts","../../src/utils/currentProjectStorage.ts","../../src/utils/handleWebAuthnAuthentication.ts","../../src/utils/resolveEmojiUrisInHtml.ts","../../src/utils/isAvatarUri.ts","../../src/utils/extractAvatarParamsFromUri.ts","../../src/utils/buildAvatarSpec.ts","../../src/utils/anonymousAnimalIcons.generated.ts","../../src/utils/anonymousEntityIcons.generated.ts","../../src/utils/hashStr.ts","../../src/utils/pickAnonymousAvatarName.ts","../../src/utils/pickAnonymousEntityName.ts","../../src/utils/generateAvatarDataUri.ts","../../src/utils/resolveLogoUri.ts","../../src/theme/themeDetection.ts","../../src/theme/getActiveTheme.ts","../../src/theme/normalizeBorderRadius.ts"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {BackendSession, ResolvedBackendEndpoints, SessionData, ThunderIDAuthException} from '@thunderid/javascript';\n\n/**\n * Header every backend request carries. A cross-origin page cannot set it without a CORS preflight,\n * which the backend never answers, so it keeps the cookie from being used cross-site.\n */\nexport const BACKEND_REQUEST_HEADER = 'X-Requested-With';\n\nconst BACKEND_REQUEST_HEADER_VALUE = 'XMLHttpRequest';\n\n/** A check on focus is skipped when the last one is more recent than this, in milliseconds. */\nconst FOCUS_CHECK_THROTTLE = 5000;\n\n/**\n * Talks to the app's backend when sign-in runs there: reads the session, refreshes it, and starts and ends it. The\n * browser never holds a token; the backend keeps them behind an `HttpOnly` cookie.\n */\nclass BackendClient {\n private session: Promise<BackendSession> | undefined;\n\n private refreshing: Promise<boolean> | undefined;\n\n private hasLoadedSession = false;\n\n /** Whether the session last seen was signed in, so a later read can tell it has ended. */\n private wasSignedIn = false;\n\n private lastCheck = 0;\n\n private readonly signedOutListeners: (() => void)[] = [];\n\n constructor(private readonly endpoints: ResolvedBackendEndpoints) {}\n\n /**\n * Calls the listener when a signed-in session turns out to have ended without this client signing\n * out: another app signed the user out, an administrator ended the session, or it timed out.\n */\n onSignedOut(listener: () => void): void {\n this.signedOutListeners.push(listener);\n }\n\n /**\n * Records that the session has ended, and tells the listeners when it had been signed in.\n */\n markSignedOut(): void {\n this.session = Promise.resolve({isSignedIn: false});\n this.hasLoadedSession = true;\n\n if (this.wasSignedIn) {\n this.wasSignedIn = false;\n this.signedOutListeners.forEach((listener: () => void) => listener());\n }\n }\n\n /**\n * Asks the backend whether the session is still live. The check neither refreshes the session nor\n * counts as activity, so it can be polled without keeping an idle session alive.\n *\n * @returns Whether the session is live. A failed check reports the last known state.\n */\n async checkSession(): Promise<boolean> {\n this.lastCheck = Date.now();\n\n try {\n const response: Response = await this.send(this.endpoints.checkSession, 'GET');\n if (!response.ok) {\n return this.wasSignedIn;\n }\n const {isSignedIn} = (await response.json()) as {isSignedIn: boolean};\n if (!isSignedIn) {\n this.markSignedOut();\n }\n\n return isSignedIn;\n } catch {\n return this.wasSignedIn;\n }\n }\n\n /**\n * Watches for the session ending while the page is open: checks it whenever the page gets focus or\n * becomes visible again, and every `pollSeconds` while it is visible when that is positive.\n *\n * @returns A function that stops watching.\n */\n watch(pollSeconds: number): () => void {\n const checkIfSignedIn = (): void => {\n if (this.wasSignedIn && document.visibilityState === 'visible') {\n void this.checkSession();\n }\n };\n const onFocus = (): void => {\n if (Date.now() - this.lastCheck >= FOCUS_CHECK_THROTTLE) {\n checkIfSignedIn();\n }\n };\n\n document.addEventListener('visibilitychange', onFocus);\n window.addEventListener('focus', onFocus);\n const timer: ReturnType<typeof setInterval> | undefined =\n pollSeconds > 0 ? setInterval(checkIfSignedIn, pollSeconds * 1000) : undefined;\n\n return (): void => {\n document.removeEventListener('visibilitychange', onFocus);\n window.removeEventListener('focus', onFocus);\n if (timer) {\n clearInterval(timer);\n }\n };\n }\n\n /**\n * Returns the session. The result is cached until a sign-in, sign-out, or refresh changes it, so\n * repeated sign-in checks do not reach the server each time.\n *\n * @param reload - Read the session from the server even when one is cached.\n */\n getSession(reload = false): Promise<BackendSession> {\n if (reload) {\n this.session = undefined;\n }\n\n this.session ??= this.loadSession()\n .catch((error: unknown) => {\n this.session = undefined;\n throw error;\n })\n .finally(() => {\n this.hasLoadedSession = true;\n });\n\n return this.session;\n }\n\n /**\n * Whether this client talks to exactly these endpoints.\n */\n hasEndpoints(endpoints: ResolvedBackendEndpoints): boolean {\n return (Object.keys(endpoints) as (keyof ResolvedBackendEndpoints)[]).every(\n (key: keyof ResolvedBackendEndpoints) =>\n key === 'bypass'\n ? JSON.stringify(this.endpoints.bypass) === JSON.stringify(endpoints.bypass)\n : this.endpoints[key] === endpoints[key],\n );\n }\n\n /**\n * Whether the first session read is still in flight, so it is not yet known whether the user is\n * signed in.\n */\n isLoading(): boolean {\n return !this.hasLoadedSession;\n }\n\n /**\n * Refreshes the session once, sharing one request between concurrent callers.\n *\n * @returns Whether the session was refreshed. When it was not, the session is now signed out.\n */\n refresh(): Promise<boolean> {\n this.refreshing ??= this.send(this.endpoints.refresh, 'POST')\n .then((response: Response) => {\n if (response.ok) {\n this.session = undefined;\n } else {\n this.markSignedOut();\n }\n\n return response.ok;\n })\n .finally(() => {\n this.refreshing = undefined;\n });\n\n return this.refreshing;\n }\n\n /**\n * The URL that starts sign-in at the backend and comes back to `returnTo`. With `ouId`, the backend\n * bounds the sign-in to that organization unit.\n */\n getSignInUrl(returnTo: string, ouId?: string): string {\n return `${this.endpoints.signIn}?${new URLSearchParams({returnTo, ...(ouId ? {ouId} : {})}).toString()}`;\n }\n\n /**\n * Ends the backend session.\n *\n * @returns The URL the browser visits to end the session at the authorization server.\n */\n async signOut(): Promise<string> {\n const response: Response = await this.send(this.endpoints.signOut, 'POST');\n // Signing out here is not news to anyone, so the listeners are not told.\n this.wasSignedIn = false;\n this.session = Promise.resolve({isSignedIn: false});\n\n if (!response.ok) {\n throw new ThunderIDAuthException(\n 'SPA-BACKEND_CLIENT-SO-SE01',\n 'Sign out failed.',\n `The backend sign-out endpoint returned ${response.status}.`,\n );\n }\n\n return ((await response.json()) as {redirectUrl: string}).redirectUrl;\n }\n\n /**\n * Maps an API URL to its backend proxy URL. A URL already on the proxy is sent as it is, and any\n * other path (`/users`) goes under the proxy. The backend, not the app, knows the API's address.\n *\n * @returns The proxy URL, or `undefined` for an absolute URL that isn't on the proxy and so cannot\n * be sent with the session's credentials.\n */\n toProxyUrl(url: string): string | undefined {\n const {proxy} = this.endpoints;\n const origin: string = typeof window !== 'undefined' ? window.location.origin : '';\n const isPath = (value: string): boolean => value.startsWith('/') && !value.startsWith('//');\n const isUnder = (base: string): boolean => url === base || url.startsWith(`${base}/`) || url.startsWith(`${base}?`);\n // The proxy as a full URL and, when it's on this origin, as a path too.\n const absoluteProxy: string = isPath(proxy) ? `${origin}${proxy}` : proxy;\n const proxyPath: string | undefined = absoluteProxy.startsWith(`${origin}/`)\n ? absoluteProxy.slice(origin.length)\n : undefined;\n\n if (isUnder(proxy) || isUnder(absoluteProxy) || (proxyPath !== undefined && isUnder(proxyPath))) {\n return url;\n }\n\n return isPath(url) ? `${proxy}${url}` : undefined;\n }\n\n /**\n * Whether a request to this URL skips the proxy and goes straight from the browser.\n */\n isBypassed(url: string): boolean {\n return this.endpoints.bypass.urls.some(\n (base: string) => url === base || url.startsWith(`${base}/`) || url.startsWith(`${base}?`),\n );\n }\n\n /**\n * Whether requests that skip the proxy carry the access token.\n */\n attachesTokenOnBypass(): boolean {\n return this.endpoints.bypass.attachToken;\n }\n\n /**\n * Gets an access token for the requests that skip the proxy from the backend's token endpoint. It comes without a\n * refresh token: when it expires, the caller asks again.\n *\n * @returns The token response, as the backend sent it.\n */\n async requestAccessToken(): Promise<Partial<SessionData>> {\n let response: Response = await this.send(this.endpoints.token, 'POST');\n\n if (response.status === 401) {\n const {error} = (await response.json().catch(() => ({}))) as {error?: string};\n if (error === 'session_expired' && (await this.refresh())) {\n response = await this.send(this.endpoints.token, 'POST');\n } else if (error === 'login_required') {\n this.markSignedOut();\n }\n }\n\n if (!response.ok) {\n throw new ThunderIDAuthException(\n 'SPA-BACKEND_CLIENT-RAT-SE01',\n 'Failed to get an access token.',\n `The backend token endpoint returned ${response.status}.`,\n );\n }\n\n return (await response.json()) as Partial<SessionData>;\n }\n\n /**\n * The headers and credentials mode every backend request is sent with. The cookies go with every\n * request, so a backend on another origin works too when its CORS allows credentials.\n */\n static requestInit(headers: Record<string, string> = {}): Pick<RequestInit, 'credentials'> & {\n headers: Record<string, string>;\n } {\n return {credentials: 'include', headers: {...headers, [BACKEND_REQUEST_HEADER]: BACKEND_REQUEST_HEADER_VALUE}};\n }\n\n private async loadSession(): Promise<BackendSession> {\n let response: Response = await this.send(this.endpoints.session, 'GET');\n\n if (response.status === 401 && (await this.refresh())) {\n response = await this.send(this.endpoints.session, 'GET');\n }\n\n if (response.status === 401) {\n return this.signedOutSession();\n }\n\n if (!response.ok) {\n throw new ThunderIDAuthException(\n 'SPA-BACKEND_CLIENT-GS-SE01',\n 'Failed to read the session.',\n `The backend session endpoint returned ${response.status}.`,\n );\n }\n\n const session: BackendSession = (await response.json()) as BackendSession;\n if (!session.isSignedIn) {\n return this.signedOutSession();\n }\n this.wasSignedIn = true;\n\n return session;\n }\n\n private signedOutSession(): BackendSession {\n if (this.wasSignedIn) {\n // Defer, so the listeners see this read's result in the cache rather than racing it.\n queueMicrotask(() => this.markSignedOut());\n }\n\n return {isSignedIn: false};\n }\n\n private send(url: string, method: string): Promise<Response> {\n return fetch(url, {method, ...BackendClient.requestInit({Accept: 'application/json'})});\n }\n}\n\nexport default BackendClient;\n","// Copyright 2025 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\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 setInstance(instanceId: number, client: FetchHttpClient): void {\n this.instances.set(instanceId, client);\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 // A caller-aborted request rejects with an 'AbortError'; keep it distinguishable from a network failure.\n const isAbort: boolean = (networkError as Error | undefined)?.name === 'AbortError';\n throw Object.assign(new Error(networkError.message), {\n code: isAbort ? 'ABORT_ERROR' : 'NETWORK_ERROR',\n config,\n name: isAbort ? 'AbortError' : 'Error',\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","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {HttpError, HttpRequestConfig, HttpResponse} from '@thunderid/javascript';\nimport BackendClient from './BackendClient';\nimport FetchHttpClient from './FetchHttpClient';\n\n/**\n * The HTTP client used when sign-in runs on the backend. It sends each request through the backend's\n * API proxy with the session cookie instead of attaching a token, and refreshes the session once\n * when the backend reports\n * it expired. Requests under `bypass` go straight there with the cookies and, unless turned off, the\n * access token the backend issued.\n */\nconst hasBackendError = (error: HttpError | undefined, code: string): boolean =>\n error?.response?.status === 401 && (error.response.data as {error?: string} | undefined)?.error === code;\n\nconst isSessionExpired = (error: HttpError | undefined): boolean => hasBackendError(error, 'session_expired');\n\nclass BackendHttpClient extends FetchHttpClient {\n /**\n * @param backend - The backend client.\n * @param getAccessToken - Returns the access token for bypassed requests; `renew` asks for a new one.\n */\n constructor(\n private readonly backend: BackendClient,\n private readonly getAccessToken: (renew: boolean) => Promise<string>,\n ) {\n super(true);\n }\n\n protected override async transport<T = unknown>(config: HttpRequestConfig): Promise<HttpResponse<T>> {\n if (this.backend.isBypassed(config.url ?? '')) {\n return this.sendBypassed<T>(config);\n }\n\n const proxyUrl: string | undefined = this.backend.toProxyUrl(config.url ?? '');\n\n if (!proxyUrl) {\n throw Object.assign(new Error(`\"${config.url}\" is not under the backend API base, so it cannot be sent.`), {\n code: 'BACKEND_UNSUPPORTED_URL',\n config,\n } as Partial<HttpError>);\n }\n\n const send = (): Promise<HttpResponse<T>> =>\n super.transport<T>({\n ...config,\n ...BackendClient.requestInit(config.headers),\n url: proxyUrl,\n });\n\n try {\n return await send();\n } catch (error) {\n // Only the backend's own `session_expired` calls for a refresh. Any other 401 is the API's answer.\n if (isSessionExpired(error as HttpError) && (await this.backend.refresh())) {\n return send();\n }\n if (hasBackendError(error as HttpError, 'login_required')) {\n this.backend.markSignedOut();\n }\n\n throw error;\n }\n }\n\n /**\n * Sends a request straight to its URL, skipping the proxy, with the cookies and the access token.\n * When the API rejects the token, it gets a new one and retries once.\n */\n private async sendBypassed<T>(config: HttpRequestConfig): Promise<HttpResponse<T>> {\n if (!this.backend.attachesTokenOnBypass()) {\n return super.transport<T>({...config, credentials: 'include'});\n }\n\n const send = async (renew: boolean): Promise<HttpResponse<T>> =>\n super.transport<T>({\n ...config,\n credentials: 'include',\n headers: {\n ...config.headers,\n Authorization: `Bearer ${await this.getAccessToken(renew)}`,\n },\n });\n\n try {\n return await send(false);\n } catch (error) {\n if ((error as HttpError).response?.status === 401) {\n return send(true);\n }\n\n throw error;\n }\n }\n}\n\nexport default BackendHttpClient;\n","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\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","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\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 SILENT_SIGN_IN_STATE = 'sign-in-silently';\nexport const SILENT_SIGN_IN_TIMEOUT = 10000;\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 SILENT_SIGN_IN_SIGNED_IN = 'silent_sign_in_signed_in';\nexport const SILENT_SIGN_IN_SIGNED_OUT = 'silent_sign_in_signed_out';\n","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\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","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\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","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\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","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\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","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {OIDCRequestConstants} from '@thunderid/javascript';\nimport {ERROR, ERROR_DESCRIPTION, SILENT_SIGN_IN_STATE, STATE_QUERY} 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 * 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 * 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","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n AuthorizeRequestParamValue,\n ThunderIDAuthException,\n User,\n IsomorphicCrypto,\n StorageManager,\n IdToken,\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 CUSTOM_GRANT_CONFIG,\n ERROR,\n ERROR_DESCRIPTION,\n REFRESH_ACCESS_TOKEN_ERR0R,\n SILENT_SIGN_IN_SIGNED_IN,\n SILENT_SIGN_IN_SIGNED_OUT,\n SILENT_SIGN_IN_STATE,\n SILENT_SIGN_IN_TIMEOUT,\n STATE_QUERY,\n} from '../constants/SPAConstants';\nimport {SPATokenExchangeConfig} from '../models/TokenExchangeConfig';\n\ninterface AuthorizationInfo {\n /** The OAuth `error` the server answered a silent request with, when it issued no code. */\n error?: string;\n code: string;\n state: string;\n}\n\ninterface Message<T> {\n type: string;\n data?: T;\n}\n\n/** Methods that change nothing on the server, so sending one twice is harmless. */\nconst RETRY_SAFE_HTTP_METHODS: string[] = ['GET', 'HEAD', 'OPTIONS'];\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\n/**\n * Browser-level authentication helper that orchestrates HTTP requests with token attachment,\n * automatic token refresh, 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 * 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 /**\n * Whether a failed request should be sent again after a token refresh: any method on a 401, and\n * only a safe method when there is no response, since the server may have acted on it. A request the\n * caller aborted is never sent again.\n *\n * @param error - The error the request failed with.\n * @param requestConfig - The failed request's configuration.\n * @returns `true` if the request should be sent again after a token refresh.\n */\n private shouldRetryAfterRefresh(error: HttpError, requestConfig: HttpRequestConfig): boolean {\n if (error?.code === 'ABORT_ERROR' || error?.name === 'AbortError') {\n return false;\n }\n\n if (error?.response?.status === 401) {\n return true;\n }\n\n if (error?.response) {\n return false;\n }\n\n return RETRY_SAFE_HTTP_METHODS.includes((requestConfig?.method ?? 'GET').toUpperCase());\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 when `shouldRetryAfterRefresh` allows it.\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 (this.shouldRetryAfterRefresh(error, requestConfig)) {\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 by loading a `prompt=none` authorize request in a hidden iframe.\n *\n * @param constructSilentSignInUrl - Builds the prompt-none authorize URL.\n * @param requestAccessToken - Exchanges the returned code for tokens.\n * @param additionalParams - Extra authorize request params.\n * @param tokenRequestConfig - Additional params for the token request.\n * @param timeout - How long to wait for the iframe's response, in milliseconds.\n * @returns The user session, or `false` if the user is not signed in.\n */\n public async signInSilently(\n constructSilentSignInUrl: (additionalParams?: Record<string, AuthorizeRequestParamValue>) => Promise<string>,\n requestAccessToken: (\n authzCode: string,\n state: string,\n tokenRequestConfig?: {params: Record<string, unknown>},\n ) => Promise<User>,\n additionalParams?: Record<string, AuthorizeRequestParamValue>,\n tokenRequestConfig?: {params: Record<string, unknown>},\n timeout: number = SILENT_SIGN_IN_TIMEOUT,\n onSignedOut?: (error?: string) => void,\n ): Promise<User | boolean> {\n if (SPAUtils.isInitializedSilentSignIn()) {\n await this.handleSilentSignInResponse();\n\n return Promise.resolve({\n allowedScopes: '',\n displayName: '',\n email: '',\n sub: '',\n tenantDomain: '',\n username: '',\n });\n }\n\n let url: string;\n\n try {\n url = await constructSilentSignInUrl(additionalParams);\n } catch (error) {\n return Promise.reject(error);\n }\n\n const silentSignInIFrame: HTMLIFrameElement = document.createElement('iframe');\n silentSignInIFrame.style.display = 'none';\n\n return new Promise((resolve, reject) => {\n const cleanUp = (): void => {\n window.removeEventListener('message', listenToSilentSignInIFrame);\n clearTimeout(timer);\n silentSignInIFrame.remove();\n };\n\n const timer = setTimeout(() => {\n cleanUp();\n resolve(false);\n }, timeout);\n\n const listenToSilentSignInIFrame = async (e: MessageEvent): Promise<void> => {\n if (e.origin !== window.location.origin || e.source !== silentSignInIFrame.contentWindow) {\n return;\n }\n\n const data: Message<AuthorizationInfo | null> = e.data;\n\n if (data?.type === SILENT_SIGN_IN_SIGNED_OUT) {\n cleanUp();\n onSignedOut?.(typeof data?.data?.error === 'string' ? data.data.error : undefined);\n resolve(false);\n }\n\n if (data?.type === SILENT_SIGN_IN_SIGNED_IN && data?.data?.code) {\n const authInfo = data.data;\n\n cleanUp();\n requestAccessToken(authInfo.code, authInfo.state, tokenRequestConfig).then(resolve).catch(reject);\n }\n };\n\n window.addEventListener('message', listenToSilentSignInIFrame);\n\n silentSignInIFrame.src = url;\n document.body.appendChild(silentSignInIFrame);\n });\n }\n\n /**\n * Handles the page load inside the silent sign-in iframe: relays the authorization response to the\n * parent window and blanks the iframe.\n *\n * @returns `true` if the current page load was a silent sign-in response.\n */\n public async handleSilentSignInResponse(): Promise<boolean> {\n const url: URL = new URL(window.location.href);\n const state: string | null = url.searchParams.get(STATE_QUERY);\n\n if (state === null || !state.includes(SILENT_SIGN_IN_STATE)) {\n return false;\n }\n\n const code: string | null = url.searchParams.get('code');\n const message: Message<AuthorizationInfo | null> =\n code !== null && code.length !== 0\n ? {data: {code, state}, type: SILENT_SIGN_IN_SIGNED_IN}\n : {\n // Only the OAuth error code crosses to the parent, never its description.\n data: url.searchParams.get('error')\n ? {code: '', error: url.searchParams.get('error') ?? '', state}\n : undefined,\n type: SILENT_SIGN_IN_SIGNED_OUT,\n };\n\n window.parent.postMessage(message, window.location.origin);\n\n window.location.href = 'about:blank';\n\n await SPAUtils.waitTillPageRedirect();\n\n return true;\n }\n\n /**\n * Handles the early-return path of `signIn()` when a session already exists\n * or the page is handling a silent sign-in response.\n *\n * @returns The current user if already signed in, or `undefined` to continue normal sign-in.\n */\n public async handleSignIn(): Promise<User | undefined> {\n if (await this.handleSilentSignInResponse()) {\n return Promise.resolve({\n allowedScopes: '',\n displayName: '',\n email: '',\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 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","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {HttpError, HttpRequestConfig, HttpResponse} from '@thunderid/javascript';\nimport FetchHttpClient from '../FetchHttpClient';\n\n/**\n * Builds a `fetch`-shaped function backed by the shared `FetchHttpClient` singleton, for\n * framework wrappers (`@thunderid/react`, `@thunderid/vue`) that need to hand a core\n * `@thunderid/javascript` API function a `fetcher` carrying the access token automatically.\n *\n * Unlike a plain `fetch` call, `FetchHttpClient.request` throws on a non-2xx response instead\n * of resolving it. This adapter catches that and reconstructs a `Response`-shaped object from\n * the thrown error's `response`, so the core API function sees the real status and body instead\n * of treating every non-2xx result as a network failure. A genuine network error (no response\n * attached) still propagates.\n *\n * @param instanceId - Which `FetchHttpClient` instance to use, for multi-instance apps. Defaults to `0`.\n * @returns A function matching the `(url, config) => Promise<Response>` shape core API functions expect.\n * @example\n * ```typescript\n * await updateMeCredentials({\n * ...config,\n * fetcher: fetcher ?? createHttpClientFetcher(instanceId),\n * });\n * ```\n */\nconst createHttpClientFetcher = (instanceId = 0): ((url: string, config: RequestInit) => Promise<Response>) => {\n return async (url: string, config: RequestInit): Promise<Response> => {\n const httpClient: FetchHttpClient = FetchHttpClient.getInstance(instanceId);\n\n const toResponse = (data: unknown, status: number, statusText: string): Response =>\n ({\n json: () => Promise.resolve(data),\n ok: status >= 200 && status < 300,\n status,\n statusText,\n text: () => Promise.resolve(typeof data === 'string' ? data : JSON.stringify(data)),\n }) as Response;\n\n try {\n const response: HttpResponse<any> = await httpClient.request({\n data: config.body ? JSON.parse(config.body as string) : undefined,\n headers: config.headers as Record<string, string>,\n method: config.method || 'POST',\n signal: config.signal,\n url,\n } as HttpRequestConfig);\n\n return toResponse(response.data, response.status, response.statusText || '');\n } catch (error) {\n const httpError: HttpError = error as HttpError;\n if (httpError?.response) {\n return toResponse(httpError.response.data, httpError.response.status, httpError.response.statusText ?? '');\n }\n throw error;\n }\n };\n};\n\nexport default createHttpClientFetcher;\n","// Copyright 2025 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\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","'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","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\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';\n\n// `crypto.getRandomValues` throws once a single request exceeds this many bytes.\nconst MAX_RANDOM_VALUES_BYTES = 65_536;\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 const bytes: Uint8Array = new Uint8Array(length);\n\n for (let offset = 0; offset < length; offset += MAX_RANDOM_VALUES_BYTES) {\n crypto.getRandomValues(bytes.subarray(offset, offset + MAX_RANDOM_VALUES_BYTES));\n }\n\n return Buffer.from(bytes);\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","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\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","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n AuthorizeRequestParamValue,\n ThunderIDJavaScriptClient,\n ThunderIDAuthException,\n User,\n IsomorphicCrypto,\n IdToken,\n OIDCEndpoints,\n OIDCRequestConstants,\n SessionConfig,\n Storage,\n TokenResponse,\n extractPkceStorageKeyFromState,\n HttpError,\n HttpRequestConfig,\n HttpResponse,\n UserProfile,\n BackendEndpointConfig,\n ResolvedBackendEndpoints,\n SessionData,\n TokenConstants,\n createPackageComponentLogger,\n generateFlattenedUserProfile,\n getTokenPermissions,\n getUsersMe,\n resolveRequestBaseUrl,\n resolveBackendEndpoints,\n resolveResourceEndpoint,\n AuthClientConfig,\n StorageManager,\n DeviceSecretSwitchResult,\n EmbeddedFlowSessionData,\n EmbeddedFlowType,\n EmbeddedSignInFlowResponse,\n EmbeddedSignInFlowStatus,\n OrganizationUnitSwitchErrorCodes,\n SwitchOrganizationUnitOptions,\n ThunderIDAPIError,\n executeEmbeddedSignInFlow,\n} from '@thunderid/javascript';\nimport BackendClient from './BackendClient';\nimport BackendHttpClient from './BackendHttpClient';\nimport Hooks from './constants/Hooks';\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 createHttpClientFetcher from './utils/createHttpClientFetcher';\nimport navigate from './utils/navigate';\nimport SPACryptoUtils from './utils/SPACryptoUtils';\nimport SPAHelper from './utils/SPAHelper';\nimport SPAUtils from './utils/SPAUtils';\n\n/**\n * OAuth errors that mean the server needs the user, so a silent switch falls back to a redirect.\n */\nconst INTERACTION_ERRORS: string[] = [\n 'interaction_required',\n 'login_required',\n 'consent_required',\n 'account_selection_required',\n];\n\n/**\n * OAuth errors for a device secret the server cannot use, which the SDK drops before signing in again.\n */\nconst UNUSABLE_DEVICE_SECRET_ERRORS: string[] = ['invalid_request', 'invalid_grant'];\n\n/**\n * Temporary-data key that marks a switch to another organization unit left the page, so its callback is\n * redeemed although the previous session is still signed in.\n */\nconst ORGANIZATION_UNIT_SWITCH_KEY = 'organization_unit_switch';\n\nconst logger = createPackageComponentLogger('@thunderid/browser', 'ThunderIDBrowserClient');\n\nconst BROWSER_DEFAULT_CONFIG = {\n autoLogoutOnTokenRefreshError: false,\n periodicTokenRefresh: false,\n};\n\ntype HookCallback = (response?: any) => void | Promise<void>;\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 _authHelper: AuthenticationHelper<T> | undefined;\n private _storage: BrowserStorage | string = BrowserStorage.SessionStorage;\n private _getSignOutURLFromSessionStorage = false;\n private _isHttpHandlerEnabled = true;\n private _hookCallbacks = new Map<string, Set<HookCallback>>();\n private _initialized = false;\n private _startedInitialize = false;\n private _backend: BackendClient | undefined;\n private _stopBackendWatch: (() => void) | undefined;\n private _backendTokenRequest: Promise<string> | undefined;\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 const backendEndpoints: ResolvedBackendEndpoints | undefined = resolveBackendEndpoints(\n merged as BackendEndpointConfig,\n window.location.origin,\n );\n\n if (backendEndpoints) {\n // The backend holds the tokens, so requests carry the session cookie instead of a token. A\n // repeated initialization with the same endpoints, as React's strict mode does in development,\n // keeps the client and its session read.\n if (!this._backend?.hasEndpoints(backendEndpoints)) {\n this._backend = new BackendClient(backendEndpoints);\n // A session that ends elsewhere, such as a sign-out in another app, signs the app out too.\n this._backend.onSignedOut(() => {\n void this.getStorageManager().removeSessionData();\n void this._emitHook(Hooks.SignOut);\n });\n }\n // Poll the backend every `session.checkInterval` seconds. Checks on focus run either way.\n this._stopBackendWatch?.();\n const {session} = merged as {session?: SessionConfig};\n this._stopBackendWatch = this._backend.watch(Number(session?.checkInterval ?? 0));\n this._httpClient = new BackendHttpClient(this._backend, (renew: boolean) => this._getBackendAccessToken(renew));\n FetchHttpClient.setInstance(this._browserInstanceId, this._httpClient);\n // Read the session now, so the client reports loading until it is known whether the user is\n // signed in. Route guards otherwise see \"not loading, not signed in\" and start a sign-in.\n this._backend.getSession().catch((error: unknown) => {\n logger.debug('Could not read the backend session.', error);\n });\n } else {\n this._stopBackendWatch?.();\n this._stopBackendWatch = undefined;\n this._backend = undefined;\n this._httpClient = FetchHttpClient.getInstance(this._browserInstanceId, true, attachToken);\n }\n\n this._httpClient.setHttpRequestStartCallback((request: HttpRequestConfig) => {\n void this._emitHook(Hooks.HttpRequestStart, request);\n });\n this._httpClient.setHttpRequestSuccessCallback((response: HttpResponse) => {\n void this._emitHook(Hooks.HttpRequestSuccess, response);\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 void this._emitHook(Hooks.Initialize, true);\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 this._backend?.isLoading() ?? false;\n }\n\n /**\n * Whether sign-in runs on the app's backend, which holds the tokens so the browser never does.\n */\n public isBackendMode(): boolean {\n return this._backend !== undefined;\n }\n\n private _rejectInBackendMode<R>(operation: string): Promise<R> {\n return Promise.reject(\n new ThunderIDAuthException(\n 'SPA-AUTH_CLIENT-BACKEND-NS01',\n 'Not supported when sign-in runs on the backend.',\n `${operation} is not available when sign-in runs on the backend, because the browser holds no tokens.`,\n ),\n );\n }\n\n public override async signIn(\n config?: SignInConfig,\n authorizationCode?: string,\n state?: string,\n tokenRequestConfig?: {params: Record<string, unknown>},\n ): Promise<User | undefined> {\n await this.isInitialized();\n\n if (this._backend) {\n if (config?.callOnlyOnRedirect) {\n return undefined;\n }\n\n const backendOuId: unknown = (config as Record<string, unknown> | undefined)?.['organizationUnitId'];\n\n location.href = this._backend.getSignInUrl(\n `${window.location.pathname}${window.location.search}`,\n typeof backendOuId === 'string' && backendOuId !== '' ? backendOuId : undefined,\n );\n await SPAUtils.waitTillPageRedirect();\n\n return undefined;\n }\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, state, tokenRequestConfig);\n\n if (user) {\n void this._emitHook(Hooks.SignIn, user);\n }\n\n return user;\n }\n\n private async _signInInternal(\n signInConfig?: SignInConfig,\n authorizationCode?: 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 // The callback of a switch to another organization unit arrives while the previous session is still\n // signed in, so it is redeemed here rather than answered with that session.\n const switchedUser: User | undefined = await this._completeOrganizationUnitSwitch(tokenRequestConfig);\n\n if (switchedUser) {\n return switchedUser;\n }\n\n const basicUserInfo = await this._authHelper!.handleSignIn();\n\n if (basicUserInfo) {\n return basicUserInfo;\n }\n\n let resolvedAuthorizationCode: 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 resolvedState = state ?? '';\n } else {\n resolvedAuthorizationCode =\n new URL(window.location.href).searchParams.get(OIDCRequestConstants.Params.AUTHORIZATION_CODE) ?? '';\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(resolvedAuthorizationCode, resolvedState, resolvedTokenRequestConfig);\n }\n\n // Opt-in: look for an existing ThunderID SSO session before leaving the app. Skipped inside an\n // iframe, and when the caller asks for a specific prompt (login, consent, ...), which a silent\n // request cannot honour.\n const sessionConfig: SessionConfig | undefined = (config as BrowserAuthConfig | undefined)?.session;\n\n if (sessionConfig?.silentSignIn?.beforeRedirect && window.self === window.top && !signInConfig?.['prompt']) {\n try {\n const silentUser: User | boolean = await this._signInSilentlyInternal(signInConfig, tokenRequestConfig);\n\n if (silentUser && typeof silentUser === 'object') {\n return silentUser;\n }\n } catch (error) {\n logger.debug('Checking for an existing session failed; continuing with the sign-in redirect.', error);\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: '', sub: '', tenantDomain: '', username: ''};\n });\n }\n\n private async _exchangeCodeForTokens(\n authorizationCode: 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 && state) {\n const pkceKey = extractPkceStorageKeyFromState(state);\n const pkce = SPAUtils.getPKCE(pkceKey);\n await this.setPKCECode(pkce, pkceKey);\n }\n\n await this.requestAccessToken(authorizationCode, state ?? '', undefined, tokenRequestConfig);\n\n return this._startSession(config.clientId);\n }\n\n /**\n * Prepares the sign-out URL and the token refresh for tokens just stored, and reads the user.\n */\n private async _startSession(clientId: string): Promise<User> {\n try {\n const signOutUrl = await this.getSignOutUrl();\n SPAUtils.setSignOutURL(signOutUrl, 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 return this.getUser();\n }\n\n /**\n * Signs in again bounded to the organization unit `organizationUnitId`, and replaces the session with\n * the one it gets. The server reuses the SSO session when the user can sign in there, so normally no\n * credentials are asked.\n *\n * - Redirect mode exchanges the session's device secret at `{baseUrl}/ou/{ouId}/oauth2/token` when it\n * holds one, which a sign-in with the `device_sso` scope returns. Otherwise it tries a `prompt=none`\n * request to `{baseUrl}/ou/{ouId}/oauth2/authorize` in a hidden iframe. When the server needs the\n * user, it redirects the page there (unless `redirect` is `false`), and the callback replaces the\n * session.\n * - Embedded mode starts an `AUTHENTICATION` flow with `ouId`, presenting the SSO session handles kept\n * from earlier flow steps. A flow that needs input fails with `interaction_required`; render the\n * sign-in for the unit instead.\n * - Backend mode sends the page to the backend's sign-in endpoint with `ouId`.\n *\n * A failed switch leaves the previous session as it was.\n *\n * @throws {ThunderIDAPIError} With a code from `OrganizationUnitSwitchErrorCodes`.\n */\n public override async switchOrganizationUnit(\n organizationUnitId: string,\n options: SwitchOrganizationUnitOptions = {},\n ): Promise<User | undefined> {\n await this.isInitialized();\n\n if (typeof organizationUnitId !== 'string' || organizationUnitId.trim() === '') {\n throw new ThunderIDAPIError(\n 'An organization unit identifier is required.',\n OrganizationUnitSwitchErrorCodes.InvalidOrganizationUnit,\n 'browser',\n 400,\n );\n }\n\n if (this._backend) {\n location.href = this._backend.getSignInUrl(\n `${window.location.pathname}${window.location.search}`,\n organizationUnitId,\n );\n await SPAUtils.waitTillPageRedirect();\n\n return undefined;\n }\n\n const {redirect = true, ...params} = options;\n const sm: StorageManager<T> = this.getStorageManager();\n const config: AuthClientConfig<T> = await sm.getConfigData();\n\n if ((config as {mode?: string})?.mode === 'embedded') {\n return this._switchOrganizationUnitEmbedded(organizationUnitId, config);\n }\n\n const exchangedUser: User | false | undefined = await this._switchOrganizationUnitWithDeviceSecret(\n organizationUnitId,\n config,\n );\n\n if (exchangedUser) {\n return exchangedUser;\n }\n\n let silentError: string | undefined;\n let silentUser: User | boolean = false;\n\n // Without a device secret, the silent sign-in runs in an iframe on the session cookie.\n if (exchangedUser === undefined) {\n try {\n silentUser = await this._authHelper!.signInSilently(\n (additional: Record<string, AuthorizeRequestParamValue> | undefined) =>\n this._constructSilentSignInUrl(additional),\n (code: string, s: string, trc?: {params: Record<string, unknown>}) =>\n this._exchangeCodeForTokens(code, s, trc),\n {...(params as Record<string, AuthorizeRequestParamValue>), organizationUnitId},\n undefined,\n (config as BrowserAuthConfig | undefined)?.session?.silentSignIn?.timeout,\n (error?: string) => {\n silentError = error;\n },\n );\n } catch (error) {\n throw ThunderIDBrowserClient._toSwitchError(error instanceof Error ? error.message : undefined, error);\n }\n }\n\n if (silentUser && typeof silentUser === 'object') {\n void this._emitHook(Hooks.SignIn, silentUser);\n\n return silentUser;\n }\n\n if (silentError && !INTERACTION_ERRORS.includes(silentError)) {\n throw ThunderIDBrowserClient._toSwitchError(silentError);\n }\n\n if (!redirect) {\n throw ThunderIDBrowserClient._toSwitchError('interaction_required');\n }\n\n const url: string = await this.getSignInUrl({\n ...(params as Record<string, AuthorizeRequestParamValue>),\n organizationUnitId,\n });\n\n await sm.setTemporaryDataParameter(ORGANIZATION_UNIT_SWITCH_KEY, organizationUnitId);\n\n location.href = url;\n await SPAUtils.waitTillPageRedirect();\n\n return undefined;\n }\n\n /**\n * Switches back-channel by exchanging the session's device secret at the unit's token endpoint.\n *\n * @returns The user, `false` when the server needs the user, or `undefined` when the session holds no\n * device secret.\n */\n private async _switchOrganizationUnitWithDeviceSecret(\n organizationUnitId: string,\n config: AuthClientConfig<T>,\n ): Promise<User | false | undefined> {\n let result: DeviceSecretSwitchResult | undefined;\n\n try {\n result = await this.switchOrganizationUnitWithDeviceSecret(organizationUnitId);\n } catch (error) {\n throw ThunderIDBrowserClient._toSwitchError(undefined, error);\n }\n\n if (!result) {\n return undefined;\n }\n\n if ('error' in result) {\n // A device secret the server refused as unusable has been dropped, so the user signs in again.\n if (INTERACTION_ERRORS.includes(result.error) || UNUSABLE_DEVICE_SECRET_ERRORS.includes(result.error)) {\n return false;\n }\n\n throw ThunderIDBrowserClient._toSwitchError(result.error);\n }\n\n const user: User = await this._startSession(config.clientId ?? '');\n\n void this._emitHook(Hooks.SignIn, user);\n\n return user;\n }\n\n /**\n * Maps an OAuth error from a bounded sign-in onto the switch's documented errors.\n */\n private static _toSwitchError(oauthError?: string, cause?: unknown): ThunderIDAPIError {\n if (\n cause instanceof ThunderIDAPIError &&\n (Object.values(OrganizationUnitSwitchErrorCodes) as string[]).includes(cause.code)\n ) {\n return cause;\n }\n\n let code: string = OrganizationUnitSwitchErrorCodes.Failed;\n\n if (oauthError === 'unauthorized_client') {\n code = OrganizationUnitSwitchErrorCodes.UnauthorizedClient;\n } else if (oauthError && INTERACTION_ERRORS.includes(oauthError)) {\n code = OrganizationUnitSwitchErrorCodes.InteractionRequired;\n }\n\n const serverCode: string = oauthError ?? 'switch_failed';\n\n return new ThunderIDAPIError(\n JSON.stringify({code: serverCode, message: {defaultValue: serverCode}}),\n code,\n 'browser',\n oauthError === 'unauthorized_client' ? 400 : undefined,\n undefined,\n 'Switching the organization unit failed',\n );\n }\n\n /**\n * Embedded mode: starts a sign-in flow bounded to the unit. When the SSO session is reused, the flow\n * completes at once and its assertion replaces the session.\n */\n private async _switchOrganizationUnitEmbedded(\n organizationUnitId: string,\n config: AuthClientConfig<T>,\n ): Promise<User> {\n let response: EmbeddedSignInFlowResponse;\n // The kept session handles let the server reuse the SSO session where its cookie is not sent.\n const sessionData: EmbeddedFlowSessionData[] = await this.getFlowSessions();\n\n try {\n response = await executeEmbeddedSignInFlow({\n baseUrl: config?.baseUrl,\n payload: {\n applicationId: config?.applicationId ?? '',\n flowType: EmbeddedFlowType.Authentication,\n ouId: organizationUnitId,\n ...(sessionData.length > 0 ? {sessionData} : {}),\n },\n url: resolveResourceEndpoint('flowExecute', config),\n });\n } catch (error) {\n const serverCode: string | undefined = error instanceof ThunderIDAPIError ? error.serverError?.code : undefined;\n\n // FES-1023: a unit the application is not accessible from, or one that does not exist.\n throw ThunderIDBrowserClient._toSwitchError(\n serverCode === 'FES-1023' ? 'unauthorized_client' : serverCode,\n error,\n );\n }\n\n await this.storeFlowSessions(response);\n\n if (response?.flowStatus === EmbeddedSignInFlowStatus.Complete && response.assertion) {\n const claims: Record<string, unknown> = await this.decodeJwtToken<Record<string, unknown>>(response.assertion);\n const iat: number | undefined = typeof claims['iat'] === 'number' ? claims['iat'] : undefined;\n const exp: number | undefined = typeof claims['exp'] === 'number' ? claims['exp'] : undefined;\n\n await this.setSession({\n access_token: response.assertion,\n created_at: iat ? iat * 1000 : Date.now(),\n expires_in: exp && iat ? exp - iat : 3600,\n id_token: response.assertion,\n scope: claims['scope'],\n token_type: 'Bearer',\n });\n\n const user: User = await this.getUser();\n\n void this._emitHook(Hooks.SignIn, user);\n\n return user;\n }\n\n if (response?.flowStatus === EmbeddedSignInFlowStatus.Error) {\n throw ThunderIDBrowserClient._toSwitchError('access_denied');\n }\n\n throw ThunderIDBrowserClient._toSwitchError('interaction_required');\n }\n\n /**\n * Completes a switch that left the page for the unit's authorization endpoint: redeems the returned\n * code, or reports the returned error and keeps the previous session.\n */\n private async _completeOrganizationUnitSwitch(tokenRequestConfig?: {\n params: Record<string, unknown>;\n }): Promise<User | undefined> {\n const sm: StorageManager<T> = this.getStorageManager();\n const pending: unknown = await sm.getTemporaryDataParameter(ORGANIZATION_UNIT_SWITCH_KEY);\n\n // A silent sign-in response inside its iframe is relayed to the parent, never redeemed here.\n if (!pending || SPAUtils.isInitializedSilentSignIn()) {\n return undefined;\n }\n\n const url: URL = new URL(window.location.href);\n const code: string | null = url.searchParams.get(OIDCRequestConstants.Params.AUTHORIZATION_CODE);\n const state: string | null = url.searchParams.get(OIDCRequestConstants.Params.STATE);\n const error: string | null = url.searchParams.get('error');\n\n if (code && state) {\n await sm.removeTemporaryDataParameter(ORGANIZATION_UNIT_SWITCH_KEY);\n SPAUtils.removeAuthorizationCode();\n\n try {\n return await this._exchangeCodeForTokens(code, state, tokenRequestConfig);\n } catch (exchangeError) {\n throw ThunderIDBrowserClient._toSwitchError(undefined, exchangeError);\n }\n }\n\n if (error) {\n await sm.removeTemporaryDataParameter(ORGANIZATION_UNIT_SWITCH_KEY);\n url.searchParams.delete('error');\n url.searchParams.delete('error_description');\n url.searchParams.delete(OIDCRequestConstants.Params.STATE);\n history.replaceState(null, document.title, url.toString());\n\n throw ThunderIDBrowserClient._toSwitchError(error);\n }\n\n return undefined;\n }\n\n public override async signInSilently(\n additionalParams?: Record<string, AuthorizeRequestParamValue>,\n tokenRequestConfig?: {params: Record<string, unknown>},\n ): Promise<User | boolean | undefined> {\n await this.isInitialized();\n\n if (this._backend) {\n return (await this.isSignedIn()) ? this.getUser() : false;\n }\n\n if (SPAUtils.wasSignInCalled()) {\n return undefined;\n }\n\n const response = await this._signInSilentlyInternal(additionalParams, tokenRequestConfig);\n\n if (response) {\n void this._emitHook(Hooks.SignIn, response);\n }\n\n return response;\n }\n\n private async _signInSilentlyInternal(\n additionalParams?: Record<string, AuthorizeRequestParamValue>,\n tokenRequestConfig?: {params: Record<string, unknown>},\n ): Promise<User | boolean> {\n const {session} = await this.getStorageManager().getConfigData();\n\n return this._authHelper!.signInSilently(\n (params) => this._constructSilentSignInUrl(params),\n (code, s, trc) => this._exchangeCodeForTokens(code, s, trc),\n additionalParams,\n tokenRequestConfig,\n session?.silentSignIn?.timeout,\n );\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 let sessionId: string | undefined;\n\n if (typeof sessionIdOrAfterSignOut === 'function') {\n afterSignOut = sessionIdOrAfterSignOut;\n } else if (typeof sessionIdOrAfterSignOut === 'string') {\n sessionId = sessionIdOrAfterSignOut;\n afterSignOut = afterSignOutParam;\n }\n\n if (this._backend) {\n await this.getStorageManager().removeSessionData();\n const backendSignOutUrl: string = await this._backend.signOut();\n afterSignOut?.(backendSignOutUrl);\n location.href = backendSignOutUrl;\n await SPAUtils.waitTillPageRedirect();\n\n return backendSignOutUrl;\n }\n\n const sm = this.getStorageManager();\n const config = await (sm as any).getConfigData();\n\n // OIDC RP-Initiated Logout: end the session at the OP's end_session_endpoint. The sign-out URL\n // (carrying id_token_hint/client_id + post_logout_redirect_uri) is resolved before the access\n // token is revoked or the local session is cleared, so the ID token used for the hint is still\n // available. This is the default; it falls back to a local-only sign out when no\n // end_session_endpoint is advertised or the URL cannot be built. Set rpInitiatedLogout: false to\n // force a local-only sign out.\n let signOutUrl = '';\n\n if (config?.rpInitiatedLogout !== false) {\n // A cached URL is stored per client at token exchange; when a specific session is targeted, build\n // a fresh URL instead so the id_token_hint matches that session.\n signOutUrl = sessionId ? '' : SPAUtils.getSignOutUrl(config.clientId, this._browserInstanceId);\n\n if (!signOutUrl) {\n try {\n signOutUrl = await this.getSignOutUrl(sessionId);\n } catch (error) {\n // end_session_endpoint absent or ID token unavailable — fall through to local sign out.\n logger.debug('Could not build the RP-initiated logout URL; falling back to a local sign out.', error);\n signOutUrl = '';\n }\n }\n }\n\n // Revoke the access token at the OP before clearing the session. Disabled by default; set\n // tokenLifecycle.revokeToken.revokeOnSignOut to true to enable. Best-effort: revocation can\n // fail (no revocation_endpoint advertised, network error, non-200 response, or a stalled request)\n // without blocking sign out, since the local session must be cleared regardless. Uses the\n // request-only core method so the session (and the ID token read above) isn't cleared twice or\n // ahead of the RP-Initiated Logout URL resolution.\n if (config?.tokenLifecycle?.revokeToken?.revokeOnSignOut === true) {\n try {\n await this.requestAccessTokenRevocation(sessionId);\n } catch (error) {\n logger.debug('Could not revoke the access token before signing out.', error);\n }\n }\n\n if (signOutUrl) {\n // Await the clear so local tokens are gone before navigating away; clearSession() is otherwise\n // fire-and-forget and could be cut short by the redirect.\n await this.clearSessionAsync(sessionId);\n // Notify the caller before navigating away, mirroring the local-only path below.\n afterSignOut?.(signOutUrl);\n location.href = signOutUrl;\n await SPAUtils.waitTillPageRedirect();\n\n return signOutUrl;\n }\n\n // Local-only sign out: clear the session and navigate back to sign-in. Used when RP-initiated\n // logout is disabled, or as a fallback when the OP advertises no end_session_endpoint.\n this.clearSession(sessionId);\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 if (this._backend) {\n return this._backendRequest(requestConfig);\n }\n\n const response: HttpResponse = await this._authHelper!.httpRequest(\n this._httpClient!,\n requestConfig,\n this._isHttpHandlerEnabled,\n this._emitHttpError,\n this._emitHttpFinish,\n );\n\n if (this._isHttpHandlerEnabled) {\n this._emitHttpFinish();\n }\n\n return response;\n }\n\n public async httpRequestAll(configs: HttpRequestConfig[]): Promise<HttpResponse[] | undefined> {\n await this._validateMethod(false);\n\n if (this._backend) {\n return Promise.all(configs.map((requestConfig: HttpRequestConfig) => this._backendRequest(requestConfig)));\n }\n\n const responses: HttpResponse[] | undefined = await this._authHelper!.httpRequestAll(\n configs,\n this._httpClient!,\n this._isHttpHandlerEnabled,\n this._emitHttpError,\n this._emitHttpFinish,\n );\n\n if (this._isHttpHandlerEnabled) {\n this._emitHttpFinish();\n }\n\n return responses;\n }\n\n private async _backendRequest(requestConfig: HttpRequestConfig): Promise<HttpResponse> {\n try {\n return await this._httpClient!.request(requestConfig);\n } catch (error) {\n if (this._isHttpHandlerEnabled) {\n await this._emitHttpError(error as HttpError);\n }\n\n throw error;\n } finally {\n if (this._isHttpHandlerEnabled) {\n this._emitHttpFinish();\n }\n }\n }\n\n public override async getUser(userId?: string): Promise<User> {\n await this._validateMethod();\n\n if (this._backend) {\n return ((await this._backend.getSession()).user ?? {}) as User;\n }\n\n return super.getUser(userId);\n }\n\n /**\n * Fetches the signed-in user's profile from the `/users/me` endpoint (or `endpoints.usersMe` when\n * configured), sending the request through the client's HTTP client so the access token is attached.\n *\n * @param options - Optional `baseUrl` or full `url` overrides for the profile endpoint.\n * @returns The user's profile.\n */\n public override async getUserProfile(options?: {baseUrl?: string; url?: string}): Promise<UserProfile> {\n await this._validateMethod();\n\n const configData = await this.getStorageManager().getConfigData();\n const profile: User = await getUsersMe({\n // In backend mode the API is reached through the backend's proxy.\n baseUrl: options?.baseUrl ?? resolveRequestBaseUrl(configData as any),\n fetcher: createHttpClientFetcher(this._browserInstanceId),\n url: resolveResourceEndpoint('usersMe', configData as any, options?.url),\n });\n\n return {\n flattenedProfile: generateFlattenedUserProfile(profile),\n profile,\n };\n }\n\n public override async getAccessToken(sessionId?: string): Promise<string> {\n if (this._backend) {\n return this._getBackendAccessToken();\n }\n\n return super.getAccessToken(sessionId);\n }\n\n /**\n * The permissions the signed-in user's access token grants, for example to hide a page the user\n * cannot use. The server still checks every request.\n *\n * In backend mode they come only from the backend's session (`scope`): the token stays on the backend,\n * so a session without `scope` grants nothing. Otherwise they are read from the access token's `scope`\n * or `scopes` claim.\n *\n * @returns The granted permissions, or an empty list when none can be read.\n */\n public async getGrantedPermissions(): Promise<string[]> {\n if (this._backend) {\n const {scope} = await this._backend.getSession();\n\n return typeof scope === 'string' ? scope.split(' ').filter((entry: string) => entry.length > 0) : [];\n }\n\n return getTokenPermissions(await this.getAccessToken());\n }\n\n /**\n * The access token for requests under `endpoints.backend.bypass`. Like a client credentials token it\n * has no refresh token: it is kept in the session storage until it nears expiry, then requested again.\n *\n * @param renew - Request a new token even when the stored one is still valid.\n */\n private async _getBackendAccessToken(renew = false): Promise<string> {\n const storageManager = this.getStorageManager();\n const session: Partial<SessionData> | undefined = await storageManager.getSessionData();\n const expiresAt: number = (session?.created_at ?? 0) + Number(session?.expires_in ?? 0) * 1000;\n\n if (\n !renew &&\n session?.access_token &&\n expiresAt - TokenConstants.Lifecycle.CLIENT_CREDENTIALS_REFRESH_MARGIN_MS > Date.now()\n ) {\n return session.access_token;\n }\n\n this._backendTokenRequest ??= this._backend!.requestAccessToken()\n .then(async (response: Partial<SessionData>) => {\n await storageManager.setSessionData({...response, created_at: Date.now()});\n\n return response.access_token ?? '';\n })\n .finally(() => {\n this._backendTokenRequest = undefined;\n });\n\n return this._backendTokenRequest;\n }\n\n public override async getDecodedIdToken(userId?: string, idToken?: string): Promise<IdToken> {\n await this._validateMethod();\n\n if (this._backend) {\n // The backend keeps the ID token and returns its user claims, which is what callers read from it.\n return ((await this._backend.getSession()).user ?? {}) as IdToken;\n }\n\n return super.getDecodedIdToken(userId, idToken);\n }\n\n public override async getIdToken(userId?: string): Promise<string> {\n if (this._backend) {\n return this._rejectInBackendMode('getIdToken');\n }\n\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 if (this._backend) {\n return (await this._backend.getSession()).isSignedIn;\n }\n\n return super.isSignedIn(userId);\n }\n\n protected notifySignIn(user: User): void {\n void this._emitHook(Hooks.SignIn, user);\n }\n\n public async isSessionActive(): Promise<boolean | undefined> {\n await this.isInitialized();\n\n if (this._backend) {\n return this.isSignedIn();\n }\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 if (this._backend) {\n if (!(await this._backend.refresh())) {\n return Promise.reject(\n new ThunderIDAuthException(\n 'SPA-AUTH_CLIENT-BACKEND-RF01',\n 'Refresh failed.',\n 'The backend could not refresh the session.',\n ),\n );\n }\n\n return this.getUser();\n }\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 if (this._backend) {\n return this._rejectInBackendMode('revokeAccessToken');\n }\n\n await this._validateMethod();\n\n const timer: number = await this._spaHelper!.getRefreshTimeoutTimer();\n await super.revokeAccessToken(userId);\n\n await this._spaHelper!.clearRefreshTokenTimeout(timer);\n\n await this._emitHook(Hooks.RevokeAccessToken, true);\n\n return true;\n }\n\n public override async exchangeToken(config: SPATokenExchangeConfig): Promise<Response | User> {\n if (this._backend) {\n return this._rejectInBackendMode('exchangeToken');\n }\n\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 void this._emitHook(`${Hooks.CustomGrant}:${config.id}`, response);\n\n return response;\n }\n\n public override async reInitialize(config: Partial<T>): Promise<boolean> {\n await this.isInitialized();\n\n return super.reInitialize(config);\n }\n\n public async startAutoRefreshToken(): Promise<void> {\n await this.isInitialized();\n\n if (this._backend) {\n // The backend refreshes on demand: a request that finds the session expired refreshes it once.\n return;\n }\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 /**\n * Subscribes a callback to a lifecycle hook. Every callback registered for a hook is called when it\n * fires; registering the same callback again for the same hook has no further effect. Hooks can be\n * registered before or after `initialize()`.\n *\n * @param hook - The hook to subscribe to (see `Hooks`).\n * @param callback - Called when the hook fires.\n * @param id - The custom grant id. Required for `custom-grant`.\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 as Hooks) {\n case Hooks.SignIn:\n case Hooks.RevokeAccessToken:\n case Hooks.Initialize:\n case Hooks.HttpRequestError:\n case Hooks.HttpRequestFinish:\n case Hooks.HttpRequestStart:\n case Hooks.HttpRequestSuccess:\n this._addHookCallback(hook, callback);\n break;\n case Hooks.SignOut:\n // The hook fires on the way back from a sign-out redirect, and later whenever the session\n // ends without this app signing out, which only the backend can report.\n this._addHookCallback(hook, callback);\n if (\n await SPAUtils.isSignOutSuccessful(\n ThunderIDBrowserClient.isSignOutSuccessful.bind(ThunderIDBrowserClient),\n () => ThunderIDBrowserClient.clearSession(),\n )\n ) {\n void callback();\n }\n break;\n case Hooks.CustomGrant:\n id && this._addHookCallback(`${Hooks.CustomGrant}:${id}`, callback);\n break;\n case Hooks.SignOutFailed: {\n const signOutFail = SPAUtils.didSignOutFail(ThunderIDBrowserClient.didSignOutFail.bind(ThunderIDBrowserClient));\n if (signOutFail) {\n void callback(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 _addHookCallback(hook: string, callback: HookCallback): void {\n const callbacks: Set<HookCallback> = this._hookCallbacks.get(hook) ?? new Set<HookCallback>();\n\n callbacks.add(callback);\n this._hookCallbacks.set(hook, callbacks);\n }\n\n private _emitHook(hook: string, response?: unknown): Promise<unknown[]> {\n return Promise.all(\n [...(this._hookCallbacks.get(hook) ?? [])].map((callback: HookCallback) => Promise.resolve(callback(response))),\n );\n }\n\n private _emitHttpError = async (error: HttpError): Promise<void> => {\n await this._emitHook(Hooks.HttpRequestError, error);\n };\n\n private _emitHttpFinish = (): void => {\n void this._emitHook(Hooks.HttpRequestFinish);\n };\n\n private _enableRetrievingSignOutURLFromSession(config: SPATokenExchangeConfig): void {\n if (config.preventSignOutURLUpdate) {\n this._getSignOutURLFromSessionStorage = true;\n }\n }\n\n private async _constructSilentSignInUrl(\n additionalParams: Record<string, AuthorizeRequestParamValue> = {},\n ): 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 // eslint-disable-next-line camelcase\n response_mode: 'query',\n state: SILENT_SIGN_IN_STATE,\n ...additionalParams,\n } as any);\n\n const urlObject = new URL(urlString);\n // A pushed request carries its parameters server-side, and its URL takes no others.\n const isPushed: boolean = urlObject.searchParams.has('request_uri');\n\n if (!isPushed) {\n urlObject.searchParams.set('response_mode', 'query');\n }\n\n if (this._storage === BrowserStorage.BrowserMemory && config.enablePKCE) {\n const state = urlObject.searchParams.get(OIDCRequestConstants.Params.STATE) ?? this.lastAuthorizeRequestState;\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","// Copyright 2025 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Utility to check if `code` is available in the URL as a search param.\n *\n * @param params - The URL search params to check. Defaults to `window.location.search`.\n * @return `true` if the URL contains a `code` search param, 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","// Copyright 2025 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\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","// Copyright 2025 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\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","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Copies text to the clipboard. It uses the Clipboard API, and falls back to a hidden textarea and\n * `document.execCommand('copy')` where the API is missing or refuses, such as on a page without a secure context.\n *\n * @param text - The text to copy.\n */\nconst copyTextToClipboard = async (text: string): Promise<void> => {\n try {\n await navigator.clipboard.writeText(text);\n } catch {\n const textArea: HTMLTextAreaElement = document.createElement('textarea');\n\n textArea.value = text;\n document.body.appendChild(textArea);\n textArea.select();\n document.execCommand('copy');\n document.body.removeChild(textArea);\n }\n};\n\nexport default copyTextToClipboard;\n","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {Project, getVendorPrefix} from '@thunderid/javascript';\n\n/**\n * The `localStorage` key the current project is kept under, scoped to the vendor like the SDK's\n * other UI preferences.\n *\n * @param vendor - The vendor prefix.\n * @returns The key.\n */\nexport const getCurrentProjectStorageKey = (vendor?: string): string => `${getVendorPrefix(vendor)}-current-project`;\n\n/**\n * Reads the project the user last chose. The current project is a client-side preference for the\n * management UI: it does not change the session, the tokens or what the server allows.\n *\n * @param vendor - The vendor prefix.\n * @returns The project, or `null` when none is kept or storage is unavailable.\n */\nexport const readCurrentProject = (vendor?: string): Project | null => {\n try {\n if (typeof window === 'undefined' || !window.localStorage) {\n return null;\n }\n\n const stored: string | null = window.localStorage.getItem(getCurrentProjectStorageKey(vendor));\n const parsed: unknown = stored ? JSON.parse(stored) : null;\n\n return parsed && typeof parsed === 'object' && typeof (parsed as Project).id === 'string'\n ? (parsed as Project)\n : null;\n } catch {\n return null;\n }\n};\n\n/**\n * Keeps the project the user chose, or forgets it with `null`.\n *\n * @param vendor - The vendor prefix.\n * @param project - The project, or `null`.\n */\nexport const writeCurrentProject = (vendor: string | undefined, project: Project | null): void => {\n try {\n if (typeof window === 'undefined' || !window.localStorage) {\n return;\n }\n\n const key: string = getCurrentProjectStorageKey(vendor);\n\n if (project) {\n window.localStorage.setItem(key, JSON.stringify(project));\n } else {\n window.localStorage.removeItem(key);\n }\n } catch {\n // Storage is full or blocked: the choice lasts for this page only.\n }\n};\n","// Copyright 2025 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\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. Please try again.',\n 'browser-webauthn-general-error',\n 'browser',\n `WebAuthn authentication failed with error: ${error.name}: ${error.message}`,\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","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\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","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nexport const AVATAR_URI_SCHEME = 'avatar:';\n\n/**\n * Checks whether a given URI uses the `avatar:` scheme\n * (e.g. `\"avatar:style=rounded,text=Acme,colors=2\"`).\n *\n * @param uri - The URI string to check.\n * @returns `true` if the URI starts with `\"avatar:\"`, `false` otherwise.\n *\n * @example\n * ```typescript\n * isAvatarUri(\"avatar:style=circle,text=Acme,colors=0\"); // true\n * isAvatarUri(\"emoji:🐯\"); // false\n * ```\n */\nconst isAvatarUri = (uri: string): boolean => typeof uri === 'string' && uri.startsWith(AVATAR_URI_SCHEME);\n\nexport default isAvatarUri;\n","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport isAvatarUri, {AVATAR_URI_SCHEME} from './isAvatarUri';\n\nexport type AvatarShape = 'circle' | 'rounded';\n\nexport type AvatarVariant = 'anonymous_animal' | 'anonymous_entity' | 'blank' | 'one_letter' | 'two_letter';\n\nexport interface AvatarParams {\n /**\n * Explicit flat background color override (e.g. `#FF5733`). When set, replaces the\n * derived gradient (letter variants) or the curated icon color (`anonymous_animal`/\n * `anonymous_entity`).\n */\n bg?: string;\n /**\n * Gradient rotation index for letter variants (ignored by `anonymous_animal`/`anonymous_entity`).\n */\n colors: number;\n /**\n * The rendered payload: pre-computed initials (e.g. `\"BM\"`) for `one_letter`/`two_letter`,\n * a lowercase animal key (e.g. `\"jackalope\"`) for `anonymous_animal`, a lowercase entity key\n * (e.g. `\"hexagon\"`) for `anonymous_entity`, or unused (empty) for `blank`.\n */\n content: string;\n /**\n * Background shape.\n */\n shape: AvatarShape;\n /**\n * What's drawn on the background.\n */\n variant: AvatarVariant;\n}\n\nconst DEFAULT_PARAMS: AvatarParams = {colors: 0, content: '', shape: 'rounded', variant: 'two_letter'};\n\n/**\n * Parses the comma-separated `key=value` pairs of an `avatar:` URI, e.g.\n * `\"avatar:shape=circle,variant=two_letter,content=BM,colors=2,bg=#FF5733\"`.\n *\n * @param uri - A URI string in the form `\"avatar:shape=...,variant=...,content=...,colors=...,bg=...\"`.\n * @returns The parsed avatar parameters, falling back to defaults for any missing/invalid field.\n *\n * @example\n * ```typescript\n * extractAvatarParamsFromUri(\"avatar:shape=circle,variant=anonymous_animal,content=jackalope\");\n * // { shape: \"circle\", variant: \"anonymous_animal\", content: \"jackalope\", colors: 0 }\n * ```\n */\nconst extractAvatarParamsFromUri = (uri: string): AvatarParams => {\n if (!isAvatarUri(uri)) {\n return {...DEFAULT_PARAMS};\n }\n\n const raw: string = uri.slice(AVATAR_URI_SCHEME.length);\n const params: Record<string, string> = {};\n\n raw.split(',').forEach((pair: string) => {\n const [key, ...rest] = pair.split('=');\n if (key) {\n params[key.trim()] = rest.join('=').trim();\n }\n });\n\n const shape: AvatarShape = ['circle', 'rounded'].includes(params['shape'])\n ? (params['shape'] as AvatarShape)\n : DEFAULT_PARAMS.shape;\n const variant: AvatarVariant = ['anonymous_animal', 'anonymous_entity', 'blank', 'one_letter', 'two_letter'].includes(\n params['variant'],\n )\n ? (params['variant'] as AvatarVariant)\n : DEFAULT_PARAMS.variant;\n const colors: number = Number.parseInt(params['colors'], 10);\n\n return {\n ...(params['bg'] ? {bg: params['bg']} : {}),\n colors: Number.isFinite(colors) ? colors : DEFAULT_PARAMS.colors,\n content: params['content'] ?? DEFAULT_PARAMS.content,\n shape,\n variant,\n };\n};\n\nexport default extractAvatarParamsFromUri;\n","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport type {AvatarParams} from './extractAvatarParamsFromUri';\nimport {AVATAR_URI_SCHEME} from './isAvatarUri';\n\n/**\n * Serializes {@link AvatarParams} into an `avatar:` URI, the inverse of\n * {@link extractAvatarParamsFromUri}.\n *\n * @param params - The avatar parameters to serialize.\n * @returns An `\"avatar:shape=...,variant=...,content=...,colors=...\"` spec string, with a\n * trailing `,bg=...` when {@link AvatarParams.bg} is set.\n *\n * @example\n * ```typescript\n * buildAvatarSpec({shape: 'circle', variant: 'two_letter', content: 'BM', colors: 2});\n * // \"avatar:shape=circle,variant=two_letter,content=BM,colors=2\"\n * ```\n */\nconst buildAvatarSpec = ({shape, variant, content, colors, bg}: AvatarParams): string => {\n const base = `${AVATAR_URI_SCHEME}shape=${shape},variant=${variant},content=${content},colors=${colors}`;\n return bg ? `${base},bg=${bg}` : base;\n};\n\nexport default buildAvatarSpec;\n","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\n// AUTO-GENERATED FILE. Do not edit directly.\n// Regenerate with: node scripts/generate-anonymous-animal-icons.mjs\n// Source SVGs live in static/images/anonymous.\n\nexport interface AnonymousAnimalIcon {\n /** The animal's curated default background color (hex). */\n color: string;\n /** Inner SVG markup (no outer <svg>/<rect>). Any \"%COLOR%\" token is the animal's\n * color, substitutable at render time so a custom \"bg\" recolors accents too. */\n markup: string;\n}\n\nexport const ANONYMOUS_ANIMAL_ICONS: Record<string, AnonymousAnimalIcon> = {\n capybara: {\n color: '#8A6A2E',\n markup:\n '<ellipse cx=\"50\" cy=\"58\" rx=\"30\" ry=\"20\" fill=\"#FFFFFF\"/>\\n<ellipse cx=\"24\" cy=\"50\" rx=\"5\" ry=\"5\" fill=\"#FFFFFF\"/>\\n<ellipse cx=\"76\" cy=\"50\" rx=\"5\" ry=\"5\" fill=\"#FFFFFF\"/>\\n<ellipse cx=\"50\" cy=\"70\" rx=\"14\" ry=\"10\" fill=\"#FFFFFF\"/>\\n<circle cx=\"36\" cy=\"56\" r=\"3\" fill=\"%COLOR%\"/>\\n<circle cx=\"64\" cy=\"56\" r=\"3\" fill=\"%COLOR%\"/>',\n },\n chameleon: {\n color: '#C23B7A',\n markup:\n '<path d=\"M30 60 Q20 55 25 45 Q35 35 45 42 L55 35 Q65 25 72 35 Q78 42 68 48 L55 55 Q60 65 45 68 Q32 70 30 60 Z\" fill=\"#FFFFFF\"/>\\n<circle cx=\"60\" cy=\"35\" r=\"9\" fill=\"#FFFFFF\"/>\\n<circle cx=\"60\" cy=\"35\" r=\"3\" fill=\"%COLOR%\"/>\\n<path d=\"M25 62 Q15 65 12 78\" stroke=\"#FFFFFF\" stroke-width=\"5\" fill=\"none\" stroke-linecap=\"round\"/>',\n },\n chinchilla: {\n color: '#5B6BC0',\n markup:\n '<circle cx=\"30\" cy=\"34\" r=\"14\" fill=\"#FFFFFF\"/>\\n<circle cx=\"70\" cy=\"34\" r=\"14\" fill=\"#FFFFFF\"/>\\n<circle cx=\"30\" cy=\"34\" r=\"7\" fill=\"%COLOR%\"/>\\n<circle cx=\"70\" cy=\"34\" r=\"7\" fill=\"%COLOR%\"/>\\n<circle cx=\"50\" cy=\"58\" r=\"26\" fill=\"#FFFFFF\"/>\\n<circle cx=\"38\" cy=\"55\" r=\"3.5\" fill=\"%COLOR%\"/>\\n<circle cx=\"62\" cy=\"55\" r=\"3.5\" fill=\"%COLOR%\"/>\\n<circle cx=\"50\" cy=\"65\" r=\"4\" fill=\"%COLOR%\"/>',\n },\n chipmunk: {\n color: '#B5522C',\n markup:\n '<circle cx=\"50\" cy=\"52\" r=\"22\" fill=\"#FFFFFF\"/>\\n<path d=\"M28 34 L22 16 L38 28 Z\" fill=\"#FFFFFF\"/>\\n<path d=\"M72 34 L78 16 L62 28 Z\" fill=\"#FFFFFF\"/>\\n<circle cx=\"30\" cy=\"60\" r=\"8\" fill=\"#FFFFFF\"/>\\n<circle cx=\"70\" cy=\"60\" r=\"8\" fill=\"#FFFFFF\"/>\\n<path d=\"M50 75 Q70 70 78 85 Q65 95 50 88 Q35 95 22 85 Q30 70 50 75 Z\" fill=\"#FFFFFF\"/>\\n<path d=\"M40 88 Q50 82 60 88\" stroke=\"%COLOR%\" stroke-width=\"3\" fill=\"none\"/>',\n },\n chupacabra: {\n color: '#4B7A3F',\n markup:\n '<path d=\"M20 50 L15 35 M28 42 L25 22 M38 38 L38 15 M50 36 L50 12 M62 38 L62 15 M72 42 L75 22 M80 50 L85 35\" stroke=\"#FFFFFF\" stroke-width=\"4\" stroke-linecap=\"round\"/>\\n<ellipse cx=\"50\" cy=\"58\" rx=\"24\" ry=\"20\" fill=\"#FFFFFF\"/>\\n<circle cx=\"38\" cy=\"52\" r=\"6\" fill=\"%COLOR%\"/>\\n<circle cx=\"62\" cy=\"52\" r=\"6\" fill=\"%COLOR%\"/>\\n<circle cx=\"38\" cy=\"52\" r=\"3\" fill=\"#FFFFFF\"/>\\n<circle cx=\"62\" cy=\"52\" r=\"3\" fill=\"#FFFFFF\"/>',\n },\n dingo: {\n color: '#B5892C',\n markup:\n '<path d=\"M30 30 L22 10 L38 24 Z\" fill=\"#FFFFFF\"/>\\n<path d=\"M70 30 L78 10 L62 24 Z\" fill=\"#FFFFFF\"/>\\n<ellipse cx=\"50\" cy=\"55\" rx=\"22\" ry=\"18\" fill=\"#FFFFFF\"/>\\n<path d=\"M40 68 Q50 82 60 68 Q66 60 55 60 L45 60 Q34 60 40 68 Z\" fill=\"#FFFFFF\"/>',\n },\n dinosaur: {\n color: '#2E8F5B',\n markup:\n '<path d=\"M20 78 Q18 55 35 45 L38 25 L46 42 L55 30 L58 45 Q75 50 75 65 L78 78 Z\" fill=\"#FFFFFF\"/>\\n<path d=\"M40 45 L45 30 L50 45 L57 33 L60 45\" stroke=\"#FFFFFF\" stroke-width=\"0\" fill=\"#FFFFFF\"/>\\n<circle cx=\"42\" cy=\"40\" r=\"2.5\" fill=\"%COLOR%\"/>',\n },\n frog: {\n color: '#4FA33F',\n markup:\n '<circle cx=\"30\" cy=\"35\" r=\"14\" fill=\"#FFFFFF\"/>\\n<circle cx=\"70\" cy=\"35\" r=\"14\" fill=\"#FFFFFF\"/>\\n<circle cx=\"30\" cy=\"35\" r=\"6\" fill=\"%COLOR%\"/>\\n<circle cx=\"70\" cy=\"35\" r=\"6\" fill=\"%COLOR%\"/>\\n<ellipse cx=\"50\" cy=\"62\" rx=\"32\" ry=\"22\" fill=\"#FFFFFF\"/>\\n<path d=\"M25 65 Q50 78 75 65\" stroke=\"%COLOR%\" stroke-width=\"4\" fill=\"none\" stroke-linecap=\"round\"/>',\n },\n giraffe: {\n color: '#C99A2E',\n markup:\n '<path d=\"M42 90 L38 40 Q37 20 48 15 L55 15 Q62 20 58 28 Q52 30 52 38 L58 40 L54 90 Z\" fill=\"#FFFFFF\"/>\\n<circle cx=\"47\" cy=\"14\" r=\"3\" fill=\"#FFFFFF\"/>\\n<circle cx=\"58\" cy=\"14\" r=\"3\" fill=\"#FFFFFF\"/>\\n<ellipse cx=\"30\" cy=\"55\" rx=\"4\" ry=\"6\" fill=\"#FFFFFF\"/>\\n<ellipse cx=\"44\" cy=\"70\" rx=\"4\" ry=\"6\" fill=\"#FFFFFF\"/>\\n<ellipse cx=\"60\" cy=\"50\" rx=\"4\" ry=\"6\" fill=\"#FFFFFF\"/>',\n },\n hedgehog: {\n color: '#8A9A3B',\n markup:\n '<path d=\"M20 55 L10 40 M25 42 L18 25 M35 33 L30 15 M50 30 L48 10 M65 33 L70 15 M75 42 L82 25 M80 55 L90 40\" stroke=\"#FFFFFF\" stroke-width=\"4\" stroke-linecap=\"round\"/>\\n<circle cx=\"50\" cy=\"60\" r=\"26\" fill=\"#FFFFFF\"/>\\n<path d=\"M50 60 Q30 90 20 75 Q30 70 34 60 Z\" fill=\"#FFFFFF\"/>\\n<circle cx=\"30\" cy=\"56\" r=\"3.5\" fill=\"%COLOR%\"/>',\n },\n hippo: {\n color: '#5B7A9E',\n markup:\n '<ellipse cx=\"50\" cy=\"52\" rx=\"34\" ry=\"24\" fill=\"#FFFFFF\"/>\\n<circle cx=\"30\" cy=\"30\" r=\"7\" fill=\"#FFFFFF\"/>\\n<circle cx=\"70\" cy=\"30\" r=\"7\" fill=\"#FFFFFF\"/>\\n<circle cx=\"34\" cy=\"42\" r=\"3.5\" fill=\"%COLOR%\"/>\\n<circle cx=\"66\" cy=\"42\" r=\"3.5\" fill=\"%COLOR%\"/>\\n<ellipse cx=\"50\" cy=\"70\" rx=\"20\" ry=\"10\" fill=\"#FFFFFF\"/>\\n<path d=\"M35 70 Q50 78 65 70\" stroke=\"%COLOR%\" stroke-width=\"3\" fill=\"none\"/>',\n },\n jackal: {\n color: '#D6822C',\n markup:\n '<path d=\"M28 32 L18 8 L40 26 Z\" fill=\"#FFFFFF\"/>\\n<path d=\"M72 32 L82 8 L60 26 Z\" fill=\"#FFFFFF\"/>\\n<ellipse cx=\"50\" cy=\"55\" rx=\"20\" ry=\"17\" fill=\"#FFFFFF\"/>\\n<path d=\"M42 66 Q50 82 58 66 Q64 58 52 58 L48 58 Q36 58 42 66 Z\" fill=\"#FFFFFF\"/>',\n },\n jackalope: {\n color: '#2E9E9E',\n markup:\n '<path d=\"M35 20 L28 5 M35 20 L38 8\" stroke=\"#FFFFFF\" stroke-width=\"4\" stroke-linecap=\"round\" fill=\"none\"/>\\n<path d=\"M65 20 L72 5 M65 20 L62 8\" stroke=\"#FFFFFF\" stroke-width=\"4\" stroke-linecap=\"round\" fill=\"none\"/>\\n<ellipse cx=\"40\" cy=\"35\" rx=\"7\" ry=\"16\" fill=\"#FFFFFF\"/>\\n<ellipse cx=\"60\" cy=\"35\" rx=\"7\" ry=\"16\" fill=\"#FFFFFF\"/>\\n<ellipse cx=\"50\" cy=\"62\" rx=\"22\" ry=\"20\" fill=\"#FFFFFF\"/>\\n<ellipse cx=\"50\" cy=\"78\" rx=\"10\" ry=\"7\" fill=\"#FFFFFF\"/>',\n },\n mink: {\n color: '#3B7DD8',\n markup:\n '<ellipse cx=\"50\" cy=\"55\" rx=\"24\" ry=\"16\" fill=\"#FFFFFF\"/>\\n<ellipse cx=\"24\" cy=\"46\" rx=\"6\" ry=\"6\" fill=\"#FFFFFF\"/>\\n<ellipse cx=\"76\" cy=\"46\" rx=\"6\" ry=\"6\" fill=\"#FFFFFF\"/>\\n<ellipse cx=\"18\" cy=\"60\" rx=\"10\" ry=\"7\" fill=\"#FFFFFF\"/>\\n<circle cx=\"12\" cy=\"60\" r=\"2.5\" fill=\"%COLOR%\"/>',\n },\n otter: {\n color: '#E8622C',\n markup:\n '<circle cx=\"50\" cy=\"55\" r=\"24\" fill=\"#FFFFFF\"/>\\n<circle cx=\"30\" cy=\"38\" r=\"7\" fill=\"#FFFFFF\"/>\\n<circle cx=\"70\" cy=\"38\" r=\"7\" fill=\"#FFFFFF\"/>\\n<circle cx=\"38\" cy=\"52\" r=\"4\" fill=\"%COLOR%\"/>\\n<circle cx=\"62\" cy=\"52\" r=\"4\" fill=\"%COLOR%\"/>\\n<circle cx=\"50\" cy=\"62\" r=\"5\" fill=\"%COLOR%\"/>\\n<path d=\"M30 68 L15 65 M30 71 L14 71 M30 74 L15 77 M70 68 L85 65 M70 71 L86 71 M70 74 L85 77\" stroke=\"#FFFFFF\" stroke-width=\"3\" stroke-linecap=\"round\"/>',\n },\n platypus: {\n color: '#C23B7A',\n markup:\n '<ellipse cx=\"55\" cy=\"55\" rx=\"22\" ry=\"18\" fill=\"#FFFFFF\"/>\\n<path d=\"M18 52 Q10 55 18 62 Q35 68 42 55 Q35 45 18 52 Z\" fill=\"#FFFFFF\"/>',\n },\n quagga: {\n color: '#D6455C',\n markup:\n '<path d=\"M25 70 L30 30 Q35 20 45 22 L60 25 Q68 27 72 35 L75 55 L68 70 Z\" fill=\"#FFFFFF\"/>\\n<path d=\"M35 25 L20 10 M42 22 L34 6\" stroke=\"#FFFFFF\" stroke-width=\"4\" stroke-linecap=\"round\"/>\\n<rect x=\"33\" y=\"30\" width=\"6\" height=\"10\" fill=\"%COLOR%\"/>\\n<rect x=\"45\" y=\"32\" width=\"6\" height=\"12\" fill=\"%COLOR%\"/>\\n<rect x=\"57\" y=\"35\" width=\"6\" height=\"12\" fill=\"%COLOR%\"/>',\n },\n raccoon: {\n color: '#E0348E',\n markup:\n '<circle cx=\"50\" cy=\"55\" r=\"24\" fill=\"#FFFFFF\"/>\\n<path d=\"M25 35 L18 15 L38 28 Z\" fill=\"#FFFFFF\"/>\\n<path d=\"M75 35 L82 15 L62 28 Z\" fill=\"#FFFFFF\"/>\\n<ellipse cx=\"36\" cy=\"52\" rx=\"9\" ry=\"6\" fill=\"%COLOR%\"/>\\n<ellipse cx=\"64\" cy=\"52\" rx=\"9\" ry=\"6\" fill=\"%COLOR%\"/>\\n<circle cx=\"50\" cy=\"63\" r=\"4\" fill=\"%COLOR%\"/>',\n },\n skunk: {\n color: '#7B3F9E',\n markup:\n '<circle cx=\"38\" cy=\"55\" r=\"18\" fill=\"#FFFFFF\"/>\\n<path d=\"M50 45 Q85 30 85 65 Q85 90 55 82 Q78 68 65 55 Q60 48 50 45 Z\" fill=\"#FFFFFF\"/>\\n<path d=\"M55 45 Q80 35 80 65\" stroke=\"%COLOR%\" stroke-width=\"4\" fill=\"none\" stroke-linecap=\"round\"/>\\n<ellipse cx=\"24\" cy=\"48\" rx=\"4\" ry=\"5\" fill=\"%COLOR%\"/>',\n },\n};\n","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\n// AUTO-GENERATED FILE. Do not edit directly.\n// Regenerate with: node scripts/generate-anonymous-entity-icons.mjs\n// Source SVGs live in static/images/entity.\n\nexport interface AnonymousEntityIcon {\n /** The entity icon's curated default background color (hex). */\n color: string;\n /** Inner SVG markup (no outer <svg>/<rect>). Any \"%COLOR%\" token is the icon's\n * color, substitutable at render time so a custom \"bg\" recolors accents too. */\n markup: string;\n}\n\nexport const ANONYMOUS_ENTITY_ICONS: Record<string, AnonymousEntityIcon> = {\n anchor: {\n color: '#D6455C',\n markup:\n '<circle cx=\"50\" cy=\"18\" r=\"8\" fill=\"none\" stroke=\"#FFFFFF\" stroke-width=\"6\"/>\\n<rect x=\"46\" y=\"26\" width=\"8\" height=\"50\" fill=\"#FFFFFF\"/>\\n<path d=\"M20 55 Q20 80 50 82 Q80 80 80 55\" fill=\"none\" stroke=\"#FFFFFF\" stroke-width=\"7\"/>\\n<rect x=\"28\" y=\"42\" width=\"44\" height=\"7\" fill=\"#FFFFFF\"/>',\n },\n antenna: {\n color: '#8A9A3B',\n markup:\n '<rect x=\"46\" y=\"45\" width=\"8\" height=\"40\" fill=\"#FFFFFF\"/>\\n<circle cx=\"50\" cy=\"35\" r=\"7\" fill=\"#FFFFFF\"/>\\n<path d=\"M35 30 Q50 10 65 30 M28 40 Q50 8 72 40\" fill=\"none\" stroke=\"#FFFFFF\" stroke-width=\"5\" stroke-linecap=\"round\"/>',\n },\n anvil: {\n color: '#B5522C',\n markup:\n '<rect x=\"20\" y=\"30\" width=\"60\" height=\"14\" rx=\"3\" fill=\"#FFFFFF\"/>\\n<polygon points=\"35,44 65,44 58,60 42,60\" fill=\"#FFFFFF\"/>\\n<rect x=\"42\" y=\"60\" width=\"16\" height=\"10\" fill=\"#FFFFFF\"/>\\n<rect x=\"30\" y=\"70\" width=\"40\" height=\"12\" rx=\"3\" fill=\"#FFFFFF\"/>',\n },\n arch: {\n color: '#E0348E',\n markup:\n '<path d=\"M20 85 L20 50 Q20 15 50 15 Q80 15 80 50 L80 85 Z\" fill=\"none\" stroke=\"#FFFFFF\" stroke-width=\"10\"/>',\n },\n bot_head: {\n color: '#3B7DD8',\n markup:\n '<rect x=\"26\" y=\"30\" width=\"48\" height=\"42\" rx=\"12\" fill=\"#FFFFFF\"/>\\n<circle cx=\"40\" cy=\"50\" r=\"5\" fill=\"%COLOR%\"/>\\n<circle cx=\"60\" cy=\"50\" r=\"5\" fill=\"%COLOR%\"/>\\n<rect x=\"46\" y=\"12\" width=\"8\" height=\"16\" fill=\"#FFFFFF\"/>\\n<circle cx=\"50\" cy=\"10\" r=\"5\" fill=\"#FFFFFF\"/>\\n<rect x=\"14\" y=\"45\" width=\"8\" height=\"14\" rx=\"3\" fill=\"#FFFFFF\"/>\\n<rect x=\"78\" y=\"45\" width=\"8\" height=\"14\" rx=\"3\" fill=\"#FFFFFF\"/>',\n },\n brain: {\n color: '#7B3F9E',\n markup:\n '<path d=\"M50 15 Q30 15 28 32 Q14 34 16 50 Q10 58 18 66 Q18 80 34 80 Q38 88 50 85 Q62 88 66 80 Q82 80 82 66 Q90 58 84 50 Q86 34 72 32 Q70 15 50 15 Z\" fill=\"#FFFFFF\"/>\\n<path d=\"M50 22 L50 78 M35 35 Q45 45 35 55 Q45 65 35 75 M65 35 Q55 45 65 55 Q55 65 65 75\" stroke=\"%COLOR%\" stroke-width=\"3\" fill=\"none\"/>',\n },\n bridge: {\n color: '#B5892C',\n markup:\n '<path d=\"M10 55 Q50 20 90 55\" fill=\"none\" stroke=\"#FFFFFF\" stroke-width=\"7\"/>\\n<rect x=\"10\" y=\"55\" width=\"80\" height=\"8\" fill=\"#FFFFFF\"/>\\n<rect x=\"20\" y=\"63\" width=\"6\" height=\"18\" fill=\"#FFFFFF\"/>\\n<rect x=\"74\" y=\"63\" width=\"6\" height=\"18\" fill=\"#FFFFFF\"/>',\n },\n chevron: {\n color: '#C99A2E',\n markup:\n '<polygon points=\"15,30 50,30 85,60 50,60\" fill=\"#FFFFFF\"/>\\n<polygon points=\"15,55 50,55 85,85 50,85\" fill=\"#FFFFFF\" opacity=\"0.55\"/>',\n },\n circuit_node: {\n color: '#5B7A9E',\n markup:\n '<circle cx=\"50\" cy=\"50\" r=\"10\" fill=\"#FFFFFF\"/>\\n<circle cx=\"20\" cy=\"20\" r=\"7\" fill=\"#FFFFFF\"/>\\n<circle cx=\"80\" cy=\"20\" r=\"7\" fill=\"#FFFFFF\"/>\\n<circle cx=\"20\" cy=\"80\" r=\"7\" fill=\"#FFFFFF\"/>\\n<circle cx=\"80\" cy=\"80\" r=\"7\" fill=\"#FFFFFF\"/>\\n<path d=\"M50 50 L20 20 M50 50 L80 20 M50 50 L20 80 M50 50 L80 80\" stroke=\"#FFFFFF\" stroke-width=\"5\"/>',\n },\n compass: {\n color: '#4FA33F',\n markup:\n '<circle cx=\"50\" cy=\"50\" r=\"34\" fill=\"none\" stroke=\"#FFFFFF\" stroke-width=\"6\"/>\\n<polygon points=\"50,28 58,50 50,72 42,50\" fill=\"#FFFFFF\"/>',\n },\n cube: {\n color: '#2E9E9E',\n markup:\n '<polygon points=\"50,12 84,30 84,70 50,88 16,70 16,30\" fill=\"#FFFFFF\" opacity=\"0.35\"/>\\n<polygon points=\"50,12 84,30 50,48 16,30\" fill=\"#FFFFFF\"/>\\n<polygon points=\"50,48 84,30 84,70 50,88\" fill=\"#FFFFFF\" opacity=\"0.7\"/>',\n },\n diamond: {color: '#E8622C', markup: '<polygon points=\"50,12 82,50 50,88 18,50\" fill=\"#FFFFFF\"/>'},\n dome: {\n color: '#D6822C',\n markup:\n '<path d=\"M20 85 L20 55 Q20 20 50 20 Q80 20 80 55 L80 85 Z\" fill=\"#FFFFFF\"/>\\n<rect x=\"46\" y=\"8\" width=\"8\" height=\"12\" fill=\"#FFFFFF\"/>\\n<circle cx=\"50\" cy=\"6\" r=\"4\" fill=\"#FFFFFF\"/>',\n },\n gate: {\n color: '#3B7DD8',\n markup: '<path d=\"M22 85 L22 40 Q22 15 50 15 Q78 15 78 40 L78 85\" fill=\"none\" stroke=\"#FFFFFF\" stroke-width=\"12\"/>',\n },\n hexagon: {color: '#3B7DD8', markup: '<polygon points=\"50,15 82,33 82,67 50,85 18,67 18,33\" fill=\"#FFFFFF\"/>'},\n key: {\n color: '#C99A2E',\n markup:\n '<circle cx=\"30\" cy=\"35\" r=\"16\" fill=\"none\" stroke=\"#FFFFFF\" stroke-width=\"8\"/>\\n<rect x=\"42\" y=\"46\" width=\"42\" height=\"9\" fill=\"#FFFFFF\"/>\\n<rect x=\"66\" y=\"55\" width=\"9\" height=\"14\" fill=\"#FFFFFF\"/>\\n<rect x=\"78\" y=\"55\" width=\"9\" height=\"20\" fill=\"#FFFFFF\"/>',\n },\n lighthouse: {\n color: '#D6455C',\n markup:\n '<polygon points=\"42,85 58,85 54,25 46,25\" fill=\"#FFFFFF\"/>\\n<rect x=\"40\" y=\"15\" width=\"20\" height=\"12\" fill=\"#FFFFFF\"/>\\n<polygon points=\"38,15 62,15 50,5\" fill=\"#FFFFFF\"/>\\n<rect x=\"30\" y=\"85\" width=\"40\" height=\"6\" fill=\"#FFFFFF\"/>',\n },\n lock: {\n color: '#E0348E',\n markup:\n '<rect x=\"26\" y=\"45\" width=\"48\" height=\"38\" rx=\"6\" fill=\"#FFFFFF\"/>\\n<path d=\"M34 45 L34 32 Q34 14 50 14 Q66 14 66 32 L66 45\" fill=\"none\" stroke=\"#FFFFFF\" stroke-width=\"8\"/>\\n<circle cx=\"50\" cy=\"63\" r=\"6\" fill=\"%COLOR%\"/>',\n },\n neural_net: {\n color: '#2E9E9E',\n markup:\n '<circle cx=\"50\" cy=\"20\" r=\"8\" fill=\"#FFFFFF\"/>\\n<circle cx=\"22\" cy=\"50\" r=\"8\" fill=\"#FFFFFF\"/>\\n<circle cx=\"78\" cy=\"50\" r=\"8\" fill=\"#FFFFFF\"/>\\n<circle cx=\"35\" cy=\"82\" r=\"8\" fill=\"#FFFFFF\"/>\\n<circle cx=\"65\" cy=\"82\" r=\"8\" fill=\"#FFFFFF\"/>\\n<path d=\"M50 20 L22 50 M50 20 L78 50 M22 50 L35 82 M22 50 L65 82 M78 50 L35 82 M78 50 L65 82\" stroke=\"#FFFFFF\" stroke-width=\"3\"/>',\n },\n obelisk: {color: '#5B6BC0', markup: '<polygon points=\"50,8 62,25 62,85 38,85 38,25\" fill=\"#FFFFFF\"/>'},\n octagon: {\n color: '#B5522C',\n markup: '<polygon points=\"35,15 65,15 85,35 85,65 65,85 35,85 15,65 15,35\" fill=\"#FFFFFF\"/>',\n },\n orbit_ring: {\n color: '#4FA33F',\n markup:\n '<circle cx=\"50\" cy=\"50\" r=\"10\" fill=\"#FFFFFF\"/>\\n<ellipse cx=\"50\" cy=\"50\" rx=\"38\" ry=\"16\" fill=\"none\" stroke=\"#FFFFFF\" stroke-width=\"5\" transform=\"rotate(-25 50 50)\"/>',\n },\n parallelogram: {color: '#2E8F5B', markup: '<polygon points=\"30,25 90,25 70,75 10,75\" fill=\"#FFFFFF\"/>'},\n pavilion: {\n color: '#4FA33F',\n markup:\n '<polygon points=\"50,12 90,45 10,45\" fill=\"#FFFFFF\"/>\\n<rect x=\"20\" y=\"45\" width=\"60\" height=\"40\" fill=\"#FFFFFF\" opacity=\"0.6\"/>\\n<rect x=\"44\" y=\"20\" width=\"6\" height=\"14\" fill=\"#FFFFFF\"/>',\n },\n pentagon: {color: '#7B3F9E', markup: '<polygon points=\"50,12 86,38 72,82 28,82 14,38\" fill=\"#FFFFFF\"/>'},\n plus_facet: {\n color: '#E0348E',\n markup:\n '<polygon points=\"38,12 62,12 62,38 88,38 88,62 62,62 62,88 38,88 38,62 12,62 12,38 38,38\" fill=\"#FFFFFF\"/>',\n },\n silo: {\n color: '#8A6A2E',\n markup:\n '<rect x=\"30\" y=\"35\" width=\"40\" height=\"50\" fill=\"#FFFFFF\"/>\\n<ellipse cx=\"50\" cy=\"35\" rx=\"20\" ry=\"10\" fill=\"#FFFFFF\"/>\\n<path d=\"M35 20 Q50 5 65 20\" fill=\"none\" stroke=\"#FFFFFF\" stroke-width=\"6\" stroke-linecap=\"round\"/>',\n },\n spiral: {\n color: '#8A9A3B',\n markup:\n '<path d=\"M50 50 m-30 0 a30 30 0 1 1 60 0 a22 22 0 1 1 -44 0 a14 14 0 1 1 28 0 a6 6 0 1 1 -12 0\" fill=\"none\" stroke=\"#FFFFFF\" stroke-width=\"6\" stroke-linecap=\"round\"/>',\n },\n spire: {\n color: '#7B3F9E',\n markup:\n '<polygon points=\"50,8 62,50 38,50\" fill=\"#FFFFFF\"/>\\n<rect x=\"30\" y=\"50\" width=\"40\" height=\"35\" fill=\"#FFFFFF\"/>',\n },\n star: {\n color: '#5B6BC0',\n markup: '<polygon points=\"50,10 61,38 90,38 66,56 75,86 50,68 25,86 34,56 10,38 39,38\" fill=\"#FFFFFF\"/>',\n },\n tower: {\n color: '#C23B7A',\n markup:\n '<rect x=\"38\" y=\"20\" width=\"24\" height=\"65\" fill=\"#FFFFFF\"/>\\n<polygon points=\"50,8 62,20 38,20\" fill=\"#FFFFFF\"/>\\n<rect x=\"44\" y=\"32\" width=\"6\" height=\"8\" fill=\"%COLOR%\"/>\\n<rect x=\"44\" y=\"48\" width=\"6\" height=\"8\" fill=\"%COLOR%\"/>\\n<rect x=\"44\" y=\"64\" width=\"6\" height=\"8\" fill=\"%COLOR%\"/>',\n },\n townhouse: {\n color: '#5B7A9E',\n markup:\n '<polygon points=\"50,15 82,35 82,85 18,85 18,35\" fill=\"#FFFFFF\"/>\\n<rect x=\"42\" y=\"60\" width=\"16\" height=\"25\" fill=\"%COLOR%\"/>\\n<rect x=\"26\" y=\"45\" width=\"10\" height=\"10\" fill=\"%COLOR%\"/>\\n<rect x=\"64\" y=\"45\" width=\"10\" height=\"10\" fill=\"%COLOR%\"/>',\n },\n triangle_stack: {\n color: '#D6455C',\n markup:\n '<polygon points=\"50,15 78,60 22,60\" fill=\"#FFFFFF\"/>\\n<polygon points=\"50,42 90,88 10,88\" fill=\"#FFFFFF\" opacity=\"0.55\"/>',\n },\n turbine: {\n color: '#7B3F9E',\n markup:\n '<circle cx=\"50\" cy=\"50\" r=\"9\" fill=\"#FFFFFF\"/>\\n<path d=\"M50 50 Q20 40 20 15 Q50 25 50 50 Q80 40 80 15 Q50 25 50 50 Q80 60 80 85 Q50 75 50 50 Q20 60 20 85 Q50 75 50 50\" fill=\"#FFFFFF\"/>',\n },\n valve: {\n color: '#D68A2C',\n markup:\n '<circle cx=\"50\" cy=\"50\" r=\"12\" fill=\"#FFFFFF\"/>\\n<path d=\"M50 20 L50 32 M50 68 L50 80 M20 50 L32 50 M68 50 L80 50 M30 30 L38 38 M62 62 L70 70 M70 30 L62 38 M38 62 L30 70\" stroke=\"#FFFFFF\" stroke-width=\"6\" stroke-linecap=\"round\"/>',\n },\n windmill: {\n color: '#2E9E9E',\n markup:\n '<polygon points=\"46,85 54,85 52,25 48,25\" fill=\"#FFFFFF\"/>\\n<circle cx=\"50\" cy=\"25\" r=\"5\" fill=\"#FFFFFF\"/>\\n<path d=\"M50 25 L25 10 M50 25 L75 10 M50 25 L25 40 M50 25 L75 40\" stroke=\"#FFFFFF\" stroke-width=\"6\" stroke-linecap=\"round\"/>',\n },\n};\n","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * 32-bit unsigned polynomial hash (`h = h*31 + charCode`), used to deterministically derive\n * avatar colors/icons from a seed string. Shared by every avatar util that needs the same\n * hash so seeds map identically across them.\n *\n * @example\n * ```typescript\n * hashStr('session-abc123');\n * ```\n */\nconst hashStr = (str: string): number => {\n let h = 0;\n for (let i = 0; i < str.length; i++) {\n h = (h * 31 + str.charCodeAt(i)) >>> 0;\n }\n return h;\n};\n\nexport default hashStr;\n","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {ANONYMOUS_ANIMAL_ICONS} from './anonymousAnimalIcons.generated';\nimport hashStr from './hashStr';\n\nconst ANONYMOUS_AVATAR_NAMES: string[] = Object.keys(ANONYMOUS_ANIMAL_ICONS).sort();\n\n/**\n * Deterministically picks one of the curated anonymous-avatar animal keys for a given seed\n * (e.g. a session or device identifier), so the same seed always maps to the same avatar.\n *\n * Use this to derive the `content` value for an `avatar:variant=anonymous_animal` spec —\n * the spec parser itself does no hashing, it just looks up whatever key it's given.\n *\n * @param seed - Seed text the pick is derived from. Falls back to a random pick when omitted.\n * @returns An anonymous animal key (e.g. `\"otter\"`) usable as `avatar:` spec's `content` param.\n *\n * @example\n * ```typescript\n * pickAnonymousAvatarName('session-abc123'); // \"otter\"\n * `avatar:variant=anonymous_animal,content=${pickAnonymousAvatarName(sessionId)}`;\n * ```\n */\nconst pickAnonymousAvatarName = (seed?: string): string => {\n const index: number = seed\n ? hashStr(seed) % ANONYMOUS_AVATAR_NAMES.length\n : Math.floor(Math.random() * ANONYMOUS_AVATAR_NAMES.length);\n\n return ANONYMOUS_AVATAR_NAMES[index];\n};\n\nexport default pickAnonymousAvatarName;\n","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {ANONYMOUS_ENTITY_ICONS} from './anonymousEntityIcons.generated';\nimport hashStr from './hashStr';\n\nconst ANONYMOUS_ENTITY_NAMES: string[] = Object.keys(ANONYMOUS_ENTITY_ICONS).sort();\n\n/**\n * Deterministically picks one of the curated anonymous-entity icon keys for a given seed\n * (e.g. an application, organization, or resource server identifier), so the same seed\n * always maps to the same icon.\n *\n * Use this to derive the `content` value for an `avatar:variant=anonymous_entity` spec —\n * the spec parser itself does no hashing, it just looks up whatever key it's given.\n *\n * @param seed - Seed text the pick is derived from. Falls back to a random pick when omitted.\n * @returns An anonymous entity key (e.g. `\"hexagon\"`) usable as `avatar:` spec's `content` param.\n *\n * @example\n * ```typescript\n * pickAnonymousEntityName('app-abc123'); // \"hexagon\"\n * `avatar:variant=anonymous_entity,content=${pickAnonymousEntityName(appId)}`;\n * ```\n */\nconst pickAnonymousEntityName = (seed?: string): string => {\n const index: number = seed\n ? hashStr(seed) % ANONYMOUS_ENTITY_NAMES.length\n : Math.floor(Math.random() * ANONYMOUS_ENTITY_NAMES.length);\n\n return ANONYMOUS_ENTITY_NAMES[index];\n};\n\nexport default pickAnonymousEntityName;\n","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {ANONYMOUS_ANIMAL_ICONS} from './anonymousAnimalIcons.generated';\nimport {ANONYMOUS_ENTITY_ICONS} from './anonymousEntityIcons.generated';\nimport type {AvatarParams} from './extractAvatarParamsFromUri';\nimport hashStr from './hashStr';\nimport pickAnonymousAvatarName from './pickAnonymousAvatarName';\nimport pickAnonymousEntityName from './pickAnonymousEntityName';\n\n// Curated on-brand gradient pairs — `colors` rotates through this set.\nconst AVATAR_PALETTES: [string, string][] = [\n ['#FF7300', '#EF4223'],\n ['#3688FF', '#1d5eb4'],\n ['#5567D5', '#8B6FE8'],\n ['#06b6d4', '#0891b2'],\n ['#10b981', '#059669'],\n ['#ec4899', '#be185d'],\n ['#f59e0b', '#ea580c'],\n ['#8b5cf6', '#6d28d9'],\n ['#5CD1FF', '#3688FF'],\n ['#ef4444', '#b91c1c'],\n];\n\n/**\n * Number of distinct gradient rotations `colors` cycles through for the `blank`,\n * `one_letter`, and `two_letter` variants. Callers that offer a \"pick a background\" UI\n * (e.g. a shuffleable swatch grid) can sample `colors` indices in `[0, AVATAR_GRADIENT_COUNT)`\n * without needing the actual palette values.\n */\nexport const AVATAR_GRADIENT_COUNT: number = AVATAR_PALETTES.length;\n\nconst XML_ESCAPES: Record<string, string> = {'\"': '&quot;', '&': '&amp;', \"'\": '&apos;', '<': '&lt;', '>': '&gt;'};\n\n/**\n * Escapes a caller-supplied value for interpolation into SVG text.\n */\nconst escapeXml = (value: string): string => value.replace(/[\"&'<>]/g, (ch: string) => XML_ESCAPES[ch]);\n\n/**\n * Encodes an SVG document as a data URI. Lone UTF-16 surrogates are replaced with U+FFFD\n * first, since `encodeURIComponent` throws a `URIError` on them. `Array.from` iterates by\n * code point, so a surrogate it yields on its own is unpaired.\n */\nconst toSvgDataUri = (svg: string): string =>\n `data:image/svg+xml,${encodeURIComponent(\n Array.from(svg, (ch: string) => (ch.length === 1 && ch >= '\\uD800' && ch <= '\\uDFFF' ? '\\uFFFD' : ch)).join(''),\n )}`;\n\n/**\n * Fills in `params.content` when the spec itself didn't carry one, deriving it from a raw\n * seed name (e.g. an app or user display name) — extracting initials for letter variants,\n * or hash-picking a curated animal key for `anonymous_animal`.\n *\n * Callers that already have a final `content` value (pre-computed initials, or an exact\n * animal key) should skip this and pass it directly instead.\n *\n * @param variant - The avatar variant `content` is being derived for.\n * @param seedText - A raw name/seed to derive `content` from.\n * @returns A ready-to-render `content` value.\n *\n * @example\n * ```typescript\n * deriveAvatarContent('two_letter', 'Jane Doe'); // \"JD\"\n * deriveAvatarContent('anonymous_animal', 'session-abc123'); // \"otter\"\n * deriveAvatarContent('anonymous_entity', 'app-abc123'); // \"hexagon\"\n * deriveAvatarContent('blank', 'Jane Doe'); // \"\"\n * ```\n */\nexport const deriveAvatarContent = (variant: AvatarParams['variant'], seedText: string): string => {\n if (variant === 'anonymous_animal') {\n return pickAnonymousAvatarName(seedText || undefined);\n }\n if (variant === 'anonymous_entity') {\n return pickAnonymousEntityName(seedText || undefined);\n }\n if (variant === 'blank') {\n return '';\n }\n\n const letterCount: 1 | 2 = variant === 'one_letter' ? 1 : 2;\n return (seedText.match(/[A-Za-z0-9]/g) ?? ['A']).slice(0, letterCount).join('').toUpperCase();\n};\n\n/**\n * Renders the 100x100 background shape, filled either with a gradient/flat-color reference.\n */\nconst shapeMarkup = (shape: AvatarParams['shape'], fill: string): string =>\n shape === 'circle'\n ? `<circle cx=\"50\" cy=\"50\" r=\"50\" fill=\"${fill}\"/>`\n : `<rect width=\"100\" height=\"100\" rx=\"22\" fill=\"${fill}\"/>`;\n\n/**\n * Renders a Vercel-style gradient avatar: a rounded/circle swatch, either bare (`blank`) or\n * topped with initials (`one_letter`/`two_letter`). `content` is assumed final (already the\n * initials to display, or empty for `blank`) — pass it through {@link deriveAvatarContent}\n * first if it needs deriving.\n */\nconst generateGradientAvatar = ({shape, variant, content, colors, bg}: AvatarParams): string => {\n let background: string;\n let defs = '';\n if (bg) {\n background = bg;\n } else {\n const h: number = hashStr(content || 'App');\n const idx: number = (((h + colors) % AVATAR_PALETTES.length) + AVATAR_PALETTES.length) % AVATAR_PALETTES.length;\n const [c1, c2] = AVATAR_PALETTES[idx];\n const angle: number = ((((h >> 4) + colors * 37) % 360) + 360) % 360;\n defs = `<defs><linearGradient id=\"g\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\" gradientTransform=\"rotate(${angle} 0.5 0.5)\"><stop offset=\"0%\" stop-color=\"${c1}\"/><stop offset=\"100%\" stop-color=\"${c2}\"/></linearGradient></defs>`;\n background = 'url(#g)';\n }\n\n let text = '';\n if (variant !== 'blank') {\n const letterCount: 1 | 2 = variant === 'one_letter' ? 1 : 2;\n const initials: string = escapeXml(\n Array.from((content || 'A').toUpperCase())\n .slice(0, letterCount)\n .join(''),\n );\n const fontSize: number = letterCount === 1 ? 46 : 34;\n text = `<text x=\"50\" y=\"64\" font-family=\"Helvetica,Arial,sans-serif\" font-weight=\"700\" font-size=\"${fontSize}\" text-anchor=\"middle\" fill=\"#fff\">${initials}</text>`;\n }\n\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 100 100\">${defs}${shapeMarkup(shape, background)}${text}</svg>`;\n return toSvgDataUri(svg);\n};\n\n/**\n * Renders one of the curated anonymous-animal icons, applying the requested background\n * shape and (optionally) recoloring the whole icon with `bg`. `content` is assumed to\n * already be a valid animal key — pass it through {@link deriveAvatarContent} first if\n * it needs deriving, or if it might be invalid/empty.\n */\nconst generateAnonymousAnimalAvatar = ({shape, content, bg}: AvatarParams): string => {\n const key: string = Object.prototype.hasOwnProperty.call(ANONYMOUS_ANIMAL_ICONS, content)\n ? content\n : pickAnonymousAvatarName();\n const icon = ANONYMOUS_ANIMAL_ICONS[key];\n const color: string = bg ?? icon.color;\n const markup: string = icon.markup.replaceAll('%COLOR%', color);\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 100 100\">${shapeMarkup(shape, color)}${markup}</svg>`;\n return toSvgDataUri(svg);\n};\n\n/**\n * Renders one of the curated anonymous-entity icons (application/organization/resource-server\n * shapes), applying the requested background shape and (optionally) recoloring the whole icon\n * with `bg`. `content` is assumed to already be a valid entity key — pass it through\n * {@link deriveAvatarContent} first if it needs deriving, or if it might be invalid/empty.\n */\nconst generateAnonymousEntityAvatar = ({shape, content, bg}: AvatarParams): string => {\n const key: string = Object.prototype.hasOwnProperty.call(ANONYMOUS_ENTITY_ICONS, content)\n ? content\n : pickAnonymousEntityName();\n const icon = ANONYMOUS_ENTITY_ICONS[key];\n const color: string = bg ?? icon.color;\n const markup: string = icon.markup.replaceAll('%COLOR%', color);\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 100 100\">${shapeMarkup(shape, color)}${markup}</svg>`;\n return toSvgDataUri(svg);\n};\n\n/**\n * Generates an avatar image as an `svg+xml` data URI from a fully-resolved {@link AvatarParams}.\n * `params.content` is assumed final; use {@link deriveAvatarContent} first if it might be\n * empty or otherwise needs deriving from a raw seed name.\n *\n * @param params - Resolved avatar parameters (see {@link AvatarParams}).\n * @returns A `data:image/svg+xml,...` URI rendering the generated avatar.\n *\n * @example\n * ```typescript\n * generateAvatarDataUri({shape: 'circle', variant: 'two_letter', content: 'BM', colors: 2});\n * generateAvatarDataUri({shape: 'rounded', variant: 'anonymous_animal', content: 'jackalope'});\n * generateAvatarDataUri({shape: 'rounded', variant: 'anonymous_entity', content: 'hexagon'});\n * generateAvatarDataUri({shape: 'circle', variant: 'blank', content: '', colors: 5});\n * ```\n */\nconst generateAvatarDataUri = (params: AvatarParams): string => {\n if (params.variant === 'anonymous_animal') {\n return generateAnonymousAnimalAvatar(params);\n }\n if (params.variant === 'anonymous_entity') {\n return generateAnonymousEntityAvatar(params);\n }\n return generateGradientAvatar(params);\n};\n\nexport default generateAvatarDataUri;\n","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {extractEmojiFromUri, isEmojiUri} from '@thunderid/javascript';\nimport extractAvatarParamsFromUri, {type AvatarParams} from './extractAvatarParamsFromUri';\nimport generateAvatarDataUri, {deriveAvatarContent} from './generateAvatarDataUri';\nimport isAvatarUri from './isAvatarUri';\n\nexport type ResolvedLogoKind = 'avatar' | 'emoji' | 'url';\n\nexport interface ResolvedLogo {\n /**\n * Rendered image source (a data URI or plain URL). Absent when `kind` is `\"emoji\"`.\n */\n imgSrc?: string;\n /**\n * The emoji glyph to render. Only present when `kind` is `\"emoji\"`.\n */\n glyph?: string;\n /**\n * Which logo spec variant was resolved.\n */\n kind: ResolvedLogoKind;\n}\n\n/**\n * Resolves an application logo spec string — `emoji:<glyph>`, `avatar:shape=...,variant=...,\n * content=...,colors=...,bg=...`, or a bare URL — into a renderable representation.\n *\n * A spec in none of the recognized schemes falls back to treating it as a plain URL so\n * callers can always render *something* without special-casing.\n *\n * @param spec - The stored logo spec string.\n * @param fallbackSeedText - Raw seed name (e.g. an app or user display name) used to derive\n * an `avatar:` spec's `content` when the spec itself doesn't carry one (e.g. an app name\n * to keep the avatar in sync as it changes).\n * @returns The resolved logo, ready to render.\n *\n * @example\n * ```typescript\n * resolveLogoUri(\"emoji:🛡️\"); // { kind: \"emoji\", glyph: \"🛡️\" }\n * resolveLogoUri(\"avatar:shape=circle,variant=two_letter,content=BM\"); // { kind: \"avatar\", imgSrc: \"data:image/svg+xml,...\" }\n * resolveLogoUri(\"https://example.com/logo.png\"); // { kind: \"url\", imgSrc: \"https://example.com/logo.png\" }\n * ```\n */\nconst resolveLogoUri = (spec: string, fallbackSeedText = ''): ResolvedLogo => {\n if (isEmojiUri(spec)) {\n return {glyph: extractEmojiFromUri(spec), kind: 'emoji'};\n }\n\n if (isAvatarUri(spec)) {\n const params: AvatarParams = extractAvatarParamsFromUri(spec);\n const content: string = params.content || deriveAvatarContent(params.variant, fallbackSeedText);\n return {imgSrc: generateAvatarDataUri({...params, content}), kind: 'avatar'};\n }\n\n return {imgSrc: spec, kind: 'url'};\n};\n\nexport default resolveLogoUri;\n","// Copyright 2025 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\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 * A `MediaQueryList` returned by `createMediaQueryListener`, with a `disconnect()` that removes the\n * listener it registered.\n */\nexport type MediaQueryListener = MediaQueryList & {\n /** Stops calling the callback on system theme changes. */\n disconnect: () => void;\n};\n\n/**\n * Creates a media query listener for system theme changes. Call `disconnect()` on the returned\n * object to remove the listener.\n */\nexport const createMediaQueryListener = (callback: (isDark: boolean) => void): MediaQueryListener | 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 Object.assign(mediaQuery, {\n disconnect: (): void => {\n if (mediaQuery.removeEventListener) {\n mediaQuery.removeEventListener('change', handleChange);\n } else {\n mediaQuery.removeListener(handleChange);\n }\n },\n });\n};\n","// Copyright 2025 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\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","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {FlowMetaThemeShape} from '@thunderid/javascript';\n\n/**\n * Size configuration in the v2 theme.\n *\n * @experimental This API may change in future versions\n */\ninterface FlowMetaThemeSize {\n small?: string;\n medium?: string;\n large?: string;\n}\n/**\n * Normalizes a raw `shape.borderRadius` value into per-size tokens suitable\n * for `ThemeConfig.borderRadius`.\n *\n * - Object with `small`/`medium`/`large` → used directly.\n * - Bare number or numeric string (e.g. `8` or `\"8\"`) → appended with `px` and applied uniformly.\n * - Pixel string (e.g. `\"8px\"`) → used as-is and applied uniformly.\n */\nconst normalizeBorderRadius = (raw: FlowMetaThemeShape['borderRadius']): FlowMetaThemeSize | undefined => {\n if (raw === undefined) return undefined;\n\n if (typeof raw === 'object') {\n const {small, medium, large}: FlowMetaThemeSize = raw;\n if (small === undefined && medium === undefined && large === undefined) return undefined;\n return {\n ...(large !== undefined && {large}),\n ...(medium !== undefined && {medium}),\n ...(small !== undefined && {small}),\n };\n }\n\n const trimmed: string = String(raw).trim();\n const radiusStr: string =\n typeof raw === 'number' ? `${raw}px` : /^\\d+(\\.\\d+)?$/.test(trimmed) ? `${trimmed}px` : trimmed;\n return {large: radiusStr, medium: radiusStr, small: radiusStr};\n};\n\nexport default normalizeBorderRadius;\n"],"x_google_ignoreList":[13,14,15],"mappings":"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H;CACD,OAAO;EACL,OAAO;EACP,QACE;EACH;CACD,UAAU;EACR,OAAO;EACP,QACE;EACH;CACD,MAAM;EACJ,OAAO;EACP,QACE;EACH;CACD,SAAS;EACP,OAAO;EACP,QACE;EACH;CACD,UAAU;EACR,OAAO;EACP,QACE;EACH;CACD,OAAO;EACL,OAAO;EACP,QACE;EACH;CACD,QAAQ;EACN,OAAO;EACP,QACE;EACH;CACD,WAAW;EACT,OAAO;EACP,QACE;EACH;CACD,MAAM;EACJ,OAAO;EACP,QACE;EACH;CACD,OAAO;EACL,OAAO;EACP,QACE;EACH;CACD,UAAU;EACR,OAAO;EACP,QACE;EACH;CACD,QAAQ;EACN,OAAO;EACP,QACE;EACH;CACD,SAAS;EACP,OAAO;EACP,QACE;EACH;CACD,OAAO;EACL,OAAO;EACP,QACE;EACH;CACF;;;;AChGD,MAAaC,yBAA8D;CACzE,QAAQ;EACN,OAAO;EACP,QACE;EACH;CACD,SAAS;EACP,OAAO;EACP,QACE;EACH;CACD,OAAO;EACL,OAAO;EACP,QACE;EACH;CACD,MAAM;EACJ,OAAO;EACP,QACE;EACH;CACD,UAAU;EACR,OAAO;EACP,QACE;EACH;CACD,OAAO;EACL,OAAO;EACP,QACE;EACH;CACD,QAAQ;EACN,OAAO;EACP,QACE;EACH;CACD,SAAS;EACP,OAAO;EACP,QACE;EACH;CACD,cAAc;EACZ,OAAO;EACP,QACE;EACH;CACD,SAAS;EACP,OAAO;EACP,QACE;EACH;CACD,MAAM;EACJ,OAAO;EACP,QACE;EACH;CACD,SAAS;EAAC,OAAO;EAAW,QAAQ;EAA6D;CACjG,MAAM;EACJ,OAAO;EACP,QACE;EACH;CACD,MAAM;EACJ,OAAO;EACP,QAAQ;EACT;CACD,SAAS;EAAC,OAAO;EAAW,QAAQ;EAAyE;CAC7G,KAAK;EACH,OAAO;EACP,QACE;EACH;CACD,YAAY;EACV,OAAO;EACP,QACE;EACH;CACD,MAAM;EACJ,OAAO;EACP,QACE;EACH;CACD,YAAY;EACV,OAAO;EACP,QACE;EACH;CACD,SAAS;EAAC,OAAO;EAAW,QAAQ;EAAkE;CACtG,SAAS;EACP,OAAO;EACP,QAAQ;EACT;CACD,YAAY;EACV,OAAO;EACP,QACE;EACH;CACD,eAAe;EAAC,OAAO;EAAW,QAAQ;EAA6D;CACvG,UAAU;EACR,OAAO;EACP,QACE;EACH;CACD,UAAU;EAAC,OAAO;EAAW,QAAQ;EAAmE;CACxG,YAAY;EACV,OAAO;EACP,QACE;EACH;CACD,MAAM;EACJ,OAAO;EACP,QACE;EACH;CACD,QAAQ;EACN,OAAO;EACP,QACE;EACH;CACD,OAAO;EACL,OAAO;EACP,QACE;EACH;CACD,MAAM;EACJ,OAAO;EACP,QAAQ;EACT;CACD,OAAO;EACL,OAAO;EACP,QACE;EACH;CACD,WAAW;EACT,OAAO;EACP,QACE;EACH;CACD,gBAAgB;EACd,OAAO;EACP,QACE;EACH;CACD,SAAS;EACP,OAAO;EACP,QACE;EACH;CACD,OAAO;EACL,OAAO;EACP,QACE;EACH;CACD,UAAU;EACR,OAAO;EACP,QACE;EACH;CACF;;;;;;;;;;;;;;AChKD,MAAM,WAAW,QAAwB;CACvC,IAAI,IAAI;AACR,MAAK,IAAIC,MAAI,GAAGA,MAAI,IAAI,QAAQ,MAC9B,KAAK,IAAI,KAAK,IAAI,WAAWA,IAAE,KAAM;AAEvC,QAAO;;AAGT,sBAAe;;;;ACff,MAAMC,yBAAmC,OAAO,KAAK,uBAAuB,CAAC,MAAM;;;;;;;;;;;;;;;;;AAkBnF,MAAM,2BAA2B,SAA0B;AAKzD,QAAO,uBAJe,OAClBC,gBAAQ,KAAK,GAAG,uBAAuB,SACvC,KAAK,MAAM,KAAK,QAAQ,GAAG,uBAAuB,OAAO;;AAK/D,sCAAe;;;;AC1Bf,MAAMC,yBAAmC,OAAO,KAAK,uBAAuB,CAAC,MAAM;;;;;;;;;;;;;;;;;;AAmBnF,MAAM,2BAA2B,SAA0B;AAKzD,QAAO,uBAJe,OAClBC,gBAAQ,KAAK,GAAG,uBAAuB,SACvC,KAAK,MAAM,KAAK,QAAQ,GAAG,uBAAuB,OAAO;;AAK/D,sCAAe;;;;ACtBf,MAAMC,kBAAsC;CAC1C,CAAC,WAAW,UAAU;CACtB,CAAC,WAAW,UAAU;CACtB,CAAC,WAAW,UAAU;CACtB,CAAC,WAAW,UAAU;CACtB,CAAC,WAAW,UAAU;CACtB,CAAC,WAAW,UAAU;CACtB,CAAC,WAAW,UAAU;CACtB,CAAC,WAAW,UAAU;CACtB,CAAC,WAAW,UAAU;CACtB,CAAC,WAAW,UAAU;CACvB;;;;;;;AAQD,MAAaC,wBAAgC,gBAAgB;AAE7D,MAAMC,cAAsC;CAAC,MAAK;CAAU,KAAK;CAAS,KAAK;CAAU,KAAK;CAAQ,KAAK;CAAO;;;;AAKlH,MAAM,aAAa,UAA0B,MAAM,QAAQ,aAAa,OAAe,YAAY,IAAI;;;;;;AAOvG,MAAM,gBAAgB,QACpB,sBAAsB,mBACpB,MAAM,KAAK,MAAM,OAAgB,GAAG,WAAW,KAAK,MAAM,YAAY,MAAM,WAAW,MAAW,GAAI,CAAC,KAAK,GAAG,CAChH;;;;;;;;;;;;;;;;;;;;;AAsBH,MAAa,uBAAuB,SAAkC,aAA6B;AACjG,KAAI,YAAY,mBACd,QAAOC,gCAAwB,YAAY,OAAU;AAEvD,KAAI,YAAY,mBACd,QAAOC,gCAAwB,YAAY,OAAU;AAEvD,KAAI,YAAY,QACd,QAAO;CAGT,MAAMC,cAAqB,YAAY,eAAe,IAAI;AAC1D,SAAQ,SAAS,MAAM,eAAe,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAAC,KAAK,GAAG,CAAC,aAAa;;;;;AAM/F,MAAM,eAAe,OAA8B,SACjD,UAAU,WACN,wCAAwC,KAAK,OAC7C,gDAAgD,KAAK;;;;;;;AAQ3D,MAAM,0BAA0B,EAAC,OAAO,SAAS,SAAS,QAAQ,SAA8B;CAC9F,IAAIC;CACJ,IAAI,OAAO;AACX,KAAI,GACF,cAAa;MACR;EACL,MAAMC,IAAYC,gBAAQ,WAAW,MAAM;EAE3C,MAAM,CAAC,IAAI,MAAM,kBADM,IAAI,UAAU,gBAAgB,SAAU,gBAAgB,UAAU,gBAAgB;AAGzG,SAAO,iGADmB,KAAK,KAAK,SAAS,MAAM,MAAO,OAAO,IAC0C,2CAA2C,GAAG,qCAAqC,GAAG;AACjM,eAAa;;CAGf,IAAI,OAAO;AACX,KAAI,YAAY,SAAS;EACvB,MAAMH,cAAqB,YAAY,eAAe,IAAI;EAC1D,MAAMI,WAAmB,UACvB,MAAM,MAAM,WAAW,KAAK,aAAa,CAAC,CACvC,MAAM,GAAG,YAAY,CACrB,KAAK,GAAG,CACZ;AAED,SAAO,6FADkB,gBAAgB,IAAI,KAAK,GAC2D,qCAAqC,SAAS;;AAI7J,QAAO,aADK,iEAAiE,OAAO,YAAY,OAAO,WAAW,GAAG,KAAK,QAClG;;;;;;;;AAS1B,MAAM,iCAAiC,EAAC,OAAO,SAAS,SAA8B;CAIpF,MAAM,OAAO,uBAHO,OAAO,UAAU,eAAe,KAAK,wBAAwB,QAAQ,GACrF,UACAN,iCAAyB;CAE7B,MAAMO,QAAgB,MAAM,KAAK;CACjC,MAAMC,SAAiB,KAAK,OAAO,WAAW,WAAW,MAAM;AAE/D,QAAO,aADK,iEAAiE,YAAY,OAAO,MAAM,GAAG,OAAO,QACxF;;;;;;;;AAS1B,MAAM,iCAAiC,EAAC,OAAO,SAAS,SAA8B;CAIpF,MAAM,OAAO,uBAHO,OAAO,UAAU,eAAe,KAAK,wBAAwB,QAAQ,GACrF,UACAP,iCAAyB;CAE7B,MAAMM,QAAgB,MAAM,KAAK;CACjC,MAAMC,SAAiB,KAAK,OAAO,WAAW,WAAW,MAAM;AAE/D,QAAO,aADK,iEAAiE,YAAY,OAAO,MAAM,GAAG,OAAO,QACxF;;;;;;;;;;;;;;;;;;AAmB1B,MAAM,yBAAyB,WAAiC;AAC9D,KAAI,OAAO,YAAY,mBACrB,QAAO,8BAA8B,OAAO;AAE9C,KAAI,OAAO,YAAY,mBACrB,QAAO,8BAA8B,OAAO;AAE9C,QAAO,uBAAuB,OAAO;;AAGvC,oCAAe;;;;;;;;;;;;;;;;;;;;;;;;AC/If,MAAM,kBAAkB,MAAc,mBAAmB,OAAqB;AAC5E,4CAAe,KAAK,CAClB,QAAO;EAAC,uDAA2B,KAAK;EAAE,MAAM;EAAQ;AAG1D,KAAIC,oBAAY,KAAK,EAAE;EACrB,MAAMC,SAAuBC,mCAA2B,KAAK;EAC7D,MAAMC,UAAkB,OAAO,WAAW,oBAAoB,OAAO,SAAS,iBAAiB;AAC/F,SAAO;GAAC,QAAQC,8BAAsB;IAAC,GAAG;IAAQ;IAAQ,CAAC;GAAE,MAAM;GAAS;;AAG9E,QAAO;EAAC,QAAQ;EAAM,MAAM;EAAM;;AAGpC,6BAAe;;;;ACtDf,MAAMC,kEACJ,sBACA,iBACD;;;;AAgBD,MAAa,mBAAmB,MAAiB,SAAgC,EAAE,KAAuB;CACxG,MAAM,EACJ,YAAY,QACZ,aAAa,SACb,gBAAgB,OAAO,aAAa,cAAc,SAAS,kBAAkB,SAC3E;AAEJ,KAAI,SAAS,QAAS,QAAO;AAC7B,KAAI,SAAS,OAAQ,QAAO;AAE5B,KAAI,SAAS,UAAU;AACrB,MAAI,OAAO,WAAW,eAAe,OAAO,WAC1C,QAAO,OAAO,WAAW,+BAA+B,CAAC,UAAU,SAAS;AAE9E,SAAO;;AAGT,KAAI,SAAS,SAAS;AACpB,MAAI,CAAC,eAAe;AAClB,UAAO,KAAK,kGAAkG;AAC9G,UAAO;;EAGT,MAAM,EAAC,cAAa;AAGpB,MAAI,UAAU,SAAS,UAAU,CAC/B,QAAO;AAIT,MAAI,UAAU,SAAS,WAAW,CAChC,QAAO;AAIT,SAAO;;AAGT,QAAO;;;;;AAMT,MAAa,uBACX,eACA,UACA,SAAgC,EAAE,KACb;CACrB,MAAM,EAAC,YAAY,QAAQ,aAAa,YAAW;CAEnD,MAAMC,WAA6B,IAAI,kBAAkB,cAAgC;AACvF,YAAU,SAAS,aAA6B;AAC9C,OAAI,SAAS,SAAS,gBAAgB,SAAS,kBAAkB,SAAS;IACxE,MAAM,EAAC,cAAa;AAEpB,QAAI,UAAU,SAAS,UAAU,CAC/B,UAAS,KAAK;aACL,UAAU,SAAS,WAAW,CACvC,UAAS,MAAM;;IAKnB;GACF;AAEF,UAAS,QAAQ,eAAe;EAC9B,iBAAiB,CAAC,QAAQ;EAC1B,YAAY;EACb,CAAC;AAEF,QAAO;;;;;;AAgBT,MAAa,4BAA4B,aAAmE;AAC1G,KAAI,OAAO,WAAW,eAAe,CAAC,OAAO,WAC3C,QAAO;CAGT,MAAMC,aAA6B,OAAO,WAAW,+BAA+B;CAEpF,MAAM,gBAAgB,MAAiC;AACrD,WAAS,EAAE,QAAQ;;AAIrB,KAAI,WAAW,iBACb,YAAW,iBAAiB,UAAU,aAAa;KAGnD,YAAW,YAAY,aAAa;AAGtC,QAAO,OAAO,OAAO,YAAY,EAC/B,kBAAwB;AACtB,MAAI,WAAW,oBACb,YAAW,oBAAoB,UAAU,aAAa;MAEtD,YAAW,eAAe,aAAa;IAG5C,CAAC;;;;;;;;;;;AChIJ,MAAM,kBAAkB,MAAiB,SAAgC,EAAE,KAAgB;AACzF,KAAI,SAAS,OACX,QAAO;AAGT,KAAI,SAAS,QACX,QAAO;AAGT,KAAI,SAAS,UAAU;AACrB,MAAI,OAAO,WAAW,eAAe,OAAO,WAC1C,QAAO,OAAO,WAAW,+BAA+B,CAAC,UAAU,SAAS;AAI9E,SAAOC;;AAGT,KAAI,SAAS,QACX,QAAO,gBAAgB,MAAM,OAAO;AAItC,QAAOA;;AAGT,6BAAe;;;;;;;;;;;;ACff,MAAM,yBAAyB,QAA2E;AACxG,KAAI,QAAQ,OAAW,QAAO;AAE9B,KAAI,OAAO,QAAQ,UAAU;EAC3B,MAAM,EAAC,OAAO,QAAQ,UAA4B;AAClD,MAAI,UAAU,UAAa,WAAW,UAAa,UAAU,OAAW,QAAO;AAC/E,SAAO;GACL,GAAI,UAAU,UAAa,EAAC,OAAM;GAClC,GAAI,WAAW,UAAa,EAAC,QAAO;GACpC,GAAI,UAAU,UAAa,EAAC,OAAM;GACnC;;CAGH,MAAMC,UAAkB,OAAO,IAAI,CAAC,MAAM;CAC1C,MAAMC,YACJ,OAAO,QAAQ,WAAW,GAAG,IAAI,MAAM,gBAAgB,KAAK,QAAQ,GAAG,GAAG,QAAQ,MAAM;AAC1F,QAAO;EAAC,OAAO;EAAW,QAAQ;EAAW,OAAO;EAAU;;AAGhE,oCAAe"}
1
+ {"version":3,"file":"index.cjs","names":["endpoints: ResolvedBackendEndpoints","response: Response","timer: ReturnType<typeof setInterval> | undefined","response","error: string | undefined","ThunderIDAuthException","origin: string","absoluteProxy: string","proxyPath: string | undefined","session: BackendSession","HttpClient","url: string","qs: string","headers: Record<string, string>","body: BodyInit | undefined","fetchResponse: Response","networkError: any","isAbort: boolean","responseData: T","responseHeaders: Record<string, string>","code","FetchHttpClient","backend: BackendClient","getAccessToken: (renew: boolean) => Promise<string>","proxyUrl: string | undefined","BackendClient","OIDCRequestConstants","url: URL","error: string | null","description: string | null","urlObject: URL","RETRY_SAFE_HTTP_METHODS: string[]","ThunderIDAuthException","refreshTokenError: Message<string>","SPAUtils","error: any","refreshAccessTokenResponse: User","refreshError: any","error","requests: Promise<HttpResponse<any>>[]","url: string","silentSignInIFrame: HTMLIFrameElement","data: Message<AuthorizationInfo | null>","url: URL","state: string | null","code: string | null","message: Message<AuthorizationInfo | null>","code","httpClient: FetchHttpClient","FetchHttpClient","response: HttpResponse<any>","httpError: HttpError","targetUrl: URL","byteLength","len","i","i","Buffer","i","len","byteLength","code","Buffer","bytes: Uint8Array","jwtVerifyOptions: JWTVerifyOptions","ThunderIDAuthException","TokenConstants","refreshTimer: number","INTERACTION_ERRORS: string[]","UNUSABLE_DEVICE_SECRET_ERRORS: string[]","logger","BrowserStorage","LocalStore","MemoryStore","SessionStore","ThunderIDJavaScriptClient","SPACryptoUtils","store: Storage","SPAHelper","backendEndpoints: ResolvedBackendEndpoints | undefined","BackendClient","Hooks","BackendHttpClient","FetchHttpClient","AuthenticationHelper","ThunderIDAuthException","backendOuId: unknown","SPAUtils","switchedUser: User | undefined","resolvedAuthorizationCode: string","resolvedState: string","resolvedTokenRequestConfig: {params: Record<string, unknown>}","OIDCRequestConstants","silentUser: User | boolean","pkceKey: string","ThunderIDAPIError","OrganizationUnitSwitchErrorCodes","sm: StorageManager<T>","config: AuthClientConfig<T>","exchangedUser: User | false | undefined","silentError: string | undefined","code","url: string","refusal: {error?: string} | undefined","user: User","result: DeviceSecretSwitchResult | undefined","code: string","serverCode: string","response: EmbeddedSignInFlowResponse","sessionData: EmbeddedFlowSessionData[]","EmbeddedFlowType","serverCode: string | undefined","EmbeddedSignInFlowStatus","claims: Record<string, unknown>","iat: number | undefined","exp: number | undefined","url: URL","code: string | null","state: string | null","error: string | null","afterSignOut: ((url: string) => void) | undefined","sessionId: string | undefined","backendSignOutUrl: string","response: HttpResponse","responses: HttpResponse[] | undefined","profile: User","createHttpClientFetcher","session: Partial<SessionData> | undefined","expiresAt: number","TokenConstants","timer: number","callbacks: Set<HookCallback>","urlString: string","textArea: HTMLTextAreaElement","stored: string | null","parsed: unknown","key: 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","DEFAULT_PARAMS: AvatarParams","isAvatarUri","raw: string","params: Record<string, string>","shape: AvatarShape","variant: AvatarVariant","colors: number","ANONYMOUS_ANIMAL_ICONS: Record<string, AnonymousAnimalIcon>","ANONYMOUS_ENTITY_ICONS: Record<string, AnonymousEntityIcon>","i","ANONYMOUS_AVATAR_NAMES: string[]","hashStr","ANONYMOUS_ENTITY_NAMES: string[]","hashStr","AVATAR_PALETTES: [string, string][]","AVATAR_GRADIENT_COUNT: number","XML_ESCAPES: Record<string, string>","pickAnonymousAvatarName","pickAnonymousEntityName","letterCount: 1 | 2","background: string","h: number","hashStr","initials: string","color: string","markup: string","isAvatarUri","params: AvatarParams","extractAvatarParamsFromUri","content: string","generateAvatarDataUri","logger: ReturnType<typeof createPackageComponentLogger>","observer: MutationObserver","mediaQuery: MediaQueryList","DEFAULT_THEME","trimmed: string","radiusStr: string"],"sources":["../../src/BackendClient.ts","../../src/FetchHttpClient.ts","../../src/BackendHttpClient.ts","../../src/constants/Hooks.ts","../../src/constants/SPAConstants.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/createHttpClientFetcher.ts","../../src/utils/navigate.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","../../src/utils/SPACryptoUtils.ts","../../src/utils/SPAHelper.ts","../../src/ThunderIDBrowserClient.ts","../../src/utils/hasAuthParamsInUrl.ts","../../src/utils/hasCalledForThisInstanceInUrl.ts","../../src/utils/http.ts","../../src/utils/copyTextToClipboard.ts","../../src/utils/currentProjectStorage.ts","../../src/utils/handleWebAuthnAuthentication.ts","../../src/utils/resolveEmojiUrisInHtml.ts","../../src/utils/isAvatarUri.ts","../../src/utils/extractAvatarParamsFromUri.ts","../../src/utils/buildAvatarSpec.ts","../../src/utils/anonymousAnimalIcons.generated.ts","../../src/utils/anonymousEntityIcons.generated.ts","../../src/utils/hashStr.ts","../../src/utils/pickAnonymousAvatarName.ts","../../src/utils/pickAnonymousEntityName.ts","../../src/utils/generateAvatarDataUri.ts","../../src/utils/resolveLogoUri.ts","../../src/theme/themeDetection.ts","../../src/theme/getActiveTheme.ts","../../src/theme/normalizeBorderRadius.ts"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {BackendSession, ResolvedBackendEndpoints, SessionData, ThunderIDAuthException} from '@thunderid/javascript';\n\n/**\n * Header every backend request carries. A cross-origin page cannot set it without a CORS preflight,\n * which the backend never answers, so it keeps the cookie from being used cross-site.\n */\nexport const BACKEND_REQUEST_HEADER = 'X-Requested-With';\n\nconst BACKEND_REQUEST_HEADER_VALUE = 'XMLHttpRequest';\n\n/** A check on focus is skipped when the last one is more recent than this, in milliseconds. */\nconst FOCUS_CHECK_THROTTLE = 5000;\n\n/**\n * Talks to the app's backend when sign-in runs there: reads the session, refreshes it, and starts and ends it. The\n * browser never holds a token; the backend keeps them behind an `HttpOnly` cookie.\n */\nclass BackendClient {\n private session: Promise<BackendSession> | undefined;\n\n private refreshing: Promise<boolean> | undefined;\n\n private hasLoadedSession = false;\n\n /** Whether the session last seen was signed in, so a later read can tell it has ended. */\n private wasSignedIn = false;\n\n private lastCheck = 0;\n\n private readonly signedOutListeners: (() => void)[] = [];\n\n constructor(private readonly endpoints: ResolvedBackendEndpoints) {}\n\n /**\n * Calls the listener when a signed-in session turns out to have ended without this client signing\n * out: another app signed the user out, an administrator ended the session, or it timed out.\n */\n onSignedOut(listener: () => void): void {\n this.signedOutListeners.push(listener);\n }\n\n /**\n * Records that the session has ended, and tells the listeners when it had been signed in.\n */\n markSignedOut(): void {\n this.session = Promise.resolve({isSignedIn: false});\n this.hasLoadedSession = true;\n\n if (this.wasSignedIn) {\n this.wasSignedIn = false;\n this.signedOutListeners.forEach((listener: () => void) => listener());\n }\n }\n\n /**\n * Asks the backend whether the session is still live. The check neither refreshes the session nor\n * counts as activity, so it can be polled without keeping an idle session alive.\n *\n * @returns Whether the session is live. A failed check reports the last known state.\n */\n async checkSession(): Promise<boolean> {\n this.lastCheck = Date.now();\n\n try {\n const response: Response = await this.send(this.endpoints.checkSession, 'GET');\n if (!response.ok) {\n return this.wasSignedIn;\n }\n const {isSignedIn} = (await response.json()) as {isSignedIn: boolean};\n if (!isSignedIn) {\n this.markSignedOut();\n }\n\n return isSignedIn;\n } catch {\n return this.wasSignedIn;\n }\n }\n\n /**\n * Watches for the session ending while the page is open: checks it whenever the page gets focus or\n * becomes visible again, and every `pollSeconds` while it is visible when that is positive.\n *\n * @returns A function that stops watching.\n */\n watch(pollSeconds: number): () => void {\n const checkIfSignedIn = (): void => {\n if (this.wasSignedIn && document.visibilityState === 'visible') {\n void this.checkSession();\n }\n };\n const onFocus = (): void => {\n if (Date.now() - this.lastCheck >= FOCUS_CHECK_THROTTLE) {\n checkIfSignedIn();\n }\n };\n\n document.addEventListener('visibilitychange', onFocus);\n window.addEventListener('focus', onFocus);\n const timer: ReturnType<typeof setInterval> | undefined =\n pollSeconds > 0 ? setInterval(checkIfSignedIn, pollSeconds * 1000) : undefined;\n\n return (): void => {\n document.removeEventListener('visibilitychange', onFocus);\n window.removeEventListener('focus', onFocus);\n if (timer) {\n clearInterval(timer);\n }\n };\n }\n\n /**\n * Returns the session. The result is cached until a sign-in, sign-out, or refresh changes it, so\n * repeated sign-in checks do not reach the server each time.\n *\n * @param reload - Read the session from the server even when one is cached.\n */\n getSession(reload = false): Promise<BackendSession> {\n if (reload) {\n this.session = undefined;\n }\n\n this.session ??= this.loadSession()\n .catch((error: unknown) => {\n this.session = undefined;\n throw error;\n })\n .finally(() => {\n this.hasLoadedSession = true;\n });\n\n return this.session;\n }\n\n /**\n * Whether this client talks to exactly these endpoints.\n */\n hasEndpoints(endpoints: ResolvedBackendEndpoints): boolean {\n return (Object.keys(endpoints) as (keyof ResolvedBackendEndpoints)[]).every(\n (key: keyof ResolvedBackendEndpoints) =>\n key === 'bypass'\n ? JSON.stringify(this.endpoints.bypass) === JSON.stringify(endpoints.bypass)\n : this.endpoints[key] === endpoints[key],\n );\n }\n\n /**\n * Whether the first session read is still in flight, so it is not yet known whether the user is\n * signed in.\n */\n isLoading(): boolean {\n return !this.hasLoadedSession;\n }\n\n /**\n * Refreshes the session once, sharing one request between concurrent callers.\n *\n * @returns Whether the session was refreshed. When it was not, the session is now signed out.\n */\n refresh(): Promise<boolean> {\n this.refreshing ??= this.send(this.endpoints.refresh, 'POST')\n .then((response: Response) => {\n if (response.ok) {\n this.session = undefined;\n } else {\n this.markSignedOut();\n }\n\n return response.ok;\n })\n .finally(() => {\n this.refreshing = undefined;\n });\n\n return this.refreshing;\n }\n\n /**\n * The URL that starts sign-in at the backend and comes back to `returnTo`. With `ouId`, the backend\n * bounds the sign-in to that organization unit.\n */\n getSignInUrl(returnTo: string, ouId?: string): string {\n return `${this.endpoints.signIn}?${new URLSearchParams({returnTo, ...(ouId ? {ouId} : {})}).toString()}`;\n }\n\n /**\n * Switches the session to the organization unit `ouId` at the backend, without leaving the page. On\n * success the cached session is dropped, so the next read returns the unit's; on a refusal the\n * session stays as it was.\n *\n * @returns The refusal, with the backend's OAuth `error` when it sent one, or `undefined` on success.\n */\n async switchOrganizationUnit(ouId: string): Promise<{error?: string} | undefined> {\n const url = `${this.endpoints.ouSwitch}?${new URLSearchParams({ouId}).toString()}`;\n const readError = async (response: Response): Promise<string | undefined> =>\n ((await response.json().catch(() => ({}))) as {error?: string}).error;\n\n let response: Response = await this.send(url, 'POST');\n let error: string | undefined = response.ok ? undefined : await readError(response);\n\n if (response.status === 401 && error === 'session_expired') {\n // A session that cannot be refreshed has ended, so the user has to sign in again.\n if (!(await this.refresh())) {\n return {error: 'login_required'};\n }\n response = await this.send(url, 'POST');\n error = response.ok ? undefined : await readError(response);\n }\n\n if (response.ok) {\n this.session = undefined;\n\n return undefined;\n }\n\n if (error === 'login_required') {\n this.markSignedOut();\n }\n\n return error ? {error} : {};\n }\n\n /**\n * Ends the backend session.\n *\n * @returns The URL the browser visits to end the session at the authorization server.\n */\n async signOut(): Promise<string> {\n const response: Response = await this.send(this.endpoints.signOut, 'POST');\n // Signing out here is not news to anyone, so the listeners are not told.\n this.wasSignedIn = false;\n this.session = Promise.resolve({isSignedIn: false});\n\n if (!response.ok) {\n throw new ThunderIDAuthException(\n 'SPA-BACKEND_CLIENT-SO-SE01',\n 'Sign out failed.',\n `The backend sign-out endpoint returned ${response.status}.`,\n );\n }\n\n return ((await response.json()) as {redirectUrl: string}).redirectUrl;\n }\n\n /**\n * Maps an API URL to its backend proxy URL. A URL already on the proxy is sent as it is, and any\n * other path (`/users`) goes under the proxy. The backend, not the app, knows the API's address.\n *\n * @returns The proxy URL, or `undefined` for an absolute URL that isn't on the proxy and so cannot\n * be sent with the session's credentials.\n */\n toProxyUrl(url: string): string | undefined {\n const {proxy} = this.endpoints;\n const origin: string = typeof window !== 'undefined' ? window.location.origin : '';\n const isPath = (value: string): boolean => value.startsWith('/') && !value.startsWith('//');\n const isUnder = (base: string): boolean => url === base || url.startsWith(`${base}/`) || url.startsWith(`${base}?`);\n // The proxy as a full URL and, when it's on this origin, as a path too.\n const absoluteProxy: string = isPath(proxy) ? `${origin}${proxy}` : proxy;\n const proxyPath: string | undefined = absoluteProxy.startsWith(`${origin}/`)\n ? absoluteProxy.slice(origin.length)\n : undefined;\n\n if (isUnder(proxy) || isUnder(absoluteProxy) || (proxyPath !== undefined && isUnder(proxyPath))) {\n return url;\n }\n\n return isPath(url) ? `${proxy}${url}` : undefined;\n }\n\n /**\n * Whether a request to this URL skips the proxy and goes straight from the browser.\n */\n isBypassed(url: string): boolean {\n return this.endpoints.bypass.urls.some(\n (base: string) => url === base || url.startsWith(`${base}/`) || url.startsWith(`${base}?`),\n );\n }\n\n /**\n * Whether requests that skip the proxy carry the access token.\n */\n attachesTokenOnBypass(): boolean {\n return this.endpoints.bypass.attachToken;\n }\n\n /**\n * Gets an access token for the requests that skip the proxy from the backend's token endpoint. It comes without a\n * refresh token: when it expires, the caller asks again.\n *\n * @returns The token response, as the backend sent it.\n */\n async requestAccessToken(): Promise<Partial<SessionData>> {\n let response: Response = await this.send(this.endpoints.token, 'POST');\n\n if (response.status === 401) {\n const {error} = (await response.json().catch(() => ({}))) as {error?: string};\n if (error === 'session_expired' && (await this.refresh())) {\n response = await this.send(this.endpoints.token, 'POST');\n } else if (error === 'login_required') {\n this.markSignedOut();\n }\n }\n\n if (!response.ok) {\n throw new ThunderIDAuthException(\n 'SPA-BACKEND_CLIENT-RAT-SE01',\n 'Failed to get an access token.',\n `The backend token endpoint returned ${response.status}.`,\n );\n }\n\n return (await response.json()) as Partial<SessionData>;\n }\n\n /**\n * The headers and credentials mode every backend request is sent with. The cookies go with every\n * request, so a backend on another origin works too when its CORS allows credentials.\n */\n static requestInit(headers: Record<string, string> = {}): Pick<RequestInit, 'credentials'> & {\n headers: Record<string, string>;\n } {\n return {credentials: 'include', headers: {...headers, [BACKEND_REQUEST_HEADER]: BACKEND_REQUEST_HEADER_VALUE}};\n }\n\n private async loadSession(): Promise<BackendSession> {\n let response: Response = await this.send(this.endpoints.session, 'GET');\n\n if (response.status === 401 && (await this.refresh())) {\n response = await this.send(this.endpoints.session, 'GET');\n }\n\n if (response.status === 401) {\n return this.signedOutSession();\n }\n\n if (!response.ok) {\n throw new ThunderIDAuthException(\n 'SPA-BACKEND_CLIENT-GS-SE01',\n 'Failed to read the session.',\n `The backend session endpoint returned ${response.status}.`,\n );\n }\n\n const session: BackendSession = (await response.json()) as BackendSession;\n if (!session.isSignedIn) {\n return this.signedOutSession();\n }\n this.wasSignedIn = true;\n\n return session;\n }\n\n private signedOutSession(): BackendSession {\n if (this.wasSignedIn) {\n // Defer, so the listeners see this read's result in the cache rather than racing it.\n queueMicrotask(() => this.markSignedOut());\n }\n\n return {isSignedIn: false};\n }\n\n private send(url: string, method: string): Promise<Response> {\n return fetch(url, {method, ...BackendClient.requestInit({Accept: 'application/json'})});\n }\n}\n\nexport default BackendClient;\n","// Copyright 2025 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\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 setInstance(instanceId: number, client: FetchHttpClient): void {\n this.instances.set(instanceId, client);\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 // A caller-aborted request rejects with an 'AbortError'; keep it distinguishable from a network failure.\n const isAbort: boolean = (networkError as Error | undefined)?.name === 'AbortError';\n throw Object.assign(new Error(networkError.message), {\n code: isAbort ? 'ABORT_ERROR' : 'NETWORK_ERROR',\n config,\n name: isAbort ? 'AbortError' : 'Error',\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","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {HttpError, HttpRequestConfig, HttpResponse} from '@thunderid/javascript';\nimport BackendClient from './BackendClient';\nimport FetchHttpClient from './FetchHttpClient';\n\n/**\n * The HTTP client used when sign-in runs on the backend. It sends each request through the backend's\n * API proxy with the session cookie instead of attaching a token, and refreshes the session once\n * when the backend reports\n * it expired. Requests under `bypass` go straight there with the cookies and, unless turned off, the\n * access token the backend issued.\n */\nconst hasBackendError = (error: HttpError | undefined, code: string): boolean =>\n error?.response?.status === 401 && (error.response.data as {error?: string} | undefined)?.error === code;\n\nconst isSessionExpired = (error: HttpError | undefined): boolean => hasBackendError(error, 'session_expired');\n\nclass BackendHttpClient extends FetchHttpClient {\n /**\n * @param backend - The backend client.\n * @param getAccessToken - Returns the access token for bypassed requests; `renew` asks for a new one.\n */\n constructor(\n private readonly backend: BackendClient,\n private readonly getAccessToken: (renew: boolean) => Promise<string>,\n ) {\n super(true);\n }\n\n protected override async transport<T = unknown>(config: HttpRequestConfig): Promise<HttpResponse<T>> {\n if (this.backend.isBypassed(config.url ?? '')) {\n return this.sendBypassed<T>(config);\n }\n\n const proxyUrl: string | undefined = this.backend.toProxyUrl(config.url ?? '');\n\n if (!proxyUrl) {\n throw Object.assign(new Error(`\"${config.url}\" is not under the backend API base, so it cannot be sent.`), {\n code: 'BACKEND_UNSUPPORTED_URL',\n config,\n } as Partial<HttpError>);\n }\n\n const send = (): Promise<HttpResponse<T>> =>\n super.transport<T>({\n ...config,\n ...BackendClient.requestInit(config.headers),\n url: proxyUrl,\n });\n\n try {\n return await send();\n } catch (error) {\n // Only the backend's own `session_expired` calls for a refresh. Any other 401 is the API's answer.\n if (isSessionExpired(error as HttpError) && (await this.backend.refresh())) {\n return send();\n }\n if (hasBackendError(error as HttpError, 'login_required')) {\n this.backend.markSignedOut();\n }\n\n throw error;\n }\n }\n\n /**\n * Sends a request straight to its URL, skipping the proxy, with the cookies and the access token.\n * When the API rejects the token, it gets a new one and retries once.\n */\n private async sendBypassed<T>(config: HttpRequestConfig): Promise<HttpResponse<T>> {\n if (!this.backend.attachesTokenOnBypass()) {\n return super.transport<T>({...config, credentials: 'include'});\n }\n\n const send = async (renew: boolean): Promise<HttpResponse<T>> =>\n super.transport<T>({\n ...config,\n credentials: 'include',\n headers: {\n ...config.headers,\n Authorization: `Bearer ${await this.getAccessToken(renew)}`,\n },\n });\n\n try {\n return await send(false);\n } catch (error) {\n if ((error as HttpError).response?.status === 401) {\n return send(true);\n }\n\n throw error;\n }\n }\n}\n\nexport default BackendHttpClient;\n","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\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","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\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 SILENT_SIGN_IN_STATE = 'sign-in-silently';\nexport const SILENT_SIGN_IN_TIMEOUT = 10000;\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 SILENT_SIGN_IN_SIGNED_IN = 'silent_sign_in_signed_in';\nexport const SILENT_SIGN_IN_SIGNED_OUT = 'silent_sign_in_signed_out';\n","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\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","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\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","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\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","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\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","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {OIDCRequestConstants} from '@thunderid/javascript';\nimport {ERROR, ERROR_DESCRIPTION, SILENT_SIGN_IN_STATE, STATE_QUERY} 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 * 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 * 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","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n AuthorizeRequestParamValue,\n ThunderIDAuthException,\n User,\n IsomorphicCrypto,\n StorageManager,\n IdToken,\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 CUSTOM_GRANT_CONFIG,\n ERROR,\n ERROR_DESCRIPTION,\n REFRESH_ACCESS_TOKEN_ERR0R,\n SILENT_SIGN_IN_SIGNED_IN,\n SILENT_SIGN_IN_SIGNED_OUT,\n SILENT_SIGN_IN_STATE,\n SILENT_SIGN_IN_TIMEOUT,\n STATE_QUERY,\n} from '../constants/SPAConstants';\nimport {SPATokenExchangeConfig} from '../models/TokenExchangeConfig';\n\ninterface AuthorizationInfo {\n /** The OAuth `error` the server answered a silent request with, when it issued no code. */\n error?: string;\n code: string;\n state: string;\n}\n\ninterface Message<T> {\n type: string;\n data?: T;\n}\n\n/** Methods that change nothing on the server, so sending one twice is harmless. */\nconst RETRY_SAFE_HTTP_METHODS: string[] = ['GET', 'HEAD', 'OPTIONS'];\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\n/**\n * Browser-level authentication helper that orchestrates HTTP requests with token attachment,\n * automatic token refresh, 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 * 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 /**\n * Whether a failed request should be sent again after a token refresh: any method on a 401, and\n * only a safe method when there is no response, since the server may have acted on it. A request the\n * caller aborted is never sent again.\n *\n * @param error - The error the request failed with.\n * @param requestConfig - The failed request's configuration.\n * @returns `true` if the request should be sent again after a token refresh.\n */\n private shouldRetryAfterRefresh(error: HttpError, requestConfig: HttpRequestConfig): boolean {\n if (error?.code === 'ABORT_ERROR' || error?.name === 'AbortError') {\n return false;\n }\n\n if (error?.response?.status === 401) {\n return true;\n }\n\n if (error?.response) {\n return false;\n }\n\n return RETRY_SAFE_HTTP_METHODS.includes((requestConfig?.method ?? 'GET').toUpperCase());\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 when `shouldRetryAfterRefresh` allows it.\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 (this.shouldRetryAfterRefresh(error, requestConfig)) {\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 by loading a `prompt=none` authorize request in a hidden iframe.\n *\n * @param constructSilentSignInUrl - Builds the prompt-none authorize URL.\n * @param requestAccessToken - Exchanges the returned code for tokens.\n * @param additionalParams - Extra authorize request params.\n * @param tokenRequestConfig - Additional params for the token request.\n * @param timeout - How long to wait for the iframe's response, in milliseconds.\n * @returns The user session, or `false` if the user is not signed in.\n */\n public async signInSilently(\n constructSilentSignInUrl: (additionalParams?: Record<string, AuthorizeRequestParamValue>) => Promise<string>,\n requestAccessToken: (\n authzCode: string,\n state: string,\n tokenRequestConfig?: {params: Record<string, unknown>},\n ) => Promise<User>,\n additionalParams?: Record<string, AuthorizeRequestParamValue>,\n tokenRequestConfig?: {params: Record<string, unknown>},\n timeout: number = SILENT_SIGN_IN_TIMEOUT,\n onSignedOut?: (error?: string) => void,\n ): Promise<User | boolean> {\n if (SPAUtils.isInitializedSilentSignIn()) {\n await this.handleSilentSignInResponse();\n\n return Promise.resolve({\n allowedScopes: '',\n displayName: '',\n email: '',\n sub: '',\n tenantDomain: '',\n username: '',\n });\n }\n\n let url: string;\n\n try {\n url = await constructSilentSignInUrl(additionalParams);\n } catch (error) {\n return Promise.reject(error);\n }\n\n const silentSignInIFrame: HTMLIFrameElement = document.createElement('iframe');\n silentSignInIFrame.style.display = 'none';\n\n return new Promise((resolve, reject) => {\n const cleanUp = (): void => {\n window.removeEventListener('message', listenToSilentSignInIFrame);\n clearTimeout(timer);\n silentSignInIFrame.remove();\n };\n\n const timer = setTimeout(() => {\n cleanUp();\n resolve(false);\n }, timeout);\n\n const listenToSilentSignInIFrame = async (e: MessageEvent): Promise<void> => {\n if (e.origin !== window.location.origin || e.source !== silentSignInIFrame.contentWindow) {\n return;\n }\n\n const data: Message<AuthorizationInfo | null> = e.data;\n\n if (data?.type === SILENT_SIGN_IN_SIGNED_OUT) {\n cleanUp();\n onSignedOut?.(typeof data?.data?.error === 'string' ? data.data.error : undefined);\n resolve(false);\n }\n\n if (data?.type === SILENT_SIGN_IN_SIGNED_IN && data?.data?.code) {\n const authInfo = data.data;\n\n cleanUp();\n requestAccessToken(authInfo.code, authInfo.state, tokenRequestConfig).then(resolve).catch(reject);\n }\n };\n\n window.addEventListener('message', listenToSilentSignInIFrame);\n\n silentSignInIFrame.src = url;\n document.body.appendChild(silentSignInIFrame);\n });\n }\n\n /**\n * Handles the page load inside the silent sign-in iframe: relays the authorization response to the\n * parent window and blanks the iframe.\n *\n * @returns `true` if the current page load was a silent sign-in response.\n */\n public async handleSilentSignInResponse(): Promise<boolean> {\n const url: URL = new URL(window.location.href);\n const state: string | null = url.searchParams.get(STATE_QUERY);\n\n if (state === null || !state.includes(SILENT_SIGN_IN_STATE)) {\n return false;\n }\n\n const code: string | null = url.searchParams.get('code');\n const message: Message<AuthorizationInfo | null> =\n code !== null && code.length !== 0\n ? {data: {code, state}, type: SILENT_SIGN_IN_SIGNED_IN}\n : {\n // Only the OAuth error code crosses to the parent, never its description.\n data: url.searchParams.get('error')\n ? {code: '', error: url.searchParams.get('error') ?? '', state}\n : undefined,\n type: SILENT_SIGN_IN_SIGNED_OUT,\n };\n\n window.parent.postMessage(message, window.location.origin);\n\n window.location.href = 'about:blank';\n\n await SPAUtils.waitTillPageRedirect();\n\n return true;\n }\n\n /**\n * Handles the early-return path of `signIn()` when a session already exists\n * or the page is handling a silent sign-in response.\n *\n * @returns The current user if already signed in, or `undefined` to continue normal sign-in.\n */\n public async handleSignIn(): Promise<User | undefined> {\n if (await this.handleSilentSignInResponse()) {\n return Promise.resolve({\n allowedScopes: '',\n displayName: '',\n email: '',\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 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","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {HttpError, HttpRequestConfig, HttpResponse} from '@thunderid/javascript';\nimport FetchHttpClient from '../FetchHttpClient';\n\n/**\n * Builds a `fetch`-shaped function backed by the shared `FetchHttpClient` singleton, for\n * framework wrappers (`@thunderid/react`, `@thunderid/vue`) that need to hand a core\n * `@thunderid/javascript` API function a `fetcher` carrying the access token automatically.\n *\n * Unlike a plain `fetch` call, `FetchHttpClient.request` throws on a non-2xx response instead\n * of resolving it. This adapter catches that and reconstructs a `Response`-shaped object from\n * the thrown error's `response`, so the core API function sees the real status and body instead\n * of treating every non-2xx result as a network failure. A genuine network error (no response\n * attached) still propagates.\n *\n * @param instanceId - Which `FetchHttpClient` instance to use, for multi-instance apps. Defaults to `0`.\n * @returns A function matching the `(url, config) => Promise<Response>` shape core API functions expect.\n * @example\n * ```typescript\n * await updateMeCredentials({\n * ...config,\n * fetcher: fetcher ?? createHttpClientFetcher(instanceId),\n * });\n * ```\n */\nconst createHttpClientFetcher = (instanceId = 0): ((url: string, config: RequestInit) => Promise<Response>) => {\n return async (url: string, config: RequestInit): Promise<Response> => {\n const httpClient: FetchHttpClient = FetchHttpClient.getInstance(instanceId);\n\n const toResponse = (data: unknown, status: number, statusText: string): Response =>\n ({\n json: () => Promise.resolve(data),\n ok: status >= 200 && status < 300,\n status,\n statusText,\n text: () => Promise.resolve(typeof data === 'string' ? data : JSON.stringify(data)),\n }) as Response;\n\n try {\n const response: HttpResponse<any> = await httpClient.request({\n data: config.body ? JSON.parse(config.body as string) : undefined,\n headers: config.headers as Record<string, string>,\n method: config.method || 'POST',\n signal: config.signal,\n url,\n } as HttpRequestConfig);\n\n return toResponse(response.data, response.status, response.statusText || '');\n } catch (error) {\n const httpError: HttpError = error as HttpError;\n if (httpError?.response) {\n return toResponse(httpError.response.data, httpError.response.status, httpError.response.statusText ?? '');\n }\n throw error;\n }\n };\n};\n\nexport default createHttpClientFetcher;\n","// Copyright 2025 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\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","'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","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\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';\n\n// `crypto.getRandomValues` throws once a single request exceeds this many bytes.\nconst MAX_RANDOM_VALUES_BYTES = 65_536;\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 const bytes: Uint8Array = new Uint8Array(length);\n\n for (let offset = 0; offset < length; offset += MAX_RANDOM_VALUES_BYTES) {\n crypto.getRandomValues(bytes.subarray(offset, offset + MAX_RANDOM_VALUES_BYTES));\n }\n\n return Buffer.from(bytes);\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","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\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","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n AuthorizeRequestParamValue,\n ThunderIDJavaScriptClient,\n ThunderIDAuthException,\n User,\n IsomorphicCrypto,\n IdToken,\n OIDCEndpoints,\n OIDCRequestConstants,\n SessionConfig,\n Storage,\n TokenResponse,\n extractPkceStorageKeyFromState,\n HttpError,\n HttpRequestConfig,\n HttpResponse,\n UserProfile,\n BackendEndpointConfig,\n ResolvedBackendEndpoints,\n SessionData,\n TokenConstants,\n createPackageComponentLogger,\n generateFlattenedUserProfile,\n getTokenPermissions,\n getUsersMe,\n resolveRequestBaseUrl,\n resolveBackendEndpoints,\n resolveResourceEndpoint,\n AuthClientConfig,\n StorageManager,\n DeviceSecretSwitchResult,\n EmbeddedFlowSessionData,\n EmbeddedFlowType,\n EmbeddedSignInFlowResponse,\n EmbeddedSignInFlowStatus,\n OrganizationUnitSwitchErrorCodes,\n SwitchOrganizationUnitOptions,\n ThunderIDAPIError,\n executeEmbeddedSignInFlow,\n} from '@thunderid/javascript';\nimport BackendClient from './BackendClient';\nimport BackendHttpClient from './BackendHttpClient';\nimport Hooks from './constants/Hooks';\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 createHttpClientFetcher from './utils/createHttpClientFetcher';\nimport navigate from './utils/navigate';\nimport SPACryptoUtils from './utils/SPACryptoUtils';\nimport SPAHelper from './utils/SPAHelper';\nimport SPAUtils from './utils/SPAUtils';\n\n/**\n * OAuth errors that mean the server needs the user, so a silent switch falls back to a redirect.\n */\nconst INTERACTION_ERRORS: string[] = [\n 'interaction_required',\n 'login_required',\n 'consent_required',\n 'account_selection_required',\n];\n\n/**\n * OAuth errors for a device secret the server cannot use, which the SDK drops before signing in again.\n */\nconst UNUSABLE_DEVICE_SECRET_ERRORS: string[] = ['invalid_request', 'invalid_grant'];\n\n/**\n * Temporary-data key that marks a switch to another organization unit left the page, so its callback is\n * redeemed although the previous session is still signed in.\n */\nconst ORGANIZATION_UNIT_SWITCH_KEY = 'organization_unit_switch';\n\nconst logger = createPackageComponentLogger('@thunderid/browser', 'ThunderIDBrowserClient');\n\nconst BROWSER_DEFAULT_CONFIG = {\n autoLogoutOnTokenRefreshError: false,\n periodicTokenRefresh: false,\n};\n\ntype HookCallback = (response?: any) => void | Promise<void>;\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 _authHelper: AuthenticationHelper<T> | undefined;\n private _storage: BrowserStorage | string = BrowserStorage.SessionStorage;\n private _getSignOutURLFromSessionStorage = false;\n private _isHttpHandlerEnabled = true;\n private _hookCallbacks = new Map<string, Set<HookCallback>>();\n private _initialized = false;\n private _startedInitialize = false;\n private _backend: BackendClient | undefined;\n private _stopBackendWatch: (() => void) | undefined;\n private _backendTokenRequest: Promise<string> | undefined;\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 const backendEndpoints: ResolvedBackendEndpoints | undefined = resolveBackendEndpoints(\n merged as BackendEndpointConfig,\n window.location.origin,\n );\n\n if (backendEndpoints) {\n // The backend holds the tokens, so requests carry the session cookie instead of a token. A\n // repeated initialization with the same endpoints, as React's strict mode does in development,\n // keeps the client and its session read.\n if (!this._backend?.hasEndpoints(backendEndpoints)) {\n this._backend = new BackendClient(backendEndpoints);\n // A session that ends elsewhere, such as a sign-out in another app, signs the app out too.\n this._backend.onSignedOut(() => {\n void this.getStorageManager().removeSessionData();\n void this._emitHook(Hooks.SignOut);\n });\n }\n // Poll the backend every `session.checkInterval` seconds. Checks on focus run either way.\n this._stopBackendWatch?.();\n const {session} = merged as {session?: SessionConfig};\n this._stopBackendWatch = this._backend.watch(Number(session?.checkInterval ?? 0));\n this._httpClient = new BackendHttpClient(this._backend, (renew: boolean) => this._getBackendAccessToken(renew));\n FetchHttpClient.setInstance(this._browserInstanceId, this._httpClient);\n // Read the session now, so the client reports loading until it is known whether the user is\n // signed in. Route guards otherwise see \"not loading, not signed in\" and start a sign-in.\n this._backend.getSession().catch((error: unknown) => {\n logger.debug('Could not read the backend session.', error);\n });\n } else {\n this._stopBackendWatch?.();\n this._stopBackendWatch = undefined;\n this._backend = undefined;\n this._httpClient = FetchHttpClient.getInstance(this._browserInstanceId, true, attachToken);\n }\n\n this._httpClient.setHttpRequestStartCallback((request: HttpRequestConfig) => {\n void this._emitHook(Hooks.HttpRequestStart, request);\n });\n this._httpClient.setHttpRequestSuccessCallback((response: HttpResponse) => {\n void this._emitHook(Hooks.HttpRequestSuccess, response);\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 void this._emitHook(Hooks.Initialize, true);\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 this._backend?.isLoading() ?? false;\n }\n\n /**\n * Whether sign-in runs on the app's backend, which holds the tokens so the browser never does.\n */\n public isBackendMode(): boolean {\n return this._backend !== undefined;\n }\n\n private _rejectInBackendMode<R>(operation: string): Promise<R> {\n return Promise.reject(\n new ThunderIDAuthException(\n 'SPA-AUTH_CLIENT-BACKEND-NS01',\n 'Not supported when sign-in runs on the backend.',\n `${operation} is not available when sign-in runs on the backend, because the browser holds no tokens.`,\n ),\n );\n }\n\n public override async signIn(\n config?: SignInConfig,\n authorizationCode?: string,\n state?: string,\n tokenRequestConfig?: {params: Record<string, unknown>},\n ): Promise<User | undefined> {\n await this.isInitialized();\n\n if (this._backend) {\n if (config?.callOnlyOnRedirect) {\n return undefined;\n }\n\n const backendOuId: unknown = (config as Record<string, unknown> | undefined)?.['organizationUnitId'];\n\n location.href = this._backend.getSignInUrl(\n `${window.location.pathname}${window.location.search}`,\n typeof backendOuId === 'string' && backendOuId !== '' ? backendOuId : undefined,\n );\n await SPAUtils.waitTillPageRedirect();\n\n return undefined;\n }\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, state, tokenRequestConfig);\n\n if (user) {\n void this._emitHook(Hooks.SignIn, user);\n }\n\n return user;\n }\n\n private async _signInInternal(\n signInConfig?: SignInConfig,\n authorizationCode?: 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 // The callback of a switch to another organization unit arrives while the previous session is still\n // signed in, so it is redeemed here rather than answered with that session.\n const switchedUser: User | undefined = await this._completeOrganizationUnitSwitch(tokenRequestConfig);\n\n if (switchedUser) {\n return switchedUser;\n }\n\n const basicUserInfo = await this._authHelper!.handleSignIn();\n\n if (basicUserInfo) {\n return basicUserInfo;\n }\n\n let resolvedAuthorizationCode: 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 resolvedState = state ?? '';\n } else {\n resolvedAuthorizationCode =\n new URL(window.location.href).searchParams.get(OIDCRequestConstants.Params.AUTHORIZATION_CODE) ?? '';\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(resolvedAuthorizationCode, resolvedState, resolvedTokenRequestConfig);\n }\n\n // Opt-in: look for an existing ThunderID SSO session before leaving the app. Skipped inside an\n // iframe, and when the caller asks for a specific prompt (login, consent, ...), which a silent\n // request cannot honour.\n const sessionConfig: SessionConfig | undefined = (config as BrowserAuthConfig | undefined)?.session;\n\n if (sessionConfig?.silentSignIn?.beforeRedirect && window.self === window.top && !signInConfig?.['prompt']) {\n try {\n const silentUser: User | boolean = await this._signInSilentlyInternal(signInConfig, tokenRequestConfig);\n\n if (silentUser && typeof silentUser === 'object') {\n return silentUser;\n }\n } catch (error) {\n logger.debug('Checking for an existing session failed; continuing with the sign-in redirect.', error);\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: '', sub: '', tenantDomain: '', username: ''};\n });\n }\n\n private async _exchangeCodeForTokens(\n authorizationCode: 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 && state) {\n const pkceKey = extractPkceStorageKeyFromState(state);\n const pkce = SPAUtils.getPKCE(pkceKey);\n await this.setPKCECode(pkce, pkceKey);\n }\n\n await this.requestAccessToken(authorizationCode, state ?? '', undefined, tokenRequestConfig);\n\n return this._startSession(config.clientId);\n }\n\n /**\n * Prepares the sign-out URL and the token refresh for tokens just stored, and reads the user.\n */\n private async _startSession(clientId: string): Promise<User> {\n try {\n const signOutUrl = await this.getSignOutUrl();\n SPAUtils.setSignOutURL(signOutUrl, 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 return this.getUser();\n }\n\n /**\n * Signs in again bounded to the organization unit `organizationUnitId`, and replaces the session with\n * the one it gets. The server reuses the SSO session when the user can sign in there, so normally no\n * credentials are asked.\n *\n * - Redirect mode exchanges the session's device secret at `{baseUrl}/ou/{ouId}/oauth2/token` when it\n * holds one, which a sign-in with the `device_sso` scope returns. Otherwise it tries a `prompt=none`\n * request to `{baseUrl}/ou/{ouId}/oauth2/authorize` in a hidden iframe. When the server needs the\n * user, it redirects the page there (unless `redirect` is `false`), and the callback replaces the\n * session.\n * - Embedded mode starts an `AUTHENTICATION` flow with `ouId`, presenting the SSO session handles kept\n * from earlier flow steps. A flow that needs input fails with `interaction_required`; render the\n * sign-in for the unit instead.\n * - Backend mode sends `POST {ouSwitch}?ouId=` to the backend, which switches its session, then reads\n * the session again, so the page stays where it is. When the backend needs the user, it sends the\n * page to the backend's sign-in endpoint with `ouId` (unless `redirect` is `false`). The extra\n * parameters do not apply.\n *\n * A failed switch leaves the previous session as it was.\n *\n * @throws {ThunderIDAPIError} With a code from `OrganizationUnitSwitchErrorCodes`.\n */\n public override async switchOrganizationUnit(\n organizationUnitId: string,\n options: SwitchOrganizationUnitOptions = {},\n ): Promise<User | undefined> {\n await this.isInitialized();\n\n if (typeof organizationUnitId !== 'string' || organizationUnitId.trim() === '') {\n throw new ThunderIDAPIError(\n 'An organization unit identifier is required.',\n OrganizationUnitSwitchErrorCodes.InvalidOrganizationUnit,\n 'browser',\n 400,\n );\n }\n\n if (this._backend) {\n return this._switchOrganizationUnitOnBackend(organizationUnitId, options.redirect !== false);\n }\n\n const {redirect = true, ...params} = options;\n const sm: StorageManager<T> = this.getStorageManager();\n const config: AuthClientConfig<T> = await sm.getConfigData();\n\n if ((config as {mode?: string})?.mode === 'embedded') {\n return this._switchOrganizationUnitEmbedded(organizationUnitId, config);\n }\n\n const exchangedUser: User | false | undefined = await this._switchOrganizationUnitWithDeviceSecret(\n organizationUnitId,\n config,\n );\n\n if (exchangedUser) {\n return exchangedUser;\n }\n\n let silentError: string | undefined;\n let silentUser: User | boolean = false;\n\n // Without a device secret, the silent sign-in runs in an iframe on the session cookie.\n if (exchangedUser === undefined) {\n try {\n silentUser = await this._authHelper!.signInSilently(\n (additional: Record<string, AuthorizeRequestParamValue> | undefined) =>\n this._constructSilentSignInUrl(additional),\n (code: string, s: string, trc?: {params: Record<string, unknown>}) =>\n this._exchangeCodeForTokens(code, s, trc),\n {...(params as Record<string, AuthorizeRequestParamValue>), organizationUnitId},\n undefined,\n (config as BrowserAuthConfig | undefined)?.session?.silentSignIn?.timeout,\n (error?: string) => {\n silentError = error;\n },\n );\n } catch (error) {\n throw ThunderIDBrowserClient._toSwitchError(error instanceof Error ? error.message : undefined, error);\n }\n }\n\n if (silentUser && typeof silentUser === 'object') {\n void this._emitHook(Hooks.SignIn, silentUser);\n\n return silentUser;\n }\n\n if (silentError && !INTERACTION_ERRORS.includes(silentError)) {\n throw ThunderIDBrowserClient._toSwitchError(silentError);\n }\n\n if (!redirect) {\n throw ThunderIDBrowserClient._toSwitchError('interaction_required');\n }\n\n const url: string = await this.getSignInUrl({\n ...(params as Record<string, AuthorizeRequestParamValue>),\n organizationUnitId,\n });\n\n await sm.setTemporaryDataParameter(ORGANIZATION_UNIT_SWITCH_KEY, organizationUnitId);\n\n location.href = url;\n await SPAUtils.waitTillPageRedirect();\n\n return undefined;\n }\n\n /**\n * Backend mode: asks the backend's `ouSwitch` endpoint to switch, then reads its session again, so the\n * page stays where it is. When the backend needs the user, the page goes to the backend's sign-in for\n * the unit instead, unless `redirect` is off.\n */\n private async _switchOrganizationUnitOnBackend(\n organizationUnitId: string,\n redirect: boolean,\n ): Promise<User | undefined> {\n let refusal: {error?: string} | undefined;\n\n try {\n refusal = await this._backend!.switchOrganizationUnit(organizationUnitId);\n } catch (error) {\n throw ThunderIDBrowserClient._toSwitchError(undefined, error);\n }\n\n if (refusal) {\n if (!redirect || !refusal.error || !INTERACTION_ERRORS.includes(refusal.error)) {\n throw ThunderIDBrowserClient._toSwitchError(refusal.error);\n }\n\n location.href = this._backend!.getSignInUrl(\n `${window.location.pathname}${window.location.search}`,\n organizationUnitId,\n );\n await SPAUtils.waitTillPageRedirect();\n\n return undefined;\n }\n\n const user: User = await this.getUser();\n\n void this._emitHook(Hooks.SignIn, user);\n\n return user;\n }\n\n /**\n * Switches back-channel by exchanging the session's device secret at the unit's token endpoint.\n *\n * @returns The user, `false` when the server needs the user, or `undefined` when the session holds no\n * device secret.\n */\n private async _switchOrganizationUnitWithDeviceSecret(\n organizationUnitId: string,\n config: AuthClientConfig<T>,\n ): Promise<User | false | undefined> {\n let result: DeviceSecretSwitchResult | undefined;\n\n try {\n result = await this.switchOrganizationUnitWithDeviceSecret(organizationUnitId);\n } catch (error) {\n throw ThunderIDBrowserClient._toSwitchError(undefined, error);\n }\n\n if (!result) {\n return undefined;\n }\n\n if ('error' in result) {\n // A device secret the server refused as unusable has been dropped, so the user signs in again.\n if (INTERACTION_ERRORS.includes(result.error) || UNUSABLE_DEVICE_SECRET_ERRORS.includes(result.error)) {\n return false;\n }\n\n throw ThunderIDBrowserClient._toSwitchError(result.error);\n }\n\n const user: User = await this._startSession(config.clientId ?? '');\n\n void this._emitHook(Hooks.SignIn, user);\n\n return user;\n }\n\n /**\n * Maps an OAuth error from a bounded sign-in onto the switch's documented errors.\n */\n private static _toSwitchError(oauthError?: string, cause?: unknown): ThunderIDAPIError {\n if (\n cause instanceof ThunderIDAPIError &&\n (Object.values(OrganizationUnitSwitchErrorCodes) as string[]).includes(cause.code)\n ) {\n return cause;\n }\n\n let code: string = OrganizationUnitSwitchErrorCodes.Failed;\n\n if (oauthError === 'unauthorized_client') {\n code = OrganizationUnitSwitchErrorCodes.UnauthorizedClient;\n } else if (oauthError && INTERACTION_ERRORS.includes(oauthError)) {\n code = OrganizationUnitSwitchErrorCodes.InteractionRequired;\n }\n\n const serverCode: string = oauthError ?? 'switch_failed';\n\n return new ThunderIDAPIError(\n JSON.stringify({code: serverCode, message: {defaultValue: serverCode}}),\n code,\n 'browser',\n oauthError === 'unauthorized_client' ? 400 : undefined,\n undefined,\n 'Switching the organization unit failed',\n );\n }\n\n /**\n * Embedded mode: starts a sign-in flow bounded to the unit. When the SSO session is reused, the flow\n * completes at once and its assertion replaces the session.\n */\n private async _switchOrganizationUnitEmbedded(\n organizationUnitId: string,\n config: AuthClientConfig<T>,\n ): Promise<User> {\n let response: EmbeddedSignInFlowResponse;\n // The kept session handles let the server reuse the SSO session where its cookie is not sent.\n const sessionData: EmbeddedFlowSessionData[] = await this.getFlowSessions();\n\n try {\n response = await executeEmbeddedSignInFlow({\n baseUrl: config?.baseUrl,\n payload: {\n applicationId: config?.applicationId ?? '',\n flowType: EmbeddedFlowType.Authentication,\n ouId: organizationUnitId,\n ...(sessionData.length > 0 ? {sessionData} : {}),\n },\n url: resolveResourceEndpoint('flowExecute', config),\n });\n } catch (error) {\n const serverCode: string | undefined = error instanceof ThunderIDAPIError ? error.serverError?.code : undefined;\n\n // FES-1023: a unit the application is not accessible from, or one that does not exist.\n throw ThunderIDBrowserClient._toSwitchError(\n serverCode === 'FES-1023' ? 'unauthorized_client' : serverCode,\n error,\n );\n }\n\n await this.storeFlowSessions(response);\n\n if (response?.flowStatus === EmbeddedSignInFlowStatus.Complete && response.assertion) {\n const claims: Record<string, unknown> = await this.decodeJwtToken<Record<string, unknown>>(response.assertion);\n const iat: number | undefined = typeof claims['iat'] === 'number' ? claims['iat'] : undefined;\n const exp: number | undefined = typeof claims['exp'] === 'number' ? claims['exp'] : undefined;\n\n await this.setSession({\n access_token: response.assertion,\n created_at: iat ? iat * 1000 : Date.now(),\n expires_in: exp && iat ? exp - iat : 3600,\n id_token: response.assertion,\n scope: claims['scope'],\n token_type: 'Bearer',\n });\n\n const user: User = await this.getUser();\n\n void this._emitHook(Hooks.SignIn, user);\n\n return user;\n }\n\n if (response?.flowStatus === EmbeddedSignInFlowStatus.Error) {\n throw ThunderIDBrowserClient._toSwitchError('access_denied');\n }\n\n throw ThunderIDBrowserClient._toSwitchError('interaction_required');\n }\n\n /**\n * Completes a switch that left the page for the unit's authorization endpoint: redeems the returned\n * code, or reports the returned error and keeps the previous session.\n */\n private async _completeOrganizationUnitSwitch(tokenRequestConfig?: {\n params: Record<string, unknown>;\n }): Promise<User | undefined> {\n const sm: StorageManager<T> = this.getStorageManager();\n const pending: unknown = await sm.getTemporaryDataParameter(ORGANIZATION_UNIT_SWITCH_KEY);\n\n // A silent sign-in response inside its iframe is relayed to the parent, never redeemed here.\n if (!pending || SPAUtils.isInitializedSilentSignIn()) {\n return undefined;\n }\n\n const url: URL = new URL(window.location.href);\n const code: string | null = url.searchParams.get(OIDCRequestConstants.Params.AUTHORIZATION_CODE);\n const state: string | null = url.searchParams.get(OIDCRequestConstants.Params.STATE);\n const error: string | null = url.searchParams.get('error');\n\n if (code && state) {\n await sm.removeTemporaryDataParameter(ORGANIZATION_UNIT_SWITCH_KEY);\n SPAUtils.removeAuthorizationCode();\n\n try {\n return await this._exchangeCodeForTokens(code, state, tokenRequestConfig);\n } catch (exchangeError) {\n throw ThunderIDBrowserClient._toSwitchError(undefined, exchangeError);\n }\n }\n\n if (error) {\n await sm.removeTemporaryDataParameter(ORGANIZATION_UNIT_SWITCH_KEY);\n url.searchParams.delete('error');\n url.searchParams.delete('error_description');\n url.searchParams.delete(OIDCRequestConstants.Params.STATE);\n history.replaceState(null, document.title, url.toString());\n\n throw ThunderIDBrowserClient._toSwitchError(error);\n }\n\n return undefined;\n }\n\n public override async signInSilently(\n additionalParams?: Record<string, AuthorizeRequestParamValue>,\n tokenRequestConfig?: {params: Record<string, unknown>},\n ): Promise<User | boolean | undefined> {\n await this.isInitialized();\n\n if (this._backend) {\n return (await this.isSignedIn()) ? this.getUser() : false;\n }\n\n if (SPAUtils.wasSignInCalled()) {\n return undefined;\n }\n\n const response = await this._signInSilentlyInternal(additionalParams, tokenRequestConfig);\n\n if (response) {\n void this._emitHook(Hooks.SignIn, response);\n }\n\n return response;\n }\n\n private async _signInSilentlyInternal(\n additionalParams?: Record<string, AuthorizeRequestParamValue>,\n tokenRequestConfig?: {params: Record<string, unknown>},\n ): Promise<User | boolean> {\n const {session} = await this.getStorageManager().getConfigData();\n\n return this._authHelper!.signInSilently(\n (params) => this._constructSilentSignInUrl(params),\n (code, s, trc) => this._exchangeCodeForTokens(code, s, trc),\n additionalParams,\n tokenRequestConfig,\n session?.silentSignIn?.timeout,\n );\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 let sessionId: string | undefined;\n\n if (typeof sessionIdOrAfterSignOut === 'function') {\n afterSignOut = sessionIdOrAfterSignOut;\n } else if (typeof sessionIdOrAfterSignOut === 'string') {\n sessionId = sessionIdOrAfterSignOut;\n afterSignOut = afterSignOutParam;\n }\n\n if (this._backend) {\n await this.getStorageManager().removeSessionData();\n const backendSignOutUrl: string = await this._backend.signOut();\n afterSignOut?.(backendSignOutUrl);\n location.href = backendSignOutUrl;\n await SPAUtils.waitTillPageRedirect();\n\n return backendSignOutUrl;\n }\n\n const sm = this.getStorageManager();\n const config = await (sm as any).getConfigData();\n\n // OIDC RP-Initiated Logout: end the session at the OP's end_session_endpoint. The sign-out URL\n // (carrying id_token_hint/client_id + post_logout_redirect_uri) is resolved before the access\n // token is revoked or the local session is cleared, so the ID token used for the hint is still\n // available. This is the default; it falls back to a local-only sign out when no\n // end_session_endpoint is advertised or the URL cannot be built. Set rpInitiatedLogout: false to\n // force a local-only sign out.\n let signOutUrl = '';\n\n if (config?.rpInitiatedLogout !== false) {\n // A cached URL is stored per client at token exchange; when a specific session is targeted, build\n // a fresh URL instead so the id_token_hint matches that session.\n signOutUrl = sessionId ? '' : SPAUtils.getSignOutUrl(config.clientId, this._browserInstanceId);\n\n if (!signOutUrl) {\n try {\n signOutUrl = await this.getSignOutUrl(sessionId);\n } catch (error) {\n // end_session_endpoint absent or ID token unavailable — fall through to local sign out.\n logger.debug('Could not build the RP-initiated logout URL; falling back to a local sign out.', error);\n signOutUrl = '';\n }\n }\n }\n\n // Revoke the access token at the OP before clearing the session. Disabled by default; set\n // tokenLifecycle.revokeToken.revokeOnSignOut to true to enable. Best-effort: revocation can\n // fail (no revocation_endpoint advertised, network error, non-200 response, or a stalled request)\n // without blocking sign out, since the local session must be cleared regardless. Uses the\n // request-only core method so the session (and the ID token read above) isn't cleared twice or\n // ahead of the RP-Initiated Logout URL resolution.\n if (config?.tokenLifecycle?.revokeToken?.revokeOnSignOut === true) {\n try {\n await this.requestAccessTokenRevocation(sessionId);\n } catch (error) {\n logger.debug('Could not revoke the access token before signing out.', error);\n }\n }\n\n if (signOutUrl) {\n // Await the clear so local tokens are gone before navigating away; clearSession() is otherwise\n // fire-and-forget and could be cut short by the redirect.\n await this.clearSessionAsync(sessionId);\n // Notify the caller before navigating away, mirroring the local-only path below.\n afterSignOut?.(signOutUrl);\n location.href = signOutUrl;\n await SPAUtils.waitTillPageRedirect();\n\n return signOutUrl;\n }\n\n // Local-only sign out: clear the session and navigate back to sign-in. Used when RP-initiated\n // logout is disabled, or as a fallback when the OP advertises no end_session_endpoint.\n this.clearSession(sessionId);\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 if (this._backend) {\n return this._backendRequest(requestConfig);\n }\n\n const response: HttpResponse = await this._authHelper!.httpRequest(\n this._httpClient!,\n requestConfig,\n this._isHttpHandlerEnabled,\n this._emitHttpError,\n this._emitHttpFinish,\n );\n\n if (this._isHttpHandlerEnabled) {\n this._emitHttpFinish();\n }\n\n return response;\n }\n\n public async httpRequestAll(configs: HttpRequestConfig[]): Promise<HttpResponse[] | undefined> {\n await this._validateMethod(false);\n\n if (this._backend) {\n return Promise.all(configs.map((requestConfig: HttpRequestConfig) => this._backendRequest(requestConfig)));\n }\n\n const responses: HttpResponse[] | undefined = await this._authHelper!.httpRequestAll(\n configs,\n this._httpClient!,\n this._isHttpHandlerEnabled,\n this._emitHttpError,\n this._emitHttpFinish,\n );\n\n if (this._isHttpHandlerEnabled) {\n this._emitHttpFinish();\n }\n\n return responses;\n }\n\n private async _backendRequest(requestConfig: HttpRequestConfig): Promise<HttpResponse> {\n try {\n return await this._httpClient!.request(requestConfig);\n } catch (error) {\n if (this._isHttpHandlerEnabled) {\n await this._emitHttpError(error as HttpError);\n }\n\n throw error;\n } finally {\n if (this._isHttpHandlerEnabled) {\n this._emitHttpFinish();\n }\n }\n }\n\n public override async getUser(userId?: string): Promise<User> {\n await this._validateMethod();\n\n if (this._backend) {\n return ((await this._backend.getSession()).user ?? {}) as User;\n }\n\n return super.getUser(userId);\n }\n\n /**\n * Fetches the signed-in user's profile from the `/users/me` endpoint (or `endpoints.usersMe` when\n * configured), sending the request through the client's HTTP client so the access token is attached.\n *\n * @param options - Optional `baseUrl` or full `url` overrides for the profile endpoint.\n * @returns The user's profile.\n */\n public override async getUserProfile(options?: {baseUrl?: string; url?: string}): Promise<UserProfile> {\n await this._validateMethod();\n\n const configData = await this.getStorageManager().getConfigData();\n const profile: User = await getUsersMe({\n // In backend mode the API is reached through the backend's proxy.\n baseUrl: options?.baseUrl ?? resolveRequestBaseUrl(configData as any),\n fetcher: createHttpClientFetcher(this._browserInstanceId),\n url: resolveResourceEndpoint('usersMe', configData as any, options?.url),\n });\n\n return {\n flattenedProfile: generateFlattenedUserProfile(profile),\n profile,\n };\n }\n\n public override async getAccessToken(sessionId?: string): Promise<string> {\n if (this._backend) {\n return this._getBackendAccessToken();\n }\n\n return super.getAccessToken(sessionId);\n }\n\n /**\n * The permissions the signed-in user's access token grants, for example to hide a page the user\n * cannot use. The server still checks every request.\n *\n * In backend mode they come only from the backend's session (`scope`): the token stays on the backend,\n * so a session without `scope` grants nothing. Otherwise they are read from the access token's `scope`\n * or `scopes` claim.\n *\n * @returns The granted permissions, or an empty list when none can be read.\n */\n public async getGrantedPermissions(): Promise<string[]> {\n if (this._backend) {\n const {scope} = await this._backend.getSession();\n\n return typeof scope === 'string' ? scope.split(' ').filter((entry: string) => entry.length > 0) : [];\n }\n\n return getTokenPermissions(await this.getAccessToken());\n }\n\n /**\n * The access token for requests under `endpoints.backend.bypass`. Like a client credentials token it\n * has no refresh token: it is kept in the session storage until it nears expiry, then requested again.\n *\n * @param renew - Request a new token even when the stored one is still valid.\n */\n private async _getBackendAccessToken(renew = false): Promise<string> {\n const storageManager = this.getStorageManager();\n const session: Partial<SessionData> | undefined = await storageManager.getSessionData();\n const expiresAt: number = (session?.created_at ?? 0) + Number(session?.expires_in ?? 0) * 1000;\n\n if (\n !renew &&\n session?.access_token &&\n expiresAt - TokenConstants.Lifecycle.CLIENT_CREDENTIALS_REFRESH_MARGIN_MS > Date.now()\n ) {\n return session.access_token;\n }\n\n this._backendTokenRequest ??= this._backend!.requestAccessToken()\n .then(async (response: Partial<SessionData>) => {\n await storageManager.setSessionData({...response, created_at: Date.now()});\n\n return response.access_token ?? '';\n })\n .finally(() => {\n this._backendTokenRequest = undefined;\n });\n\n return this._backendTokenRequest;\n }\n\n public override async getDecodedIdToken(userId?: string, idToken?: string): Promise<IdToken> {\n await this._validateMethod();\n\n if (this._backend) {\n // The backend keeps the ID token and returns its user claims, which is what callers read from it.\n return ((await this._backend.getSession()).user ?? {}) as IdToken;\n }\n\n return super.getDecodedIdToken(userId, idToken);\n }\n\n public override async getIdToken(userId?: string): Promise<string> {\n if (this._backend) {\n return this._rejectInBackendMode('getIdToken');\n }\n\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 if (this._backend) {\n return (await this._backend.getSession()).isSignedIn;\n }\n\n return super.isSignedIn(userId);\n }\n\n protected notifySignIn(user: User): void {\n void this._emitHook(Hooks.SignIn, user);\n }\n\n public async isSessionActive(): Promise<boolean | undefined> {\n await this.isInitialized();\n\n if (this._backend) {\n return this.isSignedIn();\n }\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 if (this._backend) {\n if (!(await this._backend.refresh())) {\n return Promise.reject(\n new ThunderIDAuthException(\n 'SPA-AUTH_CLIENT-BACKEND-RF01',\n 'Refresh failed.',\n 'The backend could not refresh the session.',\n ),\n );\n }\n\n return this.getUser();\n }\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 if (this._backend) {\n return this._rejectInBackendMode('revokeAccessToken');\n }\n\n await this._validateMethod();\n\n const timer: number = await this._spaHelper!.getRefreshTimeoutTimer();\n await super.revokeAccessToken(userId);\n\n await this._spaHelper!.clearRefreshTokenTimeout(timer);\n\n await this._emitHook(Hooks.RevokeAccessToken, true);\n\n return true;\n }\n\n public override async exchangeToken(config: SPATokenExchangeConfig): Promise<Response | User> {\n if (this._backend) {\n return this._rejectInBackendMode('exchangeToken');\n }\n\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 void this._emitHook(`${Hooks.CustomGrant}:${config.id}`, response);\n\n return response;\n }\n\n public override async reInitialize(config: Partial<T>): Promise<boolean> {\n await this.isInitialized();\n\n return super.reInitialize(config);\n }\n\n public async startAutoRefreshToken(): Promise<void> {\n await this.isInitialized();\n\n if (this._backend) {\n // The backend refreshes on demand: a request that finds the session expired refreshes it once.\n return;\n }\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 /**\n * Subscribes a callback to a lifecycle hook. Every callback registered for a hook is called when it\n * fires; registering the same callback again for the same hook has no further effect. Hooks can be\n * registered before or after `initialize()`.\n *\n * @param hook - The hook to subscribe to (see `Hooks`).\n * @param callback - Called when the hook fires.\n * @param id - The custom grant id. Required for `custom-grant`.\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 as Hooks) {\n case Hooks.SignIn:\n case Hooks.RevokeAccessToken:\n case Hooks.Initialize:\n case Hooks.HttpRequestError:\n case Hooks.HttpRequestFinish:\n case Hooks.HttpRequestStart:\n case Hooks.HttpRequestSuccess:\n this._addHookCallback(hook, callback);\n break;\n case Hooks.SignOut:\n // The hook fires on the way back from a sign-out redirect, and later whenever the session\n // ends without this app signing out, which only the backend can report.\n this._addHookCallback(hook, callback);\n if (\n await SPAUtils.isSignOutSuccessful(\n ThunderIDBrowserClient.isSignOutSuccessful.bind(ThunderIDBrowserClient),\n () => ThunderIDBrowserClient.clearSession(),\n )\n ) {\n void callback();\n }\n break;\n case Hooks.CustomGrant:\n id && this._addHookCallback(`${Hooks.CustomGrant}:${id}`, callback);\n break;\n case Hooks.SignOutFailed: {\n const signOutFail = SPAUtils.didSignOutFail(ThunderIDBrowserClient.didSignOutFail.bind(ThunderIDBrowserClient));\n if (signOutFail) {\n void callback(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 _addHookCallback(hook: string, callback: HookCallback): void {\n const callbacks: Set<HookCallback> = this._hookCallbacks.get(hook) ?? new Set<HookCallback>();\n\n callbacks.add(callback);\n this._hookCallbacks.set(hook, callbacks);\n }\n\n private _emitHook(hook: string, response?: unknown): Promise<unknown[]> {\n return Promise.all(\n [...(this._hookCallbacks.get(hook) ?? [])].map((callback: HookCallback) => Promise.resolve(callback(response))),\n );\n }\n\n private _emitHttpError = async (error: HttpError): Promise<void> => {\n await this._emitHook(Hooks.HttpRequestError, error);\n };\n\n private _emitHttpFinish = (): void => {\n void this._emitHook(Hooks.HttpRequestFinish);\n };\n\n private _enableRetrievingSignOutURLFromSession(config: SPATokenExchangeConfig): void {\n if (config.preventSignOutURLUpdate) {\n this._getSignOutURLFromSessionStorage = true;\n }\n }\n\n private async _constructSilentSignInUrl(\n additionalParams: Record<string, AuthorizeRequestParamValue> = {},\n ): 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 // eslint-disable-next-line camelcase\n response_mode: 'query',\n state: SILENT_SIGN_IN_STATE,\n ...additionalParams,\n } as any);\n\n const urlObject = new URL(urlString);\n // A pushed request carries its parameters server-side, and its URL takes no others.\n const isPushed: boolean = urlObject.searchParams.has('request_uri');\n\n if (!isPushed) {\n urlObject.searchParams.set('response_mode', 'query');\n }\n\n if (this._storage === BrowserStorage.BrowserMemory && config.enablePKCE) {\n const state = urlObject.searchParams.get(OIDCRequestConstants.Params.STATE) ?? this.lastAuthorizeRequestState;\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","// Copyright 2025 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Utility to check if `code` is available in the URL as a search param.\n *\n * @param params - The URL search params to check. Defaults to `window.location.search`.\n * @return `true` if the URL contains a `code` search param, 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","// Copyright 2025 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\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","// Copyright 2025 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\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","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Copies text to the clipboard. It uses the Clipboard API, and falls back to a hidden textarea and\n * `document.execCommand('copy')` where the API is missing or refuses, such as on a page without a secure context.\n *\n * @param text - The text to copy.\n */\nconst copyTextToClipboard = async (text: string): Promise<void> => {\n try {\n await navigator.clipboard.writeText(text);\n } catch {\n const textArea: HTMLTextAreaElement = document.createElement('textarea');\n\n textArea.value = text;\n document.body.appendChild(textArea);\n textArea.select();\n document.execCommand('copy');\n document.body.removeChild(textArea);\n }\n};\n\nexport default copyTextToClipboard;\n","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {Project, getVendorPrefix} from '@thunderid/javascript';\n\n/**\n * The `localStorage` key the current project is kept under, scoped to the vendor like the SDK's\n * other UI preferences.\n *\n * @param vendor - The vendor prefix.\n * @returns The key.\n */\nexport const getCurrentProjectStorageKey = (vendor?: string): string => `${getVendorPrefix(vendor)}-current-project`;\n\n/**\n * Reads the project the user last chose. The current project is a client-side preference for the\n * management UI: it does not change the session, the tokens or what the server allows.\n *\n * @param vendor - The vendor prefix.\n * @returns The project, or `null` when none is kept or storage is unavailable.\n */\nexport const readCurrentProject = (vendor?: string): Project | null => {\n try {\n if (typeof window === 'undefined' || !window.localStorage) {\n return null;\n }\n\n const stored: string | null = window.localStorage.getItem(getCurrentProjectStorageKey(vendor));\n const parsed: unknown = stored ? JSON.parse(stored) : null;\n\n return parsed && typeof parsed === 'object' && typeof (parsed as Project).id === 'string'\n ? (parsed as Project)\n : null;\n } catch {\n return null;\n }\n};\n\n/**\n * Keeps the project the user chose, or forgets it with `null`.\n *\n * @param vendor - The vendor prefix.\n * @param project - The project, or `null`.\n */\nexport const writeCurrentProject = (vendor: string | undefined, project: Project | null): void => {\n try {\n if (typeof window === 'undefined' || !window.localStorage) {\n return;\n }\n\n const key: string = getCurrentProjectStorageKey(vendor);\n\n if (project) {\n window.localStorage.setItem(key, JSON.stringify(project));\n } else {\n window.localStorage.removeItem(key);\n }\n } catch {\n // Storage is full or blocked: the choice lasts for this page only.\n }\n};\n","// Copyright 2025 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\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. Please try again.',\n 'browser-webauthn-general-error',\n 'browser',\n `WebAuthn authentication failed with error: ${error.name}: ${error.message}`,\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","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\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","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nexport const AVATAR_URI_SCHEME = 'avatar:';\n\n/**\n * Checks whether a given URI uses the `avatar:` scheme\n * (e.g. `\"avatar:style=rounded,text=Acme,colors=2\"`).\n *\n * @param uri - The URI string to check.\n * @returns `true` if the URI starts with `\"avatar:\"`, `false` otherwise.\n *\n * @example\n * ```typescript\n * isAvatarUri(\"avatar:style=circle,text=Acme,colors=0\"); // true\n * isAvatarUri(\"emoji:🐯\"); // false\n * ```\n */\nconst isAvatarUri = (uri: string): boolean => typeof uri === 'string' && uri.startsWith(AVATAR_URI_SCHEME);\n\nexport default isAvatarUri;\n","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport isAvatarUri, {AVATAR_URI_SCHEME} from './isAvatarUri';\n\nexport type AvatarShape = 'circle' | 'rounded';\n\nexport type AvatarVariant = 'anonymous_animal' | 'anonymous_entity' | 'blank' | 'one_letter' | 'two_letter';\n\nexport interface AvatarParams {\n /**\n * Explicit flat background color override (e.g. `#FF5733`). When set, replaces the\n * derived gradient (letter variants) or the curated icon color (`anonymous_animal`/\n * `anonymous_entity`).\n */\n bg?: string;\n /**\n * Gradient rotation index for letter variants (ignored by `anonymous_animal`/`anonymous_entity`).\n */\n colors: number;\n /**\n * The rendered payload: pre-computed initials (e.g. `\"BM\"`) for `one_letter`/`two_letter`,\n * a lowercase animal key (e.g. `\"jackalope\"`) for `anonymous_animal`, a lowercase entity key\n * (e.g. `\"hexagon\"`) for `anonymous_entity`, or unused (empty) for `blank`.\n */\n content: string;\n /**\n * Background shape.\n */\n shape: AvatarShape;\n /**\n * What's drawn on the background.\n */\n variant: AvatarVariant;\n}\n\nconst DEFAULT_PARAMS: AvatarParams = {colors: 0, content: '', shape: 'rounded', variant: 'two_letter'};\n\n/**\n * Parses the comma-separated `key=value` pairs of an `avatar:` URI, e.g.\n * `\"avatar:shape=circle,variant=two_letter,content=BM,colors=2,bg=#FF5733\"`.\n *\n * @param uri - A URI string in the form `\"avatar:shape=...,variant=...,content=...,colors=...,bg=...\"`.\n * @returns The parsed avatar parameters, falling back to defaults for any missing/invalid field.\n *\n * @example\n * ```typescript\n * extractAvatarParamsFromUri(\"avatar:shape=circle,variant=anonymous_animal,content=jackalope\");\n * // { shape: \"circle\", variant: \"anonymous_animal\", content: \"jackalope\", colors: 0 }\n * ```\n */\nconst extractAvatarParamsFromUri = (uri: string): AvatarParams => {\n if (!isAvatarUri(uri)) {\n return {...DEFAULT_PARAMS};\n }\n\n const raw: string = uri.slice(AVATAR_URI_SCHEME.length);\n const params: Record<string, string> = {};\n\n raw.split(',').forEach((pair: string) => {\n const [key, ...rest] = pair.split('=');\n if (key) {\n params[key.trim()] = rest.join('=').trim();\n }\n });\n\n const shape: AvatarShape = ['circle', 'rounded'].includes(params['shape'])\n ? (params['shape'] as AvatarShape)\n : DEFAULT_PARAMS.shape;\n const variant: AvatarVariant = ['anonymous_animal', 'anonymous_entity', 'blank', 'one_letter', 'two_letter'].includes(\n params['variant'],\n )\n ? (params['variant'] as AvatarVariant)\n : DEFAULT_PARAMS.variant;\n const colors: number = Number.parseInt(params['colors'], 10);\n\n return {\n ...(params['bg'] ? {bg: params['bg']} : {}),\n colors: Number.isFinite(colors) ? colors : DEFAULT_PARAMS.colors,\n content: params['content'] ?? DEFAULT_PARAMS.content,\n shape,\n variant,\n };\n};\n\nexport default extractAvatarParamsFromUri;\n","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport type {AvatarParams} from './extractAvatarParamsFromUri';\nimport {AVATAR_URI_SCHEME} from './isAvatarUri';\n\n/**\n * Serializes {@link AvatarParams} into an `avatar:` URI, the inverse of\n * {@link extractAvatarParamsFromUri}.\n *\n * @param params - The avatar parameters to serialize.\n * @returns An `\"avatar:shape=...,variant=...,content=...,colors=...\"` spec string, with a\n * trailing `,bg=...` when {@link AvatarParams.bg} is set.\n *\n * @example\n * ```typescript\n * buildAvatarSpec({shape: 'circle', variant: 'two_letter', content: 'BM', colors: 2});\n * // \"avatar:shape=circle,variant=two_letter,content=BM,colors=2\"\n * ```\n */\nconst buildAvatarSpec = ({shape, variant, content, colors, bg}: AvatarParams): string => {\n const base = `${AVATAR_URI_SCHEME}shape=${shape},variant=${variant},content=${content},colors=${colors}`;\n return bg ? `${base},bg=${bg}` : base;\n};\n\nexport default buildAvatarSpec;\n","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\n// AUTO-GENERATED FILE. Do not edit directly.\n// Regenerate with: node scripts/generate-anonymous-animal-icons.mjs\n// Source SVGs live in static/images/anonymous.\n\nexport interface AnonymousAnimalIcon {\n /** The animal's curated default background color (hex). */\n color: string;\n /** Inner SVG markup (no outer <svg>/<rect>). Any \"%COLOR%\" token is the animal's\n * color, substitutable at render time so a custom \"bg\" recolors accents too. */\n markup: string;\n}\n\nexport const ANONYMOUS_ANIMAL_ICONS: Record<string, AnonymousAnimalIcon> = {\n capybara: {\n color: '#8A6A2E',\n markup:\n '<ellipse cx=\"50\" cy=\"58\" rx=\"30\" ry=\"20\" fill=\"#FFFFFF\"/>\\n<ellipse cx=\"24\" cy=\"50\" rx=\"5\" ry=\"5\" fill=\"#FFFFFF\"/>\\n<ellipse cx=\"76\" cy=\"50\" rx=\"5\" ry=\"5\" fill=\"#FFFFFF\"/>\\n<ellipse cx=\"50\" cy=\"70\" rx=\"14\" ry=\"10\" fill=\"#FFFFFF\"/>\\n<circle cx=\"36\" cy=\"56\" r=\"3\" fill=\"%COLOR%\"/>\\n<circle cx=\"64\" cy=\"56\" r=\"3\" fill=\"%COLOR%\"/>',\n },\n chameleon: {\n color: '#C23B7A',\n markup:\n '<path d=\"M30 60 Q20 55 25 45 Q35 35 45 42 L55 35 Q65 25 72 35 Q78 42 68 48 L55 55 Q60 65 45 68 Q32 70 30 60 Z\" fill=\"#FFFFFF\"/>\\n<circle cx=\"60\" cy=\"35\" r=\"9\" fill=\"#FFFFFF\"/>\\n<circle cx=\"60\" cy=\"35\" r=\"3\" fill=\"%COLOR%\"/>\\n<path d=\"M25 62 Q15 65 12 78\" stroke=\"#FFFFFF\" stroke-width=\"5\" fill=\"none\" stroke-linecap=\"round\"/>',\n },\n chinchilla: {\n color: '#5B6BC0',\n markup:\n '<circle cx=\"30\" cy=\"34\" r=\"14\" fill=\"#FFFFFF\"/>\\n<circle cx=\"70\" cy=\"34\" r=\"14\" fill=\"#FFFFFF\"/>\\n<circle cx=\"30\" cy=\"34\" r=\"7\" fill=\"%COLOR%\"/>\\n<circle cx=\"70\" cy=\"34\" r=\"7\" fill=\"%COLOR%\"/>\\n<circle cx=\"50\" cy=\"58\" r=\"26\" fill=\"#FFFFFF\"/>\\n<circle cx=\"38\" cy=\"55\" r=\"3.5\" fill=\"%COLOR%\"/>\\n<circle cx=\"62\" cy=\"55\" r=\"3.5\" fill=\"%COLOR%\"/>\\n<circle cx=\"50\" cy=\"65\" r=\"4\" fill=\"%COLOR%\"/>',\n },\n chipmunk: {\n color: '#B5522C',\n markup:\n '<circle cx=\"50\" cy=\"52\" r=\"22\" fill=\"#FFFFFF\"/>\\n<path d=\"M28 34 L22 16 L38 28 Z\" fill=\"#FFFFFF\"/>\\n<path d=\"M72 34 L78 16 L62 28 Z\" fill=\"#FFFFFF\"/>\\n<circle cx=\"30\" cy=\"60\" r=\"8\" fill=\"#FFFFFF\"/>\\n<circle cx=\"70\" cy=\"60\" r=\"8\" fill=\"#FFFFFF\"/>\\n<path d=\"M50 75 Q70 70 78 85 Q65 95 50 88 Q35 95 22 85 Q30 70 50 75 Z\" fill=\"#FFFFFF\"/>\\n<path d=\"M40 88 Q50 82 60 88\" stroke=\"%COLOR%\" stroke-width=\"3\" fill=\"none\"/>',\n },\n chupacabra: {\n color: '#4B7A3F',\n markup:\n '<path d=\"M20 50 L15 35 M28 42 L25 22 M38 38 L38 15 M50 36 L50 12 M62 38 L62 15 M72 42 L75 22 M80 50 L85 35\" stroke=\"#FFFFFF\" stroke-width=\"4\" stroke-linecap=\"round\"/>\\n<ellipse cx=\"50\" cy=\"58\" rx=\"24\" ry=\"20\" fill=\"#FFFFFF\"/>\\n<circle cx=\"38\" cy=\"52\" r=\"6\" fill=\"%COLOR%\"/>\\n<circle cx=\"62\" cy=\"52\" r=\"6\" fill=\"%COLOR%\"/>\\n<circle cx=\"38\" cy=\"52\" r=\"3\" fill=\"#FFFFFF\"/>\\n<circle cx=\"62\" cy=\"52\" r=\"3\" fill=\"#FFFFFF\"/>',\n },\n dingo: {\n color: '#B5892C',\n markup:\n '<path d=\"M30 30 L22 10 L38 24 Z\" fill=\"#FFFFFF\"/>\\n<path d=\"M70 30 L78 10 L62 24 Z\" fill=\"#FFFFFF\"/>\\n<ellipse cx=\"50\" cy=\"55\" rx=\"22\" ry=\"18\" fill=\"#FFFFFF\"/>\\n<path d=\"M40 68 Q50 82 60 68 Q66 60 55 60 L45 60 Q34 60 40 68 Z\" fill=\"#FFFFFF\"/>',\n },\n dinosaur: {\n color: '#2E8F5B',\n markup:\n '<path d=\"M20 78 Q18 55 35 45 L38 25 L46 42 L55 30 L58 45 Q75 50 75 65 L78 78 Z\" fill=\"#FFFFFF\"/>\\n<path d=\"M40 45 L45 30 L50 45 L57 33 L60 45\" stroke=\"#FFFFFF\" stroke-width=\"0\" fill=\"#FFFFFF\"/>\\n<circle cx=\"42\" cy=\"40\" r=\"2.5\" fill=\"%COLOR%\"/>',\n },\n frog: {\n color: '#4FA33F',\n markup:\n '<circle cx=\"30\" cy=\"35\" r=\"14\" fill=\"#FFFFFF\"/>\\n<circle cx=\"70\" cy=\"35\" r=\"14\" fill=\"#FFFFFF\"/>\\n<circle cx=\"30\" cy=\"35\" r=\"6\" fill=\"%COLOR%\"/>\\n<circle cx=\"70\" cy=\"35\" r=\"6\" fill=\"%COLOR%\"/>\\n<ellipse cx=\"50\" cy=\"62\" rx=\"32\" ry=\"22\" fill=\"#FFFFFF\"/>\\n<path d=\"M25 65 Q50 78 75 65\" stroke=\"%COLOR%\" stroke-width=\"4\" fill=\"none\" stroke-linecap=\"round\"/>',\n },\n giraffe: {\n color: '#C99A2E',\n markup:\n '<path d=\"M42 90 L38 40 Q37 20 48 15 L55 15 Q62 20 58 28 Q52 30 52 38 L58 40 L54 90 Z\" fill=\"#FFFFFF\"/>\\n<circle cx=\"47\" cy=\"14\" r=\"3\" fill=\"#FFFFFF\"/>\\n<circle cx=\"58\" cy=\"14\" r=\"3\" fill=\"#FFFFFF\"/>\\n<ellipse cx=\"30\" cy=\"55\" rx=\"4\" ry=\"6\" fill=\"#FFFFFF\"/>\\n<ellipse cx=\"44\" cy=\"70\" rx=\"4\" ry=\"6\" fill=\"#FFFFFF\"/>\\n<ellipse cx=\"60\" cy=\"50\" rx=\"4\" ry=\"6\" fill=\"#FFFFFF\"/>',\n },\n hedgehog: {\n color: '#8A9A3B',\n markup:\n '<path d=\"M20 55 L10 40 M25 42 L18 25 M35 33 L30 15 M50 30 L48 10 M65 33 L70 15 M75 42 L82 25 M80 55 L90 40\" stroke=\"#FFFFFF\" stroke-width=\"4\" stroke-linecap=\"round\"/>\\n<circle cx=\"50\" cy=\"60\" r=\"26\" fill=\"#FFFFFF\"/>\\n<path d=\"M50 60 Q30 90 20 75 Q30 70 34 60 Z\" fill=\"#FFFFFF\"/>\\n<circle cx=\"30\" cy=\"56\" r=\"3.5\" fill=\"%COLOR%\"/>',\n },\n hippo: {\n color: '#5B7A9E',\n markup:\n '<ellipse cx=\"50\" cy=\"52\" rx=\"34\" ry=\"24\" fill=\"#FFFFFF\"/>\\n<circle cx=\"30\" cy=\"30\" r=\"7\" fill=\"#FFFFFF\"/>\\n<circle cx=\"70\" cy=\"30\" r=\"7\" fill=\"#FFFFFF\"/>\\n<circle cx=\"34\" cy=\"42\" r=\"3.5\" fill=\"%COLOR%\"/>\\n<circle cx=\"66\" cy=\"42\" r=\"3.5\" fill=\"%COLOR%\"/>\\n<ellipse cx=\"50\" cy=\"70\" rx=\"20\" ry=\"10\" fill=\"#FFFFFF\"/>\\n<path d=\"M35 70 Q50 78 65 70\" stroke=\"%COLOR%\" stroke-width=\"3\" fill=\"none\"/>',\n },\n jackal: {\n color: '#D6822C',\n markup:\n '<path d=\"M28 32 L18 8 L40 26 Z\" fill=\"#FFFFFF\"/>\\n<path d=\"M72 32 L82 8 L60 26 Z\" fill=\"#FFFFFF\"/>\\n<ellipse cx=\"50\" cy=\"55\" rx=\"20\" ry=\"17\" fill=\"#FFFFFF\"/>\\n<path d=\"M42 66 Q50 82 58 66 Q64 58 52 58 L48 58 Q36 58 42 66 Z\" fill=\"#FFFFFF\"/>',\n },\n jackalope: {\n color: '#2E9E9E',\n markup:\n '<path d=\"M35 20 L28 5 M35 20 L38 8\" stroke=\"#FFFFFF\" stroke-width=\"4\" stroke-linecap=\"round\" fill=\"none\"/>\\n<path d=\"M65 20 L72 5 M65 20 L62 8\" stroke=\"#FFFFFF\" stroke-width=\"4\" stroke-linecap=\"round\" fill=\"none\"/>\\n<ellipse cx=\"40\" cy=\"35\" rx=\"7\" ry=\"16\" fill=\"#FFFFFF\"/>\\n<ellipse cx=\"60\" cy=\"35\" rx=\"7\" ry=\"16\" fill=\"#FFFFFF\"/>\\n<ellipse cx=\"50\" cy=\"62\" rx=\"22\" ry=\"20\" fill=\"#FFFFFF\"/>\\n<ellipse cx=\"50\" cy=\"78\" rx=\"10\" ry=\"7\" fill=\"#FFFFFF\"/>',\n },\n mink: {\n color: '#3B7DD8',\n markup:\n '<ellipse cx=\"50\" cy=\"55\" rx=\"24\" ry=\"16\" fill=\"#FFFFFF\"/>\\n<ellipse cx=\"24\" cy=\"46\" rx=\"6\" ry=\"6\" fill=\"#FFFFFF\"/>\\n<ellipse cx=\"76\" cy=\"46\" rx=\"6\" ry=\"6\" fill=\"#FFFFFF\"/>\\n<ellipse cx=\"18\" cy=\"60\" rx=\"10\" ry=\"7\" fill=\"#FFFFFF\"/>\\n<circle cx=\"12\" cy=\"60\" r=\"2.5\" fill=\"%COLOR%\"/>',\n },\n otter: {\n color: '#E8622C',\n markup:\n '<circle cx=\"50\" cy=\"55\" r=\"24\" fill=\"#FFFFFF\"/>\\n<circle cx=\"30\" cy=\"38\" r=\"7\" fill=\"#FFFFFF\"/>\\n<circle cx=\"70\" cy=\"38\" r=\"7\" fill=\"#FFFFFF\"/>\\n<circle cx=\"38\" cy=\"52\" r=\"4\" fill=\"%COLOR%\"/>\\n<circle cx=\"62\" cy=\"52\" r=\"4\" fill=\"%COLOR%\"/>\\n<circle cx=\"50\" cy=\"62\" r=\"5\" fill=\"%COLOR%\"/>\\n<path d=\"M30 68 L15 65 M30 71 L14 71 M30 74 L15 77 M70 68 L85 65 M70 71 L86 71 M70 74 L85 77\" stroke=\"#FFFFFF\" stroke-width=\"3\" stroke-linecap=\"round\"/>',\n },\n platypus: {\n color: '#C23B7A',\n markup:\n '<ellipse cx=\"55\" cy=\"55\" rx=\"22\" ry=\"18\" fill=\"#FFFFFF\"/>\\n<path d=\"M18 52 Q10 55 18 62 Q35 68 42 55 Q35 45 18 52 Z\" fill=\"#FFFFFF\"/>',\n },\n quagga: {\n color: '#D6455C',\n markup:\n '<path d=\"M25 70 L30 30 Q35 20 45 22 L60 25 Q68 27 72 35 L75 55 L68 70 Z\" fill=\"#FFFFFF\"/>\\n<path d=\"M35 25 L20 10 M42 22 L34 6\" stroke=\"#FFFFFF\" stroke-width=\"4\" stroke-linecap=\"round\"/>\\n<rect x=\"33\" y=\"30\" width=\"6\" height=\"10\" fill=\"%COLOR%\"/>\\n<rect x=\"45\" y=\"32\" width=\"6\" height=\"12\" fill=\"%COLOR%\"/>\\n<rect x=\"57\" y=\"35\" width=\"6\" height=\"12\" fill=\"%COLOR%\"/>',\n },\n raccoon: {\n color: '#E0348E',\n markup:\n '<circle cx=\"50\" cy=\"55\" r=\"24\" fill=\"#FFFFFF\"/>\\n<path d=\"M25 35 L18 15 L38 28 Z\" fill=\"#FFFFFF\"/>\\n<path d=\"M75 35 L82 15 L62 28 Z\" fill=\"#FFFFFF\"/>\\n<ellipse cx=\"36\" cy=\"52\" rx=\"9\" ry=\"6\" fill=\"%COLOR%\"/>\\n<ellipse cx=\"64\" cy=\"52\" rx=\"9\" ry=\"6\" fill=\"%COLOR%\"/>\\n<circle cx=\"50\" cy=\"63\" r=\"4\" fill=\"%COLOR%\"/>',\n },\n skunk: {\n color: '#7B3F9E',\n markup:\n '<circle cx=\"38\" cy=\"55\" r=\"18\" fill=\"#FFFFFF\"/>\\n<path d=\"M50 45 Q85 30 85 65 Q85 90 55 82 Q78 68 65 55 Q60 48 50 45 Z\" fill=\"#FFFFFF\"/>\\n<path d=\"M55 45 Q80 35 80 65\" stroke=\"%COLOR%\" stroke-width=\"4\" fill=\"none\" stroke-linecap=\"round\"/>\\n<ellipse cx=\"24\" cy=\"48\" rx=\"4\" ry=\"5\" fill=\"%COLOR%\"/>',\n },\n};\n","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\n// AUTO-GENERATED FILE. Do not edit directly.\n// Regenerate with: node scripts/generate-anonymous-entity-icons.mjs\n// Source SVGs live in static/images/entity.\n\nexport interface AnonymousEntityIcon {\n /** The entity icon's curated default background color (hex). */\n color: string;\n /** Inner SVG markup (no outer <svg>/<rect>). Any \"%COLOR%\" token is the icon's\n * color, substitutable at render time so a custom \"bg\" recolors accents too. */\n markup: string;\n}\n\nexport const ANONYMOUS_ENTITY_ICONS: Record<string, AnonymousEntityIcon> = {\n anchor: {\n color: '#D6455C',\n markup:\n '<circle cx=\"50\" cy=\"18\" r=\"8\" fill=\"none\" stroke=\"#FFFFFF\" stroke-width=\"6\"/>\\n<rect x=\"46\" y=\"26\" width=\"8\" height=\"50\" fill=\"#FFFFFF\"/>\\n<path d=\"M20 55 Q20 80 50 82 Q80 80 80 55\" fill=\"none\" stroke=\"#FFFFFF\" stroke-width=\"7\"/>\\n<rect x=\"28\" y=\"42\" width=\"44\" height=\"7\" fill=\"#FFFFFF\"/>',\n },\n antenna: {\n color: '#8A9A3B',\n markup:\n '<rect x=\"46\" y=\"45\" width=\"8\" height=\"40\" fill=\"#FFFFFF\"/>\\n<circle cx=\"50\" cy=\"35\" r=\"7\" fill=\"#FFFFFF\"/>\\n<path d=\"M35 30 Q50 10 65 30 M28 40 Q50 8 72 40\" fill=\"none\" stroke=\"#FFFFFF\" stroke-width=\"5\" stroke-linecap=\"round\"/>',\n },\n anvil: {\n color: '#B5522C',\n markup:\n '<rect x=\"20\" y=\"30\" width=\"60\" height=\"14\" rx=\"3\" fill=\"#FFFFFF\"/>\\n<polygon points=\"35,44 65,44 58,60 42,60\" fill=\"#FFFFFF\"/>\\n<rect x=\"42\" y=\"60\" width=\"16\" height=\"10\" fill=\"#FFFFFF\"/>\\n<rect x=\"30\" y=\"70\" width=\"40\" height=\"12\" rx=\"3\" fill=\"#FFFFFF\"/>',\n },\n arch: {\n color: '#E0348E',\n markup:\n '<path d=\"M20 85 L20 50 Q20 15 50 15 Q80 15 80 50 L80 85 Z\" fill=\"none\" stroke=\"#FFFFFF\" stroke-width=\"10\"/>',\n },\n bot_head: {\n color: '#3B7DD8',\n markup:\n '<rect x=\"26\" y=\"30\" width=\"48\" height=\"42\" rx=\"12\" fill=\"#FFFFFF\"/>\\n<circle cx=\"40\" cy=\"50\" r=\"5\" fill=\"%COLOR%\"/>\\n<circle cx=\"60\" cy=\"50\" r=\"5\" fill=\"%COLOR%\"/>\\n<rect x=\"46\" y=\"12\" width=\"8\" height=\"16\" fill=\"#FFFFFF\"/>\\n<circle cx=\"50\" cy=\"10\" r=\"5\" fill=\"#FFFFFF\"/>\\n<rect x=\"14\" y=\"45\" width=\"8\" height=\"14\" rx=\"3\" fill=\"#FFFFFF\"/>\\n<rect x=\"78\" y=\"45\" width=\"8\" height=\"14\" rx=\"3\" fill=\"#FFFFFF\"/>',\n },\n brain: {\n color: '#7B3F9E',\n markup:\n '<path d=\"M50 15 Q30 15 28 32 Q14 34 16 50 Q10 58 18 66 Q18 80 34 80 Q38 88 50 85 Q62 88 66 80 Q82 80 82 66 Q90 58 84 50 Q86 34 72 32 Q70 15 50 15 Z\" fill=\"#FFFFFF\"/>\\n<path d=\"M50 22 L50 78 M35 35 Q45 45 35 55 Q45 65 35 75 M65 35 Q55 45 65 55 Q55 65 65 75\" stroke=\"%COLOR%\" stroke-width=\"3\" fill=\"none\"/>',\n },\n bridge: {\n color: '#B5892C',\n markup:\n '<path d=\"M10 55 Q50 20 90 55\" fill=\"none\" stroke=\"#FFFFFF\" stroke-width=\"7\"/>\\n<rect x=\"10\" y=\"55\" width=\"80\" height=\"8\" fill=\"#FFFFFF\"/>\\n<rect x=\"20\" y=\"63\" width=\"6\" height=\"18\" fill=\"#FFFFFF\"/>\\n<rect x=\"74\" y=\"63\" width=\"6\" height=\"18\" fill=\"#FFFFFF\"/>',\n },\n chevron: {\n color: '#C99A2E',\n markup:\n '<polygon points=\"15,30 50,30 85,60 50,60\" fill=\"#FFFFFF\"/>\\n<polygon points=\"15,55 50,55 85,85 50,85\" fill=\"#FFFFFF\" opacity=\"0.55\"/>',\n },\n circuit_node: {\n color: '#5B7A9E',\n markup:\n '<circle cx=\"50\" cy=\"50\" r=\"10\" fill=\"#FFFFFF\"/>\\n<circle cx=\"20\" cy=\"20\" r=\"7\" fill=\"#FFFFFF\"/>\\n<circle cx=\"80\" cy=\"20\" r=\"7\" fill=\"#FFFFFF\"/>\\n<circle cx=\"20\" cy=\"80\" r=\"7\" fill=\"#FFFFFF\"/>\\n<circle cx=\"80\" cy=\"80\" r=\"7\" fill=\"#FFFFFF\"/>\\n<path d=\"M50 50 L20 20 M50 50 L80 20 M50 50 L20 80 M50 50 L80 80\" stroke=\"#FFFFFF\" stroke-width=\"5\"/>',\n },\n compass: {\n color: '#4FA33F',\n markup:\n '<circle cx=\"50\" cy=\"50\" r=\"34\" fill=\"none\" stroke=\"#FFFFFF\" stroke-width=\"6\"/>\\n<polygon points=\"50,28 58,50 50,72 42,50\" fill=\"#FFFFFF\"/>',\n },\n cube: {\n color: '#2E9E9E',\n markup:\n '<polygon points=\"50,12 84,30 84,70 50,88 16,70 16,30\" fill=\"#FFFFFF\" opacity=\"0.35\"/>\\n<polygon points=\"50,12 84,30 50,48 16,30\" fill=\"#FFFFFF\"/>\\n<polygon points=\"50,48 84,30 84,70 50,88\" fill=\"#FFFFFF\" opacity=\"0.7\"/>',\n },\n diamond: {color: '#E8622C', markup: '<polygon points=\"50,12 82,50 50,88 18,50\" fill=\"#FFFFFF\"/>'},\n dome: {\n color: '#D6822C',\n markup:\n '<path d=\"M20 85 L20 55 Q20 20 50 20 Q80 20 80 55 L80 85 Z\" fill=\"#FFFFFF\"/>\\n<rect x=\"46\" y=\"8\" width=\"8\" height=\"12\" fill=\"#FFFFFF\"/>\\n<circle cx=\"50\" cy=\"6\" r=\"4\" fill=\"#FFFFFF\"/>',\n },\n gate: {\n color: '#3B7DD8',\n markup: '<path d=\"M22 85 L22 40 Q22 15 50 15 Q78 15 78 40 L78 85\" fill=\"none\" stroke=\"#FFFFFF\" stroke-width=\"12\"/>',\n },\n hexagon: {color: '#3B7DD8', markup: '<polygon points=\"50,15 82,33 82,67 50,85 18,67 18,33\" fill=\"#FFFFFF\"/>'},\n key: {\n color: '#C99A2E',\n markup:\n '<circle cx=\"30\" cy=\"35\" r=\"16\" fill=\"none\" stroke=\"#FFFFFF\" stroke-width=\"8\"/>\\n<rect x=\"42\" y=\"46\" width=\"42\" height=\"9\" fill=\"#FFFFFF\"/>\\n<rect x=\"66\" y=\"55\" width=\"9\" height=\"14\" fill=\"#FFFFFF\"/>\\n<rect x=\"78\" y=\"55\" width=\"9\" height=\"20\" fill=\"#FFFFFF\"/>',\n },\n lighthouse: {\n color: '#D6455C',\n markup:\n '<polygon points=\"42,85 58,85 54,25 46,25\" fill=\"#FFFFFF\"/>\\n<rect x=\"40\" y=\"15\" width=\"20\" height=\"12\" fill=\"#FFFFFF\"/>\\n<polygon points=\"38,15 62,15 50,5\" fill=\"#FFFFFF\"/>\\n<rect x=\"30\" y=\"85\" width=\"40\" height=\"6\" fill=\"#FFFFFF\"/>',\n },\n lock: {\n color: '#E0348E',\n markup:\n '<rect x=\"26\" y=\"45\" width=\"48\" height=\"38\" rx=\"6\" fill=\"#FFFFFF\"/>\\n<path d=\"M34 45 L34 32 Q34 14 50 14 Q66 14 66 32 L66 45\" fill=\"none\" stroke=\"#FFFFFF\" stroke-width=\"8\"/>\\n<circle cx=\"50\" cy=\"63\" r=\"6\" fill=\"%COLOR%\"/>',\n },\n neural_net: {\n color: '#2E9E9E',\n markup:\n '<circle cx=\"50\" cy=\"20\" r=\"8\" fill=\"#FFFFFF\"/>\\n<circle cx=\"22\" cy=\"50\" r=\"8\" fill=\"#FFFFFF\"/>\\n<circle cx=\"78\" cy=\"50\" r=\"8\" fill=\"#FFFFFF\"/>\\n<circle cx=\"35\" cy=\"82\" r=\"8\" fill=\"#FFFFFF\"/>\\n<circle cx=\"65\" cy=\"82\" r=\"8\" fill=\"#FFFFFF\"/>\\n<path d=\"M50 20 L22 50 M50 20 L78 50 M22 50 L35 82 M22 50 L65 82 M78 50 L35 82 M78 50 L65 82\" stroke=\"#FFFFFF\" stroke-width=\"3\"/>',\n },\n obelisk: {color: '#5B6BC0', markup: '<polygon points=\"50,8 62,25 62,85 38,85 38,25\" fill=\"#FFFFFF\"/>'},\n octagon: {\n color: '#B5522C',\n markup: '<polygon points=\"35,15 65,15 85,35 85,65 65,85 35,85 15,65 15,35\" fill=\"#FFFFFF\"/>',\n },\n orbit_ring: {\n color: '#4FA33F',\n markup:\n '<circle cx=\"50\" cy=\"50\" r=\"10\" fill=\"#FFFFFF\"/>\\n<ellipse cx=\"50\" cy=\"50\" rx=\"38\" ry=\"16\" fill=\"none\" stroke=\"#FFFFFF\" stroke-width=\"5\" transform=\"rotate(-25 50 50)\"/>',\n },\n parallelogram: {color: '#2E8F5B', markup: '<polygon points=\"30,25 90,25 70,75 10,75\" fill=\"#FFFFFF\"/>'},\n pavilion: {\n color: '#4FA33F',\n markup:\n '<polygon points=\"50,12 90,45 10,45\" fill=\"#FFFFFF\"/>\\n<rect x=\"20\" y=\"45\" width=\"60\" height=\"40\" fill=\"#FFFFFF\" opacity=\"0.6\"/>\\n<rect x=\"44\" y=\"20\" width=\"6\" height=\"14\" fill=\"#FFFFFF\"/>',\n },\n pentagon: {color: '#7B3F9E', markup: '<polygon points=\"50,12 86,38 72,82 28,82 14,38\" fill=\"#FFFFFF\"/>'},\n plus_facet: {\n color: '#E0348E',\n markup:\n '<polygon points=\"38,12 62,12 62,38 88,38 88,62 62,62 62,88 38,88 38,62 12,62 12,38 38,38\" fill=\"#FFFFFF\"/>',\n },\n silo: {\n color: '#8A6A2E',\n markup:\n '<rect x=\"30\" y=\"35\" width=\"40\" height=\"50\" fill=\"#FFFFFF\"/>\\n<ellipse cx=\"50\" cy=\"35\" rx=\"20\" ry=\"10\" fill=\"#FFFFFF\"/>\\n<path d=\"M35 20 Q50 5 65 20\" fill=\"none\" stroke=\"#FFFFFF\" stroke-width=\"6\" stroke-linecap=\"round\"/>',\n },\n spiral: {\n color: '#8A9A3B',\n markup:\n '<path d=\"M50 50 m-30 0 a30 30 0 1 1 60 0 a22 22 0 1 1 -44 0 a14 14 0 1 1 28 0 a6 6 0 1 1 -12 0\" fill=\"none\" stroke=\"#FFFFFF\" stroke-width=\"6\" stroke-linecap=\"round\"/>',\n },\n spire: {\n color: '#7B3F9E',\n markup:\n '<polygon points=\"50,8 62,50 38,50\" fill=\"#FFFFFF\"/>\\n<rect x=\"30\" y=\"50\" width=\"40\" height=\"35\" fill=\"#FFFFFF\"/>',\n },\n star: {\n color: '#5B6BC0',\n markup: '<polygon points=\"50,10 61,38 90,38 66,56 75,86 50,68 25,86 34,56 10,38 39,38\" fill=\"#FFFFFF\"/>',\n },\n tower: {\n color: '#C23B7A',\n markup:\n '<rect x=\"38\" y=\"20\" width=\"24\" height=\"65\" fill=\"#FFFFFF\"/>\\n<polygon points=\"50,8 62,20 38,20\" fill=\"#FFFFFF\"/>\\n<rect x=\"44\" y=\"32\" width=\"6\" height=\"8\" fill=\"%COLOR%\"/>\\n<rect x=\"44\" y=\"48\" width=\"6\" height=\"8\" fill=\"%COLOR%\"/>\\n<rect x=\"44\" y=\"64\" width=\"6\" height=\"8\" fill=\"%COLOR%\"/>',\n },\n townhouse: {\n color: '#5B7A9E',\n markup:\n '<polygon points=\"50,15 82,35 82,85 18,85 18,35\" fill=\"#FFFFFF\"/>\\n<rect x=\"42\" y=\"60\" width=\"16\" height=\"25\" fill=\"%COLOR%\"/>\\n<rect x=\"26\" y=\"45\" width=\"10\" height=\"10\" fill=\"%COLOR%\"/>\\n<rect x=\"64\" y=\"45\" width=\"10\" height=\"10\" fill=\"%COLOR%\"/>',\n },\n triangle_stack: {\n color: '#D6455C',\n markup:\n '<polygon points=\"50,15 78,60 22,60\" fill=\"#FFFFFF\"/>\\n<polygon points=\"50,42 90,88 10,88\" fill=\"#FFFFFF\" opacity=\"0.55\"/>',\n },\n turbine: {\n color: '#7B3F9E',\n markup:\n '<circle cx=\"50\" cy=\"50\" r=\"9\" fill=\"#FFFFFF\"/>\\n<path d=\"M50 50 Q20 40 20 15 Q50 25 50 50 Q80 40 80 15 Q50 25 50 50 Q80 60 80 85 Q50 75 50 50 Q20 60 20 85 Q50 75 50 50\" fill=\"#FFFFFF\"/>',\n },\n valve: {\n color: '#D68A2C',\n markup:\n '<circle cx=\"50\" cy=\"50\" r=\"12\" fill=\"#FFFFFF\"/>\\n<path d=\"M50 20 L50 32 M50 68 L50 80 M20 50 L32 50 M68 50 L80 50 M30 30 L38 38 M62 62 L70 70 M70 30 L62 38 M38 62 L30 70\" stroke=\"#FFFFFF\" stroke-width=\"6\" stroke-linecap=\"round\"/>',\n },\n windmill: {\n color: '#2E9E9E',\n markup:\n '<polygon points=\"46,85 54,85 52,25 48,25\" fill=\"#FFFFFF\"/>\\n<circle cx=\"50\" cy=\"25\" r=\"5\" fill=\"#FFFFFF\"/>\\n<path d=\"M50 25 L25 10 M50 25 L75 10 M50 25 L25 40 M50 25 L75 40\" stroke=\"#FFFFFF\" stroke-width=\"6\" stroke-linecap=\"round\"/>',\n },\n};\n","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * 32-bit unsigned polynomial hash (`h = h*31 + charCode`), used to deterministically derive\n * avatar colors/icons from a seed string. Shared by every avatar util that needs the same\n * hash so seeds map identically across them.\n *\n * @example\n * ```typescript\n * hashStr('session-abc123');\n * ```\n */\nconst hashStr = (str: string): number => {\n let h = 0;\n for (let i = 0; i < str.length; i++) {\n h = (h * 31 + str.charCodeAt(i)) >>> 0;\n }\n return h;\n};\n\nexport default hashStr;\n","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {ANONYMOUS_ANIMAL_ICONS} from './anonymousAnimalIcons.generated';\nimport hashStr from './hashStr';\n\nconst ANONYMOUS_AVATAR_NAMES: string[] = Object.keys(ANONYMOUS_ANIMAL_ICONS).sort();\n\n/**\n * Deterministically picks one of the curated anonymous-avatar animal keys for a given seed\n * (e.g. a session or device identifier), so the same seed always maps to the same avatar.\n *\n * Use this to derive the `content` value for an `avatar:variant=anonymous_animal` spec —\n * the spec parser itself does no hashing, it just looks up whatever key it's given.\n *\n * @param seed - Seed text the pick is derived from. Falls back to a random pick when omitted.\n * @returns An anonymous animal key (e.g. `\"otter\"`) usable as `avatar:` spec's `content` param.\n *\n * @example\n * ```typescript\n * pickAnonymousAvatarName('session-abc123'); // \"otter\"\n * `avatar:variant=anonymous_animal,content=${pickAnonymousAvatarName(sessionId)}`;\n * ```\n */\nconst pickAnonymousAvatarName = (seed?: string): string => {\n const index: number = seed\n ? hashStr(seed) % ANONYMOUS_AVATAR_NAMES.length\n : Math.floor(Math.random() * ANONYMOUS_AVATAR_NAMES.length);\n\n return ANONYMOUS_AVATAR_NAMES[index];\n};\n\nexport default pickAnonymousAvatarName;\n","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {ANONYMOUS_ENTITY_ICONS} from './anonymousEntityIcons.generated';\nimport hashStr from './hashStr';\n\nconst ANONYMOUS_ENTITY_NAMES: string[] = Object.keys(ANONYMOUS_ENTITY_ICONS).sort();\n\n/**\n * Deterministically picks one of the curated anonymous-entity icon keys for a given seed\n * (e.g. an application, organization, or resource server identifier), so the same seed\n * always maps to the same icon.\n *\n * Use this to derive the `content` value for an `avatar:variant=anonymous_entity` spec —\n * the spec parser itself does no hashing, it just looks up whatever key it's given.\n *\n * @param seed - Seed text the pick is derived from. Falls back to a random pick when omitted.\n * @returns An anonymous entity key (e.g. `\"hexagon\"`) usable as `avatar:` spec's `content` param.\n *\n * @example\n * ```typescript\n * pickAnonymousEntityName('app-abc123'); // \"hexagon\"\n * `avatar:variant=anonymous_entity,content=${pickAnonymousEntityName(appId)}`;\n * ```\n */\nconst pickAnonymousEntityName = (seed?: string): string => {\n const index: number = seed\n ? hashStr(seed) % ANONYMOUS_ENTITY_NAMES.length\n : Math.floor(Math.random() * ANONYMOUS_ENTITY_NAMES.length);\n\n return ANONYMOUS_ENTITY_NAMES[index];\n};\n\nexport default pickAnonymousEntityName;\n","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {ANONYMOUS_ANIMAL_ICONS} from './anonymousAnimalIcons.generated';\nimport {ANONYMOUS_ENTITY_ICONS} from './anonymousEntityIcons.generated';\nimport type {AvatarParams} from './extractAvatarParamsFromUri';\nimport hashStr from './hashStr';\nimport pickAnonymousAvatarName from './pickAnonymousAvatarName';\nimport pickAnonymousEntityName from './pickAnonymousEntityName';\n\n// Curated on-brand gradient pairs — `colors` rotates through this set.\nconst AVATAR_PALETTES: [string, string][] = [\n ['#FF7300', '#EF4223'],\n ['#3688FF', '#1d5eb4'],\n ['#5567D5', '#8B6FE8'],\n ['#06b6d4', '#0891b2'],\n ['#10b981', '#059669'],\n ['#ec4899', '#be185d'],\n ['#f59e0b', '#ea580c'],\n ['#8b5cf6', '#6d28d9'],\n ['#5CD1FF', '#3688FF'],\n ['#ef4444', '#b91c1c'],\n];\n\n/**\n * Number of distinct gradient rotations `colors` cycles through for the `blank`,\n * `one_letter`, and `two_letter` variants. Callers that offer a \"pick a background\" UI\n * (e.g. a shuffleable swatch grid) can sample `colors` indices in `[0, AVATAR_GRADIENT_COUNT)`\n * without needing the actual palette values.\n */\nexport const AVATAR_GRADIENT_COUNT: number = AVATAR_PALETTES.length;\n\nconst XML_ESCAPES: Record<string, string> = {'\"': '&quot;', '&': '&amp;', \"'\": '&apos;', '<': '&lt;', '>': '&gt;'};\n\n/**\n * Escapes a caller-supplied value for interpolation into SVG text.\n */\nconst escapeXml = (value: string): string => value.replace(/[\"&'<>]/g, (ch: string) => XML_ESCAPES[ch]);\n\n/**\n * Encodes an SVG document as a data URI. Lone UTF-16 surrogates are replaced with U+FFFD\n * first, since `encodeURIComponent` throws a `URIError` on them. `Array.from` iterates by\n * code point, so a surrogate it yields on its own is unpaired.\n */\nconst toSvgDataUri = (svg: string): string =>\n `data:image/svg+xml,${encodeURIComponent(\n Array.from(svg, (ch: string) => (ch.length === 1 && ch >= '\\uD800' && ch <= '\\uDFFF' ? '\\uFFFD' : ch)).join(''),\n )}`;\n\n/**\n * Fills in `params.content` when the spec itself didn't carry one, deriving it from a raw\n * seed name (e.g. an app or user display name) — extracting initials for letter variants,\n * or hash-picking a curated animal key for `anonymous_animal`.\n *\n * Callers that already have a final `content` value (pre-computed initials, or an exact\n * animal key) should skip this and pass it directly instead.\n *\n * @param variant - The avatar variant `content` is being derived for.\n * @param seedText - A raw name/seed to derive `content` from.\n * @returns A ready-to-render `content` value.\n *\n * @example\n * ```typescript\n * deriveAvatarContent('two_letter', 'Jane Doe'); // \"JD\"\n * deriveAvatarContent('anonymous_animal', 'session-abc123'); // \"otter\"\n * deriveAvatarContent('anonymous_entity', 'app-abc123'); // \"hexagon\"\n * deriveAvatarContent('blank', 'Jane Doe'); // \"\"\n * ```\n */\nexport const deriveAvatarContent = (variant: AvatarParams['variant'], seedText: string): string => {\n if (variant === 'anonymous_animal') {\n return pickAnonymousAvatarName(seedText || undefined);\n }\n if (variant === 'anonymous_entity') {\n return pickAnonymousEntityName(seedText || undefined);\n }\n if (variant === 'blank') {\n return '';\n }\n\n const letterCount: 1 | 2 = variant === 'one_letter' ? 1 : 2;\n return (seedText.match(/[A-Za-z0-9]/g) ?? ['A']).slice(0, letterCount).join('').toUpperCase();\n};\n\n/**\n * Renders the 100x100 background shape, filled either with a gradient/flat-color reference.\n */\nconst shapeMarkup = (shape: AvatarParams['shape'], fill: string): string =>\n shape === 'circle'\n ? `<circle cx=\"50\" cy=\"50\" r=\"50\" fill=\"${fill}\"/>`\n : `<rect width=\"100\" height=\"100\" rx=\"22\" fill=\"${fill}\"/>`;\n\n/**\n * Renders a Vercel-style gradient avatar: a rounded/circle swatch, either bare (`blank`) or\n * topped with initials (`one_letter`/`two_letter`). `content` is assumed final (already the\n * initials to display, or empty for `blank`) — pass it through {@link deriveAvatarContent}\n * first if it needs deriving.\n */\nconst generateGradientAvatar = ({shape, variant, content, colors, bg}: AvatarParams): string => {\n let background: string;\n let defs = '';\n if (bg) {\n background = bg;\n } else {\n const h: number = hashStr(content || 'App');\n const idx: number = (((h + colors) % AVATAR_PALETTES.length) + AVATAR_PALETTES.length) % AVATAR_PALETTES.length;\n const [c1, c2] = AVATAR_PALETTES[idx];\n const angle: number = ((((h >> 4) + colors * 37) % 360) + 360) % 360;\n defs = `<defs><linearGradient id=\"g\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\" gradientTransform=\"rotate(${angle} 0.5 0.5)\"><stop offset=\"0%\" stop-color=\"${c1}\"/><stop offset=\"100%\" stop-color=\"${c2}\"/></linearGradient></defs>`;\n background = 'url(#g)';\n }\n\n let text = '';\n if (variant !== 'blank') {\n const letterCount: 1 | 2 = variant === 'one_letter' ? 1 : 2;\n const initials: string = escapeXml(\n Array.from((content || 'A').toUpperCase())\n .slice(0, letterCount)\n .join(''),\n );\n const fontSize: number = letterCount === 1 ? 46 : 34;\n text = `<text x=\"50\" y=\"64\" font-family=\"Helvetica,Arial,sans-serif\" font-weight=\"700\" font-size=\"${fontSize}\" text-anchor=\"middle\" fill=\"#fff\">${initials}</text>`;\n }\n\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 100 100\">${defs}${shapeMarkup(shape, background)}${text}</svg>`;\n return toSvgDataUri(svg);\n};\n\n/**\n * Renders one of the curated anonymous-animal icons, applying the requested background\n * shape and (optionally) recoloring the whole icon with `bg`. `content` is assumed to\n * already be a valid animal key — pass it through {@link deriveAvatarContent} first if\n * it needs deriving, or if it might be invalid/empty.\n */\nconst generateAnonymousAnimalAvatar = ({shape, content, bg}: AvatarParams): string => {\n const key: string = Object.prototype.hasOwnProperty.call(ANONYMOUS_ANIMAL_ICONS, content)\n ? content\n : pickAnonymousAvatarName();\n const icon = ANONYMOUS_ANIMAL_ICONS[key];\n const color: string = bg ?? icon.color;\n const markup: string = icon.markup.replaceAll('%COLOR%', color);\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 100 100\">${shapeMarkup(shape, color)}${markup}</svg>`;\n return toSvgDataUri(svg);\n};\n\n/**\n * Renders one of the curated anonymous-entity icons (application/organization/resource-server\n * shapes), applying the requested background shape and (optionally) recoloring the whole icon\n * with `bg`. `content` is assumed to already be a valid entity key — pass it through\n * {@link deriveAvatarContent} first if it needs deriving, or if it might be invalid/empty.\n */\nconst generateAnonymousEntityAvatar = ({shape, content, bg}: AvatarParams): string => {\n const key: string = Object.prototype.hasOwnProperty.call(ANONYMOUS_ENTITY_ICONS, content)\n ? content\n : pickAnonymousEntityName();\n const icon = ANONYMOUS_ENTITY_ICONS[key];\n const color: string = bg ?? icon.color;\n const markup: string = icon.markup.replaceAll('%COLOR%', color);\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 100 100\">${shapeMarkup(shape, color)}${markup}</svg>`;\n return toSvgDataUri(svg);\n};\n\n/**\n * Generates an avatar image as an `svg+xml` data URI from a fully-resolved {@link AvatarParams}.\n * `params.content` is assumed final; use {@link deriveAvatarContent} first if it might be\n * empty or otherwise needs deriving from a raw seed name.\n *\n * @param params - Resolved avatar parameters (see {@link AvatarParams}).\n * @returns A `data:image/svg+xml,...` URI rendering the generated avatar.\n *\n * @example\n * ```typescript\n * generateAvatarDataUri({shape: 'circle', variant: 'two_letter', content: 'BM', colors: 2});\n * generateAvatarDataUri({shape: 'rounded', variant: 'anonymous_animal', content: 'jackalope'});\n * generateAvatarDataUri({shape: 'rounded', variant: 'anonymous_entity', content: 'hexagon'});\n * generateAvatarDataUri({shape: 'circle', variant: 'blank', content: '', colors: 5});\n * ```\n */\nconst generateAvatarDataUri = (params: AvatarParams): string => {\n if (params.variant === 'anonymous_animal') {\n return generateAnonymousAnimalAvatar(params);\n }\n if (params.variant === 'anonymous_entity') {\n return generateAnonymousEntityAvatar(params);\n }\n return generateGradientAvatar(params);\n};\n\nexport default generateAvatarDataUri;\n","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {extractEmojiFromUri, isEmojiUri} from '@thunderid/javascript';\nimport extractAvatarParamsFromUri, {type AvatarParams} from './extractAvatarParamsFromUri';\nimport generateAvatarDataUri, {deriveAvatarContent} from './generateAvatarDataUri';\nimport isAvatarUri from './isAvatarUri';\n\nexport type ResolvedLogoKind = 'avatar' | 'emoji' | 'url';\n\nexport interface ResolvedLogo {\n /**\n * Rendered image source (a data URI or plain URL). Absent when `kind` is `\"emoji\"`.\n */\n imgSrc?: string;\n /**\n * The emoji glyph to render. Only present when `kind` is `\"emoji\"`.\n */\n glyph?: string;\n /**\n * Which logo spec variant was resolved.\n */\n kind: ResolvedLogoKind;\n}\n\n/**\n * Resolves an application logo spec string — `emoji:<glyph>`, `avatar:shape=...,variant=...,\n * content=...,colors=...,bg=...`, or a bare URL — into a renderable representation.\n *\n * A spec in none of the recognized schemes falls back to treating it as a plain URL so\n * callers can always render *something* without special-casing.\n *\n * @param spec - The stored logo spec string.\n * @param fallbackSeedText - Raw seed name (e.g. an app or user display name) used to derive\n * an `avatar:` spec's `content` when the spec itself doesn't carry one (e.g. an app name\n * to keep the avatar in sync as it changes).\n * @returns The resolved logo, ready to render.\n *\n * @example\n * ```typescript\n * resolveLogoUri(\"emoji:🛡️\"); // { kind: \"emoji\", glyph: \"🛡️\" }\n * resolveLogoUri(\"avatar:shape=circle,variant=two_letter,content=BM\"); // { kind: \"avatar\", imgSrc: \"data:image/svg+xml,...\" }\n * resolveLogoUri(\"https://example.com/logo.png\"); // { kind: \"url\", imgSrc: \"https://example.com/logo.png\" }\n * ```\n */\nconst resolveLogoUri = (spec: string, fallbackSeedText = ''): ResolvedLogo => {\n if (isEmojiUri(spec)) {\n return {glyph: extractEmojiFromUri(spec), kind: 'emoji'};\n }\n\n if (isAvatarUri(spec)) {\n const params: AvatarParams = extractAvatarParamsFromUri(spec);\n const content: string = params.content || deriveAvatarContent(params.variant, fallbackSeedText);\n return {imgSrc: generateAvatarDataUri({...params, content}), kind: 'avatar'};\n }\n\n return {imgSrc: spec, kind: 'url'};\n};\n\nexport default resolveLogoUri;\n","// Copyright 2025 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\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 * A `MediaQueryList` returned by `createMediaQueryListener`, with a `disconnect()` that removes the\n * listener it registered.\n */\nexport type MediaQueryListener = MediaQueryList & {\n /** Stops calling the callback on system theme changes. */\n disconnect: () => void;\n};\n\n/**\n * Creates a media query listener for system theme changes. Call `disconnect()` on the returned\n * object to remove the listener.\n */\nexport const createMediaQueryListener = (callback: (isDark: boolean) => void): MediaQueryListener | 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 Object.assign(mediaQuery, {\n disconnect: (): void => {\n if (mediaQuery.removeEventListener) {\n mediaQuery.removeEventListener('change', handleChange);\n } else {\n mediaQuery.removeListener(handleChange);\n }\n },\n });\n};\n","// Copyright 2025 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\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","// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {FlowMetaThemeShape} from '@thunderid/javascript';\n\n/**\n * Size configuration in the v2 theme.\n *\n * @experimental This API may change in future versions\n */\ninterface FlowMetaThemeSize {\n small?: string;\n medium?: string;\n large?: string;\n}\n/**\n * Normalizes a raw `shape.borderRadius` value into per-size tokens suitable\n * for `ThemeConfig.borderRadius`.\n *\n * - Object with `small`/`medium`/`large` → used directly.\n * - Bare number or numeric string (e.g. `8` or `\"8\"`) → appended with `px` and applied uniformly.\n * - Pixel string (e.g. `\"8px\"`) → used as-is and applied uniformly.\n */\nconst normalizeBorderRadius = (raw: FlowMetaThemeShape['borderRadius']): FlowMetaThemeSize | undefined => {\n if (raw === undefined) return undefined;\n\n if (typeof raw === 'object') {\n const {small, medium, large}: FlowMetaThemeSize = raw;\n if (small === undefined && medium === undefined && large === undefined) return undefined;\n return {\n ...(large !== undefined && {large}),\n ...(medium !== undefined && {medium}),\n ...(small !== undefined && {small}),\n };\n }\n\n const trimmed: string = String(raw).trim();\n const radiusStr: string =\n typeof raw === 'number' ? `${raw}px` : /^\\d+(\\.\\d+)?$/.test(trimmed) ? `${trimmed}px` : trimmed;\n return {large: radiusStr, medium: radiusStr, small: radiusStr};\n};\n\nexport default normalizeBorderRadius;\n"],"x_google_ignoreList":[13,14,15],"mappings":"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ACP,QACE;EACH;CACD,MAAM;EACJ,OAAO;EACP,QACE;EACH;CACD,OAAO;EACL,OAAO;EACP,QACE;EACH;CACD,UAAU;EACR,OAAO;EACP,QACE;EACH;CACD,QAAQ;EACN,OAAO;EACP,QACE;EACH;CACD,SAAS;EACP,OAAO;EACP,QACE;EACH;CACD,OAAO;EACL,OAAO;EACP,QACE;EACH;CACF;;;;AChGD,MAAaC,yBAA8D;CACzE,QAAQ;EACN,OAAO;EACP,QACE;EACH;CACD,SAAS;EACP,OAAO;EACP,QACE;EACH;CACD,OAAO;EACL,OAAO;EACP,QACE;EACH;CACD,MAAM;EACJ,OAAO;EACP,QACE;EACH;CACD,UAAU;EACR,OAAO;EACP,QACE;EACH;CACD,OAAO;EACL,OAAO;EACP,QACE;EACH;CACD,QAAQ;EACN,OAAO;EACP,QACE;EACH;CACD,SAAS;EACP,OAAO;EACP,QACE;EACH;CACD,cAAc;EACZ,OAAO;EACP,QACE;EACH;CACD,SAAS;EACP,OAAO;EACP,QACE;EACH;CACD,MAAM;EACJ,OAAO;EACP,QACE;EACH;CACD,SAAS;EAAC,OAAO;EAAW,QAAQ;EAA6D;CACjG,MAAM;EACJ,OAAO;EACP,QACE;EACH;CACD,MAAM;EACJ,OAAO;EACP,QAAQ;EACT;CACD,SAAS;EAAC,OAAO;EAAW,QAAQ;EAAyE;CAC7G,KAAK;EACH,OAAO;EACP,QACE;EACH;CACD,YAAY;EACV,OAAO;EACP,QACE;EACH;CACD,MAAM;EACJ,OAAO;EACP,QACE;EACH;CACD,YAAY;EACV,OAAO;EACP,QACE;EACH;CACD,SAAS;EAAC,OAAO;EAAW,QAAQ;EAAkE;CACtG,SAAS;EACP,OAAO;EACP,QAAQ;EACT;CACD,YAAY;EACV,OAAO;EACP,QACE;EACH;CACD,eAAe;EAAC,OAAO;EAAW,QAAQ;EAA6D;CACvG,UAAU;EACR,OAAO;EACP,QACE;EACH;CACD,UAAU;EAAC,OAAO;EAAW,QAAQ;EAAmE;CACxG,YAAY;EACV,OAAO;EACP,QACE;EACH;CACD,MAAM;EACJ,OAAO;EACP,QACE;EACH;CACD,QAAQ;EACN,OAAO;EACP,QACE;EACH;CACD,OAAO;EACL,OAAO;EACP,QACE;EACH;CACD,MAAM;EACJ,OAAO;EACP,QAAQ;EACT;CACD,OAAO;EACL,OAAO;EACP,QACE;EACH;CACD,WAAW;EACT,OAAO;EACP,QACE;EACH;CACD,gBAAgB;EACd,OAAO;EACP,QACE;EACH;CACD,SAAS;EACP,OAAO;EACP,QACE;EACH;CACD,OAAO;EACL,OAAO;EACP,QACE;EACH;CACD,UAAU;EACR,OAAO;EACP,QACE;EACH;CACF;;;;;;;;;;;;;;AChKD,MAAM,WAAW,QAAwB;CACvC,IAAI,IAAI;AACR,MAAK,IAAIC,MAAI,GAAGA,MAAI,IAAI,QAAQ,MAC9B,KAAK,IAAI,KAAK,IAAI,WAAWA,IAAE,KAAM;AAEvC,QAAO;;AAGT,sBAAe;;;;ACff,MAAMC,yBAAmC,OAAO,KAAK,uBAAuB,CAAC,MAAM;;;;;;;;;;;;;;;;;AAkBnF,MAAM,2BAA2B,SAA0B;AAKzD,QAAO,uBAJe,OAClBC,gBAAQ,KAAK,GAAG,uBAAuB,SACvC,KAAK,MAAM,KAAK,QAAQ,GAAG,uBAAuB,OAAO;;AAK/D,sCAAe;;;;AC1Bf,MAAMC,yBAAmC,OAAO,KAAK,uBAAuB,CAAC,MAAM;;;;;;;;;;;;;;;;;;AAmBnF,MAAM,2BAA2B,SAA0B;AAKzD,QAAO,uBAJe,OAClBC,gBAAQ,KAAK,GAAG,uBAAuB,SACvC,KAAK,MAAM,KAAK,QAAQ,GAAG,uBAAuB,OAAO;;AAK/D,sCAAe;;;;ACtBf,MAAMC,kBAAsC;CAC1C,CAAC,WAAW,UAAU;CACtB,CAAC,WAAW,UAAU;CACtB,CAAC,WAAW,UAAU;CACtB,CAAC,WAAW,UAAU;CACtB,CAAC,WAAW,UAAU;CACtB,CAAC,WAAW,UAAU;CACtB,CAAC,WAAW,UAAU;CACtB,CAAC,WAAW,UAAU;CACtB,CAAC,WAAW,UAAU;CACtB,CAAC,WAAW,UAAU;CACvB;;;;;;;AAQD,MAAaC,wBAAgC,gBAAgB;AAE7D,MAAMC,cAAsC;CAAC,MAAK;CAAU,KAAK;CAAS,KAAK;CAAU,KAAK;CAAQ,KAAK;CAAO;;;;AAKlH,MAAM,aAAa,UAA0B,MAAM,QAAQ,aAAa,OAAe,YAAY,IAAI;;;;;;AAOvG,MAAM,gBAAgB,QACpB,sBAAsB,mBACpB,MAAM,KAAK,MAAM,OAAgB,GAAG,WAAW,KAAK,MAAM,YAAY,MAAM,WAAW,MAAW,GAAI,CAAC,KAAK,GAAG,CAChH;;;;;;;;;;;;;;;;;;;;;AAsBH,MAAa,uBAAuB,SAAkC,aAA6B;AACjG,KAAI,YAAY,mBACd,QAAOC,gCAAwB,YAAY,OAAU;AAEvD,KAAI,YAAY,mBACd,QAAOC,gCAAwB,YAAY,OAAU;AAEvD,KAAI,YAAY,QACd,QAAO;CAGT,MAAMC,cAAqB,YAAY,eAAe,IAAI;AAC1D,SAAQ,SAAS,MAAM,eAAe,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAAC,KAAK,GAAG,CAAC,aAAa;;;;;AAM/F,MAAM,eAAe,OAA8B,SACjD,UAAU,WACN,wCAAwC,KAAK,OAC7C,gDAAgD,KAAK;;;;;;;AAQ3D,MAAM,0BAA0B,EAAC,OAAO,SAAS,SAAS,QAAQ,SAA8B;CAC9F,IAAIC;CACJ,IAAI,OAAO;AACX,KAAI,GACF,cAAa;MACR;EACL,MAAMC,IAAYC,gBAAQ,WAAW,MAAM;EAE3C,MAAM,CAAC,IAAI,MAAM,kBADM,IAAI,UAAU,gBAAgB,SAAU,gBAAgB,UAAU,gBAAgB;AAGzG,SAAO,iGADmB,KAAK,KAAK,SAAS,MAAM,MAAO,OAAO,IAC0C,2CAA2C,GAAG,qCAAqC,GAAG;AACjM,eAAa;;CAGf,IAAI,OAAO;AACX,KAAI,YAAY,SAAS;EACvB,MAAMH,cAAqB,YAAY,eAAe,IAAI;EAC1D,MAAMI,WAAmB,UACvB,MAAM,MAAM,WAAW,KAAK,aAAa,CAAC,CACvC,MAAM,GAAG,YAAY,CACrB,KAAK,GAAG,CACZ;AAED,SAAO,6FADkB,gBAAgB,IAAI,KAAK,GAC2D,qCAAqC,SAAS;;AAI7J,QAAO,aADK,iEAAiE,OAAO,YAAY,OAAO,WAAW,GAAG,KAAK,QAClG;;;;;;;;AAS1B,MAAM,iCAAiC,EAAC,OAAO,SAAS,SAA8B;CAIpF,MAAM,OAAO,uBAHO,OAAO,UAAU,eAAe,KAAK,wBAAwB,QAAQ,GACrF,UACAN,iCAAyB;CAE7B,MAAMO,QAAgB,MAAM,KAAK;CACjC,MAAMC,SAAiB,KAAK,OAAO,WAAW,WAAW,MAAM;AAE/D,QAAO,aADK,iEAAiE,YAAY,OAAO,MAAM,GAAG,OAAO,QACxF;;;;;;;;AAS1B,MAAM,iCAAiC,EAAC,OAAO,SAAS,SAA8B;CAIpF,MAAM,OAAO,uBAHO,OAAO,UAAU,eAAe,KAAK,wBAAwB,QAAQ,GACrF,UACAP,iCAAyB;CAE7B,MAAMM,QAAgB,MAAM,KAAK;CACjC,MAAMC,SAAiB,KAAK,OAAO,WAAW,WAAW,MAAM;AAE/D,QAAO,aADK,iEAAiE,YAAY,OAAO,MAAM,GAAG,OAAO,QACxF;;;;;;;;;;;;;;;;;;AAmB1B,MAAM,yBAAyB,WAAiC;AAC9D,KAAI,OAAO,YAAY,mBACrB,QAAO,8BAA8B,OAAO;AAE9C,KAAI,OAAO,YAAY,mBACrB,QAAO,8BAA8B,OAAO;AAE9C,QAAO,uBAAuB,OAAO;;AAGvC,oCAAe;;;;;;;;;;;;;;;;;;;;;;;;AC/If,MAAM,kBAAkB,MAAc,mBAAmB,OAAqB;AAC5E,4CAAe,KAAK,CAClB,QAAO;EAAC,uDAA2B,KAAK;EAAE,MAAM;EAAQ;AAG1D,KAAIC,oBAAY,KAAK,EAAE;EACrB,MAAMC,SAAuBC,mCAA2B,KAAK;EAC7D,MAAMC,UAAkB,OAAO,WAAW,oBAAoB,OAAO,SAAS,iBAAiB;AAC/F,SAAO;GAAC,QAAQC,8BAAsB;IAAC,GAAG;IAAQ;IAAQ,CAAC;GAAE,MAAM;GAAS;;AAG9E,QAAO;EAAC,QAAQ;EAAM,MAAM;EAAM;;AAGpC,6BAAe;;;;ACtDf,MAAMC,kEACJ,sBACA,iBACD;;;;AAgBD,MAAa,mBAAmB,MAAiB,SAAgC,EAAE,KAAuB;CACxG,MAAM,EACJ,YAAY,QACZ,aAAa,SACb,gBAAgB,OAAO,aAAa,cAAc,SAAS,kBAAkB,SAC3E;AAEJ,KAAI,SAAS,QAAS,QAAO;AAC7B,KAAI,SAAS,OAAQ,QAAO;AAE5B,KAAI,SAAS,UAAU;AACrB,MAAI,OAAO,WAAW,eAAe,OAAO,WAC1C,QAAO,OAAO,WAAW,+BAA+B,CAAC,UAAU,SAAS;AAE9E,SAAO;;AAGT,KAAI,SAAS,SAAS;AACpB,MAAI,CAAC,eAAe;AAClB,UAAO,KAAK,kGAAkG;AAC9G,UAAO;;EAGT,MAAM,EAAC,cAAa;AAGpB,MAAI,UAAU,SAAS,UAAU,CAC/B,QAAO;AAIT,MAAI,UAAU,SAAS,WAAW,CAChC,QAAO;AAIT,SAAO;;AAGT,QAAO;;;;;AAMT,MAAa,uBACX,eACA,UACA,SAAgC,EAAE,KACb;CACrB,MAAM,EAAC,YAAY,QAAQ,aAAa,YAAW;CAEnD,MAAMC,WAA6B,IAAI,kBAAkB,cAAgC;AACvF,YAAU,SAAS,aAA6B;AAC9C,OAAI,SAAS,SAAS,gBAAgB,SAAS,kBAAkB,SAAS;IACxE,MAAM,EAAC,cAAa;AAEpB,QAAI,UAAU,SAAS,UAAU,CAC/B,UAAS,KAAK;aACL,UAAU,SAAS,WAAW,CACvC,UAAS,MAAM;;IAKnB;GACF;AAEF,UAAS,QAAQ,eAAe;EAC9B,iBAAiB,CAAC,QAAQ;EAC1B,YAAY;EACb,CAAC;AAEF,QAAO;;;;;;AAgBT,MAAa,4BAA4B,aAAmE;AAC1G,KAAI,OAAO,WAAW,eAAe,CAAC,OAAO,WAC3C,QAAO;CAGT,MAAMC,aAA6B,OAAO,WAAW,+BAA+B;CAEpF,MAAM,gBAAgB,MAAiC;AACrD,WAAS,EAAE,QAAQ;;AAIrB,KAAI,WAAW,iBACb,YAAW,iBAAiB,UAAU,aAAa;KAGnD,YAAW,YAAY,aAAa;AAGtC,QAAO,OAAO,OAAO,YAAY,EAC/B,kBAAwB;AACtB,MAAI,WAAW,oBACb,YAAW,oBAAoB,UAAU,aAAa;MAEtD,YAAW,eAAe,aAAa;IAG5C,CAAC;;;;;;;;;;;AChIJ,MAAM,kBAAkB,MAAiB,SAAgC,EAAE,KAAgB;AACzF,KAAI,SAAS,OACX,QAAO;AAGT,KAAI,SAAS,QACX,QAAO;AAGT,KAAI,SAAS,UAAU;AACrB,MAAI,OAAO,WAAW,eAAe,OAAO,WAC1C,QAAO,OAAO,WAAW,+BAA+B,CAAC,UAAU,SAAS;AAI9E,SAAOC;;AAGT,KAAI,SAAS,QACX,QAAO,gBAAgB,MAAM,OAAO;AAItC,QAAOA;;AAGT,6BAAe;;;;;;;;;;;;ACff,MAAM,yBAAyB,QAA2E;AACxG,KAAI,QAAQ,OAAW,QAAO;AAE9B,KAAI,OAAO,QAAQ,UAAU;EAC3B,MAAM,EAAC,OAAO,QAAQ,UAA4B;AAClD,MAAI,UAAU,UAAa,WAAW,UAAa,UAAU,OAAW,QAAO;AAC/E,SAAO;GACL,GAAI,UAAU,UAAa,EAAC,OAAM;GAClC,GAAI,WAAW,UAAa,EAAC,QAAO;GACpC,GAAI,UAAU,UAAa,EAAC,OAAM;GACnC;;CAGH,MAAMC,UAAkB,OAAO,IAAI,CAAC,MAAM;CAC1C,MAAMC,YACJ,OAAO,QAAQ,WAAW,GAAG,IAAI,MAAM,gBAAgB,KAAK,QAAQ,GAAG,GAAG,QAAQ,MAAM;AAC1F,QAAO;EAAC,OAAO;EAAW,QAAQ;EAAW,OAAO;EAAU;;AAGhE,oCAAe"}