github.com/inazumav/sing-box@v0.0.0-20230926072359-ab51429a14f1/transport/fakeip/memory.go (about) 1 package fakeip 2 3 import ( 4 "net/netip" 5 "sync" 6 7 "github.com/inazumav/sing-box/adapter" 8 "github.com/sagernet/sing/common/logger" 9 ) 10 11 var _ adapter.FakeIPStorage = (*MemoryStorage)(nil) 12 13 type MemoryStorage struct { 14 addressAccess sync.RWMutex 15 domainAccess sync.RWMutex 16 addressCache map[netip.Addr]string 17 domainCache4 map[string]netip.Addr 18 domainCache6 map[string]netip.Addr 19 } 20 21 func NewMemoryStorage() *MemoryStorage { 22 return &MemoryStorage{ 23 addressCache: make(map[netip.Addr]string), 24 domainCache4: make(map[string]netip.Addr), 25 domainCache6: make(map[string]netip.Addr), 26 } 27 } 28 29 func (s *MemoryStorage) FakeIPMetadata() *adapter.FakeIPMetadata { 30 return nil 31 } 32 33 func (s *MemoryStorage) FakeIPSaveMetadata(metadata *adapter.FakeIPMetadata) error { 34 return nil 35 } 36 37 func (s *MemoryStorage) FakeIPSaveMetadataAsync(metadata *adapter.FakeIPMetadata) { 38 } 39 40 func (s *MemoryStorage) FakeIPStore(address netip.Addr, domain string) error { 41 s.addressAccess.Lock() 42 s.domainAccess.Lock() 43 s.addressCache[address] = domain 44 if address.Is4() { 45 s.domainCache4[domain] = address 46 } else { 47 s.domainCache6[domain] = address 48 } 49 s.domainAccess.Unlock() 50 s.addressAccess.Unlock() 51 return nil 52 } 53 54 func (s *MemoryStorage) FakeIPStoreAsync(address netip.Addr, domain string, logger logger.Logger) { 55 _ = s.FakeIPStore(address, domain) 56 } 57 58 func (s *MemoryStorage) FakeIPLoad(address netip.Addr) (string, bool) { 59 s.addressAccess.RLock() 60 defer s.addressAccess.RUnlock() 61 domain, loaded := s.addressCache[address] 62 return domain, loaded 63 } 64 65 func (s *MemoryStorage) FakeIPLoadDomain(domain string, isIPv6 bool) (netip.Addr, bool) { 66 s.domainAccess.RLock() 67 defer s.domainAccess.RUnlock() 68 if !isIPv6 { 69 address, loaded := s.domainCache4[domain] 70 return address, loaded 71 } else { 72 address, loaded := s.domainCache6[domain] 73 return address, loaded 74 } 75 } 76 77 func (s *MemoryStorage) FakeIPReset() error { 78 s.addressCache = make(map[netip.Addr]string) 79 s.domainCache4 = make(map[string]netip.Addr) 80 s.domainCache6 = make(map[string]netip.Addr) 81 return nil 82 }