improve mux

This commit is contained in:
arm64v8a 2023-05-02 09:23:25 +09:00
parent d4fb7c614c
commit 20375c7560
2 changed files with 40 additions and 11 deletions

View File

@ -269,14 +269,17 @@ data class ProxyEntity(
append("\n\n") append("\n\n")
append(bean.buildTrojanGoConfig(port)) append(bean.buildTrojanGoConfig(port))
} }
is NaiveBean -> { is NaiveBean -> {
append("\n\n") append("\n\n")
append(bean.buildNaiveConfig(port)) append(bean.buildNaiveConfig(port))
} }
is HysteriaBean -> { is HysteriaBean -> {
append("\n\n") append("\n\n")
append(bean.buildHysteriaConfig(port, null)) append(bean.buildHysteriaConfig(port, null))
} }
is TuicBean -> { is TuicBean -> {
append("\n\n") append("\n\n")
append(bean.buildTuicConfig(port, null)) append(bean.buildTuicConfig(port, null))
@ -299,18 +302,17 @@ data class ProxyEntity(
} }
} }
fun isV2RayNetworkTcp(): Boolean {
val bean = requireBean() as StandardV2RayBean
return when (bean.type) {
"tcp", "ws", "http" -> true
else -> false
}
}
fun needCoreMux(): Boolean { fun needCoreMux(): Boolean {
return when (type) { return when (type) {
TYPE_VMESS -> isV2RayNetworkTcp() && Protocols.shouldEnableMux("vmess") && !vmessBean!!.isVLESS TYPE_VMESS -> if (vmessBean!!.isVLESS) {
TYPE_TROJAN -> isV2RayNetworkTcp() && Protocols.shouldEnableMux("trojan") Protocols.isProfileNeedMux(vmessBean!!) && Protocols.shouldEnableMux("vless")
} else {
Protocols.isProfileNeedMux(vmessBean!!) && Protocols.shouldEnableMux("vmess")
}
TYPE_TROJAN -> Protocols.isProfileNeedMux(trojanBean!!)
&& Protocols.shouldEnableMux("trojan")
TYPE_SS -> !ssBean!!.sUoT && Protocols.shouldEnableMux("shadowsocks") TYPE_SS -> !ssBean!!.sUoT && Protocols.shouldEnableMux("shadowsocks")
else -> false else -> false
} }
@ -338,62 +340,77 @@ data class ProxyEntity(
type = TYPE_SOCKS type = TYPE_SOCKS
socksBean = bean socksBean = bean
} }
is HttpBean -> { is HttpBean -> {
type = TYPE_HTTP type = TYPE_HTTP
httpBean = bean httpBean = bean
} }
is ShadowsocksBean -> { is ShadowsocksBean -> {
type = TYPE_SS type = TYPE_SS
ssBean = bean ssBean = bean
} }
is VMessBean -> { is VMessBean -> {
type = TYPE_VMESS type = TYPE_VMESS
vmessBean = bean vmessBean = bean
} }
is TrojanBean -> { is TrojanBean -> {
type = TYPE_TROJAN type = TYPE_TROJAN
trojanBean = bean trojanBean = bean
} }
is TrojanGoBean -> { is TrojanGoBean -> {
type = TYPE_TROJAN_GO type = TYPE_TROJAN_GO
trojanGoBean = bean trojanGoBean = bean
} }
is NaiveBean -> { is NaiveBean -> {
type = TYPE_NAIVE type = TYPE_NAIVE
naiveBean = bean naiveBean = bean
} }
is HysteriaBean -> { is HysteriaBean -> {
type = TYPE_HYSTERIA type = TYPE_HYSTERIA
hysteriaBean = bean hysteriaBean = bean
} }
is SSHBean -> { is SSHBean -> {
type = TYPE_SSH type = TYPE_SSH
sshBean = bean sshBean = bean
} }
is WireGuardBean -> { is WireGuardBean -> {
type = TYPE_WG type = TYPE_WG
wgBean = bean wgBean = bean
} }
is TuicBean -> { is TuicBean -> {
type = TYPE_TUIC type = TYPE_TUIC
tuicBean = bean tuicBean = bean
} }
is ShadowTLSBean -> { is ShadowTLSBean -> {
type = TYPE_SHADOWTLS type = TYPE_SHADOWTLS
shadowTLSBean = bean shadowTLSBean = bean
} }
is ChainBean -> { is ChainBean -> {
type = TYPE_CHAIN type = TYPE_CHAIN
chainBean = bean chainBean = bean
} }
is NekoBean -> { is NekoBean -> {
type = TYPE_NEKO type = TYPE_NEKO
nekoBean = bean nekoBean = bean
} }
is ConfigBean -> { is ConfigBean -> {
type = TYPE_CONFIG type = TYPE_CONFIG
configBean = bean configBean = bean
} }
else -> error("Undefined type $type") else -> error("Undefined type $type")
} }
return this return this

View File

@ -5,6 +5,8 @@ import io.nekohasekai.sagernet.R
import io.nekohasekai.sagernet.database.DataStore import io.nekohasekai.sagernet.database.DataStore
import io.nekohasekai.sagernet.database.ProxyEntity.Companion.TYPE_NEKO import io.nekohasekai.sagernet.database.ProxyEntity.Companion.TYPE_NEKO
import io.nekohasekai.sagernet.fmt.AbstractBean import io.nekohasekai.sagernet.fmt.AbstractBean
import io.nekohasekai.sagernet.fmt.v2ray.StandardV2RayBean
import io.nekohasekai.sagernet.fmt.v2ray.isTLS
import io.nekohasekai.sagernet.ktx.app import io.nekohasekai.sagernet.ktx.app
import io.nekohasekai.sagernet.ktx.getColorAttr import io.nekohasekai.sagernet.ktx.getColorAttr
import moe.matsuri.nb4a.plugin.NekoPluginManager import moe.matsuri.nb4a.plugin.NekoPluginManager
@ -13,13 +15,21 @@ import moe.matsuri.nb4a.plugin.NekoPluginManager
object Protocols { object Protocols {
// Mux // Mux
fun isProfileNeedMux(bean: StandardV2RayBean): Boolean {
return when (bean.type) {
"tcp", "ws" -> true
"http" -> !bean.isTLS()
else -> false
}
}
fun shouldEnableMux(protocol: String): Boolean { fun shouldEnableMux(protocol: String): Boolean {
return DataStore.muxProtocols.contains(protocol) return DataStore.muxProtocols.contains(protocol)
} }
fun getCanMuxList(): List<String> { fun getCanMuxList(): List<String> {
// built-in and support mux // built-in and support mux
// sing-box support ss & vmess & trojan smux // TODO support vless mux in sing-box 1.3.x
val list = mutableListOf("vmess", "trojan", "trojan-go", "shadowsocks") val list = mutableListOf("vmess", "trojan", "trojan-go", "shadowsocks")
NekoPluginManager.getProtocols().forEach { NekoPluginManager.getProtocols().forEach {
@ -73,9 +83,11 @@ object Protocols {
msgL.contains("timeout") || msgL.contains("deadline") -> { msgL.contains("timeout") || msgL.contains("deadline") -> {
app.getString(R.string.connection_test_timeout) app.getString(R.string.connection_test_timeout)
} }
msgL.contains("refused") || msgL.contains("closed pipe") -> { msgL.contains("refused") || msgL.contains("closed pipe") -> {
app.getString(R.string.connection_test_refused) app.getString(R.string.connection_test_refused)
} }
else -> msg else -> msg
} }
} }