mirror of
https://github.com/clash-verge-rev/clash-verge-rev.git
synced 2026-10-24 04:32:07 +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;
|
|
}
|