discover static method
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;
}