Files
clash-verge-rev/src/utils/uri-parser/anytls.ts
T

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;
}