|
@@ -295,6 +295,8 @@
|
|
|
<setting-list-item type="text" title='{{ i18n "pages.settings.subPath"}}' desc='{{ i18n "pages.settings.subPathDesc"}}' v-model="allSetting.subJsonPath"></setting-list-item>
|
|
|
<setting-list-item type="text" title='{{ i18n "pages.settings.subURI"}}' desc='{{ i18n "pages.settings.subURIDesc"}}' v-model="allSetting.subJsonURI" placeholder="(http|https)://domain[:port]/path/"></setting-list-item>
|
|
|
<setting-list-item type="switch" title='{{ i18n "pages.settings.fragment"}}' desc='{{ i18n "pages.settings.fragmentDesc"}}' v-model="fragment"></setting-list-item>
|
|
|
+ <setting-list-item type="switch" title='Mux' v-model="enableMux"></setting-list-item>
|
|
|
+ <setting-list-item type="switch" title='{{ i18n "pages.xray.directCountryConfigs"}}' desc='{{ i18n "pages.xray.directCountryConfigsDesc"}}' v-model="enableDirect"></setting-list-item>
|
|
|
</a-list>
|
|
|
<a-collapse v-if="fragment">
|
|
|
<a-collapse-panel header='{{ i18n "pages.settings.fragment"}}'>
|
|
@@ -318,6 +320,36 @@
|
|
|
<setting-list-item type="text" title='Length' v-model="fragmentLength" placeholder="100-200"></setting-list-item>
|
|
|
<setting-list-item type="text" title='Interval' v-model="fragmentInterval" placeholder="10-20"></setting-list-item>
|
|
|
</a-collapse-panel>
|
|
|
+ <a-collapse-panel header='Mux' v-if="enableMux">
|
|
|
+ <setting-list-item type="number" title='Concurrency' v-model="muxConcurrency" :min="-1" :max="1024"></setting-list-item>
|
|
|
+ <setting-list-item type="number" title='xudp Concurrency' v-model="muxXudpConcurrency" :min="-1" :max="1024"></setting-list-item>
|
|
|
+ <a-list-item style="padding: 20px">
|
|
|
+ <a-row>
|
|
|
+ <a-col :lg="24" :xl="12">
|
|
|
+ <a-list-item-meta title='xudp UDP 443'/>
|
|
|
+ </a-col>
|
|
|
+ <a-col :lg="24" :xl="12">
|
|
|
+ <a-select
|
|
|
+ v-model="muxXudpProxyUDP443"
|
|
|
+ style="width: 100%"
|
|
|
+ :dropdown-class-name="themeSwitcher.currentTheme">
|
|
|
+ <a-select-option :value="p" :label="p" v-for="p in ['reject', 'allow', 'skip']">
|
|
|
+ [[ p ]]
|
|
|
+ </a-select-option>
|
|
|
+ </a-select>
|
|
|
+ </a-col>
|
|
|
+ </a-row>
|
|
|
+ </a-list-item>
|
|
|
+ </a-collapse-panel>
|
|
|
+ <a-collapse-panel header='{{ i18n "pages.xray.directCountryConfigs"}}' v-if="enableDirect">
|
|
|
+ <a-list-item style="padding: 20px">
|
|
|
+ <a-checkbox-group
|
|
|
+ v-model="directCountries"
|
|
|
+ name="Countries"
|
|
|
+ :options="countryOptions"
|
|
|
+ />
|
|
|
+ </a-list-item>
|
|
|
+ </a-collapse-panel>
|
|
|
</a-collapse>
|
|
|
</a-tab-pane>
|
|
|
</a-tabs>
|
|
@@ -367,6 +399,40 @@
|
|
|
}
|
|
|
}
|
|
|
},
|
|
|
+ defaultMux: {
|
|
|
+ enabled: true,
|
|
|
+ concurrency: 8,
|
|
|
+ xudpConcurrency: 16,
|
|
|
+ xudpProxyUDP443: "reject"
|
|
|
+ },
|
|
|
+ defaultRules: [
|
|
|
+ {
|
|
|
+ type: "field",
|
|
|
+ outboundTag: "direct",
|
|
|
+ domain: [
|
|
|
+ "geosite:category-ir",
|
|
|
+ "geosite:cn"
|
|
|
+ ],
|
|
|
+ "enabled": true
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "field",
|
|
|
+ outboundTag: "direct",
|
|
|
+ ip: [
|
|
|
+ "geoip:private",
|
|
|
+ "geoip:ir",
|
|
|
+ "geoip:cn"
|
|
|
+ ],
|
|
|
+ enabled: true
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ countryOptions: [
|
|
|
+ { label: 'Private IP/Domain', value: 'private' },
|
|
|
+ { label: '🇮🇷 Iran', value: 'ir' },
|
|
|
+ { label: '🇨🇳 China', value: 'cn' },
|
|
|
+ { label: '🇷🇺 Russia', value: 'ru' },
|
|
|
+ { label: '🇻🇳 Vietnam', value: 'vn' },
|
|
|
+ ],
|
|
|
get remarkModel() {
|
|
|
rm = this.allSetting.remarkModel;
|
|
|
return rm.length>1 ? rm.substring(1).split('') : [];
|
|
@@ -530,6 +596,61 @@
|
|
|
}
|
|
|
}
|
|
|
},
|
|
|
+ enableMux: {
|
|
|
+ get: function() { return this.allSetting?.subJsonMux != ""; },
|
|
|
+ set: function (v) {
|
|
|
+ this.allSetting.subJsonMux = v ? JSON.stringify(this.defaultMux) : "";
|
|
|
+ }
|
|
|
+ },
|
|
|
+ muxConcurrency: {
|
|
|
+ get: function() { return this.enableMux ? JSON.parse(this.allSetting.subJsonMux).concurrency : -1; },
|
|
|
+ set: function(v) {
|
|
|
+ newMux = JSON.parse(this.allSetting.subJsonMux);
|
|
|
+ newMux.concurrency = v;
|
|
|
+ this.allSetting.subJsonMux = JSON.stringify(newMux);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ muxXudpConcurrency: {
|
|
|
+ get: function() { return this.enableMux ? JSON.parse(this.allSetting.subJsonMux).xudpConcurrency : -1; },
|
|
|
+ set: function(v) {
|
|
|
+ newMux = JSON.parse(this.allSetting.subJsonMux);
|
|
|
+ newMux.xudpConcurrency = v;
|
|
|
+ this.allSetting.subJsonMux = JSON.stringify(newMux);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ muxXudpProxyUDP443: {
|
|
|
+ get: function() { return this.enableMux ? JSON.parse(this.allSetting.subJsonMux).xudpProxyUDP443 : "reject"; },
|
|
|
+ set: function(v) {
|
|
|
+ newMux = JSON.parse(this.allSetting.subJsonMux);
|
|
|
+ newMux.xudpProxyUDP443 = v;
|
|
|
+ this.allSetting.subJsonMux = JSON.stringify(newMux);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ enableDirect: {
|
|
|
+ get: function() { return this.allSetting?.subJsonRules != ""; },
|
|
|
+ set: function (v) {
|
|
|
+ this.allSetting.subJsonRules = v ? JSON.stringify(this.defaultRules) : "";
|
|
|
+ }
|
|
|
+ },
|
|
|
+ directCountries: {
|
|
|
+ get: function() {
|
|
|
+ if (!this.enableDirect) return [];
|
|
|
+ rules = JSON.parse(this.allSetting.subJsonRules);
|
|
|
+ return Array.isArray(rules) ? rules[1].ip.map(d => d.replace("geoip:","")) : [];
|
|
|
+ },
|
|
|
+ set: function (v) {
|
|
|
+ rules = JSON.parse(this.allSetting.subJsonRules);
|
|
|
+ if (!Array.isArray(rules)) return;
|
|
|
+ rules[0].domain = [];
|
|
|
+ rules[1].ip = [];
|
|
|
+ v.forEach(d => {
|
|
|
+ category = ["cn","private"].includes(d) ? "" : "category-";
|
|
|
+ rules[0].domain.push("geosite:"+category+d);
|
|
|
+ rules[1].ip.push("geoip:"+d);
|
|
|
+ });
|
|
|
+ this.allSetting.subJsonRules = JSON.stringify(rules);
|
|
|
+ }
|
|
|
+ },
|
|
|
confAlerts: {
|
|
|
get: function() {
|
|
|
if (!this.allSetting) return [];
|