experimental.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  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. N "github.com/sagernet/sing/common/network"
  11. "github.com/sagernet/sing/common/rw"
  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. LoadMode() string
  28. StoreMode(mode string) error
  29. LoadSelected(group string) string
  30. StoreSelected(group string, selected string) error
  31. LoadGroupExpand(group string) (isExpand bool, loaded bool)
  32. StoreGroupExpand(group string, expand bool) error
  33. LoadRuleSet(tag string) *SavedRuleSet
  34. SaveRuleSet(tag string, set *SavedRuleSet) error
  35. }
  36. type SavedRuleSet struct {
  37. Content []byte
  38. LastUpdated time.Time
  39. LastEtag string
  40. }
  41. func (s *SavedRuleSet) MarshalBinary() ([]byte, error) {
  42. var buffer bytes.Buffer
  43. err := binary.Write(&buffer, binary.BigEndian, uint8(1))
  44. if err != nil {
  45. return nil, err
  46. }
  47. err = rw.WriteUVariant(&buffer, uint64(len(s.Content)))
  48. if err != nil {
  49. return nil, err
  50. }
  51. buffer.Write(s.Content)
  52. err = binary.Write(&buffer, binary.BigEndian, s.LastUpdated.Unix())
  53. if err != nil {
  54. return nil, err
  55. }
  56. err = rw.WriteVString(&buffer, s.LastEtag)
  57. if err != nil {
  58. return nil, err
  59. }
  60. return buffer.Bytes(), nil
  61. }
  62. func (s *SavedRuleSet) UnmarshalBinary(data []byte) error {
  63. reader := bytes.NewReader(data)
  64. var version uint8
  65. err := binary.Read(reader, binary.BigEndian, &version)
  66. if err != nil {
  67. return err
  68. }
  69. contentLen, err := rw.ReadUVariant(reader)
  70. if err != nil {
  71. return err
  72. }
  73. s.Content = make([]byte, contentLen)
  74. _, err = io.ReadFull(reader, s.Content)
  75. if err != nil {
  76. return err
  77. }
  78. var lastUpdated int64
  79. err = binary.Read(reader, binary.BigEndian, &lastUpdated)
  80. if err != nil {
  81. return err
  82. }
  83. s.LastUpdated = time.Unix(lastUpdated, 0)
  84. s.LastEtag, err = rw.ReadVString(reader)
  85. if err != nil {
  86. return err
  87. }
  88. return nil
  89. }
  90. type Tracker interface {
  91. Leave()
  92. }
  93. type OutboundGroup interface {
  94. Outbound
  95. Now() string
  96. All() []string
  97. }
  98. type URLTestGroup interface {
  99. OutboundGroup
  100. URLTest(ctx context.Context) (map[string]uint16, error)
  101. }
  102. func OutboundTag(detour Outbound) string {
  103. if group, isGroup := detour.(OutboundGroup); isGroup {
  104. return group.Now()
  105. }
  106. return detour.Tag()
  107. }
  108. type V2RayServer interface {
  109. Service
  110. StatsService() V2RayStatsService
  111. }
  112. type V2RayStatsService interface {
  113. RoutedConnection(inbound string, outbound string, user string, conn net.Conn) net.Conn
  114. RoutedPacketConnection(inbound string, outbound string, user string, conn N.PacketConn) N.PacketConn
  115. }