getExternalIdMetrics method

Future<Nip85ExternalIdMetrics?> getExternalIdMetrics(
  1. String identifier, {
  2. Set<Nip85Metric>? metrics,
  3. List<Nip85TrustedProvider>? providers,
})

Get external identifier metrics from trusted providers (NIP-73)

identifier - The NIP-73 i-tag value 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 Nip85ExternalIdMetrics or null if no assertion found.

Implementation

Future<Nip85ExternalIdMetrics?> getExternalIdMetrics(
  String identifier, {
  Set<Nip85Metric>? metrics,
  List<Nip85TrustedProvider>? providers,
}) async {
  final effectiveProviders = _filterProviders(
    providers ?? _defaultProviders,
    kind: Nip85Kind.externalId,
    metrics: metrics,
  );

  if (effectiveProviders.isEmpty) {
    return null;
  }

  final providersByRelay = <String, List<Nip85TrustedProvider>>{};
  for (final provider in effectiveProviders) {
    providersByRelay.putIfAbsent(provider.relay, () => []).add(provider);
  }

  Nip85ExternalIdMetrics? result;
  int latestCreatedAt = 0;

  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.externalId],
              authors: providerPubkeys,
              dTags: [identifier],
              limit: providerPubkeys.length,
            ),
            explicitRelays: [relay],
            cacheRead: true,
            cacheWrite: true,
          )
          .stream) {
        final parsed = _parseExternalIdMetricsEvent(event, metrics);
        if (parsed != null && parsed.createdAt > latestCreatedAt) {
          result = parsed;
          latestCreatedAt = parsed.createdAt;
        }
      }
    } catch (_) {}
  }

  return result;
}