start method

  1. @override
void start({
  1. required DiscoveryQuery query,
  2. Duration? timeout,
  3. int? maxPeers,
})
override

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);
}