stream_finalmask.html 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503
  1. {{define "form/streamFinalMask"}}
  2. <a-form
  3. :colon="false"
  4. :label-col="{ md: {span:8} }"
  5. :wrapper-col="{ md: {span:14} }"
  6. v-if="inbound.protocol == Protocols.HYSTERIA || ['kcp', 'xhttp', 'raw', 'tcp', 'httpupgrade', 'ws', 'grpc'].includes(inbound.stream.network)"
  7. >
  8. <a-divider :style="{ margin: '5px 0 0' }"></a-divider>
  9. <!-- TCP Masks – for raw/tcp/httpupgrade/ws/grpc/xhttp -->
  10. <template v-if="['raw', 'tcp', 'httpupgrade', 'ws', 'grpc', 'xhttp'].includes(inbound.stream.network)">
  11. <a-form-item label="TCP Masks">
  12. <a-button
  13. icon="plus"
  14. type="primary"
  15. size="small"
  16. @click="inbound.stream.addTcpMask('fragment')"
  17. ></a-button>
  18. </a-form-item>
  19. <template v-if="inbound.stream.finalmask.tcp && inbound.stream.finalmask.tcp.length > 0">
  20. <a-form
  21. v-for="(mask, index) in inbound.stream.finalmask.tcp"
  22. :key="index"
  23. :colon="false"
  24. :label-col="{ md: {span:8} }"
  25. :wrapper-col="{ md: {span:14} }"
  26. >
  27. <a-divider :style="{ margin: '0' }">
  28. TCP Mask [[ index + 1 ]]
  29. <a-icon
  30. type="delete"
  31. @click="() => inbound.stream.delTcpMask(index)"
  32. :style="{ color: 'rgb(255, 77, 79)', cursor: 'pointer' }"
  33. ></a-icon>
  34. </a-divider>
  35. <a-form-item label='{{ i18n "pages.xray.outbound.type" }}'>
  36. <a-select
  37. v-model="mask.type"
  38. @change="(type) => { mask.settings = mask._getDefaultSettings(type, {}); }"
  39. :dropdown-class-name="themeSwitcher.currentTheme"
  40. >
  41. <a-select-option value="fragment">Fragment</a-select-option>
  42. <a-select-option value="header-custom">Header Custom</a-select-option>
  43. <a-select-option value="sudoku">Sudoku</a-select-option>
  44. </a-select>
  45. </a-form-item>
  46. <!-- Fragment settings -->
  47. <template v-if="mask.type === 'fragment'">
  48. <a-form-item label="Packets">
  49. <a-select
  50. v-model="mask.settings.packets"
  51. :dropdown-class-name="themeSwitcher.currentTheme"
  52. >
  53. <a-select-option value="tlshello">tlshello</a-select-option>
  54. <a-select-option value="1-3">1-3</a-select-option>
  55. <a-select-option value="1-5">1-5</a-select-option>
  56. </a-select>
  57. </a-form-item>
  58. <a-form-item label="Length">
  59. <a-input v-model.trim="mask.settings.length" placeholder="e.g. 100-200" />
  60. </a-form-item>
  61. <a-form-item label="Delay">
  62. <a-input v-model.trim="mask.settings.delay" placeholder="e.g. 10-20" />
  63. </a-form-item>
  64. <a-form-item label="Max Split">
  65. <a-input v-model.trim="mask.settings.maxSplit" placeholder="e.g. 3-6" />
  66. </a-form-item>
  67. </template>
  68. <!-- Sudoku settings (TCP) -->
  69. <template v-if="mask.type === 'sudoku'">
  70. <a-form-item label="Password">
  71. <a-input v-model.trim="mask.settings.password" placeholder="Obfuscation password" />
  72. </a-form-item>
  73. <a-form-item label="ASCII">
  74. <a-input v-model.trim="mask.settings.ascii" placeholder="ASCII" />
  75. </a-form-item>
  76. <a-form-item label="Custom Table">
  77. <a-input v-model.trim="mask.settings.customTable" placeholder="Custom Table" />
  78. </a-form-item>
  79. <a-form-item label="Custom Tables">
  80. <a-input v-model.trim="mask.settings.customTables" placeholder="Custom Tables" />
  81. </a-form-item>
  82. <a-form-item label="Padding Min">
  83. <a-input-number v-model.number="mask.settings.paddingMin" :min="0" />
  84. </a-form-item>
  85. <a-form-item label="Padding Max">
  86. <a-input-number v-model.number="mask.settings.paddingMax" :min="0" />
  87. </a-form-item>
  88. </template>
  89. <!-- Header Custom (TCP) – clients/servers/errors are 2D arrays of groups -->
  90. <template v-if="mask.type === 'header-custom'">
  91. <!-- Clients -->
  92. <a-form-item label="Clients">
  93. <a-icon type="plus" @click="mask.settings.clients.push([{delay: 0, rand: 0, randRange: '0-255', type: 'array', packet: []}])" />
  94. </a-form-item>
  95. <template v-for="(group, gi) in mask.settings.clients" :key="'cg'+gi">
  96. <a-divider :style="{ margin: '0' }">
  97. Clients Group [[ gi + 1 ]]
  98. <a-icon type="delete" @click="mask.settings.clients.splice(gi, 1)" :style="{ color: 'rgb(255, 77, 79)', cursor: 'pointer' }" />
  99. <a-icon type="plus" @click="group.push({delay: 0, rand: 0, randRange: '0-255', type: 'array', packet: []})" :style="{ marginLeft: '8px' }" />
  100. </a-divider>
  101. <template v-for="(item, ii) in group" :key="'ci'+ii">
  102. <a-divider :style="{ margin: '0', fontSize: '12px' }">
  103. Item [[ ii + 1 ]]
  104. <a-icon type="delete" @click="() => { group.splice(ii, 1); if(group.length === 0) mask.settings.clients.splice(gi, 1); }" :style="{ color: 'rgb(255, 77, 79)', cursor: 'pointer' }" />
  105. </a-divider>
  106. <a-form-item label='{{ i18n "pages.xray.outbound.type" }}'>
  107. <a-select v-model="item.type" :dropdown-class-name="themeSwitcher.currentTheme"
  108. @change="t => { if(t === 'base64') item.packet = RandomUtil.randomBase64(); else if(t === 'array') { item.rand = 0; item.packet = []; } else { item.packet = ''; } }">
  109. <a-select-option value="array">Array</a-select-option>
  110. <a-select-option value="str">String</a-select-option>
  111. <a-select-option value="hex">Hex</a-select-option>
  112. <a-select-option value="base64">Base64</a-select-option>
  113. </a-select>
  114. </a-form-item>
  115. <a-form-item label="Delay (ms)">
  116. <a-input-number v-model.number="item.delay" :min="0" />
  117. </a-form-item>
  118. <template v-if="item.type === 'array'">
  119. <a-form-item label="Rand">
  120. <a-input-number v-model.number="item.rand" :min="0" />
  121. </a-form-item>
  122. <a-form-item label="Rand Range">
  123. <a-input v-model.trim="item.randRange" placeholder="0-255" />
  124. </a-form-item>
  125. </template>
  126. <a-form-item v-else label="Packet">
  127. <a-input-group compact v-if="item.type === 'base64'">
  128. <a-input v-model.trim="item.packet" placeholder="binary data" :style="{ width: 'calc(100% - 32px)' }" />
  129. <a-button icon="reload" @click="item.packet = RandomUtil.randomBase64()" />
  130. </a-input-group>
  131. <a-input v-else v-model.trim="item.packet" placeholder="binary data" />
  132. </a-form-item>
  133. </template>
  134. </template>
  135. <!-- Servers -->
  136. <a-form-item label="Servers">
  137. <a-icon type="plus" @click="mask.settings.servers.push([{delay: 0, rand: 0, randRange: '0-255', type: 'array', packet: []}])" />
  138. </a-form-item>
  139. <template v-for="(group, gi) in mask.settings.servers" :key="'sg'+gi">
  140. <a-divider :style="{ margin: '0' }">
  141. Servers Group [[ gi + 1 ]]
  142. <a-icon type="delete" @click="mask.settings.servers.splice(gi, 1)" :style="{ color: 'rgb(255, 77, 79)', cursor: 'pointer' }" />
  143. <a-icon type="plus" @click="group.push({delay: 0, rand: 0, randRange: '0-255', type: 'array', packet: []})" :style="{ marginLeft: '8px' }" />
  144. </a-divider>
  145. <template v-for="(item, ii) in group" :key="'si'+ii">
  146. <a-divider :style="{ margin: '0', fontSize: '12px' }">
  147. Item [[ ii + 1 ]]
  148. <a-icon type="delete" @click="() => { group.splice(ii, 1); if(group.length === 0) mask.settings.servers.splice(gi, 1); }" :style="{ color: 'rgb(255, 77, 79)', cursor: 'pointer' }" />
  149. </a-divider>
  150. <a-form-item label='{{ i18n "pages.xray.outbound.type" }}'>
  151. <a-select v-model="item.type" :dropdown-class-name="themeSwitcher.currentTheme"
  152. @change="t => { if(t === 'base64') item.packet = RandomUtil.randomBase64(); else if(t === 'array') { item.rand = 0; item.packet = []; } else { item.packet = ''; } }">
  153. <a-select-option value="array">Array</a-select-option>
  154. <a-select-option value="str">String</a-select-option>
  155. <a-select-option value="hex">Hex</a-select-option>
  156. <a-select-option value="base64">Base64</a-select-option>
  157. </a-select>
  158. </a-form-item>
  159. <a-form-item label="Delay (ms)">
  160. <a-input-number v-model.number="item.delay" :min="0" />
  161. </a-form-item>
  162. <template v-if="item.type === 'array'">
  163. <a-form-item label="Rand">
  164. <a-input-number v-model.number="item.rand" :min="0" />
  165. </a-form-item>
  166. <a-form-item label="Rand Range">
  167. <a-input v-model.trim="item.randRange" placeholder="0-255" />
  168. </a-form-item>
  169. </template>
  170. <a-form-item v-else label="Packet">
  171. <a-input-group compact v-if="item.type === 'base64'">
  172. <a-input v-model.trim="item.packet" placeholder="binary data" :style="{ width: 'calc(100% - 32px)' }" />
  173. <a-button icon="reload" @click="item.packet = RandomUtil.randomBase64()" />
  174. </a-input-group>
  175. <a-input v-else v-model.trim="item.packet" placeholder="binary data" />
  176. </a-form-item>
  177. </template>
  178. </template>
  179. </template>
  180. </a-form>
  181. </template>
  182. </template>
  183. <template v-if="inbound.protocol == Protocols.HYSTERIA || inbound.stream.network == 'kcp'">
  184. <a-form-item label="UDP Masks">
  185. <a-button
  186. icon="plus"
  187. type="primary"
  188. size="small"
  189. @click="inbound.stream.addUdpMask(inbound.protocol === Protocols.HYSTERIA ? 'salamander' : 'mkcp-aes128gcm')"
  190. ></a-button>
  191. </a-form-item>
  192. <template
  193. v-if="inbound.stream.finalmask.udp && inbound.stream.finalmask.udp.length > 0"
  194. >
  195. <a-form
  196. v-for="(mask, index) in inbound.stream.finalmask.udp"
  197. :key="index"
  198. :colon="false"
  199. :label-col="{ md: {span:8} }"
  200. :wrapper-col="{ md: {span:14} }"
  201. >
  202. <a-divider :style="{ margin: '0' }">
  203. UDP Mask [[ index + 1 ]]
  204. <a-icon
  205. type="delete"
  206. @click="() => inbound.stream.delUdpMask(index)"
  207. :style="{ color: 'rgb(255, 77, 79)', cursor: 'pointer' }"
  208. ></a-icon>
  209. </a-divider>
  210. <a-form-item label='{{ i18n "pages.xray.outbound.type" }}'>
  211. <a-select
  212. v-model="mask.type"
  213. @change="(type) => { mask.settings = mask._getDefaultSettings(type, {}); if(inbound.stream.network === 'kcp') { inbound.stream.kcp.mtu = type === 'xdns' ? 900 : 1350; } }"
  214. :dropdown-class-name="themeSwitcher.currentTheme"
  215. >
  216. <template v-if="inbound.protocol === Protocols.HYSTERIA">
  217. <a-select-option value="salamander"
  218. >Salamander (Hysteria2)</a-select-option
  219. >
  220. </template>
  221. <template v-else>
  222. <a-select-option value="mkcp-aes128gcm"
  223. >mKCP AES-128-GCM</a-select-option
  224. >
  225. <a-select-option value="header-dns">Header DNS</a-select-option>
  226. <a-select-option value="header-dtls"
  227. >Header DTLS 1.2</a-select-option
  228. >
  229. <a-select-option value="header-srtp">Header SRTP</a-select-option>
  230. <a-select-option value="header-utp">Header uTP</a-select-option>
  231. <a-select-option value="header-wechat"
  232. >Header WeChat Video</a-select-option
  233. >
  234. <a-select-option value="header-wireguard"
  235. >Header WireGuard</a-select-option
  236. >
  237. <a-select-option value="mkcp-original"
  238. >mKCP Original</a-select-option
  239. >
  240. <a-select-option value="xdns">xDNS</a-select-option>
  241. <a-select-option value="xicmp">xICMP</a-select-option>
  242. <a-select-option value="header-custom">Header Custom</a-select-option>
  243. <a-select-option value="noise">Noise</a-select-option>
  244. </template>
  245. </a-select>
  246. </a-form-item>
  247. <a-form-item
  248. label="Password"
  249. v-if="['mkcp-aes128gcm', 'salamander'].includes(mask.type)"
  250. >
  251. <a-input
  252. v-model.trim="mask.settings.password"
  253. placeholder="Obfuscation password"
  254. ></a-input>
  255. </a-form-item>
  256. <a-form-item label="Domain" v-if="mask.type === 'header-dns'">
  257. <a-input
  258. v-model.trim="mask.settings.domain"
  259. placeholder="e.g., www.example.com"
  260. ></a-input>
  261. </a-form-item>
  262. <template v-if="mask.type === 'xdns'">
  263. <a-form-item label="Domains">
  264. <a-select
  265. mode="tags"
  266. v-model="mask.settings.domains"
  267. :style="{ width: '100%' }"
  268. :token-separators="[',']"
  269. placeholder="e.g., www.example.com"
  270. ></a-select>
  271. </a-form-item>
  272. </template>
  273. <template v-if="mask.type === 'noise'">
  274. <a-form-item label="Reset">
  275. <a-input-number v-model.number="mask.settings.reset" :min="0" />
  276. </a-form-item>
  277. <a-form-item label="Noise">
  278. <a-icon
  279. type="plus"
  280. type="primary"
  281. size="small"
  282. @click="mask.settings.noise.push({rand: '1-8192', randRange: '0-255', type: 'array', packet: [], delay: '10-20'})"
  283. />
  284. </a-form-item>
  285. <template v-for="(n, index) in mask.settings.noise" :key="index">
  286. <a-divider :style="{ margin: '0' }">
  287. Noise [[ index + 1 ]]
  288. <a-icon
  289. type="delete"
  290. @click="() => mask.settings.noise.splice(index, 1)"
  291. :style="{ color: 'rgb(255, 77, 79)', cursor: 'pointer' }"
  292. ></a-icon>
  293. </a-divider>
  294. <a-form-item label='{{ i18n "pages.xray.outbound.type" }}'>
  295. <a-select
  296. v-model="n.type"
  297. :dropdown-class-name="themeSwitcher.currentTheme"
  298. @change="t => { if(t === 'base64') n.packet = RandomUtil.randomBase64(); else if(t === 'array') n.packet = []; else n.packet = ''; }"
  299. >
  300. <a-select-option value="array">Array</a-select-option>
  301. <a-select-option value="str">String</a-select-option>
  302. <a-select-option value="hex">Hex</a-select-option>
  303. <a-select-option value="base64">Base64</a-select-option>
  304. </a-select>
  305. </a-form-item>
  306. <template v-if="n.type === 'array'">
  307. <a-form-item label="Rand">
  308. <a-input v-model.trim="n.rand" placeholder="0 or 1-8192" />
  309. </a-form-item>
  310. <a-form-item label="Rand Range">
  311. <a-input v-model.trim="n.randRange" placeholder="0-255" />
  312. </a-form-item>
  313. </template>
  314. <a-form-item v-else label="Packet">
  315. <a-input-group compact v-if="n.type === 'base64'">
  316. <a-input v-model.trim="n.packet" placeholder="binary data" :style="{ width: 'calc(100% - 32px)' }" />
  317. <a-button icon="reload" @click="n.packet = RandomUtil.randomBase64()" />
  318. </a-input-group>
  319. <a-input v-else v-model.trim="n.packet" placeholder="binary data" />
  320. </a-form-item>
  321. <a-form-item label="Delay">
  322. <a-input v-model.trim="n.delay" placeholder="10-20" />
  323. </a-form-item>
  324. </template>
  325. </template>
  326. <template v-if="mask.type === 'header-custom'">
  327. <a-form-item label="Client">
  328. <a-icon
  329. type="plus"
  330. size="small"
  331. @click="mask.settings.client.push({rand: 0, randRange: '0-255', type: 'array', packet: []})"
  332. />
  333. </a-form-item>
  334. <template v-for="(c, index) in mask.settings.client" :key="index">
  335. <a-divider :style="{ margin: '0' }">
  336. Client [[ index + 1 ]]
  337. <a-icon
  338. type="delete"
  339. @click="mask.settings.client.splice(index, 1)"
  340. :style="{ color: 'rgb(255, 77, 79)', cursor: 'pointer' }"
  341. ></a-icon>
  342. </a-divider>
  343. <a-form-item label='{{ i18n "pages.xray.outbound.type" }}'>
  344. <a-select
  345. v-model="c.type"
  346. :dropdown-class-name="themeSwitcher.currentTheme"
  347. @change="t => { if(t === 'base64') c.packet = RandomUtil.randomBase64(); else if(t === 'array') c.packet = []; else c.packet = ''; }"
  348. >
  349. <a-select-option value="array">Array</a-select-option>
  350. <a-select-option value="str">String</a-select-option>
  351. <a-select-option value="hex">Hex</a-select-option>
  352. <a-select-option value="base64">Base64</a-select-option>
  353. </a-select>
  354. </a-form-item>
  355. <template v-if="c.type === 'array'">
  356. <a-form-item label="Rand">
  357. <a-input-number v-model.number="c.rand" />
  358. </a-form-item>
  359. <a-form-item label="Rand Range">
  360. <a-input v-model.trim="c.randRange" placeholder="0-255" />
  361. </a-form-item>
  362. </template>
  363. <a-form-item v-else label="Packet">
  364. <a-input-group compact v-if="c.type === 'base64'">
  365. <a-input v-model.trim="c.packet" placeholder="binary data" :style="{ width: 'calc(100% - 32px)' }" />
  366. <a-button icon="reload" @click="c.packet = RandomUtil.randomBase64()" />
  367. </a-input-group>
  368. <a-input v-else v-model.trim="c.packet" placeholder="binary data" />
  369. </a-form-item>
  370. </template>
  371. <a-divider :style="{ margin: '0' }"></a-divider>
  372. <a-form-item label="Server">
  373. <a-icon
  374. type="plus"
  375. size="small"
  376. @click="mask.settings.server.push({rand: 0, randRange: '0-255', type: 'array', packet: []})"
  377. />
  378. </a-form-item>
  379. <template v-for="(s, index) in mask.settings.server" :key="index">
  380. <a-divider :style="{ margin: '0' }">
  381. Server [[ index + 1 ]]
  382. <a-icon
  383. type="delete"
  384. @click="mask.settings.server.splice(index, 1)"
  385. :style="{ color: 'rgb(255, 77, 79)', cursor: 'pointer' }"
  386. ></a-icon>
  387. </a-divider>
  388. <a-form-item label='{{ i18n "pages.xray.outbound.type" }}'>
  389. <a-select
  390. v-model="s.type"
  391. :dropdown-class-name="themeSwitcher.currentTheme"
  392. @change="t => { if(t === 'base64') s.packet = RandomUtil.randomBase64(); else if(t === 'array') s.packet = []; else s.packet = ''; }"
  393. >
  394. <a-select-option value="array">Array</a-select-option>
  395. <a-select-option value="str">String</a-select-option>
  396. <a-select-option value="hex">Hex</a-select-option>
  397. <a-select-option value="base64">Base64</a-select-option>
  398. </a-select>
  399. </a-form-item>
  400. <template v-if="s.type === 'array'">
  401. <a-form-item label="Rand">
  402. <a-input-number v-model.number="s.rand" />
  403. </a-form-item>
  404. <a-form-item label="Rand Range">
  405. <a-input v-model.trim="s.randRange" placeholder="0-255" />
  406. </a-form-item>
  407. </template>
  408. <a-form-item v-else label="Packet">
  409. <a-input-group compact v-if="s.type === 'base64'">
  410. <a-input v-model.trim="s.packet" placeholder="binary data" :style="{ width: 'calc(100% - 32px)' }" />
  411. <a-button icon="reload" @click="s.packet = RandomUtil.randomBase64()" />
  412. </a-input-group>
  413. <a-input v-else v-model.trim="s.packet" placeholder="binary data" />
  414. </a-form-item>
  415. </template>
  416. </template>
  417. <template v-if="mask.type === 'xicmp'">
  418. <a-form-item label="IP">
  419. <a-input v-model.trim="mask.settings.ip" placeholder="0.0.0.0" />
  420. </a-form-item>
  421. <a-form-item label="ID">
  422. <a-input-number v-model.number="mask.settings.id" :min="0" />
  423. </a-form-item>
  424. </template>
  425. </a-form>
  426. </template>
  427. </template>
  428. <!-- quicParams – only for xhttp H3 and hysteria -->
  429. <template v-if="inbound.protocol == Protocols.HYSTERIA || inbound.stream.network == 'xhttp'">
  430. <a-form-item label="QUIC Params">
  431. <a-switch v-model="inbound.stream.finalmask.enableQuicParams"></a-switch>
  432. </a-form-item>
  433. <template v-if="inbound.stream.finalmask.enableQuicParams">
  434. <a-form-item label="Congestion">
  435. <a-select
  436. v-model="inbound.stream.finalmask.quicParams.congestion"
  437. :dropdown-class-name="themeSwitcher.currentTheme"
  438. >
  439. <a-select-option value="reno">Reno</a-select-option>
  440. <a-select-option value="bbr">BBR</a-select-option>
  441. <a-select-option value="brutal">Brutal</a-select-option>
  442. <a-select-option value="force-brutal">Force Brutal</a-select-option>
  443. </a-select>
  444. </a-form-item>
  445. <a-form-item label="Debug">
  446. <a-switch v-model="inbound.stream.finalmask.quicParams.debug"></a-switch>
  447. </a-form-item>
  448. <template v-if="['brutal','force-brutal'].includes(inbound.stream.finalmask.quicParams.congestion)">
  449. <a-form-item label="Brutal Up">
  450. <a-input v-model.trim="inbound.stream.finalmask.quicParams.brutalUp" placeholder="e.g. 60 mbps" />
  451. </a-form-item>
  452. <a-form-item label="Brutal Down">
  453. <a-input v-model.trim="inbound.stream.finalmask.quicParams.brutalDown" placeholder="e.g. 60 mbps" />
  454. </a-form-item>
  455. </template>
  456. <a-form-item label="UDP Hop">
  457. <a-switch v-model="inbound.stream.finalmask.quicParams.hasUdpHop"></a-switch>
  458. </a-form-item>
  459. <template v-if="inbound.stream.finalmask.quicParams.hasUdpHop">
  460. <a-form-item label="Hop Ports">
  461. <a-input v-model.trim="inbound.stream.finalmask.quicParams.udpHop.ports" placeholder="e.g. 20000-50000" />
  462. </a-form-item>
  463. <a-form-item label="Hop Interval (s)">
  464. <a-input-number v-model.number="inbound.stream.finalmask.quicParams.udpHop.interval" :min="5" />
  465. </a-form-item>
  466. </template>
  467. <a-form-item label="Max Idle Timeout (s)">
  468. <a-input-number v-model.number="inbound.stream.finalmask.quicParams.maxIdleTimeout" :min="4" :max="120" />
  469. </a-form-item>
  470. <a-form-item label="Keep Alive Period (s)">
  471. <a-input-number v-model.number="inbound.stream.finalmask.quicParams.keepAlivePeriod" :min="0" :max="60" />
  472. </a-form-item>
  473. <a-form-item label="Disable Path MTU Dis">
  474. <a-switch v-model="inbound.stream.finalmask.quicParams.disablePathMTUDiscovery"></a-switch>
  475. </a-form-item>
  476. <a-form-item label="Max Incoming Streams">
  477. <a-input-number v-model.number="inbound.stream.finalmask.quicParams.maxIncomingStreams" :min="0" placeholder="0 = default" />
  478. </a-form-item>
  479. <a-form-item label="Init Stream Window">
  480. <a-input-number v-model.number="inbound.stream.finalmask.quicParams.initStreamReceiveWindow" :min="0" placeholder="0 = default" />
  481. </a-form-item>
  482. <a-form-item label="Max Stream Window">
  483. <a-input-number v-model.number="inbound.stream.finalmask.quicParams.maxStreamReceiveWindow" :min="0" placeholder="0 = default" />
  484. </a-form-item>
  485. <a-form-item label="Init Conn Window">
  486. <a-input-number v-model.number="inbound.stream.finalmask.quicParams.initConnectionReceiveWindow" :min="0" placeholder="0 = default" />
  487. </a-form-item>
  488. <a-form-item label="Max Conn Window">
  489. <a-input-number v-model.number="inbound.stream.finalmask.quicParams.maxConnectionReceiveWindow" :min="0" placeholder="0 = default" />
  490. </a-form-item>
  491. </template>
  492. </template>
  493. </a-form>
  494. {{end}}