From 12de56d275a1474e7896f6b1c84655f66636e958 Mon Sep 17 00:00:00 2001 From: nite Date: Thu, 4 Dec 2025 17:08:21 +0800 Subject: [PATCH] add: tuic protocol --- model/proxy/proxy.go | 22 +++++++++++++++++++++- model/proxy/tuic.go | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 model/proxy/tuic.go diff --git a/model/proxy/proxy.go b/model/proxy/proxy.go index fe904b1..f7f9b00 100644 --- a/model/proxy/proxy.go +++ b/model/proxy/proxy.go @@ -85,6 +85,7 @@ type Proxy struct { Vless Vmess Socks + Tuic } func (p Proxy) MarshalYAML() (any, error) { @@ -179,6 +180,16 @@ func (p Proxy) MarshalYAML() (any, error) { Name: p.Name, Socks: p.Socks, }, nil + case "tuic": + return struct { + Type string `yaml:"type"` + Name string `yaml:"name"` + Tuic `yaml:",inline"` + }{ + Type: p.Type, + Name: p.Name, + Tuic: p.Tuic, + }, nil default: return nil, fmt.Errorf("unsupported proxy type: %s", p.Type) } @@ -296,7 +307,16 @@ func (p *Proxy) UnmarshalYAML(node *yaml.Node) error { return err } p.Socks = data.Socks - + case "tuic": + var data struct { + Type string `yaml:"type"` + Name string `yaml:"name"` + Tuic `yaml:",inline"` + } + if err := node.Decode(&data); err != nil { + return err + } + p.Tuic = data.Tuic default: return fmt.Errorf("unsupported proxy type: %s", temp.Type) } diff --git a/model/proxy/tuic.go b/model/proxy/tuic.go new file mode 100644 index 0000000..9272a37 --- /dev/null +++ b/model/proxy/tuic.go @@ -0,0 +1,35 @@ +package proxy + +type Tuic struct { + Server string `proxy:"server"` + Port int `proxy:"port"` + Token string `proxy:"token,omitempty"` + UUID string `proxy:"uuid,omitempty"` + Password string `proxy:"password,omitempty"` + Ip string `proxy:"ip,omitempty"` + HeartbeatInterval int `proxy:"heartbeat-interval,omitempty"` + ALPN []string `proxy:"alpn,omitempty"` + ReduceRtt bool `proxy:"reduce-rtt,omitempty"` + RequestTimeout int `proxy:"request-timeout,omitempty"` + UdpRelayMode string `proxy:"udp-relay-mode,omitempty"` + CongestionController string `proxy:"congestion-controller,omitempty"` + DisableSni bool `proxy:"disable-sni,omitempty"` + MaxUdpRelayPacketSize int `proxy:"max-udp-relay-packet-size,omitempty"` + + FastOpen bool `proxy:"fast-open,omitempty"` + MaxOpenStreams int `proxy:"max-open-streams,omitempty"` + CWND int `proxy:"cwnd,omitempty"` + SkipCertVerify bool `proxy:"skip-cert-verify,omitempty"` + Fingerprint string `proxy:"fingerprint,omitempty"` + Certificate string `proxy:"certificate,omitempty"` + PrivateKey string `proxy:"private-key,omitempty"` + ReceiveWindowConn int `proxy:"recv-window-conn,omitempty"` + ReceiveWindow int `proxy:"recv-window,omitempty"` + DisableMTUDiscovery bool `proxy:"disable-mtu-discovery,omitempty"` + MaxDatagramFrameSize int `proxy:"max-datagram-frame-size,omitempty"` + SNI string `proxy:"sni,omitempty"` + ECHOpts ECHOptions `proxy:"ech-opts,omitempty"` + + UDPOverStream bool `proxy:"udp-over-stream,omitempty"` + UDPOverStreamVersion int `proxy:"udp-over-stream-version,omitempty"` +}