discover static method

Future<Stream<ProInstance>> discover({
  1. Duration timeout = const Duration(seconds: 5),
})

Implementation

static Future<Stream<ProInstance>> discover({Duration timeout: const Duration(seconds: 5)}) async {
  print('discover');

  List<StreamSubscription> subs = [];
  MDnsClient? client;

  final controller = StreamController<ProInstance>();
  controller.onCancel = () {
    for (var sub in subs) {
      sub.cancel();
    }
    controller.close();
    client?.stop();
  };

  // this longer installation allows us to set reusePort to false which if not set
  // causes weird errors on Android for some reason
  client =
      MDnsClient(rawDatagramSocketFactory: (dynamic host, int port, {bool? reuseAddress, bool? reusePort, int? ttl}) {
    return RawDatagramSocket.bind(host, port, reuseAddress: true, reusePort: false, ttl: ttl ?? 1);
  });
  await client.start();
  var pro6name = '_pro6proremote._tcp.local';
  var pro7name = '_pro7proremote._tcp.local';

  for (var name in [pro6name, pro7name]) {
    print(name);
    var version = name == pro6name ? ProVersion.six : ProVersion.seven;

    subs.add(_getRecordStream(client, name).listen((record) {
      var srv = record['srv'] as SrvResourceRecord;
      var ip = record['ip'] as IPAddressResourceRecord;
      // var ptr = record['ptr'] as PtrResourceRecord;
      var instance = ProInstance(srv.target, ip.address.address, srv.port, version);
      if (!controller.isClosed) controller.add(instance);
    }));
  }
  Future.delayed(timeout).then((_) {
    for (var sub in subs) {
      sub.cancel();
    }
    client?.stop();
    controller.close();
  });
  return controller.stream;
}