experimental.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  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. LoadScript(tag string) *SavedBinary
  46. SaveScript(tag string, script *SavedBinary) error
  47. SurgePersistentStoreRead(key string) string
  48. SurgePersistentStoreWrite(key string, value string) error
  49. }
  50. type SavedBinary struct {
  51. Content []byte
  52. LastUpdated time.Time
  53. LastEtag string
  54. }
  55. func (s *SavedBinary) MarshalBinary() ([]byte, error) {
  56. var buffer bytes.Buffer
  57. err := binary.Write(&buffer, binary.BigEndian, uint8(1))
  58. if err != nil {
  59. return nil, err
  60. }
  61. err = varbin.Write(&buffer, binary.BigEndian, s.Content)
  62. if err != nil {
  63. return nil, err
  64. }
  65. err = binary.Write(&buffer, binary.BigEndian, s.LastUpdated.Unix())
  66. if err != nil {
  67. return nil, err
  68. }
  69. err = varbin.Write(&buffer, binary.BigEndian, s.LastEtag)
  70. if err != nil {
  71. return nil, err
  72. }
  73. return buffer.Bytes(), nil
  74. }
  75. func (s *SavedBinary) UnmarshalBinary(data []byte) error {
  76. reader := bytes.NewReader(data)
  77. var version uint8
  78. err := binary.Read(reader, binary.BigEndian, &version)
  79. if err != nil {
  80. return err
  81. }
  82. err = varbin.Read(reader, binary.BigEndian, &s.Content)
  83. if err != nil {
  84. return err
  85. }
  86. var lastUpdated int64
  87. err = binary.Read(reader, binary.BigEndian, &lastUpdated)
  88. if err != nil {
  89. return err
  90. }
  91. s.LastUpdated = time.Unix(lastUpdated, 0)
  92. err = varbin.Read(reader, binary.BigEndian, &s.LastEtag)
  93. if err != nil {
  94. return err
  95. }
  96. return nil
  97. }
  98. type OutboundGroup interface {
  99. Outbound
  100. Now() string
  101. All() []string
  102. }
  103. type URLTestGroup interface {
  104. OutboundGroup
  105. URLTest(ctx context.Context) (map[string]uint16, error)
  106. }
  107. func OutboundTag(detour Outbound) string {
  108. if group, isGroup := detour.(OutboundGroup); isGroup {
  109. return group.Now()
  110. }
  111. return detour.Tag()
  112. }