resolveAssetsForReleases method
Future<Map<String, List<SoftwareAsset> > >
resolveAssetsForReleases(
- Iterable<
SoftwareRelease> releases, { - Iterable<
String> ? relays, - 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),
};
}