Files
op-packages/luci-app-hijpass/ts-src/module/luci.ts
T

474 lines
11 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { CORE_TYPE } from "../enum/hijpass";
export class DnsNode {
tag: string;
type: string;
server: string;
port: string;
}
export class DnsSection {
defaultDnsNode: string;
defaultStrategy: string;
rulesetDnsNode: string;
useCache: string;
nodes: DnsNode[];
constructor() {
this.nodes = [];
}
}
export class ShuntRouteRule {
enabled: string;
name: string;
proxyNode: string;
ipVersionSplit: string;
proxyNodeV4: string;
proxyNodeV6: string;
protocol: string[];
network: string[];
port: string[];
portRange: string[];
domainList: string;
ipList: string;
dnsNode: string;
dnsProxyNode: string;
dnsStrategy: string;
constructor() {
this.port = [];
this.portRange = [];
this.network = [];
this.protocol = [];
this.ipVersionSplit = '0';
}
}
export class RouteSection {
defaultProxyNode: string;
rulesetOutNode: string;
rulesetConvert: string;
rules: ShuntRouteRule[];
constructor() {
this.rules = [];
}
}
export class ShuntSection {
type: string;
configType: string;
shuntListenPort: string;
dnsListenPort: string;
logLevel: string;
logPath: string;
route: RouteSection;
dns: DnsSection;
}
export class RuleDTO {
domain: string[];
domainRegex: string[];
domainKeyword: string[];
domainSuffix: string[];
ipCidr: string[];
network: string[];
protocol: string[];
port: number[];
portRange: string[];
ipVersion?: 4 | 6;
ruleSet: RuleSetDTO[]; // 规则集合
geoIp: string[];
geoSite: string[];
constructor() {
this.domain = [];
this.domainRegex = [];
this.domainKeyword = [];
this.domainSuffix = [];
this.ruleSet = [];
this.ipCidr = [];
this.geoIp = [];
this.geoSite = [];
this.network = [];
this.protocol = [];
this.port = [];
this.portRange = [];
}
containDomain(): boolean {
return this.domain.length > 0
|| this.domainRegex.length > 0
|| this.domainSuffix.length > 0
|| this.domainKeyword.length > 0
}
containGeo(): boolean {
return this.geoSite.length > 0 || this.geoIp.length > 0
}
containRuleSet(): boolean {
return this.ruleSet.length > 0
}
containIp(): boolean {
return this.ipCidr.length > 0
|| this.geoIp.length > 0
}
isEmpty(collectionType: "geo" | "set"): boolean {
return !(this.containDomain()
|| this.containIp()
|| (collectionType === "geo" && this.containGeo())
|| (collectionType === "set" && this.containRuleSet())
|| this.network.length > 0
|| this.port.length > 0
|| this.portRange.length > 0
|| this.protocol.length > 0)
}
}
export interface ShuntRouteRuleVariant {
rule: ShuntRouteRule;
proxyNode: string;
ipVersion?: 4 | 6;
}
export interface RuleSetDTO {
tag: string;
type: string;
format: string;
pathOrUrl: string;
}
export interface CoreAdapter {
genShuntConf: () => {}
genProxyConf: (proxyNode: ProxyNode) => {}
}
export interface LuciConvertUtils {
convert: (ProxyNode: ProxyNode) => {}
}
/**
* 代理节点基础配置
*/
export interface ProxyNode {
name: string;
cfgid?: string;
type: string;
core?: string;
enabled: string;
listen_port: string;
socks_port: string;
upstream_proxy_node?: string;
procd_env: string[];
log_level?: string;
log_path: string;
}
/**
* 负载均衡代理节点。
*
* 成员节点只通过其本地 SOCKS 端口接入,不复制成员的协议配置。
*/
export class LoadBalanceProxyNode implements ProxyNode {
name: string;
type: 'load_balance' = 'load_balance';
core: string = CORE_TYPE.SING_BOX;
enabled: string = '1';
listen_port: string;
socks_port: string;
member_node: string[];
procd_env: string[];
log_level: string;
log_path: string;
// sing-box urltest
url: string;
interval: string;
tolerance: string;
idle_timeout: string;
interrupt_exist_connections: string;
// Xray balancer
strategy: string;
strategy_expected: string;
strategy_max_rtt: string;
strategy_tolerance: string;
fallback_tag: string;
// Xray burstObservatory
probe_url: string;
probe_connectivity: string;
probe_interval: string;
probe_timeout: string;
probe_sampling: string;
probe_http_method: string;
constructor() {
this.member_node = [];
this.procd_env = [];
}
}
/**
* 自定义代理配置
*/
export class CustomProxyNode implements ProxyNode {
name: string;
type: 'custom' = 'custom';
enabled: string = '1';
command: string;
listen_port: string;
socks_port: string;
procd_env: string[];
log_enabled: string;
log_path: string;
constructor() {
this.type = 'custom';
this.enabled = '1';
this.procd_env = [];
}
}
/**
* Hysteria2 代理配置
*/
export class Hysteria2Config implements ProxyNode {
name: string;
type: 'hysteria2' = 'hysteria2';
enabled: string = '1';
/** 核心选择:'' 或 'sing-box' 使用 sing-box'xray' 使用 xray */
core: string;
server: string;
server_port: string;
// sing-box 独有
server_ports: string[];
hop_interval: string;
obfs_type: string;
obfs_password: string;
brutal_debug: string;
// xray 独有
udp_idle_timeout: string;
// 共有
up_mbps: string;
down_mbps: string;
password: string;
network: string;
tls_server_name: string;
tls_insecure: string;
listen_port: string;
socks_port: string;
procd_env: string[];
log_path: string;
constructor() {
this.type = 'hysteria2';
this.enabled = '1';
this.core = CORE_TYPE.SING_BOX;
this.server_ports = [];
this.network = '';
this.brutal_debug = '0';
this.tls_insecure = '0';
// TLS 默认启用(不可配置)
}
}
/**
* Shadowsocks 代理配置
*/
export class ShadowsocksConfig implements ProxyNode {
name: string;
type: 'shadowsocks' = 'shadowsocks';
enabled: string = '1';
/** 核心选择:'sing-box'(默认)或 'xray' */
core: string;
server: string;
server_port: string;
method: string;
password: string;
plugin: string;
plugin_opts: string;
network: string;
udp_over_tcp: string;
listen_port: string;
socks_port: string;
multiplex_enabled: string;
multiplex_protocol: string;
multiplex_max_connections: string;
multiplex_min_streams: string;
multiplex_max_streams: string;
multiplex_brutal_enabled: string;
multiplex_brutal_up_mbps: string;
multiplex_brutal_down_mbps: string;
procd_env: string[];
log_path: string;
constructor() {
this.type = 'shadowsocks';
this.enabled = '1';
this.core = CORE_TYPE.SING_BOX;
this.network = '';
this.udp_over_tcp = '0';
this.multiplex_enabled = '0';
this.multiplex_protocol = 'h2mux';
this.multiplex_brutal_enabled = '0';
}
}
/**
* TUIC 代理配置
*/
export class TuicConfig implements ProxyNode {
name: string;
type: 'tuic' = 'tuic';
enabled: string = '1';
core: string;
server: string;
server_port: string;
uuid: string;
password: string;
congestion_control: string;
udp_relay_mode: string;
udp_over_stream: string;
zero_rtt_handshake: string;
heartbeat: string;
network: string;
tls_server_name: string;
tls_insecure: string;
listen_port: string;
socks_port: string;
procd_env: string[];
log_path: string;
constructor() {
this.type = 'tuic';
this.enabled = '1';
this.core = CORE_TYPE.SING_BOX;
this.congestion_control = 'cubic';
this.udp_relay_mode = '';
this.udp_over_stream = '0';
this.zero_rtt_handshake = '0';
this.heartbeat = '10s';
this.network = '';
this.tls_insecure = '0';
}
}
/**
* ShadowTLS 代理配置
*/
export class ShadowTLSConfig implements ProxyNode {
name: string;
type: 'shadowtls' = 'shadowtls';
enabled: string = '1';
core: string;
server: string;
server_port: string;
version: string;
password: string;
tls_server_name: string;
tls_insecure: string;
listen_port: string;
socks_port: string;
procd_env: string[];
log_path: string;
constructor() {
this.type = 'shadowtls';
this.enabled = '1';
this.core = CORE_TYPE.SING_BOX;
this.version = '1';
this.tls_insecure = '0';
}
}
/**
* VLESS 代理配置
*/
export class VlessConfig implements ProxyNode {
name: string;
type: 'vless' = 'vless';
enabled: string = '1';
/** 核心选择:'sing-box' 使用 sing-box'xray'(默认)使用 xray */
core: string;
server: string;
server_port: string;
uuid: string;
flow: string;
network: string;
packet_encoding: string;
tls_server_name: string;
tls_insecure: string;
tls_reality_enabled: string;
tls_reality_public_key: string;
tls_reality_short_id: string;
listen_port: string;
socks_port: string;
multiplex_enabled: string;
multiplex_protocol: string;
multiplex_max_connections: string;
multiplex_min_streams: string;
multiplex_max_streams: string;
multiplex_brutal_enabled: string;
multiplex_brutal_up_mbps: string;
multiplex_brutal_down_mbps: string;
// V2Ray 传输层
transport_type: string;
transport_http_host: string;
transport_http_path: string;
transport_http_method: string;
transport_http_idle_timeout: string;
transport_http_ping_timeout: string;
transport_ws_host: string;
transport_ws_path: string;
transport_ws_max_early_data: string;
transport_ws_early_data_header_name: string;
transport_grpc_service_name: string;
transport_grpc_idle_timeout: string;
transport_grpc_ping_timeout: string;
transport_grpc_permit_without_stream: string;
transport_httpupgrade_host: string;
transport_httpupgrade_path: string;
// XHTTP 传输层
transport_xhttp_host: string;
transport_xhttp_path: string;
transport_xhttp_mode: string;
procd_env: string[];
log_path: string;
constructor() {
this.type = 'vless';
this.enabled = '1';
this.core = CORE_TYPE.XRAY; // VLESS 默认用 xray(支持 Vision/XHTTP+REALITY
this.network = 'tcp';
this.packet_encoding = '';
this.tls_insecure = '0';
this.tls_reality_enabled = '0';
this.multiplex_enabled = '0';
this.multiplex_protocol = 'h2mux';
this.multiplex_brutal_enabled = '0';
// 传输层默认值
this.transport_type = '';
this.transport_http_idle_timeout = '15s';
this.transport_http_ping_timeout = '15s';
this.transport_grpc_idle_timeout = '15s';
this.transport_grpc_ping_timeout = '15s';
this.transport_grpc_permit_without_stream = '0';
// XHTTP 传输层默认值
this.transport_xhttp_path = '/';
this.transport_xhttp_mode = 'auto';
}
}