package iroh
import (
"context"
"iter"
"sync"
"time"
"github.com/tmc/go-iroh/dns"
"github.com/tmc/go-iroh/key"
"github.com/tmc/go-iroh/netaddr"
)
const MemoryProvenance = "memory_lookup"
type MemoryLookup struct {
mu sync .RWMutex
endpoints map [key .EndpointID ]storedInfo
provenance string
}
type storedInfo struct {
data dns .EndpointData
lastUpdated time .Time
}
func NewMemoryLookup () *MemoryLookup {
return NewMemoryLookupWithProvenance (MemoryProvenance )
}
func NewMemoryLookupWithProvenance (provenance string ) *MemoryLookup {
return &MemoryLookup {
endpoints : make (map [key .EndpointID ]storedInfo ),
provenance : provenance ,
}
}
func MemoryLookupFromInfo (infos ...dns .EndpointInfo ) *MemoryLookup {
m := NewMemoryLookup ()
for _ , info := range infos {
m .AddEndpointInfo (info )
}
return m
}
func (m *MemoryLookup ) SetEndpointInfo (info dns .EndpointInfo ) (dns .EndpointData , bool ) {
m .mu .Lock ()
defer m .mu .Unlock ()
prev , existed := m .endpoints [info .ID ]
m .endpoints [info .ID ] = storedInfo {data : info .Data , lastUpdated : time .Now ()}
return prev .data , existed
}
func (m *MemoryLookup ) AddEndpointInfo (info dns .EndpointInfo ) {
m .mu .Lock ()
defer m .mu .Unlock ()
existing , ok := m .endpoints [info .ID ]
if !ok {
m .endpoints [info .ID ] = storedInfo {data : info .Data , lastUpdated : time .Now ()}
return
}
existing .data .AddAddrs (info .Data .Addrs ()...)
existing .data .SetUserData (info .Data .UserData ())
existing .lastUpdated = time .Now ()
m .endpoints [info .ID ] = existing
}
func (m *MemoryLookup ) AddEndpointAddr (addr netaddr .EndpointAddr ) {
m .AddEndpointInfo (dns .EndpointInfoFromAddr (addr ))
}
func (m *MemoryLookup ) GetEndpointInfo (id key .EndpointID ) (dns .EndpointInfo , bool ) {
m .mu .RLock ()
defer m .mu .RUnlock ()
info , ok := m .endpoints [id ]
if !ok {
return dns .EndpointInfo {}, false
}
return dns .EndpointInfo {ID : id , Data : info .data }, true
}
func (m *MemoryLookup ) RemoveEndpointInfo (id key .EndpointID ) (dns .EndpointInfo , bool ) {
m .mu .Lock ()
defer m .mu .Unlock ()
info , ok := m .endpoints [id ]
if !ok {
return dns .EndpointInfo {}, false
}
delete (m .endpoints , id )
return dns .EndpointInfo {ID : id , Data : info .data }, true
}
func (m *MemoryLookup ) Resolve (ctx context .Context , id key .EndpointID ) iter .Seq2 [Item , error ] {
m .mu .RLock ()
info , ok := m .endpoints [id ]
m .mu .RUnlock ()
if !ok {
return nil
}
lastUpdated := uint64 (info .lastUpdated .UnixMicro ())
item := NewItem (dns .EndpointInfo {ID : id , Data : info .data }, m .provenance , &lastUpdated )
return func (yield func (Item , error ) bool ) {
if ctx .Err () == nil {
yield (item , nil )
}
}
}
type FilteredAddressPublisher struct {
inner AddressPublisher
filter AddrFilter
}
func NewFilteredAddressPublisher (inner AddressPublisher , f AddrFilter ) FilteredAddressPublisher {
return FilteredAddressPublisher {inner : inner , filter : f }
}
func (f FilteredAddressPublisher ) Inner () AddressPublisher { return f .inner }
func (f FilteredAddressPublisher ) Publish (data dns .EndpointData ) {
f .inner .Publish (applyFilter (data , f .filter ))
}
The pages are generated with Golds v0.8.4 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .