resolveAssetsForReleases method

Future<Map<String, List<SoftwareAsset>>> resolveAssetsForReleases(
  1. Iterable<SoftwareRelease> releases, {
  2. Iterable<String>? relays,
  3. Duration? timeout,
})

Resolves assets for multiple releases with one relay query.

Implementation

Future<Map<String, List<SoftwareAsset>>> resolveAssetsForReleases(
  Iterable<SoftwareRelease> releases, {
  Iterable<String>? relays,
  Duration? timeout,
}) async {
  final releaseList = releases.toList(growable: false);
  final ids = releaseList
      .expand((release) => release.assets)
      .map((asset) => asset.eventId)
      .toSet();
  if (ids.isEmpty) {
    return {for (final release in releaseList) release.event.id: const []};
  }
  final hintedRelays = releaseList
      .expand((release) => release.assets)
      .map((asset) => asset.relayHint)
      .whereType<String>()
      .toSet();
  final resolvedRelays = {...?relays};
  final responses = [
    _requests.query(
      filter: Filter(ids: ids.toList(), kinds: const [softwareAssetKind]),
      explicitRelays: resolvedRelays.isEmpty
          ? null
          : {...resolvedRelays, ...hintedRelays},
      timeout: timeout,
      name: 'software-assets',
    ),
    if (resolvedRelays.isEmpty && hintedRelays.isNotEmpty)
      _requests.query(
        filter: Filter(ids: ids.toList(), kinds: const [softwareAssetKind]),
        explicitRelays: hintedRelays,
        timeout: timeout,
        name: 'software-assets-hints',
      ),
  ];
  final events =
      (await Future.wait(responses.map((response) => response.future)))
          .expand((events) => events);
  final assetsById = <String, SoftwareAsset>{
    for (final asset in events
        .where((event) => ids.contains(event.id))
        .map(_parseAsset)
        .whereType<SoftwareAsset>())
      asset.event.id: asset,
  };
  return {
    for (final release in releaseList)
      release.event.id: release.assets
          .map((reference) => assetsById[reference.eventId])
          .whereType<SoftwareAsset>()
          .toList(growable: false),
  };
}