Hunter0x7c7
2022-08-11 b8230139fb40edea387617b6accd8371e37eda58
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package v4
 
import (
    "github.com/v2fly/v2ray-core/v5/common/serial"
    "github.com/v2fly/v2ray-core/v5/transport"
    "github.com/v2fly/v2ray-core/v5/transport/internet"
)
 
type TransportConfig struct {
    TCPConfig  *TCPConfig          `json:"tcpSettings"`
    KCPConfig  *KCPConfig          `json:"kcpSettings"`
    WSConfig   *WebSocketConfig    `json:"wsSettings"`
    HTTPConfig *HTTPConfig         `json:"httpSettings"`
    DSConfig   *DomainSocketConfig `json:"dsSettings"`
    QUICConfig *QUICConfig         `json:"quicSettings"`
    GunConfig  *GunConfig          `json:"gunSettings"`
    GRPCConfig *GunConfig          `json:"grpcSettings"`
}
 
// Build implements Buildable.
func (c *TransportConfig) Build() (*transport.Config, error) {
    config := new(transport.Config)
 
    if c.TCPConfig != nil {
        ts, err := c.TCPConfig.Build()
        if err != nil {
            return nil, newError("failed to build TCP config").Base(err).AtError()
        }
        config.TransportSettings = append(config.TransportSettings, &internet.TransportConfig{
            ProtocolName: "tcp",
            Settings:     serial.ToTypedMessage(ts),
        })
    }
 
    if c.KCPConfig != nil {
        ts, err := c.KCPConfig.Build()
        if err != nil {
            return nil, newError("failed to build mKCP config").Base(err).AtError()
        }
        config.TransportSettings = append(config.TransportSettings, &internet.TransportConfig{
            ProtocolName: "mkcp",
            Settings:     serial.ToTypedMessage(ts),
        })
    }
 
    if c.WSConfig != nil {
        ts, err := c.WSConfig.Build()
        if err != nil {
            return nil, newError("failed to build WebSocket config").Base(err)
        }
        config.TransportSettings = append(config.TransportSettings, &internet.TransportConfig{
            ProtocolName: "websocket",
            Settings:     serial.ToTypedMessage(ts),
        })
    }
 
    if c.HTTPConfig != nil {
        ts, err := c.HTTPConfig.Build()
        if err != nil {
            return nil, newError("Failed to build HTTP config.").Base(err)
        }
        config.TransportSettings = append(config.TransportSettings, &internet.TransportConfig{
            ProtocolName: "http",
            Settings:     serial.ToTypedMessage(ts),
        })
    }
 
    if c.DSConfig != nil {
        ds, err := c.DSConfig.Build()
        if err != nil {
            return nil, newError("Failed to build DomainSocket config.").Base(err)
        }
        config.TransportSettings = append(config.TransportSettings, &internet.TransportConfig{
            ProtocolName: "domainsocket",
            Settings:     serial.ToTypedMessage(ds),
        })
    }
 
    if c.QUICConfig != nil {
        qs, err := c.QUICConfig.Build()
        if err != nil {
            return nil, newError("Failed to build QUIC config.").Base(err)
        }
        config.TransportSettings = append(config.TransportSettings, &internet.TransportConfig{
            ProtocolName: "quic",
            Settings:     serial.ToTypedMessage(qs),
        })
    }
 
    if c.GunConfig == nil {
        c.GunConfig = c.GRPCConfig
    }
    if c.GunConfig != nil {
        gs, err := c.GunConfig.Build()
        if err != nil {
            return nil, newError("Failed to build Gun config.").Base(err)
        }
        config.TransportSettings = append(config.TransportSettings, &internet.TransportConfig{
            ProtocolName: "gun",
            Settings:     serial.ToTypedMessage(gs),
        })
    }
 
    return config, nil
}