getEventMetrics method
Future<Nip85EventMetrics?>
getEventMetrics(
- String eventId, {
- Set<
Nip85Metric> ? metrics, - List<
Nip85TrustedProvider> ? providers,
Get event metrics from trusted providers
eventId - The event ID to get metrics for
metrics - Optional set of specific metrics to fetch. If null, fetches all available.
providers - Optional list of providers to use. If null, uses default providers.
Returns Nip85EventMetrics or null if no assertion found.
Implementation
Future<Nip85EventMetrics?> getEventMetrics(
String eventId, {
Set<Nip85Metric>? metrics,
List<Nip85TrustedProvider>? providers,
}) async {
final effectiveProviders = _filterProviders(
providers ?? _defaultProviders,
kind: Nip85Kind.event,
metrics: metrics,
);
if (effectiveProviders.isEmpty) {
return null;
}
// Group providers by relay for efficient querying
final providersByRelay = <String, List<Nip85TrustedProvider>>{};
for (final provider in effectiveProviders) {
providersByRelay.putIfAbsent(provider.relay, () => []).add(provider);
}
final aggregatedMetrics = <Nip85Metric, dynamic>{};
final metricCreatedAt = <Nip85Metric, int>{};
String? latestProviderPubkey;
String? latestEventId;
int latestCreatedAt = 0;
// Query each relay
for (final entry in providersByRelay.entries) {
final relay = entry.key;
final relayProviders = entry.value;
final providerPubkeys = relayProviders.map((p) => p.pubkey).toList();
try {
await for (final event in _requests
.query(
filter: Filter(
kinds: [Nip85Kind.event],
authors: providerPubkeys,
dTags: [eventId],
limit: providerPubkeys.length,
),
explicitRelays: [relay],
cacheRead: true,
cacheWrite: true,
)
.stream) {
final parsed = _parseEventMetricsEvent(event, metrics);
if (parsed == null) continue;
parsed.metrics.forEach((metric, value) {
final currentMetricCreatedAt = metricCreatedAt[metric] ?? -1;
if (parsed.createdAt >= currentMetricCreatedAt) {
aggregatedMetrics[metric] = value;
metricCreatedAt[metric] = parsed.createdAt;
}
});
if (parsed.createdAt >= latestCreatedAt) {
latestCreatedAt = parsed.createdAt;
latestProviderPubkey = parsed.providerPubkey;
latestEventId = parsed.eventId;
}
}
} catch (_) {
// Continue with other relays if one fails
}
}
if (aggregatedMetrics.isEmpty || latestProviderPubkey == null) {
return null;
}
return Nip85EventMetrics(
eventId: latestEventId ?? eventId,
providerPubkey: latestProviderPubkey,
createdAt: latestCreatedAt,
metrics: aggregatedMetrics,
);
}