experimental.go 2.9 KB

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