<ribaunt-widget> emits four DOM custom events — verify, error, state-change, and solver-backend — that you can listen to with addEventListener on the element. In React, use the typed callback props instead of addEventListener; the wrapper wires up and tears down listeners for you automatically.
verify
The verify event is dispatched when the widget successfully solves all challenges and, if you provided a verify-endpoint, the server confirms the solutions are valid. If no verify-endpoint is set, the event fires as soon as local proof-of-work is complete.
Event type: CustomEvent<{ solutions: ChallengeSolution[]; phase: 'done'; progress: 100 }>
Where ChallengeSolution = { nonce: string; hash: string }.
onVerify={(detail) => ...}
error
The error event is dispatched when the widget encounters a failure at any stage — fetching tokens from your challenge endpoint, running the proof-of-work solver, or receiving a non-OK response from your verify endpoint.
Event type: CustomEvent<{ error: string; code: WidgetErrorCode; timeout: boolean; phase: 'error' }>
The code field is a stable, machine-readable identifier you can branch on:
onError={(detail) => ...}
The
timeout field is always present in the event detail. It is true only when solve-timeout is configured and the attempt exceeded that limit; for every other error it is false.state-change
The state-change event is dispatched every time the widget transitions between internal states. You can use this to mirror the widget’s visual state in your own UI — for example, disabling a submit button while verification is in progress.
Event type: CustomEvent<{ state: WidgetState; phase: WidgetState; progress: number }>
onStateChange={(detail) => ...}
solver-backend
The solver-backend event is dispatched once per solve request when the worker selects its solving backend: wasm when the WebAssembly SHA-256 solver loaded, js when WASM is disabled or unavailable, or argon2id when the challenge tokens use the memory-hard Argon2id algorithm. Use it for adoption telemetry or to confirm your wasm-mode configuration takes effect. The detail never includes challenge contents, nonces, or hashes.
Event type: CustomEvent<{ backend: 'wasm' | 'js' | 'argon2id'; phase: 'solving' }>
worker-mode="preferred" falls back to main-thread solving, no solver-backend event is emitted.
The worker detects the algorithm from the challenge tokens themselves, so argon2id is reported automatically whenever your server issues Argon2id challenges. wasm-mode does not affect this selection; it only controls the SHA-256 solver.
React equivalent: listen via onEvent or addEventListener on the element ref.
React callback props
When you use the React wrapper, you can pass all callbacks directly as props. The wrapper maintains stable event listener references across re-renders so your callbacks always receive the latest closure values:React-only events
Three additional callbacks are available in the React wrapper that have no corresponding DOM custom event on the web component:onReady— fires once after the widget mounts, with the initial widget state in the detail payload. Use this to know when the widget is ready for interaction.onLoad— functionally identical toonReady. It is provided as an alias for backward compatibility if you were already usingonLoadin an earlier version.onEvent— a catch-all handler that fires for every event type ('verify','error','state-change','solver-backend', and'ready'), along with the event’s detail object. Use this if you want a single place to handle or log all widget events.
Widget states
The widget moves through a defined set of states during its lifecycle. You will encounter these state strings instate-change events and in the return value of getState():