start method
Begins continuous discovery, reporting matches on events until stop.
Only one continuous query runs at a time; calling this again replaces it.
Implementation
@override
void start({
required DiscoveryQuery query,
Duration? timeout,
int? maxPeers,
}) {
if (disposed) throw StateError('Discovery is disposed');
stop();
_controlSubscription = connection.control.listen((frame) {
if (frame.type != WsControl.queryResult) return;
if (frame.payload['qid'] != _queryId) return;
if (_paused || disposed || _events.isClosed) return;
final peers = _peersFrom(frame);
if (peers.isEmpty) return;
for (final handle in peers) {
manageResource(handle);
}
_events.add(PeersDiscoveredEvent(query, peers));
});
if (timeout != null) {
_timeoutTimer = Timer(timeout, () {
if (disposed || _events.isClosed) return;
_events.add(DiscoveryTimeoutEvent(query, timeout));
});
}
// The hub pushes an updated result whenever the matching set grows, so no
// polling is needed here — unlike LSL, which must re-resolve on a timer.
_queryId = connection.query(query, continuous: true);
}