Skip to content

Commit

Permalink
sdk: fetch and cache profiles.
Browse files Browse the repository at this point in the history
  • Loading branch information
fiatjaf committed Oct 31, 2023
1 parent aaaf608 commit 374dbbe
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 15 deletions.
2 changes: 1 addition & 1 deletion event.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ type Event struct {
}

const (
KindSetMetadata int = 0
KindProfileMetadata int = 0
KindTextNote int = 1
KindRecommendServer int = 2
KindContactList int = 3
Expand Down
31 changes: 22 additions & 9 deletions sdk/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,16 @@ import (
)

type System struct {
relaysCache cache.Cache32[[]Relay]
followsCache cache.Cache32[[]Follow]
metadataCache cache.Cache32[*ProfileMetadata]
pool *nostr.SimplePool
metadataRelays []string
relayListRelays []string
relaysCache cache.Cache32[[]Relay]
followsCache cache.Cache32[[]Follow]
metadataCache cache.Cache32[ProfileMetadata]
pool *nostr.SimplePool
relayListRelays []string
followListRelays []string
metadataRelays []string
}

func (sys System) FetchRelaysForPubkey(ctx context.Context, pubkey string) []Relay {
func (sys System) FetchRelays(ctx context.Context, pubkey string) []Relay {
if v, ok := sys.relaysCache.Get(pubkey); ok {
return v
}
Expand All @@ -29,8 +30,8 @@ func (sys System) FetchRelaysForPubkey(ctx context.Context, pubkey string) []Rel
return res
}

func (sys System) FetchOutboxRelaysForPubkey(ctx context.Context, pubkey string) []string {
relays := sys.FetchRelaysForPubkey(ctx, pubkey)
func (sys System) FetchOutboxRelays(ctx context.Context, pubkey string) []string {
relays := sys.FetchRelays(ctx, pubkey)
result := make([]string, 0, len(relays))
for _, relay := range relays {
if relay.Outbox {
Expand All @@ -39,3 +40,15 @@ func (sys System) FetchOutboxRelaysForPubkey(ctx context.Context, pubkey string)
}
return result
}

func (sys System) FetchProfileMetadata(ctx context.Context, pubkey string) ProfileMetadata {
if v, ok := sys.metadataCache.Get(pubkey); ok {
return v
}

ctx, cancel := context.WithTimeout(ctx, time.Second*5)
defer cancel()
res := FetchProfileMetadata(ctx, sys.pool, pubkey, sys.metadataRelays...)
sys.metadataCache.SetWithTTL(pubkey, res, time.Hour*6)
return res
}
24 changes: 23 additions & 1 deletion sdk/metadata.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,32 @@ func (p ProfileMetadata) Npub() string {
}

func (p ProfileMetadata) Nprofile(ctx context.Context, sys *System, nrelays int) string {
v, _ := nip19.EncodeProfile(p.pubkey, sys.FetchOutboxRelaysForPubkey(ctx, p.pubkey))
v, _ := nip19.EncodeProfile(p.pubkey, sys.FetchOutboxRelays(ctx, p.pubkey))
return v
}

func FetchProfileMetadata(ctx context.Context, pool *nostr.SimplePool, pubkey string, relays ...string) ProfileMetadata {
ctx, cancel := context.WithCancel(ctx)
defer cancel()

ch := pool.SubManyEose(ctx, relays, nostr.Filters{
{
Kinds: []int{nostr.KindProfileMetadata},
Authors: []string{pubkey},
Limit: 1,
},
})

for ie := range ch {
if m, err := ParseMetadata(ie.Event); err == nil {
m.pubkey = pubkey
return *m
}
}

return ProfileMetadata{pubkey: pubkey}
}

func ParseMetadata(event *nostr.Event) (*ProfileMetadata, error) {
if event.Kind != 0 {
return nil, fmt.Errorf("event %s is kind %d, not 0", event.ID, event.Kind)
Expand Down
3 changes: 0 additions & 3 deletions sdk/relays.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,6 @@ type Relay struct {
Outbox bool
}

func FetchOutboxRelaysForPubkey(ctx context.Context, pool *nostr.SimplePool, pubkey string, n int) {
}

func FetchRelaysForPubkey(ctx context.Context, pool *nostr.SimplePool, pubkey string, relays ...string) []Relay {
ctx, cancel := context.WithCancel(ctx)
defer cancel()
Expand Down
2 changes: 1 addition & 1 deletion subscription_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ func TestNestedSubscriptions(t *testing.T) {
select {
case event := <-sub.Events:
// now fetch author of this
sub, err := rl.Subscribe(context.Background(), Filters{{Kinds: []int{KindSetMetadata}, Authors: []string{event.PubKey}, Limit: 1}})
sub, err := rl.Subscribe(context.Background(), Filters{{Kinds: []int{KindProfileMetadata}, Authors: []string{event.PubKey}, Limit: 1}})
if err != nil {
t.Errorf("subscription 2 failed: %v", err)
return
Expand Down

0 comments on commit 374dbbe

Please sign in to comment.