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 }