memory_settings.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package internet
  2. import (
  3. "github.com/xtls/xray-core/common/net"
  4. "github.com/xtls/xray-core/transport/internet/finalmask"
  5. )
  6. // MemoryStreamConfig is a parsed form of StreamConfig. It is used to reduce the number of Protobuf parses.
  7. type MemoryStreamConfig struct {
  8. Destination *net.Destination
  9. ProtocolName string
  10. ProtocolSettings interface{}
  11. SecurityType string
  12. SecuritySettings interface{}
  13. TcpmaskManager *finalmask.TcpmaskManager
  14. UdpmaskManager *finalmask.UdpmaskManager
  15. SocketSettings *SocketConfig
  16. DownloadSettings *MemoryStreamConfig
  17. }
  18. // ToMemoryStreamConfig converts a StreamConfig to MemoryStreamConfig. It returns a default non-nil MemoryStreamConfig for nil input.
  19. func ToMemoryStreamConfig(s *StreamConfig) (*MemoryStreamConfig, error) {
  20. ets, err := s.GetEffectiveTransportSettings()
  21. if err != nil {
  22. return nil, err
  23. }
  24. mss := &MemoryStreamConfig{
  25. ProtocolName: s.GetEffectiveProtocol(),
  26. ProtocolSettings: ets,
  27. }
  28. if s != nil {
  29. if s.Address != nil {
  30. mss.Destination = &net.Destination{
  31. Address: s.Address.AsAddress(),
  32. Port: net.Port(s.Port),
  33. Network: net.Network_TCP,
  34. }
  35. }
  36. mss.SocketSettings = s.SocketSettings
  37. }
  38. if s != nil && s.HasSecuritySettings() {
  39. ess, err := s.GetEffectiveSecuritySettings()
  40. if err != nil {
  41. return nil, err
  42. }
  43. mss.SecurityType = s.SecurityType
  44. mss.SecuritySettings = ess
  45. }
  46. if s != nil && len(s.Tcpmasks) > 0 {
  47. var masks []finalmask.Tcpmask
  48. for _, msg := range s.Tcpmasks {
  49. instance, err := msg.GetInstance()
  50. if err != nil {
  51. return nil, err
  52. }
  53. masks = append(masks, instance.(finalmask.Tcpmask))
  54. }
  55. mss.TcpmaskManager = finalmask.NewTcpmaskManager(masks)
  56. }
  57. if s != nil && len(s.Udpmasks) > 0 {
  58. var masks []finalmask.Udpmask
  59. for _, msg := range s.Udpmasks {
  60. instance, err := msg.GetInstance()
  61. if err != nil {
  62. return nil, err
  63. }
  64. masks = append(masks, instance.(finalmask.Udpmask))
  65. }
  66. mss.UdpmaskManager = finalmask.NewUdpmaskManager(masks)
  67. }
  68. return mss, nil
  69. }