import { generateMLKEM768KeyPair, generatePassword, generateRealityKeyPair, generateRealityShortId, } from '../generate'; import { CERT_MODES, ENCRYPTION_MODES, ENCRYPTION_RTT, ENCRYPTION_TYPES, FINGERPRINTS, FLOWS, multiplexLevels, SECURITY, SS_CIPHERS, TRANSPORTS, TUIC_CONGESTION, TUIC_UDP_RELAY_MODES, XHTTP_MODES, } from './constants'; import type { FieldConfig } from './types'; export const PROTOCOL_FIELDS: Record = { shadowsocks: [ { name: 'ratio', type: 'number', label: 'traffic_ratio', min: 1, step: 0.01, defaultValue: 1, group: 'basic', }, { name: 'port', type: 'number', label: 'port', min: 1, max: 65535, placeholder: '1-65535', group: 'basic', }, { name: 'cipher', type: 'select', label: 'cipher', options: SS_CIPHERS, defaultValue: 'chacha20-ietf-poly1305', group: 'basic', }, { name: 'server_key', type: 'input', label: 'server_key', generate: { function: () => generatePassword(32), }, group: 'basic', condition: (p) => [ '2022-blake3-aes-128-gcm', '2022-blake3-aes-256-gcm', '2022-blake3-chacha20-poly1305', ].includes(p.cipher), }, { name: 'obfs', type: 'select', label: 'obfs', options: ['none', 'http', 'tls'], defaultValue: 'none', group: 'obfs', }, { name: 'obfs_host', type: 'input', label: 'host', placeholder: 'e.g. www.bing.com', group: 'obfs', condition: (p) => p.obfs && p.obfs !== 'none', }, { name: 'obfs_path', type: 'input', label: 'path', placeholder: 'e.g. /path/to/obfs', group: 'obfs', condition: (p) => p.obfs && p.obfs !== 'none', }, { name: 'sni', type: 'input', label: 'security_sni', group: 'security', condition: (p) => p.obfs === 'tls', }, { name: 'allow_insecure', type: 'switch', label: 'security_allow_insecure', group: 'security', condition: (p) => p.obfs === 'tls', }, { name: 'cert_mode', type: 'select', label: 'cert_mode', options: CERT_MODES, defaultValue: 'none', group: 'security', condition: (p) => p.obfs === 'tls', }, { name: 'cert_dns_provider', type: 'input', label: 'cert_dns_provider', placeholder: 'e.g. cloudflare, aliyun', group: 'security', condition: (p) => p.obfs === 'tls' && p.cert_mode === 'dns', }, { name: 'cert_dns_env', type: 'textarea', label: 'cert_dns_env', placeholder: 'CF_DNS_API_TOKEN=1234567890abcdefghijklmnopqrstuvwxyz\nALI_ACCESS_KEY_ID=your_access_key_id\nALI_ACCESS_KEY_SECRET=your_access_key_secret', group: 'security', condition: (p) => p.obfs === 'tls' && p.cert_mode === 'dns', }, ], vmess: [ { name: 'ratio', type: 'number', label: 'traffic_ratio', min: 1, step: 0.01, defaultValue: 1, group: 'basic', }, { name: 'port', type: 'number', label: 'port', min: 1, max: 65535, placeholder: '1-65535', group: 'basic', }, { name: 'transport', type: 'select', label: 'transport', options: TRANSPORTS.vmess, defaultValue: 'tcp', group: 'transport', }, { name: 'security', type: 'select', label: 'security', options: SECURITY.vmess, defaultValue: 'none', group: 'security', }, { name: 'host', type: 'input', label: 'host', placeholder: 'e.g. www.bing.com', group: 'transport', condition: (p) => ['websocket', 'xhttp', 'httpupgrade'].includes(p.transport), }, { name: 'path', type: 'input', label: 'path', placeholder: 'e.g. /path/to/obfs', group: 'transport', condition: (p) => ['websocket', 'xhttp', 'httpupgrade'].includes(p.transport), }, { name: 'service_name', type: 'input', label: 'service_name', group: 'transport', condition: (p) => p.transport === 'grpc', }, { name: 'sni', type: 'input', label: 'security_sni', group: 'security', condition: (p) => p.security !== 'none', }, { name: 'allow_insecure', type: 'switch', label: 'security_allow_insecure', group: 'security', condition: (p) => p.security !== 'none', }, { name: 'fingerprint', type: 'select', label: 'security_fingerprint', options: FINGERPRINTS, defaultValue: 'chrome', group: 'security', condition: (p) => p.security !== 'none', }, { name: 'cert_mode', type: 'select', label: 'cert_mode', options: CERT_MODES, defaultValue: 'none', group: 'security', condition: (p) => p.security === 'tls', }, { name: 'cert_dns_provider', type: 'input', label: 'cert_dns_provider', placeholder: 'e.g. cloudflare, aliyun', group: 'security', condition: (p) => p.security === 'tls' && p.cert_mode === 'dns', }, { name: 'cert_dns_env', type: 'textarea', label: 'cert_dns_env', placeholder: 'CF_DNS_API_TOKEN=1234567890abcdefghijklmnopqrstuvwxyz\nALI_ACCESS_KEY_ID=your_access_key_id\nALI_ACCESS_KEY_SECRET=your_access_key_secret', group: 'security', condition: (p) => p.security === 'tls' && p.cert_mode === 'dns', }, ], vless: [ { name: 'ratio', type: 'number', label: 'traffic_ratio', min: 1, step: 0.01, defaultValue: 1, group: 'basic', }, { name: 'port', type: 'number', label: 'port', min: 1, max: 65535, placeholder: '1-65535', group: 'basic', }, { name: 'transport', type: 'select', label: 'transport', options: TRANSPORTS.vless, defaultValue: 'tcp', group: 'transport', }, { name: 'flow', type: 'select', label: 'flow', options: FLOWS.vless, defaultValue: 'none', group: 'transport', condition: (p) => p.transport === 'tcp', }, { name: 'security', type: 'select', label: 'security', options: SECURITY.vless, defaultValue: 'none', group: 'security', }, { name: 'host', type: 'input', label: 'host', placeholder: 'e.g. www.bing.com', group: 'transport', condition: (p) => ['websocket', 'mkcp', 'httpupgrade', 'xhttp'].includes(p.transport), }, { name: 'path', type: 'input', label: 'path', placeholder: 'e.g. /path/to/obfs', group: 'transport', condition: (p) => ['websocket', 'mkcp', 'httpupgrade', 'xhttp'].includes(p.transport), }, { name: 'service_name', type: 'input', label: 'service_name', group: 'transport', condition: (p) => p.transport === 'grpc', }, { name: 'xhttp_mode', type: 'select', label: 'mode', options: XHTTP_MODES, defaultValue: 'auto', group: 'transport', condition: (p) => p.transport === 'xhttp', }, { name: 'xhttp_extra', type: 'textarea', label: 'extra', placeholder: '{}', group: 'transport', condition: (p) => p.transport === 'xhttp', }, { name: 'sni', type: 'input', label: 'security_sni', group: 'security', condition: (p) => p.security !== 'none', }, { name: 'allow_insecure', type: 'switch', label: 'security_allow_insecure', group: 'security', condition: (p) => p.security !== 'none', }, { name: 'fingerprint', type: 'select', label: 'security_fingerprint', options: FINGERPRINTS, defaultValue: 'chrome', group: 'security', condition: (p) => p.security !== 'none', }, { name: 'reality_server_addr', type: 'input', label: 'security_server_address', placeholder: (t) => t('security_server_address_placeholder'), group: 'reality', condition: (p) => p.security === 'reality', }, { name: 'reality_server_port', type: 'number', label: 'security_server_port', min: 1, max: 65535, placeholder: '1-65535', group: 'reality', condition: (p) => p.security === 'reality', }, { name: 'reality_private_key', type: 'input', label: 'security_private_key', placeholder: (t) => t('security_private_key_placeholder'), group: 'reality', generate: { function: generateRealityKeyPair, updateFields: { reality_private_key: 'privateKey', reality_public_key: 'publicKey', }, }, condition: (p) => p.security === 'reality', }, { name: 'reality_public_key', type: 'input', label: 'security_public_key', placeholder: (t) => t('security_public_key_placeholder'), group: 'reality', condition: (p) => p.security === 'reality', }, { name: 'reality_short_id', type: 'input', label: 'security_short_id', group: 'reality', generate: { function: generateRealityShortId, }, condition: (p) => p.security === 'reality', }, { name: 'encryption', type: 'select', label: 'encryption', options: ENCRYPTION_TYPES, defaultValue: 'none', group: 'encryption', }, { name: 'encryption_mode', type: 'select', label: 'encryption_mode', options: ENCRYPTION_MODES, defaultValue: 'native', group: 'encryption', condition: (p) => p.encryption === 'mlkem768x25519plus', }, { name: 'encryption_rtt', type: 'select', label: 'encryption_rtt', options: ENCRYPTION_RTT, defaultValue: '1rtt', group: 'encryption', condition: (p) => p.encryption === 'mlkem768x25519plus', }, { name: 'encryption_ticket', type: 'input', label: 'encryption_ticket', placeholder: 'e.g. 600s', group: 'encryption', condition: (p) => p.encryption === 'mlkem768x25519plus' && p.encryption_rtt === '0rtt', }, { name: 'encryption_server_padding', type: 'input', label: 'encryption_server_padding', placeholder: 'e.g. 100-111-1111.75-0-111.50-0-3333', group: 'encryption', condition: (p) => p.encryption === 'mlkem768x25519plus', }, { name: 'encryption_private_key', type: 'input', label: 'encryption_private_key', placeholder: (t) => t('encryption_private_key_placeholder'), group: 'encryption', generate: { function: generateMLKEM768KeyPair, updateFields: { encryption_private_key: 'privateKey', encryption_password: 'publicKey', }, }, condition: (p) => p.encryption === 'mlkem768x25519plus', }, { name: 'encryption_client_padding', type: 'input', label: 'encryption_client_padding', placeholder: 'e.g. 100-111-1111.75-0-111.50-0-3333', group: 'encryption', condition: (p) => p.encryption === 'mlkem768x25519plus', }, { name: 'encryption_password', type: 'input', label: 'encryption_password', placeholder: (t) => t('encryption_password_placeholder'), group: 'encryption', condition: (p) => p.encryption === 'mlkem768x25519plus', }, { name: 'cert_mode', type: 'select', label: 'cert_mode', options: CERT_MODES, defaultValue: 'none', group: 'security', condition: (p) => p.security === 'tls', }, { name: 'cert_dns_provider', type: 'input', label: 'cert_dns_provider', placeholder: 'e.g. cloudflare, aliyun', group: 'security', condition: (p) => p.security === 'tls' && p.cert_mode === 'dns', }, { name: 'cert_dns_env', type: 'textarea', label: 'cert_dns_env', placeholder: 'CF_DNS_API_TOKEN=1234567890abcdefghijklmnopqrstuvwxyz\nALI_ACCESS_KEY_ID=your_access_key_id\nALI_ACCESS_KEY_SECRET=your_access_key_secret', group: 'security', condition: (p) => p.security === 'tls' && p.cert_mode === 'dns', }, ], trojan: [ { name: 'ratio', type: 'number', label: 'traffic_ratio', min: 1, step: 0.01, defaultValue: 1, group: 'basic', }, { name: 'port', type: 'number', label: 'port', min: 1, max: 65535, placeholder: '1-65535', group: 'basic', }, { name: 'transport', type: 'select', label: 'transport', options: TRANSPORTS.trojan, defaultValue: 'tcp', group: 'transport', }, { name: 'security', type: 'select', label: 'security', options: SECURITY.trojan, defaultValue: 'tls', group: 'security', }, { name: 'host', type: 'input', label: 'host', placeholder: 'e.g. www.bing.com', group: 'transport', condition: (p) => ['websocket', 'xhttp', 'httpupgrade'].includes(p.transport), }, { name: 'path', type: 'input', label: 'path', placeholder: 'e.g. /path/to/obfs', group: 'transport', condition: (p) => ['websocket', 'xhttp', 'httpupgrade'].includes(p.transport), }, { name: 'service_name', type: 'input', label: 'service_name', group: 'transport', condition: (p) => p.transport === 'grpc', }, { name: 'sni', type: 'input', label: 'security_sni', group: 'security', condition: (p) => p.security !== 'none', }, { name: 'allow_insecure', type: 'switch', label: 'security_allow_insecure', group: 'security', condition: (p) => p.security !== 'none', }, { name: 'fingerprint', type: 'select', label: 'security_fingerprint', options: FINGERPRINTS, defaultValue: 'chrome', group: 'security', condition: (p) => p.security !== 'none', }, { name: 'cert_mode', type: 'select', label: 'cert_mode', options: CERT_MODES, defaultValue: 'none', group: 'security', condition: (p) => p.security === 'tls', }, { name: 'cert_dns_provider', type: 'input', label: 'cert_dns_provider', placeholder: 'e.g. cloudflare, aliyun', group: 'security', condition: (p) => p.security === 'tls' && p.cert_mode === 'dns', }, { name: 'cert_dns_env', type: 'textarea', label: 'cert_dns_env', placeholder: 'CF_DNS_API_TOKEN=1234567890abcdefghijklmnopqrstuvwxyz\nALI_ACCESS_KEY_ID=your_access_key_id\nALI_ACCESS_KEY_SECRET=your_access_key_secret', group: 'security', condition: (p) => p.security === 'tls' && p.cert_mode === 'dns', }, ], hysteria2: [ { name: 'ratio', type: 'number', label: 'traffic_ratio', min: 1, step: 0.01, defaultValue: 1, group: 'basic', }, { name: 'port', type: 'number', label: 'port', min: 1, max: 65535, placeholder: '1-65535', group: 'basic', }, { name: 'hop_ports', type: 'input', label: 'hop_ports', placeholder: (t) => t('hop_ports_placeholder'), group: 'basic', }, { name: 'hop_interval', type: 'number', label: 'hop_interval', placeholder: 'e.g. 300', min: 1, suffix: 'S', group: 'basic', }, { name: 'obfs', type: 'select', label: 'obfs', options: ['none', 'salamander'], defaultValue: 'none', group: 'obfs', }, { name: 'obfs_password', type: 'input', label: 'obfs_password', placeholder: (t) => t('obfs_password_placeholder'), generate: { function: () => generatePassword(16), }, group: 'obfs', condition: (p) => p.obfs && p.obfs !== 'none', }, { name: 'up_mbps', type: 'number', label: 'up_mbps', min: 1, placeholder: (t) => t('bandwidth_placeholder'), suffix: 'Mbps', group: 'basic', }, { name: 'down_mbps', type: 'number', label: 'down_mbps', min: 1, placeholder: (t) => t('bandwidth_placeholder'), suffix: 'Mbps', group: 'basic', }, { name: 'sni', type: 'input', label: 'security_sni', group: 'security' }, { name: 'allow_insecure', type: 'switch', label: 'security_allow_insecure', group: 'security' }, { name: 'fingerprint', type: 'select', label: 'security_fingerprint', options: FINGERPRINTS, defaultValue: 'chrome', group: 'security', }, { name: 'cert_mode', type: 'select', label: 'cert_mode', options: CERT_MODES, defaultValue: 'none', group: 'security', }, { name: 'cert_dns_provider', type: 'input', label: 'cert_dns_provider', placeholder: 'e.g. cloudflare, aliyun', group: 'security', condition: (p) => p.cert_mode === 'dns', }, { name: 'cert_dns_env', type: 'textarea', label: 'cert_dns_env', placeholder: 'CF_DNS_API_TOKEN=1234567890abcdefghijklmnopqrstuvwxyz\nALI_ACCESS_KEY_ID=your_access_key_id\nALI_ACCESS_KEY_SECRET=your_access_key_secret', group: 'security', condition: (p) => p.cert_mode === 'dns', }, ], tuic: [ { name: 'ratio', type: 'number', label: 'traffic_ratio', min: 1, step: 0.01, defaultValue: 1, group: 'basic', }, { name: 'port', type: 'number', label: 'port', min: 1, max: 65535, placeholder: '1-65535', group: 'basic', }, { name: 'udp_relay_mode', type: 'select', label: 'udp_relay_mode', options: TUIC_UDP_RELAY_MODES, defaultValue: 'native', group: 'basic', }, { name: 'congestion_controller', type: 'select', label: 'congestion_controller', options: TUIC_CONGESTION, defaultValue: 'bbr', group: 'basic', }, { name: 'disable_sni', type: 'switch', label: 'disable_sni', group: 'basic' }, { name: 'reduce_rtt', type: 'switch', label: 'reduce_rtt', group: 'basic' }, { name: 'sni', type: 'input', label: 'security_sni', group: 'security' }, { name: 'allow_insecure', type: 'switch', label: 'security_allow_insecure', group: 'security' }, { name: 'fingerprint', type: 'select', label: 'security_fingerprint', options: FINGERPRINTS, defaultValue: 'chrome', group: 'security', }, { name: 'cert_mode', type: 'select', label: 'cert_mode', options: CERT_MODES, defaultValue: 'none', group: 'security', }, { name: 'cert_dns_provider', type: 'input', label: 'cert_dns_provider', placeholder: 'e.g. cloudflare, aliyun', group: 'security', condition: (p) => p.cert_mode === 'dns', }, { name: 'cert_dns_env', type: 'textarea', label: 'cert_dns_env', placeholder: 'CF_DNS_API_TOKEN=1234567890abcdefghijklmnopqrstuvwxyz\nALI_ACCESS_KEY_ID=your_access_key_id\nALI_ACCESS_KEY_SECRET=your_access_key_secret', group: 'security', condition: (p) => p.cert_mode === 'dns', }, ], socks: [ { name: 'ratio', type: 'number', label: 'traffic_ratio', min: 1, step: 0.01, defaultValue: 1, group: 'basic', }, { name: 'port', type: 'number', label: 'port', min: 1, max: 65535, placeholder: '1-65535', group: 'basic', }, ], naive: [ { name: 'ratio', type: 'number', label: 'traffic_ratio', min: 1, step: 0.01, defaultValue: 1, group: 'basic', }, { name: 'port', type: 'number', label: 'port', min: 1, max: 65535, placeholder: '1-65535', group: 'basic', }, { name: 'security', type: 'select', label: 'security', options: SECURITY.naive, defaultValue: 'none', group: 'security', }, { name: 'sni', type: 'input', label: 'security_sni', group: 'security', condition: (p) => p.security !== 'none', }, { name: 'allow_insecure', type: 'switch', label: 'security_allow_insecure', group: 'security', condition: (p) => p.security !== 'none', }, { name: 'fingerprint', type: 'select', label: 'security_fingerprint', options: FINGERPRINTS, defaultValue: 'chrome', group: 'security', condition: (p) => p.security !== 'none', }, { name: 'cert_mode', type: 'select', label: 'cert_mode', options: CERT_MODES, defaultValue: 'none', group: 'security', condition: (p) => p.security === 'tls', }, { name: 'cert_dns_provider', type: 'input', label: 'cert_dns_provider', placeholder: 'e.g. cloudflare, aliyun', group: 'security', condition: (p) => p.security === 'tls' && p.cert_mode === 'dns', }, { name: 'cert_dns_env', type: 'textarea', label: 'cert_dns_env', placeholder: 'CF_DNS_API_TOKEN=1234567890abcdefghijklmnopqrstuvwxyz\nALI_ACCESS_KEY_ID=your_access_key_id\nALI_ACCESS_KEY_SECRET=your_access_key_secret', group: 'security', condition: (p) => p.security === 'tls' && p.cert_mode === 'dns', }, ], http: [ { name: 'ratio', type: 'number', label: 'traffic_ratio', min: 1, step: 0.01, defaultValue: 1, group: 'basic', }, { name: 'port', type: 'number', label: 'port', min: 1, max: 65535, placeholder: '1-65535', group: 'basic', }, { name: 'security', type: 'select', label: 'security', options: SECURITY.http, defaultValue: 'none', group: 'security', }, { name: 'sni', type: 'input', label: 'security_sni', group: 'security', condition: (p) => p.security !== 'none', }, { name: 'allow_insecure', type: 'switch', label: 'security_allow_insecure', group: 'security', condition: (p) => p.security !== 'none', }, { name: 'fingerprint', type: 'select', label: 'security_fingerprint', options: FINGERPRINTS, defaultValue: 'chrome', group: 'security', condition: (p) => p.security !== 'none', }, { name: 'cert_mode', type: 'select', label: 'cert_mode', options: CERT_MODES, defaultValue: 'none', group: 'security', condition: (p) => p.security === 'tls', }, { name: 'cert_dns_provider', type: 'input', label: 'cert_dns_provider', placeholder: 'e.g. cloudflare, aliyun', group: 'security', condition: (p) => p.security === 'tls' && p.cert_mode === 'dns', }, { name: 'cert_dns_env', type: 'textarea', label: 'cert_dns_env', placeholder: 'CF_DNS_API_TOKEN=1234567890abcdefghijklmnopqrstuvwxyz\nALI_ACCESS_KEY_ID=your_access_key_id\nALI_ACCESS_KEY_SECRET=your_access_key_secret', group: 'security', condition: (p) => p.security === 'tls' && p.cert_mode === 'dns', }, ], mieru: [ { name: 'ratio', type: 'number', label: 'traffic_ratio', min: 1, step: 0.01, defaultValue: 1, group: 'basic', }, { name: 'port', type: 'number', label: 'port', min: 1, max: 65535, placeholder: '1-65535', group: 'basic', }, { name: 'multiplex', type: 'select', label: 'multiplex', options: multiplexLevels, defaultValue: 'off', group: 'basic', }, { name: 'transport', type: 'select', label: 'transport', options: TRANSPORTS.mieru, defaultValue: 'tcp', group: 'transport', }, ], anytls: [ { name: 'ratio', type: 'number', label: 'traffic_ratio', min: 1, step: 0.01, defaultValue: 1, group: 'basic', }, { name: 'port', type: 'number', label: 'port', min: 1, max: 65535, placeholder: '1-65535', group: 'basic', }, { name: 'padding_scheme', type: 'textarea', label: 'padding_scheme', placeholder: (t: (key: string) => string) => t('padding_scheme_placeholder'), group: 'basic', }, { name: 'sni', type: 'input', label: 'security_sni', group: 'security' }, { name: 'allow_insecure', type: 'switch', label: 'security_allow_insecure', group: 'security' }, { name: 'fingerprint', type: 'select', label: 'security_fingerprint', options: FINGERPRINTS, defaultValue: 'chrome', group: 'security', }, { name: 'cert_mode', type: 'select', label: 'cert_mode', options: CERT_MODES, defaultValue: 'none', group: 'security', }, { name: 'cert_dns_provider', type: 'input', label: 'cert_dns_provider', placeholder: 'e.g. cloudflare, aliyun', group: 'security', condition: (p) => p.cert_mode === 'dns', }, { name: 'cert_dns_env', type: 'textarea', label: 'cert_dns_env', placeholder: 'CF_DNS_API_TOKEN=1234567890abcdefghijklmnopqrstuvwxyz\nALI_ACCESS_KEY_ID=your_access_key_id\nALI_ACCESS_KEY_SECRET=your_access_key_secret', group: 'security', condition: (p) => p.cert_mode === 'dns', }, ], };