Initial cut at a typed event framework for arti (#230).
This implements a basic typed event broadcast mechanism, as described in
#230: consumers of the new tor-events
crate can emit TorEvent
events, which others can consume via the TorEventReceiver
.
Under the hood, the crate uses the async-broadcast
(https://github.com/smol-rs/async-broadcast) crate, and a
futures::mpsc::UnboundedSender
for the event emitters; these are glued
together in the EventReactor
, which must be run in a background thread
for things to work. (This is done so event sending is always cheap and
non-blocking, since async-broadcast
senders don't have this
functionality.)
Additionally, the TorEventKind
type is used to implement selective
event reception / emission: receivers can subscribe to certain event
types (and in fact start out receiving nothing), which filters the set
of events they receive. Having no subscribers for a given event type
means it won't even be emitted in the first place, making things more
efficient.