memc.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. package memconservative
  2. import (
  3. "errors"
  4. "fmt"
  5. "runtime"
  6. "github.com/metacubex/mihomo/component/geodata"
  7. "github.com/metacubex/mihomo/component/geodata/router"
  8. )
  9. type memConservativeLoader struct {
  10. geoipcache GeoIPCache
  11. geositecache GeoSiteCache
  12. }
  13. func (m *memConservativeLoader) LoadIPByPath(filename, country string) ([]*router.CIDR, error) {
  14. defer runtime.GC()
  15. geoip, err := m.geoipcache.Unmarshal(filename, country)
  16. if err != nil {
  17. return nil, fmt.Errorf("failed to decode geodata file: %s, base error: %s", filename, err.Error())
  18. }
  19. return geoip.Cidr, nil
  20. }
  21. func (m *memConservativeLoader) LoadIPByBytes(geoipBytes []byte, country string) ([]*router.CIDR, error) {
  22. return nil, errors.New("memConservative do not support LoadIPByBytes")
  23. }
  24. func (m *memConservativeLoader) LoadSiteByPath(filename, list string) ([]*router.Domain, error) {
  25. defer runtime.GC()
  26. geosite, err := m.geositecache.Unmarshal(filename, list)
  27. if err != nil {
  28. return nil, fmt.Errorf("failed to decode geodata file: %s, base error: %s", filename, err.Error())
  29. }
  30. return geosite.Domain, nil
  31. }
  32. func (m *memConservativeLoader) LoadSiteByBytes(geositeBytes []byte, list string) ([]*router.Domain, error) {
  33. return nil, errors.New("memConservative do not support LoadSiteByBytes")
  34. }
  35. func newMemConservativeLoader() geodata.LoaderImplementation {
  36. return &memConservativeLoader{make(map[string]*router.GeoIP), make(map[string]*router.GeoSite)}
  37. }
  38. func init() {
  39. geodata.RegisterGeoDataLoaderImplementationCreator("memconservative", newMemConservativeLoader)
  40. }