experimental.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. package adapter
  2. import (
  3. "bytes"
  4. "context"
  5. "encoding/binary"
  6. "time"
  7. "github.com/sagernet/sing/common/varbin"
  8. )
  9. type ClashServer interface {
  10. LifecycleService
  11. ConnectionTracker
  12. Mode() string
  13. ModeList() []string
  14. HistoryStorage() URLTestHistoryStorage
  15. }
  16. type URLTestHistory struct {
  17. Time time.Time `json:"time"`
  18. Delay uint16 `json:"delay"`
  19. }
  20. type URLTestHistoryStorage interface {
  21. SetHook(hook chan<- struct{})
  22. LoadURLTestHistory(tag string) *URLTestHistory
  23. DeleteURLTestHistory(tag string)
  24. StoreURLTestHistory(tag string, history *URLTestHistory)
  25. Close() error
  26. }
  27. type V2RayServer interface {
  28. LifecycleService
  29. StatsService() ConnectionTracker
  30. }
  31. type CacheFile interface {
  32. LifecycleService
  33. StoreFakeIP() bool
  34. FakeIPStorage
  35. StoreRDRC() bool
  36. RDRCStore
  37. LoadMode() string
  38. StoreMode(mode string) error
  39. LoadSelected(group string) string
  40. StoreSelected(group string, selected string) error
  41. LoadGroupExpand(group string) (isExpand bool, loaded bool)
  42. StoreGroupExpand(group string, expand bool) error
  43. LoadRuleSet(tag string) *SavedBinary
  44. SaveRuleSet(tag string, set *SavedBinary) error
  45. }
  46. type SavedBinary struct {
  47. Content []byte
  48. LastUpdated time.Time
  49. LastEtag string
  50. }
  51. func (s *SavedBinary) MarshalBinary() ([]byte, error) {
  52. var buffer bytes.Buffer
  53. err := binary.Write(&buffer, binary.BigEndian, uint8(1))
  54. if err != nil {
  55. return nil, err
  56. }
  57. err = varbin.Write(&buffer, binary.BigEndian, s.Content)
  58. if err != nil {
  59. return nil, err
  60. }
  61. err = binary.Write(&buffer, binary.BigEndian, s.LastUpdated.Unix())
  62. if err != nil {
  63. return nil, err
  64. }
  65. err = varbin.Write(&buffer, binary.BigEndian, s.LastEtag)
  66. if err != nil {
  67. return nil, err
  68. }
  69. return buffer.Bytes(), nil
  70. }
  71. func (s *SavedBinary) UnmarshalBinary(data []byte) error {
  72. reader := bytes.NewReader(data)
  73. var version uint8
  74. err := binary.Read(reader, binary.BigEndian, &version)
  75. if err != nil {
  76. return err
  77. }
  78. err = varbin.Read(reader, binary.BigEndian, &s.Content)
  79. if err != nil {
  80. return err
  81. }
  82. var lastUpdated int64
  83. err = binary.Read(reader, binary.BigEndian, &lastUpdated)
  84. if err != nil {
  85. return err
  86. }
  87. s.LastUpdated = time.Unix(lastUpdated, 0)
  88. err = varbin.Read(reader, binary.BigEndian, &s.LastEtag)
  89. if err != nil {
  90. return err
  91. }
  92. return nil
  93. }
  94. type OutboundGroup interface {
  95. Outbound
  96. Now() string
  97. All() []string
  98. }
  99. type URLTestGroup interface {
  100. OutboundGroup
  101. URLTest(ctx context.Context) (map[string]uint16, error)
  102. }
  103. func OutboundTag(detour Outbound) string {
  104. if group, isGroup := detour.(OutboundGroup); isGroup {
  105. return group.Now()
  106. }
  107. return detour.Tag()
  108. }