search method

Future<List<CastDevice>> search({
  1. Duration timeout = const Duration(seconds: 5),
})

Implementation

Future<List<CastDevice>> search({Duration timeout = const Duration(seconds: 5)}) async {
  final results = <CastDevice>[];

  final discovery = BonsoirDiscovery(type: _domain);
  await discovery.ready;
  await discovery.start();

  discovery.eventStream!.listen((event) {
    if (event.type == BonsoirDiscoveryEventType.DISCOVERY_SERVICE_RESOLVED) {
      if (event.service == null || event.service?.attributes == null) {
        return;
      }

      final port = event.service!.port;
      final host = event.service?.toJson()['service.ip'];
      String name = [event.service?.attributes?['md'], event.service?.attributes?['fn']].whereType<String>().join(' - ');
      if (name.isEmpty) {
        name = event.service!.name;
      }

      if (host == null) {
        return;
      }

      results.add(
        CastDevice(
          serviceName: event.service!.name,
          name: name,
          port: port,
          host: host,
          extras: event.service!.attributes ?? {},
        ),
      );
    }
  }, onError: (error) {
    print('[CastDiscoveryService] error ${error.runtimeType} - $error');
  });

  await Future.delayed(timeout);
  await discovery.stop();

  return results.toSet().toList();
}