service
service
¶
Validator service for BigBrotr.
Validates relay candidates discovered by the Finder service by checking whether they speak the Nostr protocol via WebSocket. Valid candidates are promoted to the relays table; invalid ones have their failure counter incremented and are retried in future cycles.
Validation criteria: a candidate is valid if it accepts a WebSocket connection and responds to a Nostr REQ message with EOSE, EVENT, NOTICE, or AUTH, as determined by is_nostr_relay.
Note
Each cycle initializes per-network semaphores from NetworksConfig, cleans up stale/exhausted candidates, then processes remaining candidates in configurable chunks. CandidateCheckpoint priority is ordered by fewest failures first (most likely to succeed).
See Also
ValidatorConfig:
Configuration model for networks, processing, and cleanup.
BaseService: Abstract base
class providing run(), run_forever(), and from_yaml().
Brotr: Database facade used for
candidate queries and relay promotion.
Finder: Upstream service that
discovers and inserts candidates.
Monitor: Downstream service
that health-checks promoted relays.
is_nostr_relay: WebSocket
probe function used for validation.
promote_candidates:
Insert+delete for promotion (with cleanup safety net).
Examples:
from bigbrotr.core import Brotr
from bigbrotr.services import Validator
brotr = Brotr.from_yaml("config/brotr.yaml")
validator = Validator.from_yaml("config/services/validator.yaml", brotr=brotr)
async with brotr:
async with validator:
await validator.run_forever()
Classes¶
Validator
¶
Validator(
brotr: Brotr, config: ValidatorConfig | None = None
)
Bases: ConcurrentStreamMixin, NetworkSemaphoresMixin, BaseService[ValidatorConfig]
Validates relay candidates by checking if they speak the Nostr protocol.
Processes candidate URLs discovered by the Finder service. Valid relays are promoted to the relays table via promote_candidates; invalid ones have their failure counter incremented for retry in future cycles.
Each cycle initializes per-network semaphores via NetworkSemaphoresMixin, cleans up stale/exhausted candidates, then processes remaining candidates in configurable chunks. Supports clearnet (direct), Tor (.onion via SOCKS5), I2P (.i2p via SOCKS5), and Lokinet (.loki via SOCKS5).
See Also
ValidatorConfig:
Configuration model for this service.
Finder: Upstream service that
creates the candidates validated here.
Monitor: Downstream service
that health-checks promoted relays.
is_nostr_relay:
WebSocket probe used by _validate_candidate().
Source code in src/bigbrotr/services/validator/service.py
Functions¶
run
async
¶
cleanup
async
¶
Remove promoted candidates and exhausted candidates.
Source code in src/bigbrotr/services/validator/service.py
validate
async
¶
Validate all pending candidates and persist results.
Fetches candidates in pages (chunk_size), validates each page
concurrently via
_iter_concurrent(),
and flushes results at each pagination boundary.
Returns:
-
int–Total number of candidates processed (valid + invalid).