export interface AltchaGlobal { algorithms: Map Worker | Promise>; defaults: Store>; i18n: Store>>; instances: Set; plugins: Set any>; } export declare enum AudioState { ERROR = "error", LOADING = "loading", PLAYING = "playing", PAUSED = "paused", READY = "ready" } export interface Configuration { /** * Forces a specific language for audio-based challenges. */ audioChallengeLanguage: string; /** * Determines when verification triggers automatically. * @default 'off' */ auto: 'off' | 'onfocus' | 'onload' | 'onsubmit'; /** * Vertical position of the widget when `display` is set to `bar`. */ barPlacement: 'bottom' | 'top'; /** * The challenge data or the URL to fetch a new challenge from. */ challenge: Challenge | string | null; /** * A specific code-challenge object. Overrides values provided in the `challenge` property. */ codeChallenge: CodeChallenge | null; /** * The UI layout used for the code-challenge modal. */ codeChallengeDisplay: 'standard' | 'overlay' | 'bottomsheet'; /** * Defines how credentials (cookies/auth headers) are handled during the challenge request. */ credentials: RequestCredentials | null; /** * Enables verbose logging in the browser console for debugging. */ debug: boolean; /** * Prevents the code-challenge modal from stealing focus when opened. */ disableAutoFocus: boolean; /** * The visual layout mode of the widget. */ display: 'standard' | 'bar' | 'floating' | 'overlay' | 'invisible'; /** * A custom `fetch` implementation for network requests. */ fetch: typeof fetch; /** * The element or CSS selector the floating UI attaches to. * Defaults to the first `submit` button in the parent form. */ floatingAnchor: string | HTMLElement | null; /** * Vertical offset (in pixels) between the floating UI and its anchor. * @default 12 */ floatingOffset: number; /** * Controls whether the floating widget remains visible after successful verification. */ floatingPersist: boolean | 'focus'; /** * Preferred position of the floating widget relative to the anchor. */ floatingPlacement: 'auto' | 'bottom' | 'top'; /** * Hides the "ALTCHA" attribution link. */ hideFooter: boolean; /** * Hides the ALTCHA logo icon. */ hideLogo: boolean; /** * Enables the collection of pointer and scroll events for ALTCHA HIS mechanism (defaults to true). */ humanInteractionSignature: boolean; /** * The ISO alpha-2 language code for localization (requires corresponding i18n file). */ language: string; /** * The minimum verification time in milliseconds (adds an artificial delay if the PoW is faster). * @default 500 */ minDuration: number; /** * Forces the widget into a failed state with a mock error for UI testing. */ mockError: boolean; /** * The `name` attribute of the hidden input field containing the payload. * @default 'altcha' */ name: string; /** * CSS selector for an element to be mirrored inside the overlay modal. */ overlayContent: string | null; /** * Configures the placement (top / bottom) for popovers. Defaults to 'auto'. */ popoverPlacement: 'auto' | 'bottom' | 'top'; /** * Automatically attempts to restart verification with fewer workers if the browser runs out of memory (Argon2 and Scrypt only). */ retryOnOutOfMemoryError: boolean; /** * Includes other form field values in the server-side verification request. */ serverVerificationFields: boolean; /** * Includes the user's time zone in the server-side verification request. */ serverVerificationTimeZone: boolean; /** * When set, the widget will set a configured cookie for the payload instead of sending it as form field. */ setCookie: SetCookieOptions | null; /** * Mocks a successful verification. Useful for testing environments without network access. */ test: boolean; /** * PoW verification timeout in milliseconds. Defaults to 90_000 ms. */ timeout: number; /** * The visual style of the interaction element. */ type: 'native' | 'checkbox' | 'switch'; /** * Custom validation message for the HTML5 `setCustomValidity` API. */ validationMessage: string; /** * A custom verification handler. Overrides the default network-based verification. */ verifyFunction: ((payload: string, code?: string) => Promise) | null; /** * The endpoint URL for server-side verification. */ verifyUrl: string | null; /** * The number of Web Workers to spawn for proof-of-work calculations. */ workers: number; } export interface Challenge { codeChallenge?: CodeChallenge; parameters: ChallengeParameters; signature?: string; } export interface ChallengeParameters { algorithm: string; nonce: string; salt: string; cost: number; keyLength: number; keyPrefix: string; keySignature?: string; memoryCost?: number; parallelism?: number; expiresAt?: number; data?: Record; } export interface ChallengeV1 { algorithm: string; challenge: string; codeChallenge?: CodeChallenge; salt: string; maxnumber?: number; maxNumber?: number; signature: string; } export interface CodeChallenge { image: string; audio?: string; length?: number; } export interface CreateChallengeOptions { algorithm: string; counter?: number; counterMode?: 'uint32' | 'string'; cost: number; data?: Record; deriveKey: DeriveKeyFunction; expiresAt?: number | Date; hmacAlgorithm?: HmacAlgorithm; hmacKeySignatureSecret?: string; hmacSignatureSecret?: string; keyLength?: number; keyPrefix?: string; keyPrefixLength?: number; memoryCost?: number; parallelism?: number; } export interface CSSVariables { '--altcha-border-color': string; '--altcha-border-width': string; '--altcha-border-radius': string; '--altcha-color-base': string; '--altcha-color-base-content': string; '--altcha-color-error': string; '--altcha-color-error-content': string; '--altcha-color-neutral': string; '--altcha-color-neutral-content': string; '--altcha-color-primary': string; '--altcha-color-primary-content': string; '--altcha-color-success': string; '--altcha-color-success-content': string; '--altcha-checkbox-border-color': string; '--altcha-checkbox-border-radius': string; '--altcha-checkbox-border-width': string; '--altcha-checkbox-outline': string; '--altcha-checkbox-outline-offset': string; '--altcha-checkbox-size': string; '--altcha-checkbox-transition-duration': string; '--altcha-input-background-color': string; '--altcha-input-border-radius': string; '--altcha-input-border-width': string; '--altcha-max-width': string; '--altcha-padding': string; '--altcha-popover-arrow-size': string; '--altcha-popover-color': string; '--altcha-shadow': string; '--altcha-spinner-color': string; '--altcha-switch-background-color': string; '--altcha-switch-border-radius': string; '--altcha-switch-height': string; '--altcha-switch-padding': string; '--altcha-switch-width': string; '--altcha-switch-toggle-border-radius': string; '--altcha-switch-toggle-color': string; '--altcha-switch-toggle-size': string; '--altcha-transition-duration': string; '--altcha-z-index': string | number; '--altcha-z-index-popover': string | number; } export type DeriveKeyFunction = (parameters: ChallengeParameters, salt: Uint8Array, password: Uint8Array) => Promise; export interface DeriveKeyFunctionResult { parameters?: Partial; derivedKey: Uint8Array; } export declare enum HmacAlgorithm { SHA_256 = "SHA-256", SHA_384 = "SHA-384", SHA_512 = "SHA-512" } export interface Payload { challenge: Omit; solution: Solution; } export interface PayloadV1 { algorithm: string; challenge: string; number: number; salt: string; signature?: string; took: number; } export interface SetCookieOptions { domain?: string; name?: string; maxAge?: number; path?: string; sameSite?: string; secure?: boolean; } export type ServerClassification = 'BAD' | 'GOOD' | 'NEUTRAL'; export interface ServerSignaturePayload { algorithm: string; apiKey?: string; id?: string; signature: string; verificationData: string; verified: boolean; } export interface ServerSignatureVerificationData { [key: string]: string | unknown; classification?: ServerClassification; email?: string; expire?: number; fields?: string[]; fieldsHash?: string; id?: string; ipAddress?: string; reasons?: string[]; score?: number; time?: number; verified?: boolean; } export interface ServerVerificationResult { algorithm?: string; apiKey?: string; id?: string; payload?: string; reason?: string; score?: number; signature?: string; verificationData?: string; verified?: boolean; } export interface SolveChallengeOptions { challenge: Challenge; controller?: AbortController; counterStart?: number; counterStep?: number; counterMode?: 'uint32' | 'string'; deriveKey: DeriveKeyFunction; timeout?: number; } export interface Strings { ariaLinkLabel: string; enterCode: string; enterCodeAria: string; error: string; expired: string; footer: string; getAudioChallenge: string; label: string; loading: string; reload: string; verify: string; verificationRequired: string; verified: string; verifying: string; waitAlert: string; } export declare enum State { CODE = "code", ERROR = "error", VERIFIED = "verified", VERIFYING = "verifying", UNVERIFIED = "unverified", EXPIRED = "expired" } export interface Solution { counter: number; derivedKey: string; time?: number; } export type Store = { get: (name: K) => T[K]; set: (name: N | T, value?: T[N]) => void; store: Writable; }; export interface VerifyOptions { concurrency?: number; controller?: AbortController; minDuration?: number; } export interface VerifyResult { challenge?: Challenge; payload: string; solution?: Solution; } export interface VerifyServerSignatureResult extends VerifySolutionResult { verificationData?: ServerSignatureVerificationData | null; } export interface VerifySolutionOptions { challenge: Challenge; counterMode?: 'uint32' | 'string'; deriveKey: DeriveKeyFunction; hmacAlgorithm?: HmacAlgorithm; hmacKeySignatureSecret?: string; hmacSignatureSecret: string; solution: Solution; } export interface VerifySolutionResult { expired: boolean; invalidSignature: boolean | null; invalidSolution: boolean | null; time: number; verified: boolean; } export interface WidgetAttributes extends Partial> { challenge?: string; configuration?: string; } export interface WidgetMethods { configure: (config: Partial) => Promise; getConfiguration: () => Configuration; getState: () => State; hide: () => void; reset: (newState?: State, err?: string | null) => void; setState: (newState: State, err?: string | null) => void; show: () => void; updateUI: () => void; verify: (options?: VerifyOptions) => Promise; } export type Writable>> = { set(this: void, value: T): void; update(this: void, updater: (value: T) => T): void; subscribe(this: void, run: (value: T) => void, invalidate?: () => void): () => void; };