|
|
@@ -22,13 +22,12 @@ func NewSubClashService(enableRouting bool, clashRules string, subService *SubSe
|
|
|
}
|
|
|
|
|
|
func (s *SubClashService) GetClash(subId string, host string) (string, string, error) {
|
|
|
- // Set per-request state so resolveInboundAddress sees the node map.
|
|
|
- s.SubService.PrepareForRequest(host)
|
|
|
- inbounds, err := s.SubService.getInboundsBySubId(subId)
|
|
|
+ subReq := s.SubService.ForRequest(host)
|
|
|
+ inbounds, err := subReq.getInboundsBySubId(subId)
|
|
|
if err != nil {
|
|
|
return "", "", err
|
|
|
}
|
|
|
- externalLinks, err := s.SubService.getClientExternalLinksBySubId(subId)
|
|
|
+ externalLinks, err := subReq.getClientExternalLinksBySubId(subId)
|
|
|
if err != nil {
|
|
|
return "", "", err
|
|
|
}
|
|
|
@@ -40,14 +39,14 @@ func (s *SubClashService) GetClash(subId string, host string) (string, string, e
|
|
|
|
|
|
seenEmails := make(map[string]struct{})
|
|
|
for _, inbound := range inbounds {
|
|
|
- clients := s.SubService.matchingClients(inbound, subId)
|
|
|
+ clients := subReq.matchingClients(inbound, subId)
|
|
|
if len(clients) == 0 {
|
|
|
continue
|
|
|
}
|
|
|
- s.SubService.projectThroughFallbackMaster(inbound)
|
|
|
+ subReq.projectThroughFallbackMaster(inbound)
|
|
|
for _, client := range clients {
|
|
|
seenEmails[client.Email] = struct{}{}
|
|
|
- proxies = append(proxies, s.getProxies(inbound, client, host)...)
|
|
|
+ proxies = append(proxies, s.getProxies(subReq, inbound, client, host)...)
|
|
|
}
|
|
|
}
|
|
|
for _, ext := range externalLinks {
|
|
|
@@ -73,7 +72,7 @@ func (s *SubClashService) GetClash(subId string, host string) (string, string, e
|
|
|
for e := range seenEmails {
|
|
|
emails = append(emails, e)
|
|
|
}
|
|
|
- traffic, _ := s.SubService.AggregateTrafficByEmails(emails)
|
|
|
+ traffic, _ := subReq.AggregateTrafficByEmails(emails)
|
|
|
|
|
|
proxyNames := make([]string, 0, len(proxies)+1)
|
|
|
for _, proxy := range proxies {
|
|
|
@@ -140,12 +139,12 @@ func fallbackProxyName(proxy map[string]any, idx int) string {
|
|
|
return fmt.Sprintf("proxy-%d", idx+1)
|
|
|
}
|
|
|
|
|
|
-func (s *SubClashService) getProxies(inbound *model.Inbound, client model.Client, host string) []map[string]any {
|
|
|
+func (s *SubClashService) getProxies(subReq *SubService, inbound *model.Inbound, client model.Client, host string) []map[string]any {
|
|
|
stream := s.streamData(inbound.StreamSettings)
|
|
|
// For node-managed inbounds the Clash proxy "server" must be the
|
|
|
// node's address, not the request host. resolveInboundAddress handles
|
|
|
// the node→subscriber-host fallback chain.
|
|
|
- defaultDest := s.SubService.resolveInboundAddress(inbound)
|
|
|
+ defaultDest := subReq.resolveInboundAddress(inbound)
|
|
|
if defaultDest == "" {
|
|
|
defaultDest = host
|
|
|
}
|
|
|
@@ -187,7 +186,7 @@ func (s *SubClashService) getProxies(inbound *model.Inbound, client model.Client
|
|
|
applyExternalProxyTLSToStream(extPrxy, workingStream, security)
|
|
|
}
|
|
|
|
|
|
- proxy := s.buildProxy(&workingInbound, client, workingStream, extPrxy["remark"].(string))
|
|
|
+ proxy := s.buildProxy(subReq, &workingInbound, client, workingStream, extPrxy["remark"].(string))
|
|
|
if len(proxy) > 0 {
|
|
|
proxies = append(proxies, proxy)
|
|
|
}
|
|
|
@@ -195,15 +194,15 @@ func (s *SubClashService) getProxies(inbound *model.Inbound, client model.Client
|
|
|
return proxies
|
|
|
}
|
|
|
|
|
|
-func (s *SubClashService) buildProxy(inbound *model.Inbound, client model.Client, stream map[string]any, extraRemark string) map[string]any {
|
|
|
+func (s *SubClashService) buildProxy(subReq *SubService, inbound *model.Inbound, client model.Client, stream map[string]any, extraRemark string) map[string]any {
|
|
|
// Hysteria has its own transport + TLS model, applyTransport /
|
|
|
// applySecurity don't fit.
|
|
|
if inbound.Protocol == model.Hysteria {
|
|
|
- return s.buildHysteriaProxy(inbound, client, extraRemark)
|
|
|
+ return s.buildHysteriaProxy(subReq, inbound, client, extraRemark)
|
|
|
}
|
|
|
|
|
|
proxy := map[string]any{
|
|
|
- "name": s.SubService.genRemark(inbound, client.Email, extraRemark),
|
|
|
+ "name": subReq.genRemark(inbound, client.Email, extraRemark),
|
|
|
"server": inbound.Listen,
|
|
|
"port": inbound.Port,
|
|
|
"udp": true,
|
|
|
@@ -274,7 +273,7 @@ func (s *SubClashService) buildProxy(inbound *model.Inbound, client model.Client
|
|
|
// directly instead of going through streamData/tlsData, because those
|
|
|
// helpers prune fields (like `allowInsecure` / the salamander obfs
|
|
|
// block) that the hysteria proxy wants preserved.
|
|
|
-func (s *SubClashService) buildHysteriaProxy(inbound *model.Inbound, client model.Client, extraRemark string) map[string]any {
|
|
|
+func (s *SubClashService) buildHysteriaProxy(subReq *SubService, inbound *model.Inbound, client model.Client, extraRemark string) map[string]any {
|
|
|
var inboundSettings map[string]any
|
|
|
_ = json.Unmarshal([]byte(inbound.Settings), &inboundSettings)
|
|
|
|
|
|
@@ -286,7 +285,7 @@ func (s *SubClashService) buildHysteriaProxy(inbound *model.Inbound, client mode
|
|
|
}
|
|
|
|
|
|
proxy := map[string]any{
|
|
|
- "name": s.SubService.genRemark(inbound, client.Email, extraRemark),
|
|
|
+ "name": subReq.genRemark(inbound, client.Email, extraRemark),
|
|
|
"type": proxyType,
|
|
|
"server": inbound.Listen,
|
|
|
"port": inbound.Port,
|