diff options
Diffstat (limited to 'web')
| -rw-r--r-- | web/assets/js/model/inbound.js | 20 | ||||
| -rw-r--r-- | web/assets/js/model/outbound.js | 20 | ||||
| -rw-r--r-- | web/html/form/outbound.html | 1107 | ||||
| -rw-r--r-- | web/html/form/stream/stream_kcp.html | 11 |
4 files changed, 806 insertions, 352 deletions
diff --git a/web/assets/js/model/inbound.js b/web/assets/js/model/inbound.js index f74b2736..c4416e59 100644 --- a/web/assets/js/model/inbound.js +++ b/web/assets/js/model/inbound.js @@ -323,18 +323,16 @@ class KcpStreamSettings extends XrayCommonClass { tti = 20, uplinkCapacity = 5, downlinkCapacity = 20, - congestion = false, - readBufferSize = 1, - writeBufferSize = 1, + cwndMultiplier = 0, + maxSendingWindow = 0, ) { super(); this.mtu = mtu; this.tti = tti; this.upCap = uplinkCapacity; this.downCap = downlinkCapacity; - this.congestion = congestion; - this.readBuffer = readBufferSize; - this.writeBuffer = writeBufferSize; + this.cwndMultiplier = cwndMultiplier; + this.maxSendingWindow = maxSendingWindow; } static fromJson(json = {}) { @@ -343,9 +341,8 @@ class KcpStreamSettings extends XrayCommonClass { json.tti, json.uplinkCapacity, json.downlinkCapacity, - json.congestion, - json.readBufferSize, - json.writeBufferSize, + json.cwndMultiplier, + json.maxSendingWindow, ); } @@ -355,9 +352,8 @@ class KcpStreamSettings extends XrayCommonClass { tti: this.tti, uplinkCapacity: this.upCap, downlinkCapacity: this.downCap, - congestion: this.congestion, - readBufferSize: this.readBuffer, - writeBufferSize: this.writeBuffer, + cwndMultiplier: this.cwndMultiplier, + maxSendingWindow: this.maxSendingWindow, }; } } diff --git a/web/assets/js/model/outbound.js b/web/assets/js/model/outbound.js index c0e7b03d..9d2c080b 100644 --- a/web/assets/js/model/outbound.js +++ b/web/assets/js/model/outbound.js @@ -169,18 +169,16 @@ class KcpStreamSettings extends CommonClass { tti = 20, uplinkCapacity = 5, downlinkCapacity = 20, - congestion = false, - readBufferSize = 1, - writeBufferSize = 1, + cwndMultiplier = 0, + maxSendingWindow = 0, ) { super(); this.mtu = mtu; this.tti = tti; this.upCap = uplinkCapacity; this.downCap = downlinkCapacity; - this.congestion = congestion; - this.readBuffer = readBufferSize; - this.writeBuffer = writeBufferSize; + this.cwndMultiplier = cwndMultiplier; + this.maxSendingWindow = maxSendingWindow; } static fromJson(json = {}) { @@ -189,9 +187,8 @@ class KcpStreamSettings extends CommonClass { json.tti, json.uplinkCapacity, json.downlinkCapacity, - json.congestion, - json.readBufferSize, - json.writeBufferSize, + json.cwndMultiplier, + json.maxSendingWindow, ); } @@ -201,9 +198,8 @@ class KcpStreamSettings extends CommonClass { tti: this.tti, uplinkCapacity: this.upCap, downlinkCapacity: this.downCap, - congestion: this.congestion, - readBufferSize: this.readBuffer, - writeBufferSize: this.writeBuffer, + cwndMultiplier: this.cwndMultiplier, + maxSendingWindow: this.maxSendingWindow, }; } } diff --git a/web/html/form/outbound.html b/web/html/form/outbound.html index 0deb8ee1..fe76b518 100644 --- a/web/html/form/outbound.html +++ b/web/html/form/outbound.html @@ -1,19 +1,36 @@ {{define "form/outbound"}} <!-- base --> -<a-tabs :active-key="outModal.activeKey" :style="{ padding: '0', backgroundColor: 'transparent' }" - @change="(activeKey) => {outModal.toggleJson(activeKey == '2'); }"> +<a-tabs + :active-key="outModal.activeKey" + :style="{ padding: '0', backgroundColor: 'transparent' }" + @change="(activeKey) => {outModal.toggleJson(activeKey == '2'); }" +> <a-tab-pane key="1" tab="Form"> - <a-form :colon="false" :label-col="{ md: {span:8} }" :wrapper-col="{ md: {span:14} }"> + <a-form + :colon="false" + :label-col="{ md: {span:8} }" + :wrapper-col="{ md: {span:14} }" + > <a-form-item label='{{ i18n "protocol" }}'> - <a-select v-model="outbound.protocol" :dropdown-class-name="themeSwitcher.currentTheme"> - <a-select-option v-for="x,y in Protocols" :value="x">[[ y - ]]</a-select-option> + <a-select + v-model="outbound.protocol" + :dropdown-class-name="themeSwitcher.currentTheme" + > + <a-select-option v-for="x,y in Protocols" :value="x" + >[[ y ]]</a-select-option + > </a-select> </a-form-item> - <a-form-item label='{{ i18n "pages.xray.outbound.tag" }}' has-feedback - :validate-status="outModal.duplicateTag? 'warning' : 'success'"> - <a-input v-model.trim="outbound.tag" @change="outModal.check()" - placeholder='{{ i18n "pages.xray.outbound.tagDesc" }}'></a-input> + <a-form-item + label='{{ i18n "pages.xray.outbound.tag" }}' + has-feedback + :validate-status="outModal.duplicateTag? 'warning' : 'success'" + > + <a-input + v-model.trim="outbound.tag" + @change="outModal.check()" + placeholder='{{ i18n "pages.xray.outbound.tagDesc" }}' + ></a-input> </a-form-item> <a-form-item label='{{ i18n "pages.xray.outbound.sendThrough" }}'> <a-input v-model="outbound.sendThrough"></a-input> @@ -21,74 +38,115 @@ <!-- freedom settings--> <template v-if="outbound.protocol === Protocols.Freedom"> - <a-form-item label='Strategy'> - <a-select v-model="outbound.settings.domainStrategy" :dropdown-class-name="themeSwitcher.currentTheme"> - <a-select-option v-for="s in OutboundDomainStrategies" :value="s">[[ - s ]]</a-select-option> + <a-form-item label="Strategy"> + <a-select + v-model="outbound.settings.domainStrategy" + :dropdown-class-name="themeSwitcher.currentTheme" + > + <a-select-option v-for="s in OutboundDomainStrategies" :value="s" + >[[ s ]]</a-select-option + > </a-select> </a-form-item> - <a-form-item label='Redirect'> + <a-form-item label="Redirect"> <a-input v-model="outbound.settings.redirect"></a-input> </a-form-item> - <a-form-item label='Fragment'> - <a-switch :checked="Object.keys(outbound.settings.fragment).length >0" - @change="checked => outbound.settings.fragment = checked ? new Outbound.FreedomSettings.Fragment() : {}"> + <a-form-item label="Fragment"> + <a-switch + :checked="Object.keys(outbound.settings.fragment).length >0" + @change="checked => outbound.settings.fragment = checked ? new Outbound.FreedomSettings.Fragment() : {}" + > </a-switch> </a-form-item> <template v-if="Object.keys(outbound.settings.fragment).length >0"> - <a-form-item label='Packets'> - <a-select v-model="outbound.settings.fragment.packets" :dropdown-class-name="themeSwitcher.currentTheme"> - <a-select-option v-for="s in ['1-3','tlshello']" :value="s">[[ s - ]]</a-select-option> + <a-form-item label="Packets"> + <a-select + v-model="outbound.settings.fragment.packets" + :dropdown-class-name="themeSwitcher.currentTheme" + > + <a-select-option v-for="s in ['1-3','tlshello']" :value="s" + >[[ s ]]</a-select-option + > </a-select> </a-form-item> - <a-form-item label='Length'> + <a-form-item label="Length"> <a-input v-model.trim="outbound.settings.fragment.length"></a-input> </a-form-item> - <a-form-item label='Interval'> - <a-input v-model.trim="outbound.settings.fragment.interval"></a-input> + <a-form-item label="Interval"> + <a-input + v-model.trim="outbound.settings.fragment.interval" + ></a-input> </a-form-item> - <a-form-item label='Max Split'> - <a-input v-model.trim="outbound.settings.fragment.maxSplit"></a-input> + <a-form-item label="Max Split"> + <a-input + v-model.trim="outbound.settings.fragment.maxSplit" + ></a-input> </a-form-item> </template> <!-- Switch for Noises --> - <a-form-item label='Noises'> - <a-switch :checked="outbound.settings.noises.length > 0" - @change="checked => outbound.settings.noises = checked ? [new Outbound.FreedomSettings.Noise()] : []"> + <a-form-item label="Noises"> + <a-switch + :checked="outbound.settings.noises.length > 0" + @change="checked => outbound.settings.noises = checked ? [new Outbound.FreedomSettings.Noise()] : []" + > </a-switch> </a-form-item> <!-- Add Noise Button --> <template v-if="outbound.settings.noises.length > 0"> <a-form-item label="Noises"> - <a-button icon="plus" type="primary" size="small" @click="outbound.settings.addNoise()"></a-button> + <a-button + icon="plus" + type="primary" + size="small" + @click="outbound.settings.addNoise()" + ></a-button> </a-form-item> <!-- Noise Configurations --> - <a-form v-for="(noise, index) in outbound.settings.noises" :key="index" :colon="false" - :label-col="{ md: {span:8} }" :wrapper-col="{ md: {span:14} }"> - <a-divider :style="{ margin: '0' }"> Noise [[ index + 1 ]] - <a-icon v-if="outbound.settings.noises.length > 1" type="delete" + <a-form + v-for="(noise, index) in outbound.settings.noises" + :key="index" + :colon="false" + :label-col="{ md: {span:8} }" + :wrapper-col="{ md: {span:14} }" + > + <a-divider :style="{ margin: '0' }"> + Noise [[ index + 1 ]] + <a-icon + v-if="outbound.settings.noises.length > 1" + type="delete" @click="() => outbound.settings.delNoise(index)" - :style="{ color: 'rgb(255, 77, 79)', cursor: 'pointer' }"></a-icon> + :style="{ color: 'rgb(255, 77, 79)', cursor: 'pointer' }" + ></a-icon> </a-divider> - <a-form-item label='Type'> - <a-select v-model="noise.type" :dropdown-class-name="themeSwitcher.currentTheme"> - <a-select-option v-for="s in ['rand','base64','str', 'hex']" :value="s">[[ s ]]</a-select-option> + <a-form-item label="Type"> + <a-select + v-model="noise.type" + :dropdown-class-name="themeSwitcher.currentTheme" + > + <a-select-option + v-for="s in ['rand','base64','str', 'hex']" + :value="s" + >[[ s ]]</a-select-option + > </a-select> </a-form-item> - <a-form-item label='Packet'> + <a-form-item label="Packet"> <a-input v-model.trim="noise.packet"></a-input> </a-form-item> - <a-form-item label='Delay'> + <a-form-item label="Delay"> <a-input v-model.trim="noise.delay"></a-input> </a-form-item> - <a-form-item label='Apply To'> - <a-select v-model="noise.applyTo" :dropdown-class-name="themeSwitcher.currentTheme"> - <a-select-option v-for="s in ['ip','ipv4','ipv6']" :value="s">[[ - s ]]</a-select-option> + <a-form-item label="Apply To"> + <a-select + v-model="noise.applyTo" + :dropdown-class-name="themeSwitcher.currentTheme" + > + <a-select-option v-for="s in ['ip','ipv4','ipv6']" :value="s" + >[[ s ]]</a-select-option + > </a-select> </a-form-item> </a-form> @@ -97,10 +155,14 @@ <!-- blackhole settings --> <template v-if="outbound.protocol === Protocols.Blackhole"> - <a-form-item label='Response Type'> - <a-select v-model="outbound.settings.type" :dropdown-class-name="themeSwitcher.currentTheme"> - <a-select-option v-for="s in ['', 'none','http']" :value="s">[[ s - ]]</a-select-option> + <a-form-item label="Response Type"> + <a-select + v-model="outbound.settings.type" + :dropdown-class-name="themeSwitcher.currentTheme" + > + <a-select-option v-for="s in ['', 'none','http']" :value="s" + >[[ s ]]</a-select-option + > </a-select> </a-form-item> </template> @@ -108,18 +170,29 @@ <!-- dns settings --> <template v-if="outbound.protocol === Protocols.DNS"> <a-form-item label='{{ i18n "pages.inbounds.network" }}'> - <a-select v-model="outbound.settings.network" :dropdown-class-name="themeSwitcher.currentTheme"> - <a-select-option v-for="s in ['udp','tcp']" :value="s">[[ s - ]]</a-select-option> + <a-select + v-model="outbound.settings.network" + :dropdown-class-name="themeSwitcher.currentTheme" + > + <a-select-option v-for="s in ['udp','tcp']" :value="s" + >[[ s ]]</a-select-option + > </a-select> </a-form-item> - <a-form-item label='non-IP queries'> - <a-select v-model="outbound.settings.nonIPQuery" :dropdown-class-name="themeSwitcher.currentTheme"> - <a-select-option v-for="s in ['reject','drop','skip']" :value="s">[[ - s ]]</a-select-option> + <a-form-item label="non-IP queries"> + <a-select + v-model="outbound.settings.nonIPQuery" + :dropdown-class-name="themeSwitcher.currentTheme" + > + <a-select-option v-for="s in ['reject','drop','skip']" :value="s" + >[[ s ]]</a-select-option + > </a-select> </a-form-item> - <a-form-item v-if="outbound.settings.nonIPQuery === 'skip'" label='Block Types'> + <a-form-item + v-if="outbound.settings.nonIPQuery === 'skip'" + label="Block Types" + > <a-input v-model.number="outbound.settings.blockTypes"></a-input> </a-form-item> </template> @@ -145,8 +218,10 @@ <span>{{ i18n "reset" }}</span> </template> {{ i18n "pages.xray.wireguard.secretKey" }} - <a-icon type="sync" - @click="[outbound.settings.pubKey, outbound.settings.secretKey] = Object.values(Wireguard.generateKeypair())"> + <a-icon + type="sync" + @click="[outbound.settings.pubKey, outbound.settings.secretKey] = Object.values(Wireguard.generateKeypair())" + > </a-icon> </a-tooltip> </template> @@ -156,17 +231,30 @@ <a-input disabled v-model="outbound.settings.pubKey"></a-input> </a-form-item> <a-form-item label='{{ i18n "pages.xray.wireguard.domainStrategy" }}'> - <a-select v-model="outbound.settings.domainStrategy" :dropdown-class-name="themeSwitcher.currentTheme"> - <a-select-option v-for="wds in ['', ...WireguardDomainStrategy]" :value="wds">[[ wds ]]</a-select-option> + <a-select + v-model="outbound.settings.domainStrategy" + :dropdown-class-name="themeSwitcher.currentTheme" + > + <a-select-option + v-for="wds in ['', ...WireguardDomainStrategy]" + :value="wds" + >[[ wds ]]</a-select-option + > </a-select> </a-form-item> - <a-form-item label='MTU'> - <a-input-number v-model.number="outbound.settings.mtu" min="0"></a-input-number> + <a-form-item label="MTU"> + <a-input-number + v-model.number="outbound.settings.mtu" + min="0" + ></a-input-number> </a-form-item> - <a-form-item label='Workers'> - <a-input-number v-model.number="outbound.settings.workers" min="0"></a-input-number> + <a-form-item label="Workers"> + <a-input-number + v-model.number="outbound.settings.workers" + min="0" + ></a-input-number> </a-form-item> - <a-form-item label='No Kernel Tun'> + <a-form-item label="No Kernel Tun"> <a-switch v-model="outbound.settings.noKernelTun"></a-switch> </a-form-item> <a-form-item> @@ -174,19 +262,34 @@ <a-tooltip> <template slot="title"> <span>{{ i18n "pages.xray.rules.useComma" }}</span> - </template> Reserved <a-icon type="question-circle"></a-icon> + </template> + Reserved <a-icon type="question-circle"></a-icon> </a-tooltip> </template> <a-input v-model="outbound.settings.reserved"></a-input> </a-form-item> <a-form-item label="Peers"> - <a-button icon="plus" type="primary" size="small" @click="outbound.settings.addPeer()"></a-button> + <a-button + icon="plus" + type="primary" + size="small" + @click="outbound.settings.addPeer()" + ></a-button> </a-form-item> - <a-form v-for="(peer, index) in outbound.settings.peers" :colon="false" :label-col="{ md: {span:8} }" - :wrapper-col="{ md: {span:14} }"> - <a-divider :style="{ margin: '0' }"> Peer [[ index + 1 ]] <a-icon v-if="outbound.settings.peers.length>1" - type="delete" @click="() => outbound.settings.delPeer(index)" - :style="{ color: 'rgb(255, 77, 79)', cursor: 'pointer' }"></a-icon> + <a-form + v-for="(peer, index) in outbound.settings.peers" + :colon="false" + :label-col="{ md: {span:8} }" + :wrapper-col="{ md: {span:14} }" + > + <a-divider :style="{ margin: '0' }"> + Peer [[ index + 1 ]] + <a-icon + v-if="outbound.settings.peers.length>1" + type="delete" + @click="() => outbound.settings.delPeer(index)" + :style="{ color: 'rgb(255, 77, 79)', cursor: 'pointer' }" + ></a-icon> </a-divider> <a-form-item label='{{ i18n "pages.xray.wireguard.endpoint" }}'> <a-input v-model.trim="peer.endpoint"></a-input> @@ -200,17 +303,33 @@ <a-form-item> <template slot="label"> {{ i18n "pages.xray.wireguard.allowedIPs" }} - <a-button icon="plus" type="primary" size="small" @click="peer.allowedIPs.push('')"></a-button> + <a-button + icon="plus" + type="primary" + size="small" + @click="peer.allowedIPs.push('')" + ></a-button> </template> - <template v-for="(aip, index) in peer.allowedIPs" :style="{ marginBottom: '10px' }"> + <template + v-for="(aip, index) in peer.allowedIPs" + :style="{ marginBottom: '10px' }" + > <a-input v-model.trim="peer.allowedIPs[index]"> - <a-button icon="minus" v-if="peer.allowedIPs.length>1" slot="addonAfter" size="small" - @click="peer.allowedIPs.splice(index, 1)"></a-button> + <a-button + icon="minus" + v-if="peer.allowedIPs.length>1" + slot="addonAfter" + size="small" + @click="peer.allowedIPs.splice(index, 1)" + ></a-button> </a-input> </template> </a-form-item> - <a-form-item label='Keep Alive'> - <a-input-number v-model.number="peer.keepAlive" :min="0"></a-input-number> + <a-form-item label="Keep Alive"> + <a-input-number + v-model.number="peer.keepAlive" + :min="0" + ></a-input-number> </a-form-item> </a-form> </template> @@ -221,65 +340,109 @@ <a-input v-model.trim="outbound.settings.address"></a-input> </a-form-item> <a-form-item label='{{ i18n "pages.inbounds.port" }}'> - <a-input-number v-model.number="outbound.settings.port" :min="1" :max="65532"></a-input-number> + <a-input-number + v-model.number="outbound.settings.port" + :min="1" + :max="65532" + ></a-input-number> </a-form-item> </template> <!-- VLESS/VMess user settings --> - <template v-if="[Protocols.VMess, Protocols.VLESS].includes(outbound.protocol)"> - <a-form-item label='ID'> + <template + v-if="[Protocols.VMess, Protocols.VLESS].includes(outbound.protocol)" + > + <a-form-item label="ID"> <a-input v-model.trim="outbound.settings.id"></a-input> </a-form-item> <!-- vmess settings --> <template v-if="outbound.protocol === Protocols.VMess"> - <a-form-item label='Security'> - <a-select v-model="outbound.settings.security" :dropdown-class-name="themeSwitcher.currentTheme"> - <a-select-option v-for="key in USERS_SECURITY" :value="key">[[ key - ]]</a-select-option> + <a-form-item label="Security"> + <a-select + v-model="outbound.settings.security" + :dropdown-class-name="themeSwitcher.currentTheme" + > + <a-select-option v-for="key in USERS_SECURITY" :value="key" + >[[ key ]]</a-select-option + > </a-select> </a-form-item> </template> <!-- vless settings --> <template v-if="outbound.protocol === Protocols.VLESS"> - <a-form-item label='encryption'> + <a-form-item label="encryption"> <a-input v-model.trim="outbound.settings.encryption"></a-input> </a-form-item> </template> <template v-if="outbound.canEnableTlsFlow()"> - <a-form-item label='Flow'> - <a-select v-model="outbound.settings.flow" :dropdown-class-name="themeSwitcher.currentTheme"> - <a-select-option value selected>{{ i18n "none" - }}</a-select-option> - <a-select-option v-for="key in TLS_FLOW_CONTROL" :value="key">[[ - key ]]</a-select-option> + <a-form-item label="Flow"> + <a-select + v-model="outbound.settings.flow" + :dropdown-class-name="themeSwitcher.currentTheme" + > + <a-select-option value selected + >{{ i18n "none" }}</a-select-option + > + <a-select-option v-for="key in TLS_FLOW_CONTROL" :value="key" + >[[ key ]]</a-select-option + > </a-select> </a-form-item> </template> <!-- XTLS Vision Advanced Settings --> <template v-if="outbound.canEnableVisionSeed()"> <a-form-item label="Vision Pre-Connect"> - <a-input-number v-model.number="outbound.settings.testpre" :min="0" :max="10" :style="{ width: '100%' }" - placeholder="0"></a-input-number> + <a-input-number + v-model.number="outbound.settings.testpre" + :min="0" + :max="10" + :style="{ width: '100%' }" + placeholder="0" + ></a-input-number> </a-form-item> <a-form-item label="Vision Seed"> <a-row :gutter="8"> <a-col :span="6"> - <a-input-number v-model.number="outbound.settings.testseed[0]" :min="0" :max="9999" - :style="{ width: '100%' }" placeholder="900" addon-before="[0]"></a-input-number> + <a-input-number + v-model.number="outbound.settings.testseed[0]" + :min="0" + :max="9999" + :style="{ width: '100%' }" + placeholder="900" + addon-before="[0]" + ></a-input-number> </a-col> <a-col :span="6"> - <a-input-number v-model.number="outbound.settings.testseed[1]" :min="0" :max="9999" - :style="{ width: '100%' }" placeholder="500" addon-before="[1]"></a-input-number> + <a-input-number + v-model.number="outbound.settings.testseed[1]" + :min="0" + :max="9999" + :style="{ width: '100%' }" + placeholder="500" + addon-before="[1]" + ></a-input-number> </a-col> <a-col :span="6"> - <a-input-number v-model.number="outbound.settings.testseed[2]" :min="0" :max="9999" - :style="{ width: '100%' }" placeholder="900" addon-before="[2]"></a-input-number> + <a-input-number + v-model.number="outbound.settings.testseed[2]" + :min="0" + :max="9999" + :style="{ width: '100%' }" + placeholder="900" + addon-before="[2]" + ></a-input-number> </a-col> <a-col :span="6"> - <a-input-number v-model.number="outbound.settings.testseed[3]" :min="0" :max="9999" - :style="{ width: '100%' }" placeholder="256" addon-before="[3]"></a-input-number> + <a-input-number + v-model.number="outbound.settings.testseed[3]" + :min="0" + :max="9999" + :style="{ width: '100%' }" + placeholder="256" + addon-before="[3]" + ></a-input-number> </a-col> </a-row> </a-form-item> @@ -299,7 +462,9 @@ </template> <!-- trojan/shadowsocks --> - <template v-if="[Protocols.Trojan, Protocols.Shadowsocks].includes(outbound.protocol)"> + <template + v-if="[Protocols.Trojan, Protocols.Shadowsocks].includes(outbound.protocol)" + > <a-form-item label='{{ i18n "password" }}'> <a-input v-model.trim="outbound.settings.password"></a-input> </a-form-item> @@ -308,46 +473,69 @@ <!-- shadowsocks --> <template v-if="outbound.protocol === Protocols.Shadowsocks"> <a-form-item label='{{ i18n "encryption" }}'> - <a-select v-model="outbound.settings.method" :dropdown-class-name="themeSwitcher.currentTheme"> - <a-select-option v-for="(method, method_name) in SSMethods" :value="method">[[ method_name - ]]</a-select-option> + <a-select + v-model="outbound.settings.method" + :dropdown-class-name="themeSwitcher.currentTheme" + > + <a-select-option + v-for="(method, method_name) in SSMethods" + :value="method" + >[[ method_name ]]</a-select-option + > </a-select> </a-form-item> - <a-form-item label='UDP over TCP'> + <a-form-item label="UDP over TCP"> <a-switch v-model="outbound.settings.uot"></a-switch> </a-form-item> - <a-form-item label='UoTVersion'> - <a-input-number v-model.number="outbound.settings.UoTVersion" :min="1" :max="2"></a-input-number> + <a-form-item label="UoTVersion"> + <a-input-number + v-model.number="outbound.settings.UoTVersion" + :min="1" + :max="2" + ></a-input-number> </a-form-item> </template> </template> <!-- hysteria settings --> <template v-if="outbound.protocol === Protocols.Hysteria"> - <a-form-item label='Version'> - <a-input-number v-model.number="outbound.settings.version" :min="2" :max="2" disabled></a-input-number> + <a-form-item label="Version"> + <a-input-number + v-model.number="outbound.settings.version" + :min="2" + :max="2" + disabled + ></a-input-number> </a-form-item> </template> <!-- stream settings --> <template v-if="outbound.canEnableStream()"> <a-form-item label='{{ i18n "transmission" }}'> - <a-select v-model="outbound.stream.network" @change="streamNetworkChange" - :dropdown-class-name="themeSwitcher.currentTheme"> + <a-select + v-model="outbound.stream.network" + @change="streamNetworkChange" + :dropdown-class-name="themeSwitcher.currentTheme" + > <a-select-option value="tcp">TCP (RAW)</a-select-option> <a-select-option value="kcp">mKCP</a-select-option> <a-select-option value="ws">WebSocket</a-select-option> <a-select-option value="grpc">gRPC</a-select-option> <a-select-option value="httpupgrade">HTTPUpgrade</a-select-option> <a-select-option value="xhttp">XHTTP</a-select-option> - <a-select-option v-if="outbound.protocol === Protocols.Hysteria" - value="hysteria">Hysteria2</a-select-option> + <a-select-option + v-if="outbound.protocol === Protocols.Hysteria" + value="hysteria" + >Hysteria2</a-select-option + > </a-select> </a-form-item> <template v-if="outbound.stream.network === 'tcp'"> <a-form-item label='HTTP {{ i18n "camouflage" }}'> - <a-switch :checked="outbound.stream.tcp.type === 'http'" - @change="checked => outbound.stream.tcp.type = checked ? 'http' : 'none'"></a-switch> + <a-switch + :checked="outbound.stream.tcp.type === 'http'" + @change="checked => outbound.stream.tcp.type = checked ? 'http' : 'none'" + ></a-switch> </a-form-item> <template v-if="outbound.stream.tcp.type == 'http'"> <a-form-item label='{{ i18n "host" }}'> @@ -361,26 +549,41 @@ <!-- kcp --> <template v-if="outbound.stream.network === 'kcp'"> - <a-form-item label='MTU'> - <a-input-number v-model.number="outbound.stream.kcp.mtu" min="0"></a-input-number> - </a-form-item> - <a-form-item label='TTI (ms)'> - <a-input-number v-model.number="outbound.stream.kcp.tti" min="0"></a-input-number> - </a-form-item> - <a-form-item label='Uplink (MB/s)'> - <a-input-number v-model.number="outbound.stream.kcp.upCap" min="0"></a-input-number> - </a-form-item> - <a-form-item label='Downlink (MB/s)'> - <a-input-number v-model.number="outbound.stream.kcp.downCap" min="0"></a-input-number> - </a-form-item> - <a-form-item label='Congestion'> - <a-switch v-model="outbound.stream.kcp.congestion"></a-switch> - </a-form-item> - <a-form-item label='Read Buffer (MB)'> - <a-input-number v-model.number="outbound.stream.kcp.readBuffer" min="0"></a-input-number> - </a-form-item> - <a-form-item label='Write Buffer (MB)'> - <a-input-number v-model.number="outbound.stream.kcp.writeBuffer" min="0"></a-input-number> + <a-form-item label="MTU"> + <a-input-number + v-model.number="outbound.stream.kcp.mtu" + min="0" + ></a-input-number> + </a-form-item> + <a-form-item label="TTI (ms)"> + <a-input-number + v-model.number="outbound.stream.kcp.tti" + min="0" + ></a-input-number> + </a-form-item> + <a-form-item label="Uplink (MB/s)"> + <a-input-number + v-model.number="outbound.stream.kcp.upCap" + min="0" + ></a-input-number> + </a-form-item> + <a-form-item label="Downlink (MB/s)"> + <a-input-number + v-model.number="outbound.stream.kcp.downCap" + min="0" + ></a-input-number> + </a-form-item> + <a-form-item label="CWND Multiplier"> + <a-input-number + v-model.number="outbound.stream.kcp.cwndMultiplier" + min="0" + ></a-input-number> + </a-form-item> + <a-form-item label="Max Sending Window"> + <a-input-number + v-model.number="outbound.stream.kcp.maxSendingWindow" + min="0" + ></a-input-number> </a-form-item> </template> @@ -392,20 +595,23 @@ <a-form-item label='{{ i18n "path" }}'> <a-input v-model.trim="outbound.stream.ws.path"></a-input> </a-form-item> - <a-form-item label='Heartbeat Period'> - <a-input-number v-model.number="outbound.stream.ws.heartbeatPeriod" :min="0"></a-input-number> + <a-form-item label="Heartbeat Period"> + <a-input-number + v-model.number="outbound.stream.ws.heartbeatPeriod" + :min="0" + ></a-input-number> </a-form-item> </template> <!-- grpc --> <template v-if="outbound.stream.network === 'grpc'"> - <a-form-item label='Service Name'> + <a-form-item label="Service Name"> <a-input v-model.trim="outbound.stream.grpc.serviceName"></a-input> </a-form-item> <a-form-item label="Authority"> <a-input v-model.trim="outbound.stream.grpc.authority"></a-input> </a-form-item> - <a-form-item label='Multi Mode'> + <a-form-item label="Multi Mode"> <a-switch v-model="outbound.stream.grpc.multiMode"></a-switch> </a-form-item> </template> @@ -428,247 +634,437 @@ <a-form-item label='{{ i18n "path" }}'> <a-input v-model.trim="outbound.stream.xhttp.path"></a-input> </a-form-item> - <a-form-item label='Mode'> - <a-select v-model="outbound.stream.xhttp.mode" :dropdown-class-name="themeSwitcher.currentTheme"> - <a-select-option v-for="key in MODE_OPTION" :value="key">[[ key - ]]</a-select-option> + <a-form-item label="Mode"> + <a-select + v-model="outbound.stream.xhttp.mode" + :dropdown-class-name="themeSwitcher.currentTheme" + > + <a-select-option v-for="key in MODE_OPTION" :value="key" + >[[ key ]]</a-select-option + > </a-select> </a-form-item> - <a-form-item label="No gRPC Header" - v-if="outbound.stream.xhttp.mode === 'stream-up' || outbound.stream.xhttp.mode === 'stream-one'"> + <a-form-item + label="No gRPC Header" + v-if="outbound.stream.xhttp.mode === 'stream-up' || outbound.stream.xhttp.mode === 'stream-one'" + > <a-switch v-model="outbound.stream.xhttp.noGRPCHeader"></a-switch> </a-form-item> - <a-form-item label="Min Upload Interval (Ms)" v-if="outbound.stream.xhttp.mode === 'packet-up'"> - <a-input v-model.trim="outbound.stream.xhttp.scMinPostsIntervalMs"></a-input> - </a-form-item> - <a-form-item label="Max Concurrency" v-if="!outbound.stream.xhttp.xmux.maxConnections"&g
|
