experimental.go 2.8 KB

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