@usewayn/widget
Version:
Client side widget generator for Wayn PoW CAPTCHA.
261 lines (229 loc) • 6.25 kB
TypeScript
/**
* TypeScript declarations for wayn.js
* Main Wayn widget implementation
*/
declare namespace Wayn {
/**
* Configuration options for Wayn widget
*/
interface Config {
/** API endpoint for challenge requests */
apiEndpoint?: string;
/** Number of web workers to use for solving */
workerCount?: number;
/** Custom fetch function */
customFetch?: typeof fetch;
/** Custom WASM URL */
customWasmUrl?: string;
/** Hidden field name for form integration */
hiddenFieldName?: string;
/** Internationalization text overrides */
i18n?: {
initialState?: string;
verifyingLabel?: string;
verifyingAriaLabel?: string;
verifiedAriaLabel?: string;
errorAriaLabel?: string;
solvedLabel?: string;
errorLabel?: string;
verifyAriaLabel?: string;
};
}
/**
* Challenge data from server
*/
interface Challenge {
challenge: Array<[string, string]>; // [salt, target] tuples
token?: string;
expires: number;
}
/**
* Solution format for redeeming challenges
*/
interface Solution {
token: string;
solutions: Array<[string, string, number]>; // [salt, target, nonce] tuples
}
/**
* Server response for challenge redemption
*/
interface RedeemResponse {
success: boolean;
message?: string;
token?: string;
expires?: number;
}
/**
* Event detail for progress events
*/
interface ProgressDetail {
progress: number; // 0-100
}
/**
* Event detail for solve events
*/
interface SolveDetail {
token: string;
}
/**
* Event detail for error events
*/
interface ErrorDetail {
isWayn: boolean;
message: string;
}
/**
* Event detail for reset events
*/
interface ResetDetail {}
/**
* Custom events dispatched by Wayn widget
*/
interface WaynEvents {
progress: CustomEvent<ProgressDetail>;
solve: CustomEvent<SolveDetail>;
error: CustomEvent<ErrorDetail>;
reset: CustomEvent<ResetDetail>;
}
}
/**
* Wayn Widget Custom Element
*/
declare class WaynWidget extends HTMLElement {
/** Current token value */
token: string | null;
/**
* Solve the proof-of-work challenge
* @returns Promise resolving to success result with token
*/
solve(): Promise<{ success: boolean; token: string }>;
/**
* Reset the widget to initial state
*/
reset(): void;
/**
* Get the current token value
*/
get tokenValue(): string | null;
/**
* Set number of workers for solving
* @param workers Number of workers to use
*/
setWorkersCount(workers: number): void;
/**
* Get internationalized text
* @param key Text key
* @param defaultValue Default value if key not found
*/
getI18nText(key: string, defaultValue: string): string;
/**
* Dispatch a custom event with detail
* @param eventName Name of the event
* @param detail Event detail object
*/
dispatchEvent<K extends keyof Wayn.WaynEvents>(
eventName: K,
detail?: Wayn.WaynEvents[K]['detail']
): void;
/**
* Handle error and dispatch error event
* @param message Error message
*/
error(message?: string): void;
// Event handlers
addEventListener<K extends keyof Wayn.WaynEvents>(
type: K,
listener: (this: WaynWidget, ev: Wayn.WaynEvents[K]) => any,
options?: boolean | AddEventListenerOptions
): void;
addEventListener(
type: string,
listener: EventListenerOrEventListenerObject,
options?: boolean | AddEventListenerOptions
): void;
removeEventListener<K extends keyof Wayn.WaynEvents>(
type: K,
listener: (this: WaynWidget, ev: Wayn.WaynEvents[K]) => any,
options?: boolean | EventListenerOptions
): void;
removeEventListener(
type: string,
listener: EventListenerOrEventListenerObject,
options?: boolean | EventListenerOptions
): void;
// HTML attributes
static readonly observedAttributes: string[];
// Lifecycle callbacks
connectedCallback(): Promise<void>;
disconnectedCallback(): void;
attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
}
/**
* Wayn class for programmatic usage
*/
declare class Wayn {
/** The underlying widget element */
readonly widget: WaynWidget;
/** Current token value */
readonly token: string | null;
/**
* Create a new Wayn instance
* @param config Configuration options
* @param el Optional existing element to use
*/
constructor(config?: Wayn.Config, el?: WaynWidget);
/**
* Solve the proof-of-work challenge
*/
solve(): Promise<{ success: boolean; token: string }>;
/**
* Reset the widget to initial state
*/
reset(): void;
/**
* Add event listener to the widget
*/
addEventListener<K extends keyof Wayn.WaynEvents>(
type: K,
listener: (this: WaynWidget, ev: Wayn.WaynEvents[K]) => any,
options?: boolean | AddEventListenerOptions
): void;
}
declare global {
interface Window {
/** Custom fetch function for Wayn */
WAYN_CUSTOM_FETCH?: typeof fetch;
/** Custom WASM URL for Wayn */
WAYN_CUSTOM_WASM_URL?: string;
/** Skip re-defining custom element */
WAYN_DONT_SKIP_REDEFINE?: boolean;
/** Wayn class constructor */
Wayn: typeof Wayn;
}
interface HTMLElementTagNameMap {
'wayn-widget': WaynWidget;
}
namespace JSX {
interface IntrinsicElements {
'wayn-widget': React.DetailedHTMLProps<React.HTMLAttributes<WaynWidget>, WaynWidget> & {
'data-wayn-api-endpoint'?: string;
'data-wayn-worker-count'?: string;
'data-wayn-hidden-field-name'?: string;
'data-wayn-i18n-initial-state'?: string;
'data-wayn-i18n-verifying-label'?: string;
'data-wayn-i18n-verifying-aria-label'?: string;
'data-wayn-i18n-verified-aria-label'?: string;
'data-wayn-i18n-error-aria-label'?: string;
'data-wayn-i18n-solved-label'?: string;
'data-wayn-i18n-error-label'?: string;
'data-wayn-i18n-verify-aria-label'?: string;
onsolve?: string;
onprogress?: string;
onreset?: string;
onerror?: string;
};
}
}
}
export = Wayn;
export as namespace Wayn;