// Package directory_client provides a high-level client API for the // Distributed Directory Consensus Protocol (NIP-XX). // // # Overview // // This package builds on top of the lower-level directory protocol package // to provide convenient utilities for: // // - Identity resolution and key delegation tracking // - Trust score calculation and aggregation // - Replication filtering based on trust relationships // - Event collection and filtering // - Trust graph construction and analysis // // # Architecture // // The client library consists of several main components: // // **IdentityResolver**: Tracks mappings between delegate keys and primary // identities, enabling resolution of the actual identity behind any signing // key. It processes Identity Tags (I tags) from events and maintains a cache // of delegation relationships. // // **TrustCalculator**: Computes aggregate trust scores from multiple trust // acts using a weighted average approach. Trust levels (high/medium/low) are // mapped to numeric weights and non-expired acts are combined to produce // an overall trust score. // // **ReplicationFilter**: Uses trust scores to determine which relays should // be trusted for event replication. It maintains a set of trusted relays // based on a configurable minimum trust score threshold. // // **EventCollector**: Provides convenient methods to extract and parse // specific types of directory events from a collection. // // **TrustGraph**: Represents trust relationships as a directed graph, // enabling analysis of trust networks and transitive trust paths. // // # Thread Safety // // All components are thread-safe and can be used concurrently from multiple // goroutines. Internal state is protected by read-write mutexes. // // # Example: Identity Resolution // // resolver := directory_client.NewIdentityResolver() // // // Process events to build identity mappings // for _, event := range events { // resolver.ProcessEvent(event) // } // // // Resolve identity behind a delegate key // actualIdentity := resolver.ResolveIdentity(delegateKey) // // // Check delegation status // if resolver.IsDelegateKey(pubkey) { // tag, _ := resolver.GetIdentityTag(pubkey) // fmt.Printf("Delegate %s belongs to identity %s\n", // pubkey, tag.Identity) // } // // # Example: Trust Management // // calculator := directory_client.NewTrustCalculator() // // // Add trust acts // for _, event := range trustEvents { // if act, err := directory.ParseTrustAct(event); err == nil { // calculator.AddAct(act) // } // } // // // Calculate trust score // score := calculator.CalculateTrust(targetPubkey) // fmt.Printf("Trust score: %.1f\n", score) // // # Example: Replication Filtering // // // Create filter with minimum trust score of 50 // filter := directory_client.NewReplicationFilter(50) // // // Add trust acts to influence decisions // for _, act := range trustActs { // filter.AddTrustAct(act) // } // // // Check if should replicate from a relay // if filter.ShouldReplicate(relayPubkey) { // // Proceed with replication // events := fetchEventsFromRelay(relayPubkey) // // ... // } // // # Example: Event Collection // // collector := directory_client.NewEventCollector(events) // // // Extract specific event types // identities := collector.RelayIdentities() // trustActs := collector.TrustActs() // keyAds := collector.PublicKeyAdvertisements() // // // Find specific events // if identity, found := directory_client.FindRelayIdentity( // events, "wss://relay.example.com/"); found { // fmt.Printf("Found relay identity: %s\n", identity.RelayURL) // } // // # Example: Trust Graph Analysis // // graph := directory_client.BuildTrustGraph(events) // // // Find who trusts a specific relay // trustedBy := graph.GetTrustedBy(targetPubkey) // fmt.Printf("Trusted by %d relays\n", len(trustedBy)) // // // Find who a relay trusts // targets := graph.GetTrustTargets(sourcePubkey) // fmt.Printf("Trusts %d relays\n", len(targets)) // // # Integration with Directory Protocol // // This package is designed to work seamlessly with the lower-level // directory protocol package (next.orly.dev/pkg/protocol/directory). // Use the protocol package for: // // - Parsing individual directory events // - Creating new directory events // - Validating event structure // - Working with event content and tags // // Use the client package for: // // - Managing collections of events // - Tracking identity relationships // - Computing trust metrics // - Filtering events for replication // - Analyzing trust networks // // # Performance Considerations // // The IdentityResolver maintains in-memory caches of identity mappings. // For large numbers of identities and delegates, memory usage will grow // proportionally. Use ClearCache() if you need to free memory. // // The TrustCalculator stores all trust acts in memory. For long-running // applications processing many trust acts, consider periodically clearing // expired acts or implementing a sliding window approach. // // # Related Documentation // // See the NIP-XX specification for details on the protocol: // // docs/NIP-XX-distributed-directory-consensus.md // // See the directory protocol package for low-level event handling: // // pkg/protocol/directory/ package directory_client