mirror of
https://github.com/clash-verge-rev/clash-verge-rev.git
synced 2026-04-15 06:20:31 +08:00
95 lines
2.5 KiB
TypeScript
95 lines
2.5 KiB
TypeScript
import {
|
|
decodeAndTrim,
|
|
parseBoolOrPresence,
|
|
parseInteger,
|
|
parsePortOrDefault,
|
|
parseQueryStringNormalized,
|
|
parseUrlLike,
|
|
safeDecodeURIComponent,
|
|
splitOnce,
|
|
stripUriScheme,
|
|
} from './helpers'
|
|
|
|
export function URI_AnyTLS(line: string): IProxyAnyTLSConfig {
|
|
const afterScheme = stripUriScheme(line, 'anytls', 'Invalid anytls uri')
|
|
if (!afterScheme) {
|
|
throw new Error('Invalid anytls uri')
|
|
}
|
|
const {
|
|
auth: authRaw,
|
|
host: server,
|
|
port,
|
|
query: addons,
|
|
fragment: nameRaw,
|
|
} = parseUrlLike(afterScheme, {
|
|
errorMessage: 'Invalid anytls uri',
|
|
})
|
|
if (!server) {
|
|
throw new Error('Invalid anytls uri')
|
|
}
|
|
const portNum = parsePortOrDefault(port, 443)
|
|
const auth = safeDecodeURIComponent(authRaw) ?? authRaw
|
|
const decodedName = decodeAndTrim(nameRaw)
|
|
const name = decodedName ?? `AnyTLS ${server}:${portNum}`
|
|
const proxy: IProxyAnyTLSConfig = {
|
|
type: 'anytls',
|
|
name,
|
|
server,
|
|
port: portNum,
|
|
udp: true,
|
|
}
|
|
|
|
if (auth) {
|
|
const [username, password] = splitOnce(auth, ':')
|
|
proxy.password = password ?? username
|
|
}
|
|
|
|
const params = parseQueryStringNormalized(addons)
|
|
if (params.sni) {
|
|
proxy.sni = params.sni
|
|
}
|
|
if (params.alpn) {
|
|
const alpn = params.alpn
|
|
.split(',')
|
|
.map((item) => item.trim())
|
|
.filter(Boolean)
|
|
if (alpn.length > 0) {
|
|
proxy.alpn = alpn
|
|
}
|
|
}
|
|
|
|
const fingerprint = params.fingerprint ?? params.hpkp
|
|
if (fingerprint) {
|
|
proxy.fingerprint = fingerprint
|
|
}
|
|
const clientFingerprint = params['client-fingerprint'] ?? params.fp
|
|
if (clientFingerprint) {
|
|
proxy['client-fingerprint'] = clientFingerprint as ClientFingerprint
|
|
}
|
|
|
|
if (Object.prototype.hasOwnProperty.call(params, 'skip-cert-verify')) {
|
|
proxy['skip-cert-verify'] = parseBoolOrPresence(params['skip-cert-verify'])
|
|
} else if (Object.prototype.hasOwnProperty.call(params, 'insecure')) {
|
|
proxy['skip-cert-verify'] = parseBoolOrPresence(params.insecure)
|
|
}
|
|
|
|
if (Object.prototype.hasOwnProperty.call(params, 'udp')) {
|
|
proxy.udp = parseBoolOrPresence(params.udp)
|
|
}
|
|
|
|
const idleCheck = parseInteger(params['idle-session-check-interval'])
|
|
if (idleCheck !== undefined) {
|
|
proxy['idle-session-check-interval'] = idleCheck
|
|
}
|
|
const idleTimeout = parseInteger(params['idle-session-timeout'])
|
|
if (idleTimeout !== undefined) {
|
|
proxy['idle-session-timeout'] = idleTimeout
|
|
}
|
|
const minIdle = parseInteger(params['min-idle-session'])
|
|
if (minIdle !== undefined) {
|
|
proxy['min-idle-session'] = minIdle
|
|
}
|
|
|
|
return proxy
|
|
}
|