diff --git a/package.json b/package.json index fc55aac..59e35d8 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "private": true, "author": "leizi97", "description": "A simple network initiator based on Easytier", - "version": "1.5.2", + "version": "1.5.3", "scripts": { "dev": "nuxt dev --dotenv env/.env.dev --host 0.0.0.0", "build": "nuxt generate --dotenv env/.env.prod", diff --git a/pages/index.vue b/pages/index.vue index 7c3a001..27d1c91 100644 --- a/pages/index.vue +++ b/pages/index.vue @@ -999,6 +999,7 @@ mainStore.basePeers = uniq([...mainStore.config.serverUrl, ...mainStore.basePeers]); }; + let getMemeberTimer: number | null = null; const listenObj: { [key: string]: any } = { unListenOutPut: null, unListenThreadId: null, @@ -1009,31 +1010,28 @@ server_thread_id: ref(null), async listenOutput() { // const appWindow = getCurrentWindow(); - const unListen = await listen("command-output", async event => { - data.isStart = true; - // console.error(event.payload); - if (event.payload) { - data.startLoading = false; - let ipv4 = /dhcp ip changed. old: None, new: Some\((\d+\.\d+\.\d+\.\d+).*\)/g.exec(event.payload as string)?.[1]; - let devName = /tun device ready. dev: (.*)/g.exec(event.payload as string)?.[1]; - if (mainStore.configStartEnable || mainStore.config.dhcp) { - let configIpv4 = /ipv4\s.*=\s.*[\'\"](\d+\.\d+\.\d+\.\d+).*[\'\"]/g.exec(event.payload as string)?.[1]; - if (configIpv4) { - mainStore.config.ipv4 = configIpv4; - } - } - // if (event.payload.includes("peer connection removed")) { - // data.isSuccessGetIp = false; - // } - if (event.payload.includes("new peer connection added") && !data.isSuccessGetIp) { + getMemeberTimer && clearInterval(getMemeberTimer); + getMemeberTimer = setInterval(async () => { + const [error, member] = await ATJ(invoke("get_members_by_cli")); + if (!error && member !== "_EasytierGameCliFailedToConnect_") { + const memberJson = JSON.parse(member) as Member[]; + const localData = memberJson.find(member => member?.cost == "Local"); + const ipv4 = localData?.ipv4; + if (localData && ipv4) { + mainStore.config.ipv4 = ipv4; await setTrayRunState(tray, true); data.isSuccessGetIp = true; await setTrayTooltip(tray, `IP: ${mainStore.config.ipv4}`); + return; } - if (ipv4) { - mainStore.config.ipv4 = ipv4; - await setTrayTooltip(tray, `IP: ${ipv4}`); - } + ipReset(); + } + }, 1000); + const unListen = await listen("command-output", async event => { + data.isStart = true; + if (event.payload) { + data.startLoading = false; + let devName = /tun device ready. dev: (.*)/g.exec(event.payload as string)?.[1]; if ( devName && mainStore.config.enableNetCardMetric && @@ -1060,7 +1058,10 @@ data.log = logArr.slice(start).join("\n"); data.log += (event.payload as string) + "\n"; }); - this.unListenOutPut = unListen; + this.unListenOutPut = () => { + getMemeberTimer && clearInterval(getMemeberTimer); + unListen(); + }; }, async listenThreadId() { const unListen = await listen("thread-id", event => { @@ -1402,101 +1403,6 @@ }); }; - // 过滤可用节点的函数 - const filterAvailableNodes = (nodes: NodeItem[]): NodeItem[] => { - return nodes.filter(node => { - // 基本条件:节点必须激活且被批准 - if (!node.is_active || !node.is_approved) { - return false; - } - - // 健康状态检查 - if (node.current_health_status !== "healthy") { - return false; - } - - // 使用率检查:使用率不能超过95% - if (node.usage_percentage > 95) { - return false; - } - - // 24小时健康率检查:必须大于90% - if (node.health_percentage_24h < 90) { - return false; - } - - // 响应时间检查:响应时间不能超过60秒 - if (node.last_response_time > 60000) { - return false; - } - - // 连接数检查:当前连接数不能超过最大连接数的90% - if (node.current_connections > node.max_connections * 0.9) { - return false; - } - - // 必须有有效的地址 - if (!node.address || !node.host || !node.port) { - return false; - } - - return true; - }); - }; - - // 按优先级排序节点的函数 - const sortNodesByPriority = (nodes: NodeItem[]): NodeItem[] => { - return nodes.sort((a, b) => { - // 优先级排序规则: - // 1. 响应时间越短越好 - // 2. 使用率越低越好 - // 3. 24小时健康率越高越好 - // 4. 当前连接数越少越好 - - // 响应时间权重最高 - const responseTimeDiff = a.last_response_time - b.last_response_time; - if (Math.abs(responseTimeDiff) > 1000) { - // 如果响应时间差异超过1秒 - return responseTimeDiff; - } - - // 使用率权重次之 - const usageDiff = a.usage_percentage - b.usage_percentage; - if (Math.abs(usageDiff) > 5) { - // 如果使用率差异超过5% - return usageDiff; - } - - // 24小时健康率 - const healthDiff = b.health_percentage_24h - a.health_percentage_24h; - if (Math.abs(healthDiff) > 1) { - // 如果健康率差异超过1% - return healthDiff; - } - - // 当前连接数 - return a.current_connections - b.current_connections; - }); - }; - - // 将节点添加到服务器列表的函数 - const addNodesToServerList = (nodes: NodeItem[]) => { - // 提取服务器地址 - const serverAddresses = nodes.map(node => node.address.replace(`${node.protocol}://`, "")); - - // 去重并添加到基础服务器列表 - const uniqueAddresses = uniq([...serverAddresses, ...mainStore.basePeers]); - mainStore.basePeers = uniqueAddresses; - - // 如果当前没有选择服务器,自动选择第一个最佳节点 - if (mainStore.config.serverUrl.length === 0 && serverAddresses.length > 0) { - mainStore.config.serverUrl = [serverAddresses[0]]; - console.log(`自动选择最佳服务器: ${serverAddresses[0]}`); - } - - console.log(`已添加 ${serverAddresses.length} 个可用服务器到列表`); - }; - let logsTimer: number | null = null; let serverLogsTimer: number | null = null; let cidrTimer: number | null = null; @@ -1724,12 +1630,18 @@ return args; }; - const reset = async () => { - data.isStart = false; + const ipReset = async () => { data.isSuccessGetIp = false; if (mainStore.config.dhcp) { mainStore.config.ipv4 = ""; } + await setTrayRunState(tray, false); + await setTrayTooltip(tray); + }; + + const reset = async () => { + data.isStart = false; + await ipReset(); const memberDialog = await getAllWebviewWindows(); const memberDialogs = memberDialog.filter(item => item.label === "member"); if (memberDialogs && memberDialogs.length > 0) { @@ -1741,8 +1653,7 @@ } } } - await setTrayRunState(tray, false); - await setTrayTooltip(tray); + await unListenAll(); }; diff --git a/pages/member.vue b/pages/member.vue index 5bfefad..4bbe0a2 100644 --- a/pages/member.vue +++ b/pages/member.vue @@ -119,7 +119,7 @@ prop="nat_type" > import { invoke } from "@tauri-apps/api/core"; import { reactive, onMounted, onBeforeUnmount, computed } from "vue"; - import { ATJ, parseCliInfo } from "@/utils"; + import { ATJ } from "@/utils"; import { ElConfirmDanger } from "~/utils/element"; import { getCurrentWindow } from "@tauri-apps/api/window"; - import { endsWith, isNaN } from "lodash-es"; - - type Member = { - cidr: string; - ipv4: string; - hostname: string; - cost: string; - lat_ms: string; - loss_rate: string; - rx_bytes: string; - tx_bytes: string; - tunnel_proto: string; - nat_type: string; - id: string; - version: string; - connections_addrs: string[]; - proxy?: [string, "Connected" | "Closed"]; - }; - - type ConnectionsType = { - route: { - peer_id: number; - ipv4_addr: string | null; - next_hop_peer_id: number; - cost: number; - path_latency: number; - proxy_cidrs: string[]; - hostname: string; - stun_info: { - udp_nat_type: number; - tcp_nat_type: number; - last_update_time: number; - public_ip: string[]; - min_port: number; - max_port: number; - }; - }; - peer: { - peer_id: number; - conns: { - conn_id: string; - my_peer_id: number; - peer_id: number; - features: string[]; - tunnel: { - tunnel_type: string; - local_addr: { - url: string; - }; - remote_addr: { - url: string; - }; - }; - }[]; - }; - }; + import { isNaN } from "lodash-es"; const natMaps = { unknown: "未知", @@ -229,15 +174,7 @@ symUdpfirewall: "nat4-udpfirewall" }; - type Proxy = { - src: string; - dst: string; - start_time: string; - state: "Connected" | "Closed"; - transport_type: string; - }; - - type natKyes = keyof typeof natMaps; + type NATKyes = keyof typeof natMaps; const data = reactive<{ member: Member[]; proxy: Proxy[] }>({ member: [], diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index d2c2d64..e0a0aaf 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -1178,7 +1178,7 @@ checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" [[package]] name = "easytier-game" -version = "1.5.1" +version = "1.5.3" dependencies = [ "hashbrown 0.15.5", "log", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index c98c720..ce07864 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "easytier-game" -version = "1.5.2" +version = "1.5.3" homepage = "https://github.com/EasyTier/EasyTier" repository = "https://github.com/EasyTier/EasytierGame" description = "A simple network initiator based on Easytier" diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index d1b82f9..40856d7 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -875,6 +875,7 @@ fn autostart(enabled: bool) -> std::result::Result<(), Box std::result::Result<(), Box