github.com/metacubex/mihomo@v1.18.5/component/fakeip/memory.go (about)

     1  package fakeip
     2  
     3  import (
     4  	"net/netip"
     5  
     6  	"github.com/metacubex/mihomo/common/lru"
     7  )
     8  
     9  type memoryStore struct {
    10  	cacheIP   *lru.LruCache[string, netip.Addr]
    11  	cacheHost *lru.LruCache[netip.Addr, string]
    12  }
    13  
    14  // GetByHost implements store.GetByHost
    15  func (m *memoryStore) GetByHost(host string) (netip.Addr, bool) {
    16  	if ip, exist := m.cacheIP.Get(host); exist {
    17  		// ensure ip --> host on head of linked list
    18  		m.cacheHost.Get(ip)
    19  		return ip, true
    20  	}
    21  
    22  	return netip.Addr{}, false
    23  }
    24  
    25  // PutByHost implements store.PutByHost
    26  func (m *memoryStore) PutByHost(host string, ip netip.Addr) {
    27  	m.cacheIP.Set(host, ip)
    28  }
    29  
    30  // GetByIP implements store.GetByIP
    31  func (m *memoryStore) GetByIP(ip netip.Addr) (string, bool) {
    32  	if host, exist := m.cacheHost.Get(ip); exist {
    33  		// ensure host --> ip on head of linked list
    34  		m.cacheIP.Get(host)
    35  		return host, true
    36  	}
    37  
    38  	return "", false
    39  }
    40  
    41  // PutByIP implements store.PutByIP
    42  func (m *memoryStore) PutByIP(ip netip.Addr, host string) {
    43  	m.cacheHost.Set(ip, host)
    44  }
    45  
    46  // DelByIP implements store.DelByIP
    47  func (m *memoryStore) DelByIP(ip netip.Addr) {
    48  	if host, exist := m.cacheHost.Get(ip); exist {
    49  		m.cacheIP.Delete(host)
    50  	}
    51  	m.cacheHost.Delete(ip)
    52  }
    53  
    54  // Exist implements store.Exist
    55  func (m *memoryStore) Exist(ip netip.Addr) bool {
    56  	return m.cacheHost.Exist(ip)
    57  }
    58  
    59  // CloneTo implements store.CloneTo
    60  // only for memoryStore to memoryStore
    61  func (m *memoryStore) CloneTo(store store) {
    62  	if ms, ok := store.(*memoryStore); ok {
    63  		m.cacheIP.CloneTo(ms.cacheIP)
    64  		m.cacheHost.CloneTo(ms.cacheHost)
    65  	}
    66  }
    67  
    68  // FlushFakeIP implements store.FlushFakeIP
    69  func (m *memoryStore) FlushFakeIP() error {
    70  	_ = m.cacheIP.Clear()
    71  	return m.cacheHost.Clear()
    72  }
    73  
    74  func newMemoryStore(size int) *memoryStore {
    75  	return &memoryStore{
    76  		cacheIP:   lru.New[string, netip.Addr](lru.WithSize[string, netip.Addr](size)),
    77  		cacheHost: lru.New[netip.Addr, string](lru.WithSize[netip.Addr, string](size)),
    78  	}
    79  }