sdk: cached mint keys queries.
This commit is contained in:
@@ -14,6 +14,7 @@ import (
|
||||
"fiatjaf.com/nostr/sdk/hints/memoryh"
|
||||
"fiatjaf.com/nostr/sdk/kvstore"
|
||||
kvstore_memory "fiatjaf.com/nostr/sdk/kvstore/memory"
|
||||
"github.com/btcsuite/btcd/btcec/v2"
|
||||
)
|
||||
|
||||
// System represents the core functionality of the SDK, providing access to
|
||||
@@ -41,6 +42,7 @@ type System struct {
|
||||
FollowSetsCache cache.Cache32[GenericSets[nostr.PubKey, ProfileRef]]
|
||||
TopicSetsCache cache.Cache32[GenericSets[string, Topic]]
|
||||
ZapProviderCache cache.Cache32[nostr.PubKey]
|
||||
MintKeysCache cache.Cache32[map[uint64]*btcec.PublicKey]
|
||||
Hints hints.HintsDB
|
||||
Pool *nostr.Pool
|
||||
RelayListRelays *RelayStream
|
||||
@@ -135,6 +137,9 @@ func NewSystem() *System {
|
||||
if sys.ZapProviderCache == nil {
|
||||
sys.ZapProviderCache = cache_memory.New[nostr.PubKey](8000)
|
||||
}
|
||||
if sys.MintKeysCache == nil {
|
||||
sys.MintKeysCache = cache_memory.New[map[uint64]*btcec.PublicKey](8000)
|
||||
}
|
||||
|
||||
if sys.Store == nil {
|
||||
sys.Store = &nullstore.NullStore{}
|
||||
|
||||
26
sdk/zap.go
26
sdk/zap.go
@@ -2,12 +2,16 @@ package sdk
|
||||
|
||||
import (
|
||||
"context"
|
||||
"crypto/sha256"
|
||||
"io"
|
||||
"net/http"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"fiatjaf.com/nostr"
|
||||
"fiatjaf.com/nostr/nip60"
|
||||
"fiatjaf.com/nostr/nip60/client"
|
||||
"github.com/btcsuite/btcd/btcec/v2"
|
||||
"github.com/tidwall/gjson"
|
||||
)
|
||||
|
||||
@@ -47,3 +51,25 @@ func (sys *System) FetchZapProvider(ctx context.Context, pk nostr.PubKey) nostr.
|
||||
sys.ZapProviderCache.SetWithTTL(pk, nostr.ZeroPK, time.Hour*2)
|
||||
return nostr.ZeroPK
|
||||
}
|
||||
|
||||
// FetchMintKeys fetches the active keyset from the given mint URL and parses the keys.
|
||||
// It uses a cache to avoid repeated fetches.
|
||||
func (sys *System) FetchMintKeys(ctx context.Context, mintURL string) (map[uint64]*btcec.PublicKey, error) {
|
||||
hash := sha256.Sum256([]byte(mintURL))
|
||||
if v, ok := sys.MintKeysCache.Get(hash); ok {
|
||||
return v, nil
|
||||
}
|
||||
|
||||
keyset, err := client.GetActiveKeyset(ctx, mintURL)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
ksKeys, err := nip60.ParseKeysetKeys(keyset.Keys)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
sys.MintKeysCache.SetWithTTL(hash, ksKeys, time.Hour*6)
|
||||
return ksKeys, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user