Files
Archive/v2raya/gui/src/assets/js/utils.js
T
2026-04-19 21:03:22 +02:00

185 lines
4.5 KiB
JavaScript

import CONST from "./const.js";
import URI from "urijs";
function _locateServer(touch, whichServer) {
let ind = whichServer.id - 1;
let sub = whichServer.sub;
if (whichServer._type === CONST.ServerType) {
return touch.servers[ind];
} else if (whichServer._type === CONST.SubscriptionServerType) {
return touch.subscriptions[sub].servers[ind];
}
return null;
}
function locateServer(touch, whichServer) {
if (whichServer instanceof Array) {
const servers = [];
for (const w of whichServer) {
const server = _locateServer(touch, w);
if (server) {
servers.push(server);
}
}
return servers;
}
return _locateServer(touch, whichServer);
}
function handleResponse(res, that, suc, err, fail) {
if (!res.data) {
if (err && err instanceof Function) {
err.apply(that);
}
return;
}
if (res.data.code === "SUCCESS") {
suc.apply(that);
} else {
if (err && err instanceof Function) {
err.apply(that);
} else {
if (fail && fail instanceof Function) {
fail.apply(that);
} else {
that.$buefy.toast.open({
message: res.data.message,
type: "is-warning",
position: "is-top",
queue: false,
duration: 5000,
});
}
}
}
}
/*
var myURL = parseURL('http://user:pass@abc.com:8080/dir/index.html?id=255&m=hello#top');
myURL.username; // = 'user'
myURL.password; // = 'pass'
myURL.file; // = 'index.html'
myURL.hash; // = 'top'
myURL.host; // = 'abc.com'
myURL.query; // = '?id=255&m=hello'
myURL.params; // = Object = { id: 255, m: hello }
myURL.path; // = '/dir/index.html'
myURL.segments; // = Array = ['dir', 'index.html']
myURL.port; // = '8080'
myURL.protocol; // = 'http'
myURL.source; // = 'http://user:pass@abc.com:8080/dir/index.html?id=255&m=hello#top'
*/
function parseURL(u) {
let url = u;
let protocol = "";
let fakeProto = false;
if (url.indexOf("://") === -1) {
url = "http://" + url;
} else {
protocol = url.substr(0, url.indexOf("://"));
switch (protocol) {
case "http":
case "https":
case "ws":
case "wss":
break;
default:
url = "http" + url.substr(url.indexOf("://"));
fakeProto = true;
}
}
const a = document.createElement("a");
a.href = url;
const r = {
source: u,
username: a.username,
password: a.password,
protocol: fakeProto ? protocol : a.protocol.replace(":", ""),
host: a.hostname,
port: a.port
? parseInt(a.port)
: protocol === "https" || protocol === "wss"
? 443
: 80,
query: a.search,
params: (function () {
var ret = {},
seg = a.search.replace(/^\?/, "").split("&"),
len = seg.length,
i = 0,
s;
for (; i < len; i++) {
if (!seg[i]) {
continue;
}
s = seg[i].split("=");
let key = s[0];
let val = decodeURIComponent(s[1]);
if (ret[key]) {
if (Array.isArray(ret[key])) {
ret[key].push(val);
} else {
ret[key] = [ret[key], val];
}
} else {
ret[key] = val;
}
}
return ret;
})(),
file: (a.pathname.match(/\/([^/?#]+)$/i) || [null, ""])[1],
hash: a.hash.replace("#", ""),
path: a.pathname.replace(/^([^/])/, "/$1"),
relative: (a.href.match(/tps?:\/\/[^/]+(.+)/) || [null, ""])[1],
segments: a.pathname.replace(/^\//, "").split("/"),
};
a.remove();
return r;
}
function generateURL({
username,
password,
protocol,
host,
port,
params,
hash,
path,
}) {
/**
* 所有参数设置默认值
* 避免方法检测到参数为null/undefine返回该值查询结果
* 查询结果当然不是URI类型,导致链式调用失败
*/
const uri = URI()
.protocol(protocol || "http")
.username(username || "")
.password(password || "")
.host(host || "")
.port(port || 80)
.path(path || "")
.query(params || {})
.hash(hash || "");
const res = uri.toString();
return res;
}
function toInt(s) {
if (typeof s === "string") {
return parseInt(s);
} else if (typeof s === "number") {
return parseInt(s);
} else if (typeof s === "boolean") {
return s ? 1 : 0;
}
return s;
}
function sanitizeALPN(alpn) {
if (!alpn) return "h3"; // Default to "h3" if no ALPN is provided
return alpn; // Retain the original input
}
export { locateServer, handleResponse, parseURL, generateURL, toInt, sanitizeALPN };