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.initialize();

  discovery.eventStream!.listen((event) {
    switch (event) {
      case BonsoirDiscoveryServiceFoundEvent():
        event.service.resolve(discovery.serviceResolver);
        break;
      case BonsoirDiscoveryServiceResolvedEvent():
        final port = event.service.port;
        final host = event.service.toJson()['service.ip'] ??
            event.service.toJson()['service.host'];

        String name = [
          event.service.attributes['md'],
          event.service.attributes['fn'],
        ].whereType<String>().join(' - ');
        if (name.isEmpty) {
          name = event.service.name;
        }

        results.add(
          CastDevice(
            serviceName: event.service.name,
            name: name,
            port: port,
            host: host,
            extras: event.service.attributes,
          ),
        );
        break;
      default:
        print('Another event occurred : $event.');
        break;
    }
  });

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

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