Update On Wed Mar 19 19:36:48 CET 2025

This commit is contained in:
github-action[bot]
2025-03-19 19:36:49 +01:00
parent 919174b555
commit 82f3853a94
212 changed files with 6881 additions and 6806 deletions
+1
View File
@@ -946,3 +946,4 @@ Update On Sat Mar 15 19:32:45 CET 2025
Update On Sun Mar 16 19:33:44 CET 2025
Update On Mon Mar 17 19:35:42 CET 2025
Update On Tue Mar 18 19:36:24 CET 2025
Update On Wed Mar 19 19:36:39 CET 2025
+1
View File
@@ -76,6 +76,7 @@ func NewUDP(addr string, tunnel C.Tunnel, additions ...inbound.Addition) (*UDPLi
rAddr, err := getOrigDst(oob[:oobn])
if err != nil {
pool.Put(buf)
continue
}
@@ -16,9 +16,9 @@
"@emotion/styled": "11.14.0",
"@juggle/resize-observer": "3.4.0",
"@material/material-color-utilities": "0.3.0",
"@mui/icons-material": "6.4.7",
"@mui/lab": "6.0.0-beta.30",
"@mui/material": "6.4.7",
"@mui/icons-material": "6.4.8",
"@mui/lab": "6.0.0-beta.31",
"@mui/material": "6.4.8",
"@nyanpasu/interface": "workspace:^",
"@nyanpasu/ui": "workspace:^",
"@tailwindcss/postcss": "4.0.14",
@@ -56,9 +56,9 @@
"@iconify/json": "2.2.318",
"@monaco-editor/react": "4.7.0",
"@tanstack/react-query": "5.68.0",
"@tanstack/react-router": "1.114.24",
"@tanstack/router-devtools": "1.114.24",
"@tanstack/router-plugin": "1.114.24",
"@tanstack/react-router": "1.114.25",
"@tanstack/router-devtools": "1.114.25",
"@tanstack/router-plugin": "1.114.25",
"@tauri-apps/plugin-clipboard-manager": "2.2.2",
"@tauri-apps/plugin-dialog": "2.2.0",
"@tauri-apps/plugin-fs": "2.2.0",
@@ -72,14 +72,14 @@
"@types/validator": "13.12.2",
"@vitejs/plugin-legacy": "6.0.2",
"@vitejs/plugin-react": "4.3.4",
"@vitejs/plugin-react-swc": "3.8.0",
"@vitejs/plugin-react-swc": "3.8.1",
"change-case": "5.4.4",
"clsx": "2.1.1",
"core-js": "3.41.0",
"filesize": "10.1.6",
"meta-json-schema": "1.19.3",
"monaco-yaml": "5.3.1",
"nanoid": "5.1.4",
"nanoid": "5.1.5",
"sass-embedded": "1.85.1",
"shiki": "2.5.0",
"unplugin-auto-import": "19.1.1",
+3 -3
View File
@@ -17,9 +17,9 @@
},
"dependencies": {
"@material/material-color-utilities": "0.3.0",
"@mui/icons-material": "6.4.7",
"@mui/lab": "6.0.0-beta.30",
"@mui/material": "6.4.7",
"@mui/icons-material": "6.4.8",
"@mui/lab": "6.0.0-beta.31",
"@mui/material": "6.4.8",
"@radix-ui/react-portal": "1.1.4",
"@radix-ui/react-scroll-area": "1.2.3",
"@tauri-apps/api": "2.3.0",
+2 -2
View File
@@ -2,7 +2,7 @@
"manifest_version": 1,
"latest": {
"mihomo": "v1.19.3",
"mihomo_alpha": "alpha-7c444a9",
"mihomo_alpha": "alpha-dcef787",
"clash_rs": "v0.7.6",
"clash_premium": "2023-09-05-gdcc8d87",
"clash_rs_alpha": "0.7.6-alpha+sha.3cc3aa2"
@@ -69,5 +69,5 @@
"linux-armv7hf": "clash-armv7-unknown-linux-gnueabihf"
}
},
"updated_at": "2025-03-17T22:20:57.095Z"
"updated_at": "2025-03-18T22:22:45.612Z"
}
+198 -197
View File
@@ -227,14 +227,14 @@ importers:
specifier: 0.3.0
version: 0.3.0
'@mui/icons-material':
specifier: 6.4.7
version: 6.4.7(@mui/material@6.4.7(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.0.11)(react@19.0.0)
specifier: 6.4.8
version: 6.4.8(@mui/material@6.4.8(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.0.11)(react@19.0.0)
'@mui/lab':
specifier: 6.0.0-beta.30
version: 6.0.0-beta.30(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@mui/material@6.4.7(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
specifier: 6.0.0-beta.31
version: 6.0.0-beta.31(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@mui/material@6.4.8(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
'@mui/material':
specifier: 6.4.7
version: 6.4.7(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
specifier: 6.4.8
version: 6.4.8(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
'@nyanpasu/interface':
specifier: workspace:^
version: link:../interface
@@ -246,7 +246,7 @@ importers:
version: 4.0.14
'@tanstack/router-zod-adapter':
specifier: 1.81.5
version: 1.81.5(@tanstack/react-router@1.114.24(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(zod@3.24.2)
version: 1.81.5(@tanstack/react-router@1.114.25(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(zod@3.24.2)
'@tauri-apps/api':
specifier: 2.3.0
version: 2.3.0
@@ -279,13 +279,13 @@ importers:
version: 0.4.0
material-react-table:
specifier: 3.2.1
version: 3.2.1(654f09cb8207d585a138693171e30e7f)
version: 3.2.1(384a497145485e68a86cdc9cfd7e9248)
monaco-editor:
specifier: 0.52.2
version: 0.52.2
mui-color-input:
specifier: 5.0.1
version: 5.0.1(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@mui/material@6.4.7(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
version: 5.0.1(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@mui/material@6.4.8(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
react:
specifier: 19.0.0
version: 19.0.0
@@ -300,7 +300,7 @@ importers:
version: 1.6.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
react-hook-form-mui:
specifier: 7.5.0
version: 7.5.0(ea3e5f5c412ba73f5e2ef92ffc8e5c95)
version: 7.5.0(d916abb5390aa3b2a5543e30cee3d1b4)
react-i18next:
specifier: 15.4.1
version: 15.4.1(i18next@24.2.3(typescript@5.8.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
@@ -342,14 +342,14 @@ importers:
specifier: 5.68.0
version: 5.68.0(react@19.0.0)
'@tanstack/react-router':
specifier: 1.114.24
version: 1.114.24(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
specifier: 1.114.25
version: 1.114.25(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
'@tanstack/router-devtools':
specifier: 1.114.24
version: 1.114.24(@tanstack/react-router@1.114.24(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@tanstack/router-core@1.114.24)(csstype@3.1.3)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(tiny-invariant@1.3.3)
specifier: 1.114.25
version: 1.114.25(@tanstack/react-router@1.114.25(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@tanstack/router-core@1.114.25)(csstype@3.1.3)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(tiny-invariant@1.3.3)
'@tanstack/router-plugin':
specifier: 1.114.24
version: 1.114.24(@tanstack/react-router@1.114.24(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))
specifier: 1.114.25
version: 1.114.25(@tanstack/react-router@1.114.25(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))
'@tauri-apps/plugin-clipboard-manager':
specifier: 2.2.2
version: 2.2.2
@@ -390,8 +390,8 @@ importers:
specifier: 4.3.4
version: 4.3.4(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))
'@vitejs/plugin-react-swc':
specifier: 3.8.0
version: 3.8.0(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))
specifier: 3.8.1
version: 3.8.1(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))
change-case:
specifier: 5.4.4
version: 5.4.4
@@ -411,8 +411,8 @@ importers:
specifier: 5.3.1
version: 5.3.1(monaco-editor@0.52.2)
nanoid:
specifier: 5.1.4
version: 5.1.4
specifier: 5.1.5
version: 5.1.5
sass-embedded:
specifier: 1.85.1
version: 1.85.1
@@ -453,14 +453,14 @@ importers:
specifier: 0.3.0
version: 0.3.0
'@mui/icons-material':
specifier: 6.4.7
version: 6.4.7(@mui/material@6.4.7(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.0.11)(react@19.0.0)
specifier: 6.4.8
version: 6.4.8(@mui/material@6.4.8(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.0.11)(react@19.0.0)
'@mui/lab':
specifier: 6.0.0-beta.30
version: 6.0.0-beta.30(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@mui/material@6.4.7(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
specifier: 6.0.0-beta.31
version: 6.0.0-beta.31(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@mui/material@6.4.8(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
'@mui/material':
specifier: 6.4.7
version: 6.4.7(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
specifier: 6.4.8
version: 6.4.8(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
'@radix-ui/react-portal':
specifier: 1.1.4
version: 1.1.4(@types/react-dom@19.0.4(@types/react@19.0.11))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
@@ -1744,8 +1744,8 @@ packages:
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
'@mui/base@5.0.0-beta.69':
resolution: {integrity: sha512-r2YyGUXpZxj8rLAlbjp1x2BnMERTZ/dMqd9cClKj2OJ7ALAuiv/9X5E9eHfRc9o/dGRuLSMq/WTjREktJVjxVA==}
'@mui/base@5.0.0-beta.70':
resolution: {integrity: sha512-Tb/BIhJzb0pa5zv/wu7OdokY9ZKEDqcu1BDFnohyvGCoHuSXbEr90rPq1qeNW3XvTBIbNWHEF7gqge+xpUo6tQ==}
engines: {node: '>=14.0.0'}
deprecated: This package has been replaced by @base-ui-components/react
peerDependencies:
@@ -1756,28 +1756,28 @@ packages:
'@types/react':
optional: true
'@mui/core-downloads-tracker@6.4.7':
resolution: {integrity: sha512-XjJrKFNt9zAKvcnoIIBquXyFyhfrHYuttqMsoDS7lM7VwufYG4fAPw4kINjBFg++fqXM2BNAuWR9J7XVIuKIKg==}
'@mui/core-downloads-tracker@6.4.8':
resolution: {integrity: sha512-vjP4+A1ybyCRhDZC7r5EPWu/gLseFZxaGyPdDl94vzVvk6Yj6gahdaqcjbhkaCrJjdZj90m3VioltWPAnWF/zw==}
'@mui/icons-material@6.4.7':
resolution: {integrity: sha512-Rk8cs9ufQoLBw582Rdqq7fnSXXZTqhYRbpe1Y5SAz9lJKZP3CIdrj0PfG8HJLGw1hrsHFN/rkkm70IDzhJsG1g==}
'@mui/icons-material@6.4.8':
resolution: {integrity: sha512-LKGWiLWRyoOw3dWxZQ+lV//mK+4DVTTAiLd2ljmJdD6XV0rDB8JFKjRD9nyn9cJAU5XgWnii7ZR3c93ttUnMKg==}
engines: {node: '>=14.0.0'}
peerDependencies:
'@mui/material': ^6.4.7
'@mui/material': ^6.4.8
'@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0
react: ^17.0.0 || ^18.0.0 || ^19.0.0
peerDependenciesMeta:
'@types/react':
optional: true
'@mui/lab@6.0.0-beta.30':
resolution: {integrity: sha512-ayDYkzTlkm5cnDGa10bvuFygX+2b9Hm1T4QZYMqV8+nSx3frKE0TLAbE7/qQ4vInOO5E4aOkHVBwZjyO+UbMTA==}
'@mui/lab@6.0.0-beta.31':
resolution: {integrity: sha512-iZjchha0XznSqp5fKtgsozz/zZEjJFG8s4EeBypdlZEIcHvRKx3hUKBuaFM6B/PiC2kJrNMQSi5W2Fjio5sLKQ==}
engines: {node: '>=14.0.0'}
peerDependencies:
'@emotion/react': ^11.5.0
'@emotion/styled': ^11.3.0
'@mui/material': ^6.4.7
'@mui/material-pigment-css': ^6.4.7
'@mui/material': ^6.4.8
'@mui/material-pigment-css': ^6.4.8
'@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0
react: ^17.0.0 || ^18.0.0 || ^19.0.0
react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0
@@ -1791,13 +1791,13 @@ packages:
'@types/react':
optional: true
'@mui/material@6.4.7':
resolution: {integrity: sha512-K65StXUeGAtFJ4ikvHKtmDCO5Ab7g0FZUu2J5VpoKD+O6Y3CjLYzRi+TMlI3kaL4CL158+FccMoOd/eaddmeRQ==}
'@mui/material@6.4.8':
resolution: {integrity: sha512-5S9UTjKZZBd9GfbcYh/nYfD9cv6OXmj5Y7NgKYfk7JcSoshp8/pW5zP4wecRiroBSZX8wcrywSgogpVNO+5W0Q==}
engines: {node: '>=14.0.0'}
peerDependencies:
'@emotion/react': ^11.5.0
'@emotion/styled': ^11.3.0
'@mui/material-pigment-css': ^6.4.7
'@mui/material-pigment-css': ^6.4.8
'@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0
react: ^17.0.0 || ^18.0.0 || ^19.0.0
react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0
@@ -1821,8 +1821,8 @@ packages:
'@types/react':
optional: true
'@mui/private-theming@6.4.6':
resolution: {integrity: sha512-T5FxdPzCELuOrhpA2g4Pi6241HAxRwZudzAuL9vBvniuB5YU82HCmrARw32AuCiyTfWzbrYGGpZ4zyeqqp9RvQ==}
'@mui/private-theming@6.4.8':
resolution: {integrity: sha512-sWwQoNSn6elsPTAtSqCf+w5aaGoh7AASURNmpy+QTTD/zwJ0Jgwt0ZaaP6mXq2IcgHxYnYloM/+vJgHPMkRKTQ==}
engines: {node: '>=14.0.0'}
peerDependencies:
'@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0
@@ -1844,8 +1844,8 @@ packages:
'@emotion/styled':
optional: true
'@mui/styled-engine@6.4.6':
resolution: {integrity: sha512-vSWYc9ZLX46be5gP+FCzWVn5rvDr4cXC5JBZwSIkYk9xbC7GeV+0kCvB8Q6XLFQJy+a62bbqtmdwS4Ghi9NBlQ==}
'@mui/styled-engine@6.4.8':
resolution: {integrity: sha512-oyjx1b1FvUCI85ZMO4trrjNxGm90eLN3Ohy0AP/SqK5gWvRQg1677UjNf7t6iETOKAleHctJjuq0B3aXO2gtmw==}
engines: {node: '>=14.0.0'}
peerDependencies:
'@emotion/react': ^11.4.1
@@ -1873,8 +1873,8 @@ packages:
'@types/react':
optional: true
'@mui/system@6.4.7':
resolution: {integrity: sha512-7wwc4++Ak6tGIooEVA9AY7FhH2p9fvBMORT4vNLMAysH3Yus/9B9RYMbrn3ANgsOyvT3Z7nE+SP8/+3FimQmcg==}
'@mui/system@6.4.8':
resolution: {integrity: sha512-gV7iBHoqlsIenU2BP0wq14BefRoZcASZ/4LeyuQglayBl+DfLX5rEd3EYR3J409V2EZpR0NOM1LATAGlNk2cyA==}
engines: {node: '>=14.0.0'}
peerDependencies:
'@emotion/react': ^11.5.0
@@ -1889,8 +1889,8 @@ packages:
'@types/react':
optional: true
'@mui/types@7.2.21':
resolution: {integrity: sha512-6HstngiUxNqLU+/DPqlUJDIPbzUBxIVHb1MmXP0eTWDIROiCR2viugXpEif0PPe2mLqqakPzzRClWAnK+8UJww==}
'@mui/types@7.2.24':
resolution: {integrity: sha512-3c8tRt/CbWZ+pEg7QpSwbdxOk36EfmhbKf6AGZsD1EcLDLTSZoxxJ86FVtcjxvjuhdyBiWKSTGZFaXCnidO2kw==}
peerDependencies:
'@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0
peerDependenciesMeta:
@@ -1907,8 +1907,8 @@ packages:
'@types/react':
optional: true
'@mui/utils@6.4.6':
resolution: {integrity: sha512-43nZeE1pJF2anGafNydUcYFPtHwAqiBiauRtaMvurdrZI3YrUjHkAu43RBsxef7OFtJMXGiHFvq43kb7lig0sA==}
'@mui/utils@6.4.8':
resolution: {integrity: sha512-C86gfiZ5BfZ51KqzqoHi1WuuM2QdSKoFhbkZeAfQRB+jCc4YNhhj11UXFVMMsqBgZ+Zy8IHNJW3M9Wj/LOwRXQ==}
engines: {node: '>=14.0.0'}
peerDependencies:
'@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0
@@ -2575,68 +2575,68 @@ packages:
peerDependencies:
'@svgr/core': '*'
'@swc/core-darwin-arm64@1.10.15':
resolution: {integrity: sha512-zFdZ6/yHqMCPk7OhLFqHy/MQ1EqJhcZMpNHd1gXYT7VRU3FaqvvKETrUlG3VYl65McPC7AhMRfXPyJ0JO/jARQ==}
'@swc/core-darwin-arm64@1.11.11':
resolution: {integrity: sha512-vJcjGVDB8cZH7zyOkC0AfpFYI/7GHKG0NSsH3tpuKrmoAXJyCYspKPGid7FT53EAlWreN7+Pew+bukYf5j+Fmg==}
engines: {node: '>=10'}
cpu: [arm64]
os: [darwin]
'@swc/core-darwin-x64@1.10.15':
resolution: {integrity: sha512-8g4yiQwbr8fxOOjKXdot0dEkE5zgE8uNZudLy/ZyAhiwiZ8pbJ8/wVrDOu6dqbX7FBXAoDnvZ7fwN1jk4C8jdA==}
'@swc/core-darwin-x64@1.11.11':
resolution: {integrity: sha512-/N4dGdqEYvD48mCF3QBSycAbbQd3yoZ2YHSzYesQf8usNc2YpIhYqEH3sql02UsxTjEFOJSf1bxZABDdhbSl6A==}
engines: {node: '>=10'}
cpu: [x64]
os: [darwin]
'@swc/core-linux-arm-gnueabihf@1.10.15':
resolution: {integrity: sha512-rl+eVOltl2+7WXOnvmWBpMgh6aO13G5x0U0g8hjwlmD6ku3Y9iRcThpOhm7IytMEarUp5pQxItNoPq+VUGjVHg==}
'@swc/core-linux-arm-gnueabihf@1.11.11':
resolution: {integrity: sha512-hsBhKK+wVXdN3x9MrL5GW0yT8o9GxteE5zHAI2HJjRQel3HtW7m5Nvwaq+q8rwMf4YQRd8ydbvwl4iUOZx7i2Q==}
engines: {node: '>=10'}
cpu: [arm]
os: [linux]
'@swc/core-linux-arm64-gnu@1.10.15':
resolution: {integrity: sha512-qxWEQeyAJMWJqjaN4hi58WMpPdt3Tn0biSK9CYRegQtvZWCbewr6v2agtSu5AZ2rudeH6OfCWAMDQQeSgn6PJQ==}
'@swc/core-linux-arm64-gnu@1.11.11':
resolution: {integrity: sha512-YOCdxsqbnn/HMPCNM6nrXUpSndLXMUssGTtzT7ffXqr7WuzRg2e170FVDVQFIkb08E7Ku5uOnnUVAChAJQbMOQ==}
engines: {node: '>=10'}
cpu: [arm64]
os: [linux]
'@swc/core-linux-arm64-musl@1.10.15':
resolution: {integrity: sha512-QcELd9/+HjZx0WCxRrKcyKGWTiQ0485kFb5w8waxcSNd0d9Lgk4EFfWWVyvIb5gIHpDQmhrgzI/yRaWQX4YSZQ==}
'@swc/core-linux-arm64-musl@1.11.11':
resolution: {integrity: sha512-nR2tfdQRRzwqR2XYw9NnBk9Fdvff/b8IiJzDL28gRR2QiJWLaE8LsRovtWrzCOYq6o5Uu9cJ3WbabWthLo4jLw==}
engines: {node: '>=10'}
cpu: [arm64]
os: [linux]
'@swc/core-linux-x64-gnu@1.10.15':
resolution: {integrity: sha512-S1+ZEEn3+a/MiMeQqQypbwTGoBG8/sPoCvpNbk+uValyygT+jSn3U0xVr45FbukpmMB+NhBMqfedMLqKA0QnJA==}
'@swc/core-linux-x64-gnu@1.11.11':
resolution: {integrity: sha512-b4gBp5HA9xNWNC5gsYbdzGBJWx4vKSGybGMGOVWWuF+ynx10+0sA/o4XJGuNHm8TEDuNh9YLKf6QkIO8+GPJ1g==}
engines: {node: '>=10'}
cpu: [x64]
os: [linux]
'@swc/core-linux-x64-musl@1.10.15':
resolution: {integrity: sha512-qW+H9g/2zTJ4jP7NDw4VAALY0ZlNEKzYsEoSj/HKi7k3tYEHjMzsxjfsY9I8WZCft23bBdV3RTCPoxCshaj1CQ==}
'@swc/core-linux-x64-musl@1.11.11':
resolution: {integrity: sha512-dEvqmQVswjNvMBwXNb8q5uSvhWrJLdttBSef3s6UC5oDSwOr00t3RQPzyS3n5qmGJ8UMTdPRmsopxmqaODISdg==}
engines: {node: '>=10'}
cpu: [x64]
os: [linux]
'@swc/core-win32-arm64-msvc@1.10.15':
resolution: {integrity: sha512-AhRB11aA6LxjIqut+mg7qsu/7soQDmbK6MKR9nP3hgBszpqtXbRba58lr24xIbBCMr+dpo6kgEapWt+t5Po6Zg==}
'@swc/core-win32-arm64-msvc@1.11.11':
resolution: {integrity: sha512-aZNZznem9WRnw2FbTqVpnclvl8Q2apOBW2B316gZK+qxbe+ktjOUnYaMhdCG3+BYggyIBDOnaJeQrXbKIMmNdw==}
engines: {node: '>=10'}
cpu: [arm64]
os: [win32]
'@swc/core-win32-ia32-msvc@1.10.15':
resolution: {integrity: sha512-UGdh430TQwbDn6KjgvRTg1fO022sbQ4yCCHUev0+5B8uoBwi9a89qAz3emy2m56C8TXxUoihW9Y9OMfaRwPXUw==}
'@swc/core-win32-ia32-msvc@1.11.11':
resolution: {integrity: sha512-DjeJn/IfjgOddmJ8IBbWuDK53Fqw7UvOz7kyI/728CSdDYC3LXigzj3ZYs4VvyeOt+ZcQZUB2HA27edOifomGw==}
engines: {node: '>=10'}
cpu: [ia32]
os: [win32]
'@swc/core-win32-x64-msvc@1.10.15':
resolution: {integrity: sha512-XJzBCqO1m929qbJsOG7FZXQWX26TnEoMctS3QjuCoyBmkHxxQmZsy78KjMes1aomTcKHCyFYgrRGWgVmk7tT4Q==}
'@swc/core-win32-x64-msvc@1.11.11':
resolution: {integrity: sha512-Gp/SLoeMtsU4n0uRoKDOlGrRC6wCfifq7bqLwSlAG8u8MyJYJCcwjg7ggm0rhLdC2vbiZ+lLVl3kkETp+JUvKg==}
engines: {node: '>=10'}
cpu: [x64]
os: [win32]
'@swc/core@1.10.15':
resolution: {integrity: sha512-/iFeQuNaGdK7mfJbQcObhAhsMqLT7qgMYl7jX2GEIO+VDTejESpzAyKwaMeYXExN8D6e5BRHBCe7M5YlsuzjDA==}
'@swc/core@1.11.11':
resolution: {integrity: sha512-pCVY2Wn6dV/labNvssk9b3Owi4WOYsapcbWm90XkIj4xH/56Z6gzja9fsU+4MdPuEfC2Smw835nZHcdCFGyX6A==}
engines: {node: '>=10'}
peerDependencies:
'@swc/helpers': '*'
@@ -2647,8 +2647,8 @@ packages:
'@swc/counter@0.1.3':
resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==}
'@swc/types@0.1.17':
resolution: {integrity: sha512-V5gRru+aD8YVyCOMAjMpWR1Ui577DD5KSJsHP8RAxopAH22jFz6GZd/qxqjO6MJHQhcsjvjOFXyDhyLQUnMveQ==}
'@swc/types@0.1.19':
resolution: {integrity: sha512-WkAZaAfj44kh/UFdAQcrMP1I0nwRqpt27u+08LMBYMqmQfwwMofYoMh/48NGkMMRfC4ynpfwRbJuu8ErfNloeA==}
'@szmarczak/http-timer@4.0.6':
resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==}
@@ -2746,16 +2746,16 @@ packages:
peerDependencies:
react: ^18 || ^19
'@tanstack/react-router-devtools@1.114.24':
resolution: {integrity: sha512-sxfrcT/1QWwp/FP7U8y8AMIeRkw8uTvWguRpTfpow2zML6/U1PSKz7ShpXD7NZ2MakrD14nidq1rruC1D39kTA==}
'@tanstack/react-router-devtools@1.114.25':
resolution: {integrity: sha512-55W9Wde0D7ZW1FNa9aepk2xo0wPugWquF3fC6pVMALq4gVNP9QufNBc+TMX6TiErffGtGrJzPkkYJOkF6ZUGVg==}
engines: {node: '>=12'}
peerDependencies:
'@tanstack/react-router': ^1.114.24
'@tanstack/react-router': ^1.114.25
react: '>=18.0.0 || >=19.0.0'
react-dom: '>=18.0.0 || >=19.0.0'
'@tanstack/react-router@1.114.24':
resolution: {integrity: sha512-xHrgcYi/GvwBh/lTpVpZtDFGA8f8oBSSsFagAGgSGkvz+EPTIhAML0hvwKCV1jP2HaIdU/7aJk14y4q8TT2M4Q==}
'@tanstack/react-router@1.114.25':
resolution: {integrity: sha512-4vls9pz+AOLIeTLZWUKK5ZqENc1azuSQ/UATNzZChckZqkMqtEoUci0dgp1XVAX+ocPH9bU1WP+/eonuyaLvdA==}
engines: {node: '>=12'}
peerDependencies:
react: '>=18.0.0 || >=19.0.0'
@@ -2780,15 +2780,15 @@ packages:
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
'@tanstack/router-core@1.114.24':
resolution: {integrity: sha512-OmYX/oPby8CMfpm3a4xCBB9mfo6mqe2OAByz62XFD8ZcXvcDEcpHB5t2/ZrX2CCNH4gXQHUyZzl9+PxqqIpNPw==}
'@tanstack/router-core@1.114.25':
resolution: {integrity: sha512-OyLCfs7r+0LEhmQGAdyJxfO+pqGBITlr4aUN0rdhXqDTpqBn0tyrO6Tu+U9B3LQF9Xnux3KqbjzRopTY9QZBog==}
engines: {node: '>=12'}
'@tanstack/router-devtools-core@1.114.24':
resolution: {integrity: sha512-xGy0SmvWqS1r/sDCdqfdRRNlhUmNSRABcX95xoAXaBsRFmd7Gn6i/TfW9waZyCFTkfLq6Hs8ixFBXo+BGOG0mg==}
'@tanstack/router-devtools-core@1.114.25':
resolution: {integrity: sha512-3KFAAytAV6nWcXLTe3nWNaiRPV8AyM3jx5aa2UpB+RLDgDbO+GkVMnv3C7fnGCM6j2nw2/1boAvTvHcoKKO5UA==}
engines: {node: '>=12'}
peerDependencies:
'@tanstack/router-core': ^1.114.24
'@tanstack/router-core': ^1.114.25
csstype: ^3.0.10
solid-js: '>=1.9.5'
tiny-invariant: ^1.3.3
@@ -2796,11 +2796,11 @@ packages:
csstype:
optional: true
'@tanstack/router-devtools@1.114.24':
resolution: {integrity: sha512-+WOTp05bp33bQmqCz2hifCT3dqwUp+KabcYArSuGhNp7AoU784EvKetYAky0zb/ezrwcD3PoujI3bDCKh+cAwg==}
'@tanstack/router-devtools@1.114.25':
resolution: {integrity: sha512-qtR2uggdel8+uJDUsJaH6tmcCh834OwvUDiKA4tFk+Ruo9dmwr0h3DNHrukSAxqPeCK52c9JToBvISWKqpsQHA==}
engines: {node: '>=12'}
peerDependencies:
'@tanstack/react-router': ^1.114.24
'@tanstack/react-router': ^1.114.25
csstype: ^3.0.10
react: '>=18.0.0 || >=19.0.0'
react-dom: '>=18.0.0 || >=19.0.0'
@@ -2808,21 +2808,21 @@ packages:
csstype:
optional: true
'@tanstack/router-generator@1.114.24':
resolution: {integrity: sha512-rKVyT9ArplwzLIGdENUxAFJdWsCrCLh9+Kts59EPv5fNvJLZX14NNcnh1hn8gq3dfRu3HmBU68NRG0d4dcw3kA==}
'@tanstack/router-generator@1.114.25':
resolution: {integrity: sha512-KfPdXm9+zGPrEjcdDkkSbZpDvx8rOSD9sS0cQn6y82jqoSeHlzC0K3bSVElsAmS1uh7WXR+PNDJra+nHUdPhaQ==}
engines: {node: '>=12'}
peerDependencies:
'@tanstack/react-router': ^1.114.24
'@tanstack/react-router': ^1.114.25
peerDependenciesMeta:
'@tanstack/react-router':
optional: true
'@tanstack/router-plugin@1.114.24':
resolution: {integrity: sha512-3RYR2gct2iR5nO0Vc+ShhS9VlUHrV2im+RuPKXGB04PdWWrRoM2EDkhjepg0CzmD5zgT2Tafp5Nysu9XyR0CGA==}
'@tanstack/router-plugin@1.114.25':
resolution: {integrity: sha512-4SIvBzgX6TzwgW5OO6Knx4/vX8AocXnfQhXW7dzsNBgzt5WnI4dzoPvp6p9p+Hqo0AjJ2WndpEYq7fMl5BhA4Q==}
engines: {node: '>=12'}
peerDependencies:
'@rsbuild/core': '>=1.0.2'
'@tanstack/react-router': ^1.114.24
'@tanstack/react-router': ^1.114.25
vite: '>=5.0.0 || >=6.0.0'
vite-plugin-solid: ^2.11.2
webpack: '>=5.92.0'
@@ -3287,8 +3287,8 @@ packages:
terser: ^5.16.0
vite: ^6.0.0
'@vitejs/plugin-react-swc@3.8.0':
resolution: {integrity: sha512-T4sHPvS+DIqDP51ifPqa9XIRAz/kIvIi8oXcnOZZgHmMotgmmdxe/DD5tMFlt5nuIRzT0/QuiwmKlH0503Aapw==}
'@vitejs/plugin-react-swc@3.8.1':
resolution: {integrity: sha512-aEUPCckHDcFyxpwFm0AIkbtv6PpUp3xTb9wYGFjtABynXjCYKkWoxX0AOK9NT9XCrdk6mBBUOeHQS+RKdcNO1A==}
peerDependencies:
vite: ^4 || ^5 || ^6
@@ -6092,8 +6092,8 @@ packages:
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
nanoid@5.1.4:
resolution: {integrity: sha512-GTFcMIDgR7tqji/LpSY8rtg464VnJl/j6ypoehYnuGb+Y8qZUdtKB8WVCXon0UEZgFDbuUxpIl//6FHLHgXSNA==}
nanoid@5.1.5:
resolution: {integrity: sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==}
engines: {node: ^18 || >=20}
hasBin: true
@@ -9562,12 +9562,12 @@ snapshots:
react: 19.0.0
react-dom: 19.0.0(react@19.0.0)
'@mui/base@5.0.0-beta.69(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
'@mui/base@5.0.0-beta.70(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
dependencies:
'@babel/runtime': 7.26.0
'@babel/runtime': 7.26.10
'@floating-ui/react-dom': 2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
'@mui/types': 7.2.21(@types/react@19.0.11)
'@mui/utils': 6.4.6(@types/react@19.0.11)(react@19.0.0)
'@mui/types': 7.2.24(@types/react@19.0.11)
'@mui/utils': 6.4.8(@types/react@19.0.11)(react@19.0.0)
'@popperjs/core': 2.11.8
clsx: 2.1.1
prop-types: 15.8.1
@@ -9576,24 +9576,24 @@ snapshots:
optionalDependencies:
'@types/react': 19.0.11
'@mui/core-downloads-tracker@6.4.7': {}
'@mui/core-downloads-tracker@6.4.8': {}
'@mui/icons-material@6.4.7(@mui/material@6.4.7(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.0.11)(react@19.0.0)':
'@mui/icons-material@6.4.8(@mui/material@6.4.8(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.0.11)(react@19.0.0)':
dependencies:
'@babel/runtime': 7.26.0
'@mui/material': 6.4.7(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
'@babel/runtime': 7.26.10
'@mui/material': 6.4.8(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
react: 19.0.0
optionalDependencies:
'@types/react': 19.0.11
'@mui/lab@6.0.0-beta.30(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@mui/material@6.4.7(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
'@mui/lab@6.0.0-beta.31(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@mui/material@6.4.8(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
dependencies:
'@babel/runtime': 7.26.0
'@mui/base': 5.0.0-beta.69(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
'@mui/material': 6.4.7(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
'@mui/system': 6.4.7(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0)
'@mui/types': 7.2.21(@types/react@19.0.11)
'@mui/utils': 6.4.6(@types/react@19.0.11)(react@19.0.0)
'@babel/runtime': 7.26.10
'@mui/base': 5.0.0-beta.70(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
'@mui/material': 6.4.8(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
'@mui/system': 6.4.8(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0)
'@mui/types': 7.2.24(@types/react@19.0.11)
'@mui/utils': 6.4.8(@types/react@19.0.11)(react@19.0.0)
clsx: 2.1.1
prop-types: 15.8.1
react: 19.0.0
@@ -9603,13 +9603,13 @@ snapshots:
'@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0)
'@types/react': 19.0.11
'@mui/material@6.4.7(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
'@mui/material@6.4.8(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
dependencies:
'@babel/runtime': 7.26.0
'@mui/core-downloads-tracker': 6.4.7
'@mui/system': 6.4.7(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0)
'@mui/types': 7.2.21(@types/react@19.0.11)
'@mui/utils': 6.4.6(@types/react@19.0.11)(react@19.0.0)
'@babel/runtime': 7.26.10
'@mui/core-downloads-tracker': 6.4.8
'@mui/system': 6.4.8(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0)
'@mui/types': 7.2.24(@types/react@19.0.11)
'@mui/utils': 6.4.8(@types/react@19.0.11)(react@19.0.0)
'@popperjs/core': 2.11.8
'@types/react-transition-group': 4.4.12(@types/react@19.0.11)
clsx: 2.1.1
@@ -9633,10 +9633,10 @@ snapshots:
optionalDependencies:
'@types/react': 19.0.11
'@mui/private-theming@6.4.6(@types/react@19.0.11)(react@19.0.0)':
'@mui/private-theming@6.4.8(@types/react@19.0.11)(react@19.0.0)':
dependencies:
'@babel/runtime': 7.26.0
'@mui/utils': 6.4.6(@types/react@19.0.11)(react@19.0.0)
'@babel/runtime': 7.26.10
'@mui/utils': 6.4.8(@types/react@19.0.11)(react@19.0.0)
prop-types: 15.8.1
react: 19.0.0
optionalDependencies:
@@ -9653,9 +9653,9 @@ snapshots:
'@emotion/react': 11.14.0(@types/react@19.0.11)(react@19.0.0)
'@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0)
'@mui/styled-engine@6.4.6(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(react@19.0.0)':
'@mui/styled-engine@6.4.8(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(react@19.0.0)':
dependencies:
'@babel/runtime': 7.26.0
'@babel/runtime': 7.26.10
'@emotion/cache': 11.14.0
'@emotion/serialize': 1.3.3
'@emotion/sheet': 1.4.0
@@ -9671,7 +9671,7 @@ snapshots:
'@babel/runtime': 7.26.10
'@mui/private-theming': 5.16.6(@types/react@19.0.11)(react@19.0.0)
'@mui/styled-engine': 5.16.6(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(react@19.0.0)
'@mui/types': 7.2.21(@types/react@19.0.11)
'@mui/types': 7.2.24(@types/react@19.0.11)
'@mui/utils': 5.16.6(@types/react@19.0.11)(react@19.0.0)
clsx: 2.1.1
csstype: 3.1.3
@@ -9682,13 +9682,13 @@ snapshots:
'@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0)
'@types/react': 19.0.11
'@mui/system@6.4.7(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0)':
'@mui/system@6.4.8(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0)':
dependencies:
'@babel/runtime': 7.26.0
'@mui/private-theming': 6.4.6(@types/react@19.0.11)(react@19.0.0)
'@mui/styled-engine': 6.4.6(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(react@19.0.0)
'@mui/types': 7.2.21(@types/react@19.0.11)
'@mui/utils': 6.4.6(@types/react@19.0.11)(react@19.0.0)
'@babel/runtime': 7.26.10
'@mui/private-theming': 6.4.8(@types/react@19.0.11)(react@19.0.0)
'@mui/styled-engine': 6.4.8(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(react@19.0.0)
'@mui/types': 7.2.24(@types/react@19.0.11)
'@mui/utils': 6.4.8(@types/react@19.0.11)(react@19.0.0)
clsx: 2.1.1
csstype: 3.1.3
prop-types: 15.8.1
@@ -9698,14 +9698,14 @@ snapshots:
'@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0)
'@types/react': 19.0.11
'@mui/types@7.2.21(@types/react@19.0.11)':
'@mui/types@7.2.24(@types/react@19.0.11)':
optionalDependencies:
'@types/react': 19.0.11
'@mui/utils@5.16.6(@types/react@19.0.11)(react@19.0.0)':
dependencies:
'@babel/runtime': 7.26.10
'@mui/types': 7.2.21(@types/react@19.0.11)
'@mui/types': 7.2.24(@types/react@19.0.11)
'@types/prop-types': 15.7.14
clsx: 2.1.1
prop-types: 15.8.1
@@ -9714,10 +9714,10 @@ snapshots:
optionalDependencies:
'@types/react': 19.0.11
'@mui/utils@6.4.6(@types/react@19.0.11)(react@19.0.0)':
'@mui/utils@6.4.8(@types/react@19.0.11)(react@19.0.0)':
dependencies:
'@babel/runtime': 7.26.0
'@mui/types': 7.2.21(@types/react@19.0.11)
'@babel/runtime': 7.26.10
'@mui/types': 7.2.24(@types/react@19.0.11)
'@types/prop-types': 15.7.14
clsx: 2.1.1
prop-types: 15.8.1
@@ -9726,11 +9726,11 @@ snapshots:
optionalDependencies:
'@types/react': 19.0.11
'@mui/x-date-pickers@7.9.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@mui/material@6.4.7(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.0.11)(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
'@mui/x-date-pickers@7.9.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@mui/material@6.4.8(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.0.11)(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
dependencies:
'@babel/runtime': 7.26.10
'@mui/base': 5.0.0-beta.69(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
'@mui/material': 6.4.7(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
'@mui/base': 5.0.0-beta.70(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
'@mui/material': 6.4.8(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
'@mui/system': 5.16.7(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0)
'@mui/utils': 5.16.6(@types/react@19.0.11)(react@19.0.0)
'@types/react-transition-group': 4.4.12(@types/react@19.0.11)
@@ -10361,55 +10361,55 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@swc/core-darwin-arm64@1.10.15':
'@swc/core-darwin-arm64@1.11.11':
optional: true
'@swc/core-darwin-x64@1.10.15':
'@swc/core-darwin-x64@1.11.11':
optional: true
'@swc/core-linux-arm-gnueabihf@1.10.15':
'@swc/core-linux-arm-gnueabihf@1.11.11':
optional: true
'@swc/core-linux-arm64-gnu@1.10.15':
'@swc/core-linux-arm64-gnu@1.11.11':
optional: true
'@swc/core-linux-arm64-musl@1.10.15':
'@swc/core-linux-arm64-musl@1.11.11':
optional: true
'@swc/core-linux-x64-gnu@1.10.15':
'@swc/core-linux-x64-gnu@1.11.11':
optional: true
'@swc/core-linux-x64-musl@1.10.15':
'@swc/core-linux-x64-musl@1.11.11':
optional: true
'@swc/core-win32-arm64-msvc@1.10.15':
'@swc/core-win32-arm64-msvc@1.11.11':
optional: true
'@swc/core-win32-ia32-msvc@1.10.15':
'@swc/core-win32-ia32-msvc@1.11.11':
optional: true
'@swc/core-win32-x64-msvc@1.10.15':
'@swc/core-win32-x64-msvc@1.11.11':
optional: true
'@swc/core@1.10.15':
'@swc/core@1.11.11':
dependencies:
'@swc/counter': 0.1.3
'@swc/types': 0.1.17
'@swc/types': 0.1.19
optionalDependencies:
'@swc/core-darwin-arm64': 1.10.15
'@swc/core-darwin-x64': 1.10.15
'@swc/core-linux-arm-gnueabihf': 1.10.15
'@swc/core-linux-arm64-gnu': 1.10.15
'@swc/core-linux-arm64-musl': 1.10.15
'@swc/core-linux-x64-gnu': 1.10.15
'@swc/core-linux-x64-musl': 1.10.15
'@swc/core-win32-arm64-msvc': 1.10.15
'@swc/core-win32-ia32-msvc': 1.10.15
'@swc/core-win32-x64-msvc': 1.10.15
'@swc/core-darwin-arm64': 1.11.11
'@swc/core-darwin-x64': 1.11.11
'@swc/core-linux-arm-gnueabihf': 1.11.11
'@swc/core-linux-arm64-gnu': 1.11.11
'@swc/core-linux-arm64-musl': 1.11.11
'@swc/core-linux-x64-gnu': 1.11.11
'@swc/core-linux-x64-musl': 1.11.11
'@swc/core-win32-arm64-msvc': 1.11.11
'@swc/core-win32-ia32-msvc': 1.11.11
'@swc/core-win32-x64-msvc': 1.11.11
'@swc/counter@0.1.3': {}
'@swc/types@0.1.17':
'@swc/types@0.1.19':
dependencies:
'@swc/counter': 0.1.3
@@ -10492,10 +10492,10 @@ snapshots:
'@tanstack/query-core': 5.68.0
react: 19.0.0
'@tanstack/react-router-devtools@1.114.24(@tanstack/react-router@1.114.24(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@tanstack/router-core@1.114.24)(csstype@3.1.3)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(tiny-invariant@1.3.3)':
'@tanstack/react-router-devtools@1.114.25(@tanstack/react-router@1.114.25(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@tanstack/router-core@1.114.25)(csstype@3.1.3)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(tiny-invariant@1.3.3)':
dependencies:
'@tanstack/react-router': 1.114.24(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
'@tanstack/router-devtools-core': 1.114.24(@tanstack/router-core@1.114.24)(csstype@3.1.3)(solid-js@1.9.5)(tiny-invariant@1.3.3)
'@tanstack/react-router': 1.114.25(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
'@tanstack/router-devtools-core': 1.114.25(@tanstack/router-core@1.114.25)(csstype@3.1.3)(solid-js@1.9.5)(tiny-invariant@1.3.3)
react: 19.0.0
react-dom: 19.0.0(react@19.0.0)
solid-js: 1.9.5
@@ -10504,11 +10504,11 @@ snapshots:
- csstype
- tiny-invariant
'@tanstack/react-router@1.114.24(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
'@tanstack/react-router@1.114.25(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
dependencies:
'@tanstack/history': 1.114.22
'@tanstack/react-store': 0.7.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
'@tanstack/router-core': 1.114.24
'@tanstack/router-core': 1.114.25
jsesc: 3.1.0
react: 19.0.0
react-dom: 19.0.0(react@19.0.0)
@@ -10534,14 +10534,15 @@ snapshots:
react: 19.0.0
react-dom: 19.0.0(react@19.0.0)
'@tanstack/router-core@1.114.24':
'@tanstack/router-core@1.114.25':
dependencies:
'@tanstack/history': 1.114.22
'@tanstack/store': 0.7.0
tiny-invariant: 1.3.3
'@tanstack/router-devtools-core@1.114.24(@tanstack/router-core@1.114.24)(csstype@3.1.3)(solid-js@1.9.5)(tiny-invariant@1.3.3)':
'@tanstack/router-devtools-core@1.114.25(@tanstack/router-core@1.114.25)(csstype@3.1.3)(solid-js@1.9.5)(tiny-invariant@1.3.3)':
dependencies:
'@tanstack/router-core': 1.114.24
'@tanstack/router-core': 1.114.25
clsx: 2.1.1
goober: 2.1.16(csstype@3.1.3)
solid-js: 1.9.5
@@ -10549,10 +10550,10 @@ snapshots:
optionalDependencies:
csstype: 3.1.3
'@tanstack/router-devtools@1.114.24(@tanstack/react-router@1.114.24(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@tanstack/router-core@1.114.24)(csstype@3.1.3)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(tiny-invariant@1.3.3)':
'@tanstack/router-devtools@1.114.25(@tanstack/react-router@1.114.25(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@tanstack/router-core@1.114.25)(csstype@3.1.3)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(tiny-invariant@1.3.3)':
dependencies:
'@tanstack/react-router': 1.114.24(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
'@tanstack/react-router-devtools': 1.114.24(@tanstack/react-router@1.114.24(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@tanstack/router-core@1.114.24)(csstype@3.1.3)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(tiny-invariant@1.3.3)
'@tanstack/react-router': 1.114.25(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
'@tanstack/react-router-devtools': 1.114.25(@tanstack/react-router@1.114.25(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@tanstack/router-core@1.114.25)(csstype@3.1.3)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(tiny-invariant@1.3.3)
clsx: 2.1.1
goober: 2.1.16(csstype@3.1.3)
react: 19.0.0
@@ -10563,16 +10564,16 @@ snapshots:
- '@tanstack/router-core'
- tiny-invariant
'@tanstack/router-generator@1.114.24(@tanstack/react-router@1.114.24(react-dom@19.0.0(react@19.0.0))(react@19.0.0))':
'@tanstack/router-generator@1.114.25(@tanstack/react-router@1.114.25(react-dom@19.0.0(react@19.0.0))(react@19.0.0))':
dependencies:
'@tanstack/virtual-file-routes': 1.114.12
prettier: 3.5.3
tsx: 4.19.3
zod: 3.24.2
optionalDependencies:
'@tanstack/react-router': 1.114.24(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
'@tanstack/react-router': 1.114.25(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
'@tanstack/router-plugin@1.114.24(@tanstack/react-router@1.114.24(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))':
'@tanstack/router-plugin@1.114.25(@tanstack/react-router@1.114.25(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))':
dependencies:
'@babel/core': 7.26.9
'@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.9)
@@ -10580,8 +10581,8 @@ snapshots:
'@babel/template': 7.26.9
'@babel/traverse': 7.26.9
'@babel/types': 7.26.9
'@tanstack/router-core': 1.114.24
'@tanstack/router-generator': 1.114.24(@tanstack/react-router@1.114.24(react-dom@19.0.0(react@19.0.0))(react@19.0.0))
'@tanstack/router-core': 1.114.25
'@tanstack/router-generator': 1.114.25(@tanstack/react-router@1.114.25(react-dom@19.0.0(react@19.0.0))(react@19.0.0))
'@tanstack/router-utils': 1.114.12
'@tanstack/virtual-file-routes': 1.114.12
'@types/babel__core': 7.20.5
@@ -10592,7 +10593,7 @@ snapshots:
unplugin: 2.2.0
zod: 3.24.2
optionalDependencies:
'@tanstack/react-router': 1.114.24(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
'@tanstack/react-router': 1.114.25(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
vite: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)
transitivePeerDependencies:
- supports-color
@@ -10604,9 +10605,9 @@ snapshots:
ansis: 3.12.0
diff: 7.0.0
'@tanstack/router-zod-adapter@1.81.5(@tanstack/react-router@1.114.24(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(zod@3.24.2)':
'@tanstack/router-zod-adapter@1.81.5(@tanstack/react-router@1.114.25(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(zod@3.24.2)':
dependencies:
'@tanstack/react-router': 1.114.24(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
'@tanstack/react-router': 1.114.25(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
zod: 3.24.2
'@tanstack/store@0.7.0': {}
@@ -11113,9 +11114,9 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@vitejs/plugin-react-swc@3.8.0(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))':
'@vitejs/plugin-react-swc@3.8.1(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))':
dependencies:
'@swc/core': 1.10.15
'@swc/core': 1.11.11
vite: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)
transitivePeerDependencies:
- '@swc/helpers'
@@ -12154,7 +12155,7 @@ snapshots:
dom-helpers@5.2.1:
dependencies:
'@babel/runtime': 7.26.0
'@babel/runtime': 7.26.10
csstype: 3.1.3
dom-serializer@1.4.1:
@@ -13966,13 +13967,13 @@ snapshots:
escape-string-regexp: 4.0.0
optional: true
material-react-table@3.2.1(654f09cb8207d585a138693171e30e7f):
material-react-table@3.2.1(384a497145485e68a86cdc9cfd7e9248):
dependencies:
'@emotion/react': 11.14.0(@types/react@19.0.11)(react@19.0.0)
'@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0)
'@mui/icons-material': 6.4.7(@mui/material@6.4.7(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.0.11)(react@19.0.0)
'@mui/material': 6.4.7(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
'@mui/x-date-pickers': 7.9.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@mui/material@6.4.7(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.0.11)(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
'@mui/icons-material': 6.4.8(@mui/material@6.4.8(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.0.11)(react@19.0.0)
'@mui/material': 6.4.8(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
'@mui/x-date-pickers': 7.9.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@mui/material@6.4.8(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.0.11)(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
'@tanstack/match-sorter-utils': 8.19.4
'@tanstack/react-table': 8.20.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
'@tanstack/react-virtual': 3.11.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
@@ -14323,12 +14324,12 @@ snapshots:
muggle-string@0.4.1: {}
mui-color-input@5.0.1(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@mui/material@6.4.7(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
mui-color-input@5.0.1(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@mui/material@6.4.8(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
dependencies:
'@ctrl/tinycolor': 4.1.0
'@emotion/react': 11.14.0(@types/react@19.0.11)(react@19.0.0)
'@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0)
'@mui/material': 6.4.7(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
'@mui/material': 6.4.8(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
react: 19.0.0
react-dom: 19.0.0(react@19.0.0)
optionalDependencies:
@@ -14349,7 +14350,7 @@ snapshots:
nanoid@3.3.8: {}
nanoid@5.1.4: {}
nanoid@5.1.5: {}
natural-compare@1.4.0: {}
@@ -14888,14 +14889,14 @@ snapshots:
react: 19.0.0
react-dom: 19.0.0(react@19.0.0)
react-hook-form-mui@7.5.0(ea3e5f5c412ba73f5e2ef92ffc8e5c95):
react-hook-form-mui@7.5.0(d916abb5390aa3b2a5543e30cee3d1b4):
dependencies:
'@mui/material': 6.4.7(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
'@mui/material': 6.4.8(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
react: 19.0.0
react-hook-form: 7.52.1(react@19.0.0)
optionalDependencies:
'@mui/icons-material': 6.4.7(@mui/material@6.4.7(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.0.11)(react@19.0.0)
'@mui/x-date-pickers': 7.9.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@mui/material@6.4.7(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.0.11)(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
'@mui/icons-material': 6.4.8(@mui/material@6.4.8(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.0.11)(react@19.0.0)
'@mui/x-date-pickers': 7.9.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@mui/material@6.4.8(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react@19.0.0))(@types/react@19.0.11)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.0.11)(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
react-hook-form@7.52.1(react@19.0.0):
dependencies:
@@ -14944,7 +14945,7 @@ snapshots:
react-transition-group@4.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
dependencies:
'@babel/runtime': 7.26.0
'@babel/runtime': 7.26.10
dom-helpers: 5.2.1
loose-envify: 1.4.0
prop-types: 15.8.1
@@ -15015,7 +15016,7 @@ snapshots:
regenerator-transform@0.15.2:
dependencies:
'@babel/runtime': 7.26.0
'@babel/runtime': 7.26.10
regex-recursion@6.0.2:
dependencies:
@@ -15181,7 +15182,7 @@ snapshots:
rtl-css-js@1.16.1:
dependencies:
'@babel/runtime': 7.26.0
'@babel/runtime': 7.26.10
run-parallel@1.2.0:
dependencies:
+25 -25
View File
@@ -27,49 +27,49 @@
"@emotion/react": "^11.14.0",
"@emotion/styled": "^11.14.0",
"@juggle/resize-observer": "^3.4.0",
"@mui/icons-material": "^6.4.2",
"@mui/icons-material": "^6.4.8",
"@mui/lab": "6.0.0-beta.25",
"@mui/material": "^6.4.2",
"@mui/x-data-grid": "^7.25.0",
"@mui/material": "^6.4.8",
"@mui/x-data-grid": "^7.28.0",
"@tauri-apps/api": "2.2.0",
"@tauri-apps/plugin-clipboard-manager": "^2.2.1",
"@tauri-apps/plugin-clipboard-manager": "^2.2.2",
"@tauri-apps/plugin-dialog": "^2.2.0",
"@tauri-apps/plugin-fs": "^2.2.0",
"@tauri-apps/plugin-global-shortcut": "^2.2.0",
"@tauri-apps/plugin-notification": "^2.2.1",
"@tauri-apps/plugin-notification": "^2.2.2",
"@tauri-apps/plugin-process": "^2.2.0",
"@tauri-apps/plugin-shell": "2.2.0",
"@tauri-apps/plugin-updater": "2.3.0",
"@types/d3-shape": "^3.1.7",
"@types/json-schema": "^7.0.15",
"ahooks": "^3.8.4",
"axios": "^1.7.9",
"axios": "^1.8.3",
"cli-color": "^2.0.4",
"d3-shape": "^3.2.0",
"dayjs": "1.11.13",
"foxact": "^0.2.43",
"foxact": "^0.2.44",
"glob": "^11.0.1",
"i18next": "^24.2.2",
"i18next": "^24.2.3",
"js-base64": "^3.7.7",
"js-yaml": "^4.1.0",
"lodash-es": "^4.17.21",
"monaco-editor": "^0.52.2",
"monaco-yaml": "^5.2.3",
"nanoid": "^5.0.9",
"monaco-yaml": "^5.3.1",
"nanoid": "^5.1.5",
"peggy": "^4.2.0",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-error-boundary": "^4.0.12",
"react-error-boundary": "^4.1.2",
"react-hook-form": "^7.54.2",
"react-i18next": "^13.5.0",
"react-markdown": "^9.0.1",
"react-monaco-editor": "^0.56.0",
"react-router-dom": "^6.22.3",
"react-markdown": "^9.1.0",
"react-monaco-editor": "^0.56.2",
"react-router-dom": "^6.30.0",
"react-transition-group": "^4.4.5",
"react-virtuoso": "^4.6.3",
"react-virtuoso": "^4.12.5",
"recharts": "^2.15.1",
"sockette": "^2.0.6",
"swr": "^2.3.0",
"swr": "^2.3.3",
"tar": "^7.4.3",
"types-pac": "^1.0.3",
"zustand": "^5.0.3"
@@ -83,20 +83,20 @@
"@types/react": "^18.3.18",
"@types/react-dom": "^18.3.5",
"@types/react-transition-group": "^4.4.12",
"@vitejs/plugin-legacy": "^6.0.0",
"@vitejs/plugin-react": "^4.2.1",
"@vitejs/plugin-legacy": "^6.0.2",
"@vitejs/plugin-react": "^4.3.4",
"adm-zip": "^0.5.16",
"cross-env": "^7.0.3",
"https-proxy-agent": "^7.0.6",
"husky": "^9.1.7",
"meta-json-schema": "^1.19.1",
"meta-json-schema": "^1.19.3",
"node-fetch": "^3.3.2",
"prettier": "^3.4.2",
"pretty-quick": "^4.0.0",
"sass": "^1.83.4",
"terser": "^5.37.0",
"typescript": "^5.7.3",
"vite": "^6.0.11",
"prettier": "^3.5.3",
"pretty-quick": "^4.1.1",
"sass": "^1.86.0",
"terser": "^5.39.0",
"typescript": "^5.8.2",
"vite": "^6.2.2",
"vite-plugin-monaco-editor": "^1.1.0",
"vite-plugin-svgr": "^4.3.0"
},
+2847 -4760
View File
File diff suppressed because it is too large Load Diff
+667 -508
View File
File diff suppressed because it is too large Load Diff
@@ -1,10 +1,8 @@
use chrono::Local;
use regex::Regex;
use reqwest::header::{HeaderMap, HeaderValue};
use reqwest::Client;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::error::Error;
use std::sync::Arc;
use tauri::command;
use tokio::sync::Mutex;
+15 -1
View File
@@ -191,6 +191,12 @@ pub struct IVerge {
/// 轻量模式 - 只保留内核运行
pub enable_lite_mode: Option<bool>,
/// 自动进入轻量模式
pub auto_enter_lite_mode: Option<bool>,
/// 自动进入轻量模式的延迟(分钟)
pub auto_enter_lite_mode_delay: Option<u16>,
}
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
@@ -252,7 +258,7 @@ impl IVerge {
env_type: Some("bash".into()),
#[cfg(target_os = "windows")]
env_type: Some("powershell".into()),
start_page: Some("/".into()),
start_page: Some("/home".into()),
traffic_graph: Some(true),
enable_memory_usage: Some(true),
enable_group_icon: Some(true),
@@ -294,6 +300,8 @@ impl IVerge {
enable_tray_speed: Some(true),
enable_global_hotkey: Some(true),
enable_lite_mode: Some(false),
auto_enter_lite_mode: Some(false),
auto_enter_lite_mode_delay: Some(10),
enable_dns_settings: Some(true),
home_cards: None,
..Self::default()
@@ -378,6 +386,8 @@ impl IVerge {
patch!(webdav_password);
patch!(enable_tray_speed);
patch!(enable_lite_mode);
patch!(auto_enter_lite_mode);
patch!(auto_enter_lite_mode_delay);
patch!(enable_dns_settings);
patch!(home_cards);
}
@@ -469,6 +479,8 @@ pub struct IVergeResponse {
pub webdav_password: Option<String>,
pub enable_tray_speed: Option<bool>,
pub enable_lite_mode: Option<bool>,
pub auto_enter_lite_mode: Option<bool>,
pub auto_enter_lite_mode_delay: Option<u16>,
pub enable_dns_settings: Option<bool>,
pub home_cards: Option<serde_json::Value>,
}
@@ -534,6 +546,8 @@ impl From<IVerge> for IVergeResponse {
webdav_password: verge.webdav_password,
enable_tray_speed: verge.enable_tray_speed,
enable_lite_mode: verge.enable_lite_mode,
auto_enter_lite_mode: verge.auto_enter_lite_mode,
auto_enter_lite_mode_delay: verge.auto_enter_lite_mode_delay,
enable_dns_settings: verge.enable_dns_settings,
home_cards: verge.home_cards,
}
+87 -64
View File
@@ -7,7 +7,7 @@ use tauri::{async_runtime, Manager};
use tauri_plugin_global_shortcut::{Code, GlobalShortcutExt, ShortcutState};
pub struct Hotkey {
current: Arc<Mutex<Vec<String>>>,
current: Arc<Mutex<Vec<String>>>, // 保存当前的热键设置
}
impl Hotkey {
@@ -21,25 +21,25 @@ impl Hotkey {
pub fn init(&self) -> Result<()> {
let verge = Config::verge();
let verge_config = verge.latest();
let enable_global_hotkey = verge_config.enable_global_hotkey.unwrap_or(true);
let enable_global_hotkey = verge.latest().enable_global_hotkey.unwrap_or(true);
println!(
"Initializing hotkeys, global hotkey enabled: {}",
enable_global_hotkey
);
log::info!(target: "app", "Initializing hotkeys, global hotkey enabled: {}", enable_global_hotkey);
// If global hotkey is disabled, skip registration
// 如果全局热键被禁用,则不注册热键
if !enable_global_hotkey {
println!("Global hotkey is disabled, skipping registration");
log::info!(target: "app", "Global hotkey is disabled, skipping registration");
return Ok(());
}
if let Some(hotkeys) = verge_config.hotkeys.as_ref() {
if let Some(hotkeys) = verge.latest().hotkeys.as_ref() {
println!("Found {} hotkeys to register", hotkeys.len());
log::info!(target: "app", "Found {} hotkeys to register", hotkeys.len());
// Pre-allocate the vector for current hotkeys
let mut current = self.current.lock();
current.clear();
current.reserve(hotkeys.len());
for hotkey in hotkeys.iter() {
let mut iter = hotkey.split(',');
let func = iter.next();
@@ -47,24 +47,27 @@ impl Hotkey {
match (key, func) {
(Some(key), Some(func)) => {
println!("Registering hotkey: {} -> {}", key, func);
log::info!(target: "app", "Registering hotkey: {} -> {}", key, func);
if let Err(e) = self.register(key, func) {
println!("Failed to register hotkey {} -> {}: {:?}", key, func, e);
log::error!(target: "app", "Failed to register hotkey {} -> {}: {:?}", key, func, e);
} else {
println!("Successfully registered hotkey {} -> {}", key, func);
log::info!(target: "app", "Successfully registered hotkey {} -> {}", key, func);
}
}
_ => {
let key = key.unwrap_or("None");
let func = func.unwrap_or("None");
println!("Invalid hotkey configuration: `{key}`:`{func}`");
log::error!(target: "app", "Invalid hotkey configuration: `{key}`:`{func}`");
}
}
}
// Use extend instead of clone_from to avoid reallocating
current.extend(hotkeys.iter().cloned());
self.current.lock().clone_from(hotkeys);
} else {
println!("No hotkeys configured");
log::info!(target: "app", "No hotkeys configured");
}
@@ -72,40 +75,54 @@ impl Hotkey {
}
pub fn reset(&self) -> Result<()> {
if let Some(app_handle) = handle::Handle::global().app_handle() {
app_handle.global_shortcut().unregister_all()?;
}
let app_handle = handle::Handle::global().app_handle().unwrap();
let manager = app_handle.global_shortcut();
manager.unregister_all()?;
Ok(())
}
pub fn register(&self, hotkey: &str, func: &str) -> Result<()> {
let app_handle = match handle::Handle::global().app_handle() {
Some(handle) => handle,
None => bail!("Failed to get app handle"),
};
let app_handle = handle::Handle::global().app_handle().unwrap();
let manager = app_handle.global_shortcut();
println!(
"Attempting to register hotkey: {} for function: {}",
hotkey, func
);
log::info!(target: "app", "Attempting to register hotkey: {} for function: {}", hotkey, func);
if manager.is_registered(hotkey) {
println!(
"Hotkey {} was already registered, unregistering first",
hotkey
);
log::info!(target: "app", "Hotkey {} was already registered, unregistering first", hotkey);
manager.unregister(hotkey)?;
}
let f = match func.trim() {
"open_or_close_dashboard" => {
println!("Registering open_or_close_dashboard function");
log::info!(target: "app", "Registering open_or_close_dashboard function");
|| {
println!("=== Hotkey Dashboard Window Operation Start ===");
log::info!(target: "app", "=== Hotkey Dashboard Window Operation Start ===");
// 使用 spawn_blocking 来确保在正确的线程上执行
async_runtime::spawn_blocking(|| {
println!("Toggle dashboard window visibility");
log::info!(target: "app", "Toggle dashboard window visibility");
// 检查窗口是否存在
if let Some(window) = handle::Handle::global().get_window() {
// 如果窗口可见,则隐藏它
if window.is_visible().unwrap_or(false) {
println!("Window is visible, hiding it");
log::info!(target: "app", "Window is visible, hiding it");
let _ = window.hide();
} else {
// 如果窗口不可见,则显示它
println!("Window is hidden, showing it");
log::info!(target: "app", "Window is hidden, showing it");
if window.is_minimized().unwrap_or(false) {
let _ = window.unminimize();
@@ -114,11 +131,14 @@ impl Hotkey {
let _ = window.set_focus();
}
} else {
// 如果窗口不存在,创建一个新窗口
println!("Window does not exist, creating a new one");
log::info!(target: "app", "Window does not exist, creating a new one");
resolve::create_window();
}
});
println!("=== Hotkey Dashboard Window Operation End ===");
log::info!(target: "app", "=== Hotkey Dashboard Window Operation End ===");
}
}
@@ -130,6 +150,7 @@ impl Hotkey {
"quit" => || feat::quit(Some(0)),
_ => {
println!("Invalid function: {}", func);
log::error!(target: "app", "Invalid function: {}", func);
bail!("invalid function \"{func}\"");
}
@@ -139,27 +160,34 @@ impl Hotkey {
let _ = manager.on_shortcut(hotkey, move |app_handle, hotkey, event| {
if event.state == ShortcutState::Pressed {
println!("Hotkey pressed: {:?}", hotkey);
log::info!(target: "app", "Hotkey pressed: {:?}", hotkey);
if hotkey.key == Code::KeyQ && is_quit {
if let Some(window) = app_handle.get_webview_window("main") {
if window.is_focused().unwrap_or(false) {
println!("Executing quit function");
log::info!(target: "app", "Executing quit function");
f();
}
}
} else {
// 直接执行函数,不做任何状态检查
println!("Executing function directly");
log::info!(target: "app", "Executing function directly");
// Cache config values to avoid multiple lookups
let verge = Config::verge();
let verge_config = verge.latest();
let is_lite_mode = verge_config.enable_lite_mode.unwrap_or(false);
let is_enable_global_hotkey = verge_config.enable_global_hotkey.unwrap_or(true);
// 获取轻量模式状态和全局热键状态
let is_lite_mode = Config::verge().latest().enable_lite_mode.unwrap_or(false);
let is_enable_global_hotkey = Config::verge()
.latest()
.enable_global_hotkey
.unwrap_or(true);
// 在轻量模式下或配置了全局热键时,始终执行热键功能
if is_lite_mode || is_enable_global_hotkey {
f();
} else if let Some(window) = app_handle.get_webview_window("main") {
// 非轻量模式且未启用全局热键时,只在窗口可见且有焦点的情况下响应热键
let is_visible = window.is_visible().unwrap_or(false);
let is_focused = window.is_focused().unwrap_or(false);
@@ -171,54 +199,52 @@ impl Hotkey {
}
});
println!("Successfully registered hotkey {} for {}", hotkey, func);
log::info!(target: "app", "Successfully registered hotkey {} for {}", hotkey, func);
Ok(())
}
pub fn unregister(&self, hotkey: &str) -> Result<()> {
if let Some(app_handle) = handle::Handle::global().app_handle() {
app_handle.global_shortcut().unregister(hotkey)?;
log::debug!(target: "app", "unregister hotkey {hotkey}");
}
let app_handle = handle::Handle::global().app_handle().unwrap();
let manager = app_handle.global_shortcut();
manager.unregister(hotkey)?;
log::debug!(target: "app", "unregister hotkey {hotkey}");
Ok(())
}
pub fn update(&self, new_hotkeys: Vec<String>) -> Result<()> {
// Create maps outside of lock to minimize lock duration
let current = self.current.lock().clone();
let mut current = self.current.lock();
let old_map = Self::get_map_from_vec(&current);
let new_map = Self::get_map_from_vec(&new_hotkeys);
let (del, add) = Self::get_diff(old_map, new_map);
// Unregister and register outside the lock
for key in del {
del.iter().for_each(|key| {
let _ = self.unregister(key);
}
});
for (key, func) in add {
add.iter().for_each(|(key, func)| {
log_err!(self.register(key, func));
}
});
// Update current hotkeys with minimal lock duration
let mut current = self.current.lock();
*current = new_hotkeys;
Ok(())
}
fn get_map_from_vec(hotkeys: &[String]) -> HashMap<&str, &str> {
// Pre-allocate HashMap to avoid resizing
let mut map = HashMap::with_capacity(hotkeys.len());
let mut map = HashMap::new();
for hotkey in hotkeys {
hotkeys.iter().for_each(|hotkey| {
let mut iter = hotkey.split(',');
if let (Some(func), Some(key)) = (iter.next(), iter.next()) {
let func = func.trim();
let key = key.trim();
let func = iter.next();
let key = iter.next();
if func.is_some() && key.is_some() {
let func = func.unwrap().trim();
let key = key.unwrap().trim();
map.insert(key, func);
}
}
});
map
}
@@ -226,28 +252,26 @@ impl Hotkey {
old_map: HashMap<&'a str, &'a str>,
new_map: HashMap<&'a str, &'a str>,
) -> (Vec<&'a str>, Vec<(&'a str, &'a str)>) {
// Pre-allocate vectors with appropriate capacity
let mut del_list = Vec::with_capacity(old_map.len());
let mut add_list = Vec::with_capacity(new_map.len());
let mut del_list = vec![];
let mut add_list = vec![];
// Find keys to delete or update
for (&key, &func) in old_map.iter() {
old_map.iter().for_each(|(&key, func)| {
match new_map.get(key) {
Some(&new_func) if new_func != func => {
del_list.push(key);
add_list.push((key, new_func));
Some(new_func) => {
if new_func != func {
del_list.push(key);
add_list.push((key, *new_func));
}
}
None => del_list.push(key),
_ => {} // Key exists with same function, no change needed
}
}
};
});
// Find new keys to add
for (&key, &func) in new_map.iter() {
new_map.iter().for_each(|(&key, &func)| {
if !old_map.contains_key(key) {
add_list.push((key, func));
}
}
});
(del_list, add_list)
}
@@ -255,10 +279,9 @@ impl Hotkey {
impl Drop for Hotkey {
fn drop(&mut self) {
if let Some(app_handle) = handle::Handle::global().app_handle() {
if let Err(e) = app_handle.global_shortcut().unregister_all() {
log::error!(target:"app", "Error unregistering all hotkeys: {:?}", e);
}
let app_handle = handle::Handle::global().app_handle().unwrap();
if let Err(e) = app_handle.global_shortcut().unregister_all() {
log::error!(target:"app", "Error unregistering all hotkeys: {:?}", e);
}
}
}
@@ -6,7 +6,6 @@ use crate::{
};
use anyhow::Result;
use serde_yaml::Mapping;
use tauri::Manager;
/// Patch Clash configuration
pub async fn patch_clash(patch: Mapping) -> Result<()> {
+35
View File
@@ -283,6 +283,41 @@ pub fn run() {
api.prevent_close();
let window = core::handle::Handle::global().get_window().unwrap();
let _ = window.hide();
// 检查是否启用了自动进入 Lite Mode
let verge = crate::config::Config::verge();
let verge_config = verge.latest();
let auto_enter_lite_mode = verge_config.auto_enter_lite_mode.unwrap_or(false);
if auto_enter_lite_mode {
let delay_minutes = verge_config.auto_enter_lite_mode_delay.unwrap_or(10);
let app_handle_clone = app_handle.clone();
println!("自动进入 Lite Mode 已启用");
// 启动一个线程,在指定延迟后启用 Lite Mode
std::thread::spawn(move || {
println!("等待 {} 分钟后自动进入 Lite Mode", delay_minutes);
std::thread::sleep(std::time::Duration::from_secs(delay_minutes as u64 * 60));
println!("Lite Mode 倒计时结束");
// 延迟后检查窗口是否仍然隐藏,如果是,则启用 Lite Mode
let window_opt = app_handle_clone.get_webview_window("main");
if let Some(window) = window_opt {
if !window.is_visible().unwrap_or(true) {
println!("倒计时结束,正在进入 Lite Mode...");
// 应用 Lite Mode
if let Err(e) = tauri::async_runtime::block_on(crate::feat::patch_verge(
crate::config::IVerge {
enable_lite_mode: Some(true),
..Default::default()
},
false
)) {
println!("Lite Mode 进入失败: {:?}", e);
}
}
}
});
}
}
tauri::WindowEvent::Focused(true) => {
#[cfg(target_os = "macos")]
@@ -312,10 +312,11 @@ export const EnhancedTrafficGraph = memo(forwardRef<EnhancedTrafficGraphRef>(
);
// 格式化工具提示内容
const formatTooltip = useCallback((value: number) => {
const formatTooltip = useCallback((value: number, name: string, props: any) => {
const [num, unit] = parseTraffic(value);
return [`${num} ${unit}/s`, ""];
}, []);
// 使用props.dataKey判断是上传还是下载
return [`${num} ${unit}/s`, props?.dataKey === "up" ? t("Upload") : t("Download")];
}, [t]);
// Y轴刻度格式化
const formatYAxis = useCallback((value: number) => {
@@ -30,6 +30,9 @@ export const SystemInfoCard = () => {
{ suspense: false, revalidateOnFocus: false }
);
// 是否以sidecar模式运行
const isSidecarMode = runningMode === "sidecar";
// 初始化系统信息
useEffect(() => {
// 获取系统信息
@@ -123,10 +126,10 @@ export const SystemInfoCard = () => {
// 点击运行模式处理
const handleRunningModeClick = useCallback(() => {
if (runningMode === "sidecar") {
if (isSidecarMode) {
onInstallService();
}
}, [runningMode, onInstallService]);
}, [isSidecarMode, onInstallService]);
// 检查更新
const onCheckUpdate = useLockFn(async () => {
@@ -148,12 +151,12 @@ export const SystemInfoCard = () => {
// 运行模式样式
const runningModeStyle = useMemo(() => ({
cursor: runningMode === "sidecar" ? "pointer" : "default",
textDecoration: runningMode === "sidecar" ? "underline" : "none",
cursor: isSidecarMode ? "pointer" : "default",
textDecoration: isSidecarMode ? "underline" : "none",
"&:hover": {
opacity: runningMode === "sidecar" ? 0.7 : 1,
opacity: isSidecarMode ? 0.7 : 1,
},
}), [runningMode]);
}), [isSidecarMode]);
// 只有当verge存在时才渲染内容
if (!verge) return null;
@@ -203,7 +206,7 @@ export const SystemInfoCard = () => {
onClick={handleRunningModeClick}
sx={runningModeStyle}
>
{runningMode === "service" ? t("Service Mode") : t("Sidecar Mode")}
{isSidecarMode ? t("Sidecar Mode") : t("Service Mode")}
</Typography>
</Stack>
<Divider />
@@ -0,0 +1,144 @@
import { forwardRef, useImperativeHandle, useState } from "react";
import { useLockFn } from "ahooks";
import { useTranslation } from "react-i18next";
import {
List,
ListItem,
ListItemText,
TextField,
Typography,
InputAdornment,
} from "@mui/material";
import { useVerge } from "@/hooks/use-verge";
import { BaseDialog, DialogRef, Notice, Switch } from "@/components/base";
import { TooltipIcon } from "@/components/base/base-tooltip-icon";
export const LiteModeViewer = forwardRef<DialogRef>((props, ref) => {
const { t } = useTranslation();
const { verge, patchVerge } = useVerge();
const [open, setOpen] = useState(false);
const [values, setValues] = useState({
autoEnterLiteMode: false,
autoEnterLiteModeDelay: 10, // 默认10分钟
});
useImperativeHandle(ref, () => ({
open: () => {
setOpen(true);
setValues({
autoEnterLiteMode: verge?.auto_enter_lite_mode ?? false,
autoEnterLiteModeDelay: verge?.auto_enter_lite_mode_delay ?? 10,
});
},
close: () => setOpen(false),
}));
const onEnterLiteMode = useLockFn(async () => {
try {
await patchVerge({ enable_lite_mode: true });
setOpen(false);
} catch (err: any) {
Notice.error(err.message || err.toString());
}
});
const onSave = useLockFn(async () => {
try {
await patchVerge({
auto_enter_lite_mode: values.autoEnterLiteMode,
auto_enter_lite_mode_delay: values.autoEnterLiteModeDelay,
});
setOpen(false);
} catch (err: any) {
Notice.error(err.message || err.toString());
}
});
return (
<BaseDialog
open={open}
title={t("Lite Mode Settings")}
contentSx={{ width: 450 }}
okBtn={t("Save")}
cancelBtn={t("Cancel")}
onClose={() => setOpen(false)}
onCancel={() => setOpen(false)}
onOk={onSave}
>
<List>
<ListItem sx={{ padding: "5px 2px" }}>
<ListItemText primary={t("Enter Lite Mode Now")} />
<Typography
variant="button"
sx={{
cursor: "pointer",
color: "primary.main",
"&:hover": { textDecoration: "underline" }
}}
onClick={onEnterLiteMode}
>
{t("Enable")}
</Typography>
</ListItem>
<ListItem sx={{ padding: "5px 2px" }}>
<ListItemText
primary={t("Auto Enter Lite Mode")}
sx={{ maxWidth: "fit-content" }}
/>
<TooltipIcon
title={t("Auto Enter Lite Mode Info")}
sx={{ opacity: "0.7" }}
/>
<Switch
edge="end"
checked={values.autoEnterLiteMode}
onChange={(_, c) =>
setValues((v) => ({ ...v, autoEnterLiteMode: c }))
}
sx={{ marginLeft: "auto" }}
/>
</ListItem>
{values.autoEnterLiteMode && (
<>
<ListItem sx={{ padding: "5px 2px" }}>
<ListItemText primary={t("Auto Enter Lite Mode Delay")} />
<TextField
autoComplete="off"
size="small"
type="number"
autoCorrect="off"
autoCapitalize="off"
spellCheck="false"
sx={{ width: 150 }}
value={values.autoEnterLiteModeDelay}
onChange={(e) =>
setValues((v) => ({
...v,
autoEnterLiteModeDelay: parseInt(e.target.value) || 1,
}))
}
slotProps={{
input: {
endAdornment: (
<InputAdornment position="end">{t("mins")}</InputAdornment>
)
}
}}
/>
</ListItem>
<ListItem sx={{ padding: "5px 2px" }}>
<Typography variant="body2" color="text.secondary" sx={{ fontStyle: "italic" }}>
{t("When closing the window, Lite Mode will be automatically activated after _n minutes",
{ n: values.autoEnterLiteModeDelay })}
</Typography>
</ListItem>
</>
)}
</List>
</BaseDialog>
);
});
@@ -21,6 +21,7 @@ import { ThemeViewer } from "./mods/theme-viewer";
import { LayoutViewer } from "./mods/layout-viewer";
import { UpdateViewer } from "./mods/update-viewer";
import { BackupViewer } from "./mods/backup-viewer";
import { LiteModeViewer } from "./mods/lite-mode-viewer";
import { TooltipIcon } from "@/components/base/base-tooltip-icon";
import { ContentCopyRounded } from "@mui/icons-material";
@@ -39,6 +40,7 @@ const SettingVergeAdvanced = ({ onError }: Props) => {
const layoutRef = useRef<DialogRef>(null);
const updateRef = useRef<DialogRef>(null);
const backupRef = useRef<DialogRef>(null);
const liteModeRef = useRef<DialogRef>(null);
const onCheckUpdate = async () => {
try {
@@ -67,6 +69,7 @@ const SettingVergeAdvanced = ({ onError }: Props) => {
<LayoutViewer ref={layoutRef} />
<UpdateViewer ref={updateRef} />
<BackupViewer ref={backupRef} />
<LiteModeViewer ref={liteModeRef} />
<SettingItem
onClick={() => backupRef.current?.open()}
@@ -104,11 +107,11 @@ const SettingVergeAdvanced = ({ onError }: Props) => {
<SettingItem onClick={openDevTools} label={t("Open Dev Tools")} />
<SettingItem
label={t("Lite Mode")}
label={t("Lite Mode Settings")}
extra={
<TooltipIcon title={t("Lite Mode Info")} sx={{ opacity: "0.7" }} />
}
onClick={() => patchVerge({ enable_lite_mode: true })}
onClick={() => liteModeRef.current?.open()}
/>
<SettingItem
+6
View File
@@ -453,6 +453,12 @@
"Enable Tray Speed": "Enable Tray Speed",
"Lite Mode": "Lightweight Mode",
"Lite Mode Info": "Close the GUI and keep only the kernel running",
"Lite Mode Settings": "Lite Mode Settings",
"Enter Lite Mode Now": "Enter Lite Mode Now",
"Auto Enter Lite Mode": "Auto Enter Lite Mode",
"Auto Enter Lite Mode Info": "Enable to automatically activate Lite Mode after the window is closed for a period of time",
"Auto Enter Lite Mode Delay": "Auto Enter Lite Mode Delay",
"When closing the window, Lite Mode will be automatically activated after _n minutes": "When closing the window, Lite Mode will be automatically activated after {{n}} minutes",
"Config Validation Failed": "Subscription configuration validation failed. Please check the subscription configuration file; modifications have been rolled back.",
"Boot Config Validation Failed": "Boot subscription configuration validation failed. Started with the default configuration; please check the subscription configuration file.",
"Core Change Config Validation Failed": "Configuration validation failed when switching the kernel. Started with the default configuration; please check the subscription configuration file.",
+6
View File
@@ -453,6 +453,12 @@
"Enable Tray Speed": "启用托盘速率",
"Lite Mode": "轻量模式",
"Lite Mode Info": "关闭GUI界面,仅保留内核运行",
"Lite Mode Settings": "轻量模式设置",
"Enter Lite Mode Now": "立即进入轻量模式",
"Auto Enter Lite Mode": "自动进入轻量模式",
"Auto Enter Lite Mode Info": "启用后,将在窗口关闭一段时间后自动激活轻量模式",
"Auto Enter Lite Mode Delay": "自动进入轻量模式延迟",
"When closing the window, Lite Mode will be automatically activated after _n minutes": "关闭窗口后,轻量模式将在 {{n}} 分钟后自动激活",
"Config Validation Failed": "订阅配置校验失败,请检查订阅配置文件,变更已撤销,错误详情:",
"Boot Config Validation Failed": "启动订阅配置校验失败,已使用默认配置启动;请检查订阅配置文件,错误详情:",
"Core Change Config Validation Failed": "切换内核时配置校验失败,已使用默认配置启动;请检查订阅配置文件,错误详情:",
+1 -1
View File
@@ -304,7 +304,7 @@ const UnlockPage = () => {
>
{item.name}
</Typography>
<Tooltip title={t("Test now")}>
<Tooltip title={t("Test")}>
<span>
<Button
size="small"
+2
View File
@@ -740,6 +740,8 @@ interface IVergeConfig {
enable_tray_speed?: boolean;
enable_tun_mode?: boolean;
enable_lite_mode?: boolean;
auto_enter_lite_mode?: boolean;
auto_enter_lite_mode_delay?: number;
enable_auto_launch?: boolean;
enable_silent_start?: boolean;
enable_system_proxy?: boolean;
+1 -1
View File
@@ -42,7 +42,7 @@
"videojs-mobile-ui": "^1.1.1",
"vue": "^3.4.21",
"vue-final-modal": "^4.5.4",
"vue-i18n": "^11.0.1",
"vue-i18n": "^11.1.2",
"vue-lazyload": "^3.0.0",
"vue-reader": "^1.2.17",
"vue-router": "^4.3.0",
+30 -30
View File
@@ -81,8 +81,8 @@ importers:
specifier: ^4.5.4
version: 4.5.5(@vueuse/core@12.5.0(typescript@5.6.3))(@vueuse/integrations@12.5.0(focus-trap@7.6.2)(jwt-decode@4.0.0)(typescript@5.6.3))(focus-trap@7.6.2)(vue@3.5.13(typescript@5.6.3))
vue-i18n:
specifier: ^11.0.1
version: 11.0.1(vue@3.5.13(typescript@5.6.3))
specifier: ^11.1.2
version: 11.1.2(vue@3.5.13(typescript@5.6.3))
vue-lazyload:
specifier: ^3.0.0
version: 3.0.0
@@ -98,7 +98,7 @@ importers:
devDependencies:
'@intlify/unplugin-vue-i18n':
specifier: ^6.0.3
version: 6.0.3(@vue/compiler-dom@3.5.13)(eslint@9.19.0)(rollup@4.32.0)(typescript@5.6.3)(vue-i18n@11.0.1(vue@3.5.13(typescript@5.6.3)))(vue@3.5.13(typescript@5.6.3))
version: 6.0.3(@vue/compiler-dom@3.5.13)(eslint@9.19.0)(rollup@4.32.0)(typescript@5.6.3)(vue-i18n@11.1.2(vue@3.5.13(typescript@5.6.3)))(vue@3.5.13(typescript@5.6.3))
'@playwright/test':
specifier: ^1.50.0
version: 1.50.0
@@ -930,24 +930,24 @@ packages:
vue-i18n:
optional: true
'@intlify/core-base@11.0.1':
resolution: {integrity: sha512-NAmhw1l/llM0HZRpagR/ChJTNymW4ll6/4EDSJML5c8L5Hl/+k6UyF8EIgE6DeHpfheQujkSRngauViHqq6jJQ==}
'@intlify/core-base@11.1.2':
resolution: {integrity: sha512-nmG512G8QOABsserleechwHGZxzKSAlggGf9hQX0nltvSwyKNVuB/4o6iFeG2OnjXK253r8p8eSDOZf8PgFdWw==}
engines: {node: '>= 16'}
'@intlify/message-compiler@11.0.0-rc.1':
resolution: {integrity: sha512-TGw2uBfuTFTegZf/BHtUQBEKxl7Q/dVGLoqRIdw8lFsp9g/53sYn5iD+0HxIzdYjbWL6BTJMXCPUHp9PxDTRPw==}
engines: {node: '>= 16'}
'@intlify/message-compiler@11.0.1':
resolution: {integrity: sha512-5RFH8x+Mn3mbjcHXnb6KCXGiczBdiQkWkv99iiA0JpKrNuTAQeW59Pjq/uObMB0eR0shnKYGTkIJxum+DbL3sw==}
'@intlify/message-compiler@11.1.2':
resolution: {integrity: sha512-T/xbNDzi+Yv0Qn2Dfz2CWCAJiwNgU5d95EhhAEf4YmOgjCKktpfpiUSmLcBvK1CtLpPQ85AMMQk/2NCcXnNj1g==}
engines: {node: '>= 16'}
'@intlify/shared@11.0.0-rc.1':
resolution: {integrity: sha512-8tR1xe7ZEbkabTuE/tNhzpolygUn9OaYp9yuYAF4MgDNZg06C3Qny80bes2/e9/Wm3aVkPUlCw6WgU7mQd0yEg==}
engines: {node: '>= 16'}
'@intlify/shared@11.0.1':
resolution: {integrity: sha512-lH164+aDDptHZ3dBDbIhRa1dOPQUp+83iugpc+1upTOWCnwyC1PVis6rSWNMMJ8VQxvtHQB9JMib48K55y0PvQ==}
'@intlify/shared@11.1.2':
resolution: {integrity: sha512-dF2iMMy8P9uKVHV/20LA1ulFLL+MKSbfMiixSmn6fpwqzvix38OIc7ebgnFbBqElvghZCW9ACtzKTGKsTGTWGA==}
engines: {node: '>= 16'}
'@intlify/unplugin-vue-i18n@6.0.3':
@@ -2608,8 +2608,8 @@ packages:
focus-trap: '>=7.2.0'
vue: '>=3.2.0'
vue-i18n@11.0.1:
resolution: {integrity: sha512-pWAT8CusK8q9/EpN7V3oxwHwxWm6+Kp2PeTZmRGvdZTkUzMQDpbbmHp0TwQ8xw04XKm23cr6B4GL72y3W8Yekg==}
vue-i18n@11.1.2:
resolution: {integrity: sha512-MfdkdKGUHN+jkkaMT5Zbl4FpRmN7kfelJIwKoUpJ32ONIxdFhzxZiLTVaAXkAwvH3y9GmWpoiwjDqbPIkPIMFA==}
engines: {node: '>= 16'}
peerDependencies:
vue: ^3.0.0
@@ -3576,7 +3576,7 @@ snapshots:
'@humanwhocodes/retry@0.4.1': {}
'@intlify/bundle-utils@10.0.0(vue-i18n@11.0.1(vue@3.5.13(typescript@5.6.3)))':
'@intlify/bundle-utils@10.0.0(vue-i18n@11.1.2(vue@3.5.13(typescript@5.6.3)))':
dependencies:
'@intlify/message-compiler': 11.0.0-rc.1
'@intlify/shared': 11.0.0-rc.1
@@ -3588,33 +3588,33 @@ snapshots:
source-map-js: 1.2.1
yaml-eslint-parser: 1.2.3
optionalDependencies:
vue-i18n: 11.0.1(vue@3.5.13(typescript@5.6.3))
vue-i18n: 11.1.2(vue@3.5.13(typescript@5.6.3))
'@intlify/core-base@11.0.1':
'@intlify/core-base@11.1.2':
dependencies:
'@intlify/message-compiler': 11.0.1
'@intlify/shared': 11.0.1
'@intlify/message-compiler': 11.1.2
'@intlify/shared': 11.1.2
'@intlify/message-compiler@11.0.0-rc.1':
dependencies:
'@intlify/shared': 11.0.0-rc.1
source-map-js: 1.2.1
'@intlify/message-compiler@11.0.1':
'@intlify/message-compiler@11.1.2':
dependencies:
'@intlify/shared': 11.0.1
'@intlify/shared': 11.1.2
source-map-js: 1.2.1
'@intlify/shared@11.0.0-rc.1': {}
'@intlify/shared@11.0.1': {}
'@intlify/shared@11.1.2': {}
'@intlify/unplugin-vue-i18n@6.0.3(@vue/compiler-dom@3.5.13)(eslint@9.19.0)(rollup@4.32.0)(typescript@5.6.3)(vue-i18n@11.0.1(vue@3.5.13(typescript@5.6.3)))(vue@3.5.13(typescript@5.6.3))':
'@intlify/unplugin-vue-i18n@6.0.3(@vue/compiler-dom@3.5.13)(eslint@9.19.0)(rollup@4.32.0)(typescript@5.6.3)(vue-i18n@11.1.2(vue@3.5.13(typescript@5.6.3)))(vue@3.5.13(typescript@5.6.3))':
dependencies:
'@eslint-community/eslint-utils': 4.4.1(eslint@9.19.0)
'@intlify/bundle-utils': 10.0.0(vue-i18n@11.0.1(vue@3.5.13(typescript@5.6.3)))
'@intlify/shared': 11.0.1
'@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.0.1)(@vue/compiler-dom@3.5.13)(vue-i18n@11.0.1(vue@3.5.13(typescript@5.6.3)))(vue@3.5.13(typescript@5.6.3))
'@intlify/bundle-utils': 10.0.0(vue-i18n@11.1.2(vue@3.5.13(typescript@5.6.3)))
'@intlify/shared': 11.1.2
'@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.1.2)(@vue/compiler-dom@3.5.13)(vue-i18n@11.1.2(vue@3.5.13(typescript@5.6.3)))(vue@3.5.13(typescript@5.6.3))
'@rollup/pluginutils': 5.1.4(rollup@4.32.0)
'@typescript-eslint/scope-manager': 8.21.0
'@typescript-eslint/typescript-estree': 8.21.0(typescript@5.6.3)
@@ -3628,7 +3628,7 @@ snapshots:
unplugin: 1.16.1
vue: 3.5.13(typescript@5.6.3)
optionalDependencies:
vue-i18n: 11.0.1(vue@3.5.13(typescript@5.6.3))
vue-i18n: 11.1.2(vue@3.5.13(typescript@5.6.3))
transitivePeerDependencies:
- '@vue/compiler-dom'
- eslint
@@ -3636,14 +3636,14 @@ snapshots:
- supports-color
- typescript
'@intlify/vue-i18n-extensions@8.0.0(@intlify/shared@11.0.1)(@vue/compiler-dom@3.5.13)(vue-i18n@11.0.1(vue@3.5.13(typescript@5.6.3)))(vue@3.5.13(typescript@5.6.3))':
'@intlify/vue-i18n-extensions@8.0.0(@intlify/shared@11.1.2)(@vue/compiler-dom@3.5.13)(vue-i18n@11.1.2(vue@3.5.13(typescript@5.6.3)))(vue@3.5.13(typescript@5.6.3))':
dependencies:
'@babel/parser': 7.26.7
optionalDependencies:
'@intlify/shared': 11.0.1
'@intlify/shared': 11.1.2
'@vue/compiler-dom': 3.5.13
vue: 3.5.13(typescript@5.6.3)
vue-i18n: 11.0.1(vue@3.5.13(typescript@5.6.3))
vue-i18n: 11.1.2(vue@3.5.13(typescript@5.6.3))
'@jridgewell/gen-mapping@0.3.5':
dependencies:
@@ -5283,10 +5283,10 @@ snapshots:
focus-trap: 7.6.2
vue: 3.5.13(typescript@5.6.3)
vue-i18n@11.0.1(vue@3.5.13(typescript@5.6.3)):
vue-i18n@11.1.2(vue@3.5.13(typescript@5.6.3)):
dependencies:
'@intlify/core-base': 11.0.1
'@intlify/shared': 11.0.1
'@intlify/core-base': 11.1.2
'@intlify/shared': 11.1.2
'@vue/devtools-api': 6.6.4
vue: 3.5.13(typescript@5.6.3)
+7
View File
@@ -0,0 +1,7 @@
Copyright 2023 Toby
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+7
View File
@@ -0,0 +1,7 @@
Copyright 2023 Toby
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+7
View File
@@ -0,0 +1,7 @@
Copyright 2023 Toby
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+3 -3
View File
@@ -5,14 +5,14 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=busybox
PKG_VERSION:=1.36.0
PKG_RELEASE:=2
PKG_VERSION:=1.36.1
PKG_RELEASE:=1
PKG_FLAGS:=essential
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
PKG_SOURCE_URL:=https://www.busybox.net/downloads \
https://sources.buildroot.net/$(PKG_NAME)
PKG_HASH:=542750c8af7cb2630e201780b4f99f3dcceeb06f505b479ec68241c1e6af61a5
PKG_HASH:=b8cc24c9574d809e7279c3be349795c5d5ceb6fdf19ca709f80cde50e47de314
PKG_BUILD_DEPENDS:=BUSYBOX_CONFIG_PAM:libpam
PKG_BUILD_PARALLEL:=1
+1 -1
View File
@@ -289,5 +289,5 @@ func (mc *mieruClient) dialPostHandshake(conn net.Conn, netAddrSpec model.NetAdd
if isTCP {
return conn, nil
}
return apicommon.WrapPacketOverStream(conn), nil
return apicommon.NewPacketOverStreamTunnel(conn), nil
}
+4 -3
View File
@@ -31,7 +31,7 @@ import (
//
// the length is encoded with big endian.
//
// The destination of packets are negotiated separately and can't change.
// The destination of packets are negotiated separately.
type PacketOverStreamTunnel struct {
net.Conn
}
@@ -99,7 +99,8 @@ func (c *PacketOverStreamTunnel) Close() error {
return c.Conn.Close()
}
// WrapPacketOverStream wraps an existing connection with PacketOverStreamTunnel.
func WrapPacketOverStream(conn net.Conn) *PacketOverStreamTunnel {
// NewPacketOverStreamTunnel creates a PacketOverStreamTunnel on top of
// an existing stream oriented network connection.
func NewPacketOverStreamTunnel(conn net.Conn) *PacketOverStreamTunnel {
return &PacketOverStreamTunnel{Conn: conn}
}
+2 -2
View File
@@ -24,8 +24,8 @@ import (
func TestUDPAssociateTunnelConn(t *testing.T) {
in, out := testtool.BufPipe()
inConn := common.WrapPacketOverStream(in)
outConn := common.WrapPacketOverStream(out)
inConn := common.NewPacketOverStreamTunnel(in)
outConn := common.NewPacketOverStreamTunnel(out)
data := []byte{8, 9, 6, 4}
n, err := inConn.Write(data)
@@ -0,0 +1,93 @@
// Copyright (C) 2025 mieru authors
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
package common
import (
"bytes"
"fmt"
"net"
"github.com/enfein/mieru/v3/apis/model"
)
// UDPAssociateWrapper wraps a raw UDP packet with socks5 UDP association header.
type UDPAssociateWrapper struct {
net.PacketConn
}
// ReadFrom receives a packet and strips the socks5 UDP associate header.
func (w *UDPAssociateWrapper) ReadFrom(p []byte) (n int, addr net.Addr, err error) {
b := make([]byte, len(p)+256) // add some space to parse the header
n, addr, err = w.PacketConn.ReadFrom(b)
if err != nil {
return
}
b = b[:n]
// Validate the header.
if n <= 6 {
err = fmt.Errorf("packet size %d is too short to hold UDP associate header", n)
return
}
if b[0] != 0x00 || b[1] != 0x00 {
err = fmt.Errorf("invalid UDP header")
return
}
if b[2] != 0x00 {
err = fmt.Errorf("UDP fragment is not supported")
return
}
var destination model.NetAddrSpec
r := bytes.NewReader(b[3:])
if err = destination.ReadFromSocks5(r); err != nil {
return
}
if destination.FQDN != "" {
err = fmt.Errorf("peer used FQDN in UDP associate header, which is unsupported")
return
}
n, err = r.Read(p)
// Caller may expect the returned address to be *net.UDPAddr.
addr = &net.UDPAddr{
IP: destination.IP,
Port: destination.Port,
}
return
}
// WriteTo adds a socks5 UDP associate header and sends the packet.
func (w *UDPAssociateWrapper) WriteTo(p []byte, addr net.Addr) (n int, err error) {
var destination model.NetAddrSpec
if err = destination.From(addr); err != nil {
return
}
b := bytes.NewBuffer([]byte{0, 0, 0})
destination.WriteToSocks5(b)
b.Write(p)
_, err = w.PacketConn.WriteTo(b.Bytes(), destination)
if err != nil {
return
}
return len(p), nil
}
// NewUDPAssociateWrapper creates a UDPAssociateWrapper.
func NewUDPAssociateWrapper(conn net.PacketConn) *UDPAssociateWrapper {
return &UDPAssociateWrapper{PacketConn: conn}
}
@@ -0,0 +1,65 @@
// Copyright (C) 2025 mieru authors
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
package common_test
import (
"net"
"testing"
"github.com/enfein/mieru/v3/apis/common"
"github.com/enfein/mieru/v3/apis/model"
"github.com/enfein/mieru/v3/pkg/testtool"
)
func TestUDPAssociateWrapper(t *testing.T) {
in, out := testtool.BufPipe()
inConn := common.NewUDPAssociateWrapper(common.NewPacketOverStreamTunnel(in))
outConn := common.NewUDPAssociateWrapper(common.NewPacketOverStreamTunnel(out))
addr := model.NetAddrSpec{Net: "udp", AddrSpec: model.AddrSpec{IP: net.IPv4(1, 1, 1, 1), Port: 8964}}
data := []byte{8, 9, 6, 4}
n, err := inConn.WriteTo(data, addr)
if err != nil {
t.Fatalf("Write() failed: %v", err)
}
if n != 4 {
t.Fatalf("Write() returns %d, want %d", n, 4)
}
buf := make([]byte, 16)
var addr2 net.Addr
n, addr2, err = outConn.ReadFrom(buf)
if err != nil {
t.Fatalf("Read() failed: %v", err)
}
if n != 4 {
t.Fatalf("Read() returns %d, want %d", n, 4)
}
destination := addr2.(*net.UDPAddr)
if destination.Network() != "udp" {
t.Errorf("got destination network %s, want %s", destination.Network(), "udp")
}
if destination.String() != "1.1.1.1:8964" {
t.Errorf("got destination %s, want %s", destination.String(), "1.1.1.1:8964")
}
if err = inConn.Close(); err != nil {
t.Errorf("Close() failed: %v", err)
}
if err = outConn.Close(); err != nil {
t.Errorf("Close() failed: %v", err)
}
}
+1 -1
View File
@@ -135,7 +135,7 @@ func (n NetAddrSpec) Network() string {
return n.Net
}
// From modifies the NetAddrSpec object with the given network address.
// From sets the NetAddrSpec object with the given network address.
func (n *NetAddrSpec) From(addr net.Addr) error {
if nas, ok := addr.(NetAddrSpec); ok {
n.AddrSpec = nas.AddrSpec
+1 -1
View File
@@ -210,7 +210,7 @@ func (s *Server) handleAssociate(_ context.Context, _ *Request, conn net.Conn) e
return fmt.Errorf("failed to send reply: %w", err)
}
conn = apicommon.WrapPacketOverStream(conn)
conn = apicommon.NewPacketOverStreamTunnel(conn)
var udpErr atomic.Value
// addrMap maps the UDPAddr in string to the bytes in UDP associate header.
+1 -1
View File
@@ -220,7 +220,7 @@ func (s *Server) clientServeConn(conn net.Conn) error {
common.ReadAllAndDiscard(conn)
conn.Close()
}()
return BidiCopyUDP(udpAssociateConn, apicommon.WrapPacketOverStream(proxyConn))
return BidiCopyUDP(udpAssociateConn, apicommon.NewPacketOverStreamTunnel(proxyConn))
}
return common.BidiCopy(conn, proxyConn)
}
+1 -1
View File
@@ -213,7 +213,7 @@ func TestSocks5UDPAssociation(t *testing.T) {
}
// Send subsequent UDP association request.
wrappedConn := apicommon.WrapPacketOverStream(conn)
wrappedConn := apicommon.NewPacketOverStreamTunnel(conn)
req.Reset()
req.Write([]byte{0, 0, 0, 1, 127, 0, 0, 1})
req.WriteByte(byte(udpListenPort >> 8))
+1 -1
View File
@@ -20,7 +20,7 @@ FROM ubuntu:24.04
WORKDIR /test
# Copy binaries, data and test script into the container.
COPY mihomo mita httpserver sockshttpclient \
COPY mihomo mita httpserver sockshttpclient socksudpclient udpserver \
test/deploy/mihomo/mihomo-config.yaml \
test/deploy/mihomo/server_tcp.json \
test/deploy/mihomo/libtest.sh \
+3 -3
View File
@@ -6,13 +6,13 @@ log-level: warning
mixed-port: 1080
mode: rule
proxies:
- name: mieru-tcp
- name: mieru
type: mieru
server: 127.0.0.1
port: 8964
udp: true
transport: TCP
udp: true
username: baozi
password: manlianpenfen
rules:
- MATCH,mieru-tcp
- MATCH,mieru
+4
View File
@@ -27,6 +27,10 @@ source ./libtest.sh
./httpserver &
sleep 2
# Start UDP server.
./udpserver -port=9090 &
sleep 1
# Start mieru server daemon.
./mita run &
sleep 1
+11
View File
@@ -75,6 +75,17 @@ if [ "$?" -ne "0" ]; then
exit 1
fi
# sleep 1
# echo ">>> socks5 UDP associate - TCP <<<"
# ./socksudpclient -dst_host=127.0.0.1 -dst_port=9090 \
# -local_proxy_host=127.0.0.1 -local_proxy_port=1080 \
# -interval_ms=10 -num_request=100 -num_conn=60
# if [ "$?" -ne "0" ]; then
# print_mieru_server_thread_dump
# echo "TCP - test socks5 udp_associate failed."
# exit 1
# fi
# Print metrics and memory statistics.
print_mieru_server_metrics
sleep 1
+1
View File
@@ -76,6 +76,7 @@ func NewUDP(addr string, tunnel C.Tunnel, additions ...inbound.Addition) (*UDPLi
rAddr, err := getOrigDst(oob[:oobn])
if err != nil {
pool.Put(buf)
continue
}
+1 -5
View File
@@ -1,10 +1,6 @@
name: Build & Test
on:
push:
branches: [master]
pull_request:
branches: [master]
on: [push, pull_request]
env:
CARGO_TERM_COLOR: always
+19 -5
View File
@@ -1,10 +1,6 @@
name: Build MSRV
on:
push:
branches: [master]
pull_request:
branches: [master]
on: [push, pull_request]
env:
CARGO_TERM_COLOR: always
@@ -21,6 +17,12 @@ jobs:
runs-on: ${{ matrix.platform }}
steps:
- if: ${{ matrix.platform == 'ubuntu-latest' }}
name: Free Disk Space (Ubuntu)
uses: jlumbroso/free-disk-space@main
- if: ${{ matrix.platform == 'ubuntu-latest' }}
name: Install LLVM and Clang
run: sudo apt install -y clang
- uses: actions/checkout@v4
- uses: Swatinem/rust-cache@v2
- if: ${{ runner.os == 'Windows' }}
@@ -48,6 +50,12 @@ jobs:
runs-on: ${{ matrix.platform }}
steps:
- if: ${{ matrix.platform == 'ubuntu-latest' }}
name: Free Disk Space (Ubuntu)
uses: jlumbroso/free-disk-space@main
- if: ${{ matrix.platform == 'ubuntu-latest' }}
name: Install LLVM and Clang
run: sudo apt install -y clang
- uses: actions/checkout@v4
- uses: Swatinem/rust-cache@v2
- if: ${{ runner.os == 'Windows' }}
@@ -71,6 +79,12 @@ jobs:
runs-on: ${{ matrix.platform }}
steps:
- if: ${{ matrix.platform == 'ubuntu-latest' }}
name: Free Disk Space (Ubuntu)
uses: jlumbroso/free-disk-space@main
- if: ${{ matrix.platform == 'ubuntu-latest' }}
name: Install LLVM and Clang
run: sudo apt install -y clang
- uses: actions/checkout@v4
- uses: Swatinem/rust-cache@v2
- if: ${{ runner.os == 'Windows' }}
@@ -28,6 +28,12 @@ jobs:
toolchain: nightly
steps:
- name: Free Disk Space (Ubuntu)
uses: jlumbroso/free-disk-space@main
- name: Install LLVM and Clang
run: sudo apt install -y clang
- uses: actions/checkout@v4
- name: Install Rust
+6
View File
@@ -72,6 +72,12 @@ jobs:
# toolchain: nightly
steps:
- name: Free Disk Space (Ubuntu)
uses: jlumbroso/free-disk-space@main
- name: Install LLVM and Clang
run: sudo apt install -y clang
- uses: actions/checkout@v4
- name: Install Rust
+1 -5
View File
@@ -1,10 +1,6 @@
name: Clippy Check
on:
push:
branches: [master]
pull_request:
branches: [master]
on: [push, pull_request]
env:
CARGO_TERM_COLOR: always
+67 -47
View File
@@ -324,9 +324,9 @@ dependencies = [
[[package]]
name = "blake3"
version = "1.6.1"
version = "1.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "675f87afced0413c9bb02843499dbbd3882a237645883f71a2b59644a6d2f753"
checksum = "b17679a8d69b6d7fd9cd9801a536cec9fa5e5970b69f9d4747f70b39b031f5e7"
dependencies = [
"arrayref",
"arrayvec",
@@ -398,7 +398,7 @@ dependencies = [
"base64",
"bitvec",
"getrandom 0.2.15",
"getrandom 0.3.1",
"getrandom 0.3.2",
"hex",
"indexmap",
"js-sys",
@@ -698,6 +698,12 @@ dependencies = [
"cfg-if",
]
[[package]]
name = "critical-section"
version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b"
[[package]]
name = "crossbeam-channel"
version = "0.5.14"
@@ -1257,16 +1263,16 @@ dependencies = [
[[package]]
name = "getrandom"
version = "0.3.1"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8"
checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0"
dependencies = [
"cfg-if",
"js-sys",
"libc",
"wasi 0.13.3+wasi-0.2.2",
"r-efi",
"wasi 0.14.2+wasi-0.2.4",
"wasm-bindgen",
"windows-targets 0.52.6",
]
[[package]]
@@ -1323,9 +1329,9 @@ dependencies = [
[[package]]
name = "h3"
version = "0.0.6"
version = "0.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5e7675a0963b47a6d12fe44c279918b4ffb19baee838ac37f48d2722ad5bc6ab"
checksum = "7dfb059a4f28a66f186ed16ad912d142f490676acba59353831d7cb45a96b0d3"
dependencies = [
"bytes",
"fastrand",
@@ -1337,9 +1343,9 @@ dependencies = [
[[package]]
name = "h3-quinn"
version = "0.0.7"
version = "0.0.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "17c799f413fceeea505236c4d8132f084ff4b55a652288d91439ee93dc24d855"
checksum = "6d482318ae94198fc8e3cbb0b7ba3099c865d744e6ec7c62039ca7b6b6c66fbf"
dependencies = [
"bytes",
"futures",
@@ -1388,14 +1394,15 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
[[package]]
name = "hickory-proto"
version = "0.25.0-alpha.5"
version = "0.25.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1d00147af6310f4392a31680db52a3ed45a2e0f68eb18e8c3fe5537ecc96d9e2"
checksum = "6d844af74f7b799e41c78221be863bade11c430d46042c3b49ca8ae0c6d27287"
dependencies = [
"async-recursion",
"async-trait",
"bytes",
"cfg-if",
"critical-section",
"data-encoding",
"enum-as-inner",
"futures-channel",
@@ -1411,6 +1418,7 @@ dependencies = [
"pin-project-lite",
"quinn",
"rand 0.9.0",
"ring",
"rustls",
"serde",
"thiserror 2.0.12",
@@ -1424,9 +1432,9 @@ dependencies = [
[[package]]
name = "hickory-resolver"
version = "0.25.0-alpha.5"
version = "0.25.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5762f69ebdbd4ddb2e975cd24690bf21fe6b2604039189c26acddbc427f12887"
checksum = "a128410b38d6f931fcc6ca5c107a3b02cabd6c05967841269a4ad65d23c44331"
dependencies = [
"cfg-if",
"futures-util",
@@ -1977,9 +1985,9 @@ dependencies = [
[[package]]
name = "libmimalloc-sys"
version = "0.1.39"
version = "0.1.40"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "23aa6811d3bd4deb8a84dde645f943476d13b248d818edcf8ce0b2f37f036b44"
checksum = "07d0e07885d6a754b9c7993f2625187ad694ee985d60f23355ff0e7077261502"
dependencies = [
"cc",
"libc",
@@ -2149,9 +2157,9 @@ checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
[[package]]
name = "mimalloc"
version = "0.1.43"
version = "0.1.44"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "68914350ae34959d83f732418d51e2427a794055d0b9529f48259ac07af65633"
checksum = "99585191385958383e13f6b822e6b6d8d9cf928e7d286ceb092da92b43c87bc1"
dependencies = [
"libmimalloc-sys",
]
@@ -2320,6 +2328,10 @@ name = "once_cell"
version = "1.21.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d75b0bedcc4fe52caa0e03d9f1151a323e4aa5e2d78ba3580400cd3c9e2bc4bc"
dependencies = [
"critical-section",
"portable-atomic",
]
[[package]]
name = "opaque-debug"
@@ -2663,11 +2675,12 @@ checksum = "d68782463e408eb1e668cf6152704bd856c78c5b6417adaee3203d8f4c1fc9ec"
[[package]]
name = "quinn"
version = "0.11.6"
version = "0.11.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef"
checksum = "c3bd15a6f2967aef83887dcb9fec0014580467e33720d073560cf015a5683012"
dependencies = [
"bytes",
"cfg_aliases",
"futures-io",
"pin-project-lite",
"quinn-proto",
@@ -2678,17 +2691,18 @@ dependencies = [
"thiserror 2.0.12",
"tokio",
"tracing",
"web-time",
]
[[package]]
name = "quinn-proto"
version = "0.11.9"
version = "0.11.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d"
checksum = "b820744eb4dc9b57a3398183639c511b5a26d2ed702cedd3febaa1393caa22cc"
dependencies = [
"bytes",
"getrandom 0.2.15",
"rand 0.8.5",
"getrandom 0.3.2",
"rand 0.9.0",
"ring",
"rustc-hash 2.1.1",
"rustls",
@@ -2723,6 +2737,12 @@ dependencies = [
"proc-macro2",
]
[[package]]
name = "r-efi"
version = "5.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5"
[[package]]
name = "radium"
version = "0.7.0"
@@ -2786,7 +2806,7 @@ version = "0.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38"
dependencies = [
"getrandom 0.3.1",
"getrandom 0.3.2",
]
[[package]]
@@ -2855,9 +2875,9 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
[[package]]
name = "reqwest"
version = "0.12.14"
version = "0.12.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "989e327e510263980e231de548a33e63d34962d29ae61b467389a1a09627a254"
checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb"
dependencies = [
"base64",
"bytes",
@@ -3026,9 +3046,9 @@ dependencies = [
[[package]]
name = "rustix"
version = "1.0.2"
version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f7178faa4b75a30e269c71e61c353ce2748cf3d76f0c44c393f4e60abf49b825"
checksum = "e56a18552996ac8d29ecc3b190b4fdbb2d91ca4ec396de7bbffaf43f3d637e96"
dependencies = [
"bitflags 2.9.0",
"errno",
@@ -3039,9 +3059,9 @@ dependencies = [
[[package]]
name = "rustls"
version = "0.23.23"
version = "0.23.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "47796c98c480fce5406ef69d1c76378375492c3b0a0de587be0c1d9feb12f395"
checksum = "822ee9188ac4ec04a2f0531e55d035fb2de73f18b41a63c70c2712503b6fb13c"
dependencies = [
"log",
"once_cell",
@@ -3084,9 +3104,9 @@ dependencies = [
[[package]]
name = "rustls-webpki"
version = "0.102.8"
version = "0.103.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9"
checksum = "0aa4eeac2588ffff23e9d7a7e9b3f971c5fb5b7ebc9452745e0c232c64f83b2f"
dependencies = [
"ring",
"rustls-pki-types",
@@ -3705,7 +3725,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "488960f40a3fd53d72c2a29a58722561dee8afdd175bd88e3db4677d7b2ba600"
dependencies = [
"fastrand",
"getrandom 0.3.1",
"getrandom 0.3.2",
"once_cell",
"rustix",
"windows-sys 0.59.0",
@@ -4140,7 +4160,7 @@ version = "1.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9"
dependencies = [
"getrandom 0.3.1",
"getrandom 0.3.2",
"js-sys",
"serde",
"wasm-bindgen",
@@ -4191,9 +4211,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
[[package]]
name = "wasi"
version = "0.13.3+wasi-0.2.2"
version = "0.14.2+wasi-0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2"
checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3"
dependencies = [
"wit-bindgen-rt",
]
@@ -4300,9 +4320,9 @@ dependencies = [
[[package]]
name = "widestring"
version = "1.1.0"
version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311"
checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d"
[[package]]
name = "winapi"
@@ -4401,9 +4421,9 @@ dependencies = [
[[package]]
name = "windows-link"
version = "0.1.0"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6dccfd733ce2b1753b03b6d3c65edf020262ea35e20ccdf3e288043e6dd620e3"
checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38"
[[package]]
name = "windows-registry"
@@ -4411,7 +4431,7 @@ version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3"
dependencies = [
"windows-result 0.3.1",
"windows-result 0.3.2",
"windows-strings 0.3.1",
"windows-targets 0.53.0",
]
@@ -4427,9 +4447,9 @@ dependencies = [
[[package]]
name = "windows-result"
version = "0.3.1"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "06374efe858fab7e4f881500e6e86ec8bc28f9462c47e5a9941a0142ad86b189"
checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252"
dependencies = [
"windows-link",
]
@@ -4714,9 +4734,9 @@ dependencies = [
[[package]]
name = "wit-bindgen-rt"
version = "0.33.0"
version = "0.39.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c"
checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1"
dependencies = [
"bitflags 2.9.0",
]
+1 -1
View File
@@ -6,7 +6,7 @@
use std::process::ExitCode;
use clap::{Arg, ArgAction, Command, ValueHint};
use qrcode::{types::Color, QrCode};
use qrcode::{QrCode, types::Color};
use shadowsocks_service::{
config::{Config, ConfigType, ServerInstanceConfig},
@@ -42,15 +42,15 @@ hickory-dns = ["hickory-resolver", "shadowsocks/trust-dns"]
trust-dns = ["hickory-dns"]
dns-over-tls = [
"hickory-dns",
"hickory-resolver/dns-over-rustls",
"hickory-resolver/tls-ring",
"hickory-resolver/webpki-roots",
]
dns-over-https = [
"hickory-dns",
"hickory-resolver/dns-over-https-rustls",
"hickory-resolver/https-ring",
"hickory-resolver/webpki-roots",
]
dns-over-h3 = ["hickory-dns", "hickory-resolver/dns-over-h3"]
dns-over-h3 = ["hickory-dns", "hickory-resolver/h3-ring"]
# Enable DNS-relay
local-dns = ["local", "hickory-dns"]
@@ -166,7 +166,7 @@ http-body-util = { version = "0.1", optional = true }
http = { version = "1.1", optional = true }
httparse = { version = "1.9", optional = true }
hickory-resolver = { version = "=0.25.0-alpha.5", optional = true, features = [
hickory-resolver = { version = "0.25", optional = true, features = [
"serde",
] }
@@ -1893,7 +1893,9 @@ impl Config {
return Err(err);
}
None => {
warn!("OnlineConfig \"version\" is missing in the configuration, assuming it is a compatible version for this project");
warn!(
"OnlineConfig \"version\" is missing in the configuration, assuming it is a compatible version for this project"
);
}
}
}
@@ -41,9 +41,9 @@ pub async fn build_dns_resolver(
Ok(r) => Some(r),
Err(err) => {
warn!(
"initialize hickory-dns DNS system resolver failed, fallback to default system resolver, error: {}",
err
);
"initialize hickory-dns DNS system resolver failed, fallback to default system resolver, error: {}",
err
);
None
}
};
@@ -3,14 +3,14 @@
#[cfg(unix)]
use std::path::Path;
use std::{
collections::{hash_map::Entry, HashMap, VecDeque},
collections::{HashMap, VecDeque, hash_map::Entry},
future::Future,
io,
net::SocketAddr,
time::Duration,
};
use hickory_resolver::proto::{op::Message, ProtoError};
use hickory_resolver::proto::{ProtoError, op::Message};
use log::{debug, trace};
use tokio::sync::Mutex;
@@ -15,11 +15,11 @@ use std::{
use byteorder::{BigEndian, ByteOrder};
use bytes::{BufMut, BytesMut};
use futures::{
future::{self, Either},
FutureExt,
future::{self, Either},
};
use hickory_resolver::proto::{
op::{header::MessageType, response_code::ResponseCode, Message, OpCode, Query},
op::{Message, OpCode, Query, header::MessageType, response_code::ResponseCode},
rr::{DNSClass, Name, RData, RecordType},
};
use log::{debug, error, info, trace, warn};
@@ -30,10 +30,10 @@ use tokio::{
};
use shadowsocks::{
ServerAddr,
config::Mode,
net::TcpListener,
relay::{udprelay::MAXIMUM_UDP_PAYLOAD_SIZE, Address},
ServerAddr,
relay::{Address, udprelay::MAXIMUM_UDP_PAYLOAD_SIZE},
};
use crate::{
@@ -12,7 +12,7 @@ use std::{
use byteorder::{BigEndian, ByteOrder};
use bytes::{BufMut, BytesMut};
use hickory_resolver::proto::{op::Message, ProtoError, ProtoErrorKind};
use hickory_resolver::proto::{ProtoError, ProtoErrorKind, op::Message};
use log::{error, trace};
use lru_time_cache::{Entry, LruCache};
use shadowsocks::{
@@ -20,9 +20,9 @@ use shadowsocks::{
context::SharedContext,
net::{ConnectOpts, TcpStream as ShadowTcpStream, UdpSocket as ShadowUdpSocket},
relay::{
tcprelay::ProxyClientStream,
udprelay::{options::UdpSocketControlData, ProxySocket},
Address,
tcprelay::ProxyClientStream,
udprelay::{ProxySocket, options::UdpSocketControlData},
},
};
#[cfg(unix)]
@@ -34,9 +34,9 @@ use tokio::{
};
use crate::{
local::net::udp::generate_client_session_id,
net::{packet_window::PacketWindowFilter, FlowStat, MonProxySocket, MonProxyStream},
DEFAULT_UDP_EXPIRY_DURATION,
local::net::udp::generate_client_session_id,
net::{FlowStat, MonProxySocket, MonProxyStream, packet_window::PacketWindowFilter},
};
/// Collection of various DNS connections
@@ -231,8 +231,8 @@ impl DnsClient {
#[cfg(windows)]
fn check_peekable<F: std::os::windows::io::AsRawSocket>(s: &mut F) -> bool {
use windows_sys::{
Win32::Networking::WinSock::{MSG_PEEK, SOCKET, recv},
core::PSTR,
Win32::Networking::WinSock::{recv, MSG_PEEK, SOCKET},
};
let sock = s.as_raw_socket() as SOCKET;
@@ -75,9 +75,7 @@ macro_rules! map_domain_ip {
db.put(&name2ip_key, nv)?;
trace!(
"fakedns mapping {} -> {}, expires {}",
$domain,
i,
domain_name_mapping.expire_time
$domain, i, domain_name_mapping.expire_time
);
return Ok((i, $self.expire_duration));
} else {
@@ -94,9 +92,7 @@ macro_rules! map_domain_ip {
db.put(&ip2name_key, nv)?;
trace!(
"fakedns mapping {} -> {}, expires {}",
$domain,
i,
domain_name_mapping.expire_time
$domain, i, domain_name_mapping.expire_time
);
return Ok((i, $self.expire_duration));
}
@@ -141,9 +137,7 @@ macro_rules! map_domain_ip {
db.put(&name2ip_key, nv)?;
trace!(
"fakedns mapping {} -> {}, expires {} created",
$domain,
ip,
domain_name_mapping.expire_time
$domain, ip, domain_name_mapping.expire_time
);
return Ok((ip, $self.expire_duration));
@@ -3,10 +3,10 @@
use std::io;
use hickory_resolver::proto::{
op::{header::MessageType, response_code::ResponseCode, Header, Message, OpCode},
op::{Header, Message, OpCode, header::MessageType, response_code::ResponseCode},
rr::{
rdata::{A, AAAA},
DNSClass, RData, Record, RecordType,
rdata::{A, AAAA},
},
};
use log::{debug, trace, warn};
@@ -8,7 +8,7 @@ use std::{
time::Duration,
};
use futures::{future, FutureExt};
use futures::{FutureExt, future};
use ipnet::{Ipv4Net, Ipv6Net};
use shadowsocks::config::{Mode, ServerAddr};
@@ -10,11 +10,11 @@ use std::{
use byteorder::{BigEndian, ByteOrder};
use bytes::{BufMut, BytesMut};
use hickory_resolver::proto::{
op::{response_code::ResponseCode, Message},
op::{Message, response_code::ResponseCode},
serialize::binary::{BinEncodable, BinEncoder, EncodeMode},
};
use log::{error, trace};
use shadowsocks::{lookup_then, net::TcpListener as ShadowTcpListener, ServerAddr};
use shadowsocks::{ServerAddr, lookup_then, net::TcpListener as ShadowTcpListener};
use tokio::{
io::{AsyncReadExt, AsyncWriteExt},
net::TcpStream,
@@ -2,9 +2,9 @@
use std::{io, net::SocketAddr, sync::Arc, time::Duration};
use hickory_resolver::proto::op::{response_code::ResponseCode, Message};
use hickory_resolver::proto::op::{Message, response_code::ResponseCode};
use log::error;
use shadowsocks::{lookup_then, net::UdpSocket as ShadowUdpSocket, ServerAddr};
use shadowsocks::{ServerAddr, lookup_then, net::UdpSocket as ShadowUdpSocket};
use tokio::time;
use crate::local::context::ServiceContext;
@@ -12,13 +12,13 @@ use std::{
time::{Duration, Instant},
};
use http::{header::InvalidHeaderValue, HeaderValue, Method as HttpMethod, Uri, Version as HttpVersion};
use http::{HeaderValue, Method as HttpMethod, Uri, Version as HttpVersion, header::InvalidHeaderValue};
use hyper::{
Request, Response,
body::{self, Body},
client::conn::{http1, http2},
http::uri::Scheme,
rt::{Sleep, Timer},
Request, Response,
};
use log::{error, trace};
use lru_time_cache::LruCache;
@@ -229,8 +229,7 @@ where
if check_keep_alive(response.version(), response.headers(), false) {
trace!(
"HTTP connection keep-alive for host: {}, response: {:?}",
host,
response
host, response
);
self.cache_conn
.lock()
@@ -284,8 +283,7 @@ where
) -> io::Result<HttpConnection<B>> {
trace!(
"HTTP making new HTTP/1.1 connection to host: {}, scheme: {}",
host,
scheme
host, scheme
);
let stream = ProxyHttpStream::connect_http(stream);
@@ -3,12 +3,11 @@
use std::{net::SocketAddr, str::FromStr, sync::Arc};
use bytes::Bytes;
use http_body_util::{combinators::BoxBody, BodyExt};
use http_body_util::{BodyExt, combinators::BoxBody};
use hyper::{
body,
HeaderMap, Method, Request, Response, StatusCode, Uri, Version, body,
header::{self, HeaderValue},
http::uri::{Authority, Scheme},
HeaderMap, Method, Request, Response, StatusCode, Uri, Version,
};
use log::{debug, error, trace};
use shadowsocks::relay::Address;
@@ -65,8 +65,8 @@ impl ProxyHttpStream {
use rustls_native_certs::CertificateResult;
use std::sync::Arc;
use tokio_rustls::{
rustls::{pki_types::ServerName, ClientConfig, RootCertStore},
TlsConnector,
rustls::{ClientConfig, RootCertStore, pki_types::ServerName},
};
static TLS_CONFIG: Lazy<Arc<ClientConfig>> = Lazy::new(|| {
@@ -7,9 +7,9 @@ use std::{
};
use hyper::{
HeaderMap, Uri, Version,
header::{self, HeaderValue},
http::uri::Authority,
HeaderMap, Uri, Version,
};
use log::error;
use shadowsocks::relay::socks5::Address;
@@ -7,8 +7,8 @@ use std::{
iter::Iterator,
net::{Ipv4Addr, SocketAddr},
sync::{
atomic::{AtomicUsize, Ordering},
Arc,
atomic::{AtomicUsize, Ordering},
},
time::{Duration, Instant},
};
@@ -18,14 +18,14 @@ use byte_string::ByteStr;
use futures::future;
use log::{debug, error, info, trace, warn};
use shadowsocks::{
ServerConfig,
config::{Mode, ServerSource},
plugin::{Plugin, PluginMode},
relay::{
socks5::Address,
tcprelay::proxy_stream::ProxyClientStream,
udprelay::{options::UdpSocketControlData, proxy_socket::ProxySocket, MAXIMUM_UDP_PAYLOAD_SIZE},
udprelay::{MAXIMUM_UDP_PAYLOAD_SIZE, options::UdpSocketControlData, proxy_socket::ProxySocket},
},
ServerConfig,
};
use spin::Mutex as SpinMutex;
use tokio::{
@@ -39,7 +39,7 @@ use crate::{config::ServerInstanceConfig, local::context::ServiceContext};
use super::{
server_data::ServerIdent,
server_stat::{Score, DEFAULT_CHECK_INTERVAL_SEC, DEFAULT_CHECK_TIMEOUT_SEC},
server_stat::{DEFAULT_CHECK_INTERVAL_SEC, DEFAULT_CHECK_TIMEOUT_SEC, Score},
};
const EXPECTED_CHECK_POINTS_IN_CHECK_WINDOW: u32 = 67;
@@ -4,13 +4,13 @@ use std::{
fmt::{self, Debug},
net::SocketAddr,
sync::{
atomic::{AtomicU32, Ordering},
Arc,
atomic::{AtomicU32, Ordering},
},
time::Duration,
};
use shadowsocks::{net::ConnectOpts, ServerConfig};
use shadowsocks::{ServerConfig, net::ConnectOpts};
use tokio::sync::Mutex;
use crate::{config::ServerInstanceConfig, local::context::ServiceContext};
@@ -106,8 +106,12 @@ impl Server {
let server = &inst.config;
if server.method().is_stream() {
log::warn!("stream cipher {} for server {} have inherent weaknesses (see discussion in https://github.com/shadowsocks/shadowsocks-org/issues/36). \
DO NOT USE. It will be removed in the future.", server.method(), server.addr());
log::warn!(
"stream cipher {} for server {} have inherent weaknesses (see discussion in https://github.com/shadowsocks/shadowsocks-org/issues/36). \
DO NOT USE. It will be removed in the future.",
server.method(),
server.addr()
);
}
}
@@ -13,23 +13,23 @@ use bytes::Bytes;
use futures::future;
use log::{debug, error, trace, warn};
use lru_time_cache::LruCache;
use rand::{rngs::SmallRng, Rng, SeedableRng};
use rand::{Rng, SeedableRng, rngs::SmallRng};
use tokio::{sync::mpsc, task::JoinHandle, time};
use shadowsocks::{
lookup_then,
net::{AddrFamily, UdpSocket as ShadowUdpSocket},
relay::{
udprelay::{options::UdpSocketControlData, ProxySocket, MAXIMUM_UDP_PAYLOAD_SIZE},
Address,
udprelay::{MAXIMUM_UDP_PAYLOAD_SIZE, ProxySocket, options::UdpSocketControlData},
},
};
use crate::{
local::{context::ServiceContext, loadbalancing::PingBalancer},
net::{
packet_window::PacketWindowFilter, MonProxySocket, UDP_ASSOCIATION_KEEP_ALIVE_CHANNEL_SIZE,
UDP_ASSOCIATION_SEND_CHANNEL_SIZE,
MonProxySocket, UDP_ASSOCIATION_KEEP_ALIVE_CHANNEL_SIZE, UDP_ASSOCIATION_SEND_CHANNEL_SIZE,
packet_window::PacketWindowFilter,
},
};
@@ -1,5 +1,5 @@
#[allow(unused_imports)]
pub use self::association::{generate_client_session_id, UdpAssociationManager, UdpInboundWrite};
pub use self::association::{UdpAssociationManager, UdpInboundWrite, generate_client_session_id};
pub mod association;
pub mod listener;
@@ -19,7 +19,7 @@ use mime::Mime;
use shadowsocks::config::ServerSource;
use tokio::time;
use self::content_encoding::{read_body, ContentEncoding};
use self::content_encoding::{ContentEncoding, read_body};
mod content_encoding;
@@ -214,7 +214,8 @@ impl OnlineConfigService {
let finish_time = Instant::now();
debug!("server-loader task finished loading {} servers from url: {}, fetch time: {:?}, read time: {:?}, load time: {:?}, total time: {:?}",
debug!(
"server-loader task finished loading {} servers from url: {}, fetch time: {:?}, read time: {:?}, load time: {:?}, total time: {:?}",
server_len,
self.config_url,
fetch_time - start_time,
@@ -2,8 +2,8 @@
use std::{io, sync::Arc, time::Duration};
use futures::{future, FutureExt};
use shadowsocks::{config::Mode, ServerAddr};
use futures::{FutureExt, future};
use shadowsocks::{ServerAddr, config::Mode};
use crate::{
config::RedirType,
@@ -13,7 +13,7 @@ use nix::ioctl_readwrite;
use once_cell::sync::Lazy;
use socket2::{Protocol, SockAddr};
use super::pfvar::{in6_addr, in_addr, pfioc_natlook, sockaddr_in, sockaddr_in6, PF_OUT};
use super::pfvar::{PF_OUT, in_addr, in6_addr, pfioc_natlook, sockaddr_in, sockaddr_in6};
#[cfg(any(target_os = "macos", target_os = "ios"))]
use super::pfvar::{pf_addr, pfioc_states, pfsync_state};
@@ -3524,7 +3524,7 @@ unsafe extern "C" {
}
unsafe extern "C" {
pub fn cpuset_getid(arg1: cpulevel_t, arg2: cpuwhich_t, arg3: id_t, arg4: *mut cpusetid_t)
-> ::std::os::raw::c_int;
-> ::std::os::raw::c_int;
}
unsafe extern "C" {
pub fn cpuset_getaffinity(
@@ -6739,7 +6739,7 @@ unsafe extern "C" {
}
unsafe extern "C" {
pub fn clock_getcpuclockid2(arg1: id_t, arg2: ::std::os::raw::c_int, arg3: *mut clockid_t)
-> ::std::os::raw::c_int;
-> ::std::os::raw::c_int;
}
unsafe extern "C" {
pub fn futimes(arg1: ::std::os::raw::c_int, arg2: *const timeval) -> ::std::os::raw::c_int;
@@ -7562,11 +7562,11 @@ unsafe extern "C" {
}
unsafe extern "C" {
pub fn getpeername(arg1: ::std::os::raw::c_int, arg2: *mut sockaddr, arg3: *mut socklen_t)
-> ::std::os::raw::c_int;
-> ::std::os::raw::c_int;
}
unsafe extern "C" {
pub fn getsockname(arg1: ::std::os::raw::c_int, arg2: *mut sockaddr, arg3: *mut socklen_t)
-> ::std::os::raw::c_int;
-> ::std::os::raw::c_int;
}
unsafe extern "C" {
pub fn getsockopt(
@@ -7644,7 +7644,7 @@ unsafe extern "C" {
}
unsafe extern "C" {
pub fn sendmmsg(arg1: ::std::os::raw::c_int, arg2: *mut mmsghdr, arg3: usize, arg4: ::std::os::raw::c_int)
-> isize;
-> isize;
}
unsafe extern "C" {
pub fn setfib(arg1: ::std::os::raw::c_int) -> ::std::os::raw::c_int;
@@ -10859,12 +10859,12 @@ unsafe extern "C" {
unsafe extern "C" {
#[link_name = "\u{1}_getpeername$UNIX2003"]
pub fn getpeername(arg1: ::std::os::raw::c_int, arg2: *mut sockaddr, arg3: *mut socklen_t)
-> ::std::os::raw::c_int;
-> ::std::os::raw::c_int;
}
unsafe extern "C" {
#[link_name = "\u{1}_getsockname$UNIX2003"]
pub fn getsockname(arg1: ::std::os::raw::c_int, arg2: *mut sockaddr, arg3: *mut socklen_t)
-> ::std::os::raw::c_int;
-> ::std::os::raw::c_int;
}
unsafe extern "C" {
pub fn getsockopt(
@@ -1134,7 +1134,7 @@ pub const uio_seg_UIO_SYSSPACE: uio_seg = 1;
pub type uio_seg = ::std::os::raw::c_uint;
unsafe extern "C" {
pub fn preadv(arg1: ::std::os::raw::c_int, arg2: *const iovec, arg3: ::std::os::raw::c_int, arg4: __off_t)
-> isize;
-> isize;
}
unsafe extern "C" {
pub fn pwritev(
@@ -1599,11 +1599,11 @@ unsafe extern "C" {
}
unsafe extern "C" {
pub fn getpeername(arg1: ::std::os::raw::c_int, arg2: *mut sockaddr, arg3: *mut socklen_t)
-> ::std::os::raw::c_int;
-> ::std::os::raw::c_int;
}
unsafe extern "C" {
pub fn getsockname(arg1: ::std::os::raw::c_int, arg2: *mut sockaddr, arg3: *mut socklen_t)
-> ::std::os::raw::c_int;
-> ::std::os::raw::c_int;
}
unsafe extern "C" {
pub fn getsockopt(
@@ -8,7 +8,7 @@ use std::{
};
use log::{debug, error, info, trace};
use shadowsocks::{lookup_then, net::TcpListener as ShadowTcpListener, relay::socks5::Address, ServerAddr};
use shadowsocks::{ServerAddr, lookup_then, net::TcpListener as ShadowTcpListener, relay::socks5::Address};
use tokio::{
net::{TcpListener, TcpStream},
time,
@@ -4,7 +4,7 @@ use std::{
};
use log::warn;
use shadowsocks::net::{is_dual_stack_addr, set_tcp_fastopen, AcceptOpts};
use shadowsocks::net::{AcceptOpts, is_dual_stack_addr, set_tcp_fastopen};
use socket2::Protocol;
use tokio::net::{TcpListener, TcpSocket, TcpStream};
@@ -6,7 +6,7 @@ use std::{
};
use log::warn;
use shadowsocks::net::{is_dual_stack_addr, set_tcp_fastopen, AcceptOpts};
use shadowsocks::net::{AcceptOpts, is_dual_stack_addr, set_tcp_fastopen};
use socket2::SockAddr;
use tokio::net::{TcpListener, TcpSocket, TcpStream};
@@ -10,10 +10,9 @@ use std::{
use log::{debug, error, info, trace, warn};
use lru_time_cache::LruCache;
use shadowsocks::{
lookup_then,
net::{get_ip_stack_capabilities, ConnectOpts},
ServerAddr, lookup_then,
net::{ConnectOpts, get_ip_stack_capabilities},
relay::{socks5::Address, udprelay::MAXIMUM_UDP_PAYLOAD_SIZE},
ServerAddr,
};
use tokio::{sync::Mutex, task::JoinHandle, time};
@@ -186,10 +185,7 @@ impl UdpInboundWrite for UdpRedirInboundWriter {
trace!(
"udp redir send back data {} bytes, remote: {}, peer: {}, socket_opts: {:?}",
n,
remote_addr,
peer_addr,
self.socket_opts
n, remote_addr, peer_addr, self.socket_opts
);
Ok(())
@@ -2,8 +2,8 @@
use std::{io, sync::Arc, time::Duration};
use futures::{future, FutureExt};
use shadowsocks::{config::Mode, ServerAddr};
use futures::{FutureExt, future};
use shadowsocks::{ServerAddr, config::Mode};
use crate::local::{context::ServiceContext, loadbalancing::PingBalancer};
@@ -1,7 +1,7 @@
use std::{io, net::SocketAddr, sync::Arc, time::Duration};
use log::{error, info};
use shadowsocks::{config::Mode, net::TcpListener as ShadowTcpListener, ServerAddr};
use shadowsocks::{ServerAddr, config::Mode, net::TcpListener as ShadowTcpListener};
use tokio::{net::TcpStream, time};
#[cfg(feature = "local-http")]
@@ -9,12 +9,12 @@ use std::{
use log::{debug, error, trace, warn};
use shadowsocks::{
ServerAddr,
config::Mode,
relay::socks5::{
self, Address, Command, Error as Socks5Error, HandshakeRequest, HandshakeResponse, PasswdAuthRequest,
PasswdAuthResponse, Reply, TcpRequestHeader, TcpResponseHeader,
},
ServerAddr,
};
use tokio::net::TcpStream;
@@ -145,8 +145,7 @@ impl Socks5TcpHandler {
if self.auth.passwd.check_user(user_name, password) {
trace!(
"socks5 authenticated with Username/Password method, user: {}, password: {}",
user_name,
password
user_name, password
);
let rsp = PasswdAuthResponse::new(0);
@@ -11,11 +11,11 @@ use byte_string::ByteStr;
use bytes::{BufMut, BytesMut};
use log::{debug, error, info, trace};
use shadowsocks::{
ServerAddr,
relay::{
socks5::{Address, UdpAssociateHeader},
udprelay::MAXIMUM_UDP_PAYLOAD_SIZE,
},
ServerAddr,
};
use tokio::{net::UdpSocket, time};
@@ -23,7 +23,7 @@ use crate::{
local::{
context::ServiceContext,
loadbalancing::PingBalancer,
net::{udp::listener::create_standard_udp_listener, UdpAssociationManager, UdpInboundWrite},
net::{UdpAssociationManager, UdpInboundWrite, udp::listener::create_standard_udp_listener},
},
net::utils::to_ipv4_mapped,
};
@@ -186,9 +186,7 @@ impl Tun {
trace!(
"[TUN] tun device network: {} (address: {}, netmask: {})",
address_net,
address,
netmask
address_net, address, netmask
);
let address_broadcast = address_net.broadcast();
@@ -283,10 +281,7 @@ impl Tun {
if src_non_unicast || dst_non_unicast {
trace!(
"[TUN] IP packet {} (unicast? {}) -> {} (unicast? {}) throwing away",
src_ip_addr,
!src_non_unicast,
dst_ip_addr,
!dst_non_unicast
src_ip_addr, !src_non_unicast, dst_ip_addr, !dst_non_unicast
);
return Ok(());
}
@@ -320,11 +315,7 @@ impl Tun {
trace!(
"[TUN] TCP packet {} (unicast? {}) -> {} (unicast? {}) {}",
src_addr,
!src_non_unicast,
dst_addr,
!dst_non_unicast,
tcp_packet
src_addr, !src_non_unicast, dst_addr, !dst_non_unicast, tcp_packet
);
// TCP first handshake packet.
@@ -366,11 +357,7 @@ impl Tun {
let payload = udp_packet.payload();
trace!(
"[TUN] UDP packet {} (unicast? {}) -> {} (unicast? {}) {}",
src_addr,
!src_non_unicast,
dst_addr,
!dst_non_unicast,
udp_packet
src_addr, !src_non_unicast, dst_addr, !dst_non_unicast, udp_packet
);
if let Err(err) = self.udp.handle_packet(src_addr, dst_addr, payload).await {
@@ -6,8 +6,8 @@ use std::{
net::{IpAddr, SocketAddr},
pin::Pin,
sync::{
atomic::{AtomicBool, Ordering},
Arc,
atomic::{AtomicBool, Ordering},
},
task::{Context, Poll, Waker},
thread::{self, JoinHandle, Thread},
@@ -3,8 +3,8 @@
use std::{
marker::PhantomData,
sync::{
atomic::{AtomicBool, Ordering},
Arc,
atomic::{AtomicBool, Ordering},
},
};
@@ -2,8 +2,8 @@
use std::{io, sync::Arc, time::Duration};
use futures::{future, FutureExt};
use shadowsocks::{config::Mode, relay::socks5::Address, ServerAddr};
use futures::{FutureExt, future};
use shadowsocks::{ServerAddr, config::Mode, relay::socks5::Address};
use crate::local::{context::ServiceContext, loadbalancing::PingBalancer};
@@ -3,13 +3,13 @@
use std::{io, net::SocketAddr, sync::Arc, time::Duration};
use log::{error, info, trace};
use shadowsocks::{net::TcpListener as ShadowTcpListener, relay::socks5::Address, ServerAddr};
use shadowsocks::{ServerAddr, net::TcpListener as ShadowTcpListener, relay::socks5::Address};
use tokio::{net::TcpStream, time};
use crate::local::{
context::ServiceContext,
loadbalancing::PingBalancer,
net::{tcp::listener::create_standard_tcp_listener, AutoProxyClientStream},
net::{AutoProxyClientStream, tcp::listener::create_standard_tcp_listener},
utils::{establish_tcp_tunnel, establish_tcp_tunnel_bypassed},
};
@@ -4,15 +4,15 @@ use std::{io, net::SocketAddr, sync::Arc, time::Duration};
use log::{debug, error, info};
use shadowsocks::{
relay::{socks5::Address, udprelay::MAXIMUM_UDP_PAYLOAD_SIZE},
ServerAddr,
relay::{socks5::Address, udprelay::MAXIMUM_UDP_PAYLOAD_SIZE},
};
use tokio::{net::UdpSocket, time};
use crate::local::{
context::ServiceContext,
loadbalancing::PingBalancer,
net::{udp::listener::create_standard_udp_listener, UdpAssociationManager, UdpInboundWrite},
net::{UdpAssociationManager, UdpInboundWrite, udp::listener::create_standard_udp_listener},
};
pub struct TunnelUdpServerBuilder {
@@ -8,7 +8,7 @@ use shadowsocks::{
relay::{socks5::Address, tcprelay::utils::copy_encrypted_bidirectional},
};
use tokio::{
io::{copy_bidirectional, AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt},
io::{AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt, copy_bidirectional},
time,
};
@@ -60,8 +60,7 @@ where
trace!(
"tcp tunnel {} -> {} (proxied) sent handshake without data",
peer_addr,
target_addr
peer_addr, target_addr
);
}
}
@@ -71,18 +70,13 @@ where
Ok((wn, rn)) => {
trace!(
"tcp tunnel {} <-> {} (proxied) closed, L2R {} bytes, R2L {} bytes",
peer_addr,
target_addr,
rn,
wn
peer_addr, target_addr, rn, wn
);
}
Err(err) => {
trace!(
"tcp tunnel {} <-> {} (proxied) closed with error: {}",
peer_addr,
target_addr,
err
peer_addr, target_addr, err
);
}
}
@@ -106,18 +100,13 @@ where
Ok((rn, wn)) => {
trace!(
"tcp tunnel {} <-> {} (bypassed) closed, L2R {} bytes, R2L {} bytes",
peer_addr,
target_addr,
rn,
wn
peer_addr, target_addr, rn, wn
);
}
Err(err) => {
trace!(
"tcp tunnel {} <-> {} (bypassed) closed with error: {}",
peer_addr,
target_addr,
err
peer_addr, target_addr, err
);
}
}
@@ -6,6 +6,7 @@ use std::{collections::HashMap, io, net::SocketAddr, sync::Arc, time::Duration};
use log::{error, info, trace};
use shadowsocks::{
ManagerListener, ServerAddr,
config::{Mode, ServerConfig, ServerType, ServerUser, ServerUserManager},
context::{Context, SharedContext},
crypto::CipherKind,
@@ -19,7 +20,6 @@ use shadowsocks::{
},
net::{AcceptOpts, ConnectOpts},
plugin::PluginConfig,
ManagerListener, ServerAddr,
};
use tokio::{sync::Mutex, task::JoinHandle};
@@ -3,11 +3,11 @@
use std::{io, net::SocketAddr, sync::Arc};
use shadowsocks::{
ProxySocket,
relay::{
socks5::Address,
udprelay::{options::UdpSocketControlData, DatagramReceive, DatagramSend},
udprelay::{DatagramReceive, DatagramSend, options::UdpSocketControlData},
},
ProxySocket,
};
use super::flow::FlowStat;
@@ -42,8 +42,12 @@ pub async fn run(config: Config) -> io::Result<()> {
let server = &inst.config;
if server.method().is_stream() {
log::warn!("stream cipher {} for server {} have inherent weaknesses (see discussion in https://github.com/shadowsocks/shadowsocks-org/issues/36). \
DO NOT USE. It will be removed in the future.", server.method(), server.addr());
log::warn!(
"stream cipher {} for server {} have inherent weaknesses (see discussion in https://github.com/shadowsocks/shadowsocks-org/issues/36). \
DO NOT USE. It will be removed in the future.",
server.method(),
server.addr()
);
}
}
@@ -10,11 +10,11 @@ use std::{
use futures::future;
use log::{error, trace};
use shadowsocks::{
ManagerClient,
config::{ManagerAddr, ServerConfig},
dns_resolver::DnsResolver,
net::{AcceptOpts, ConnectOpts},
plugin::{Plugin, PluginMode},
ManagerClient,
};
use tokio::time;
@@ -10,10 +10,10 @@ use std::{
use log::{debug, error, info, trace, warn};
use shadowsocks::{
ProxyListener, ServerConfig,
crypto::CipherKind,
net::{AcceptOpts, TcpStream as OutboundTcpStream},
relay::tcprelay::{utils::copy_encrypted_bidirectional, ProxyServerStream},
ProxyListener, ServerConfig,
relay::tcprelay::{ProxyServerStream, utils::copy_encrypted_bidirectional},
};
use tokio::{
io::{AsyncReadExt, AsyncWriteExt},
@@ -21,7 +21,7 @@ use tokio::{
time,
};
use crate::net::{utils::ignore_until_end, MonProxyStream};
use crate::net::{MonProxyStream, utils::ignore_until_end};
use super::context::ServiceContext;
@@ -179,8 +179,7 @@ impl TcpServerClient {
trace!(
"tcp silent-drop peer: {} is now closing with result {:?}",
self.peer_addr,
res
self.peer_addr, res
);
return Ok(());
@@ -189,8 +188,7 @@ impl TcpServerClient {
trace!(
"accepted tcp client connection {}, establishing tunnel to {}",
self.peer_addr,
target_addr
self.peer_addr, target_addr
);
if self.context.check_outbound_blocked(&target_addr).await {
@@ -244,8 +242,7 @@ impl TcpServerClient {
trace!(
"tcp tunnel {} -> {} sent TFO connect without data",
self.peer_addr,
target_addr
self.peer_addr, target_addr
);
}
}
@@ -262,18 +259,13 @@ impl TcpServerClient {
Ok((rn, wn)) => {
trace!(
"tcp tunnel {} <-> {} closed, L2R {} bytes, R2L {} bytes",
self.peer_addr,
target_addr,
rn,
wn
self.peer_addr, target_addr, rn, wn
);
}
Err(err) => {
trace!(
"tcp tunnel {} <-> {} closed with error: {}",
self.peer_addr,
target_addr,
err
self.peer_addr, target_addr, err
);
}
}
@@ -12,26 +12,26 @@ use bytes::Bytes;
use futures::future;
use log::{debug, error, info, trace, warn};
use lru_time_cache::LruCache;
use rand::{rngs::SmallRng, Rng, SeedableRng};
use rand::{Rng, SeedableRng, rngs::SmallRng};
use shadowsocks::{
ServerConfig,
config::ServerUser,
crypto::CipherCategory,
lookup_then,
net::{
get_ip_stack_capabilities, AcceptOpts, AddrFamily, UdpSocket as OutboundUdpSocket,
UdpSocket as InboundUdpSocket,
AcceptOpts, AddrFamily, UdpSocket as OutboundUdpSocket, UdpSocket as InboundUdpSocket,
get_ip_stack_capabilities,
},
relay::{
socks5::Address,
udprelay::{options::UdpSocketControlData, ProxySocket, MAXIMUM_UDP_PAYLOAD_SIZE},
udprelay::{MAXIMUM_UDP_PAYLOAD_SIZE, ProxySocket, options::UdpSocketControlData},
},
ServerConfig,
};
use tokio::{runtime::Handle, sync::mpsc, task::JoinHandle, time};
use crate::net::{
packet_window::PacketWindowFilter, utils::to_ipv4_mapped, MonProxySocket, UDP_ASSOCIATION_KEEP_ALIVE_CHANNEL_SIZE,
UDP_ASSOCIATION_SEND_CHANNEL_SIZE,
MonProxySocket, UDP_ASSOCIATION_KEEP_ALIVE_CHANNEL_SIZE, UDP_ASSOCIATION_SEND_CHANNEL_SIZE,
packet_window::PacketWindowFilter, utils::to_ipv4_mapped,
};
use super::context::ServiceContext;
@@ -86,7 +86,7 @@ tokio = { version = "1.9.0", features = [
"time",
] }
hickory-resolver = { version = "=0.25.0-alpha.5", optional = true }
hickory-resolver = { version = "0.25", optional = true }
arc-swap = { version = "1.7", optional = true }
notify = { version = "8.0", optional = true }
@@ -500,7 +500,10 @@ where
debug_assert_eq!(method.key_len(), 0);
if !password.is_empty() {
warn!("method \"none\" doesn't need a password, which should be set as an empty String, but password.len() = {}", password.len());
warn!(
"method \"none\" doesn't need a password, which should be set as an empty String, but password.len() = {}",
password.len()
);
}
return Ok((password, Vec::new().into_boxed_slice(), Vec::new()));
@@ -10,21 +10,20 @@ use std::{
time::Duration,
};
use cfg_if::cfg_if;
use futures::ready;
use hickory_resolver::{
ResolveError, Resolver,
config::{LookupIpStrategy, ResolverConfig, ResolverOpts},
name_server::GenericConnector,
proto::{
runtime::{iocompat::AsyncIoTokioAsStd, RuntimeProvider, TokioHandle, TokioTime},
runtime::{RuntimeProvider, TokioHandle, TokioTime, iocompat::AsyncIoTokioAsStd},
udp::DnsUdpSocket,
},
ResolveError, Resolver,
};
use log::trace;
use log::{error, trace};
use tokio::{io::ReadBuf, net::UdpSocket};
use crate::net::{tcp::TcpStream as ShadowTcpStream, udp::UdpSocket as ShadowUdpSocket, ConnectOpts};
use crate::net::{ConnectOpts, tcp::TcpStream as ShadowTcpStream, udp::UdpSocket as ShadowUdpSocket};
/// Shadowsocks hickory-dns Runtime Provider
#[derive(Clone)]
@@ -130,7 +129,17 @@ pub async fn create_resolver(
// Customized dns resolution
match dns {
Some(conf) => {
let mut resolver_opts = opts.unwrap_or_default();
trace!("initializing DNS resolver with config {:?}", conf,);
let mut builder = DnsResolver::builder_with_config(
conf,
ShadowDnsConnectionProvider::new(ShadowDnsRuntimeProvider::new(connect_opts)),
);
if let Some(opts) = opts {
*builder.options_mut() = opts;
}
let resolver_opts = builder.options_mut();
// Use Ipv4AndIpv6 strategy. Because Ipv4ThenIpv6 or Ipv6ThenIpv4 will return if the first query returned.
// Since we want to use Happy Eyeballs to connect to both IPv4 and IPv6 addresses, we need both A and AAAA records.
resolver_opts.ip_strategy = LookupIpStrategy::Ipv4AndIpv6;
@@ -138,39 +147,19 @@ pub async fn create_resolver(
// Enable EDNS0 for large records
resolver_opts.edns0 = true;
trace!(
"initializing DNS resolver with config {:?} opts {:?}",
conf,
resolver_opts
);
Ok(DnsResolver::new(
conf,
resolver_opts,
ShadowDnsConnectionProvider::new(ShadowDnsRuntimeProvider::new(connect_opts)),
))
trace!("initializing DNS resolver with opts {:?}", resolver_opts);
Ok(builder.build())
}
// To make this independent, if targeting macOS, BSD, Linux, or Windows, we can use the system's configuration
// Android doesn't have /etc/resolv.conf.
None => {
cfg_if! {
if #[cfg(any(all(unix, not(target_os = "android")), windows))] {
use hickory_resolver::system_conf::read_system_conf;
// use the system resolver configuration
let (config, mut opts) = match read_system_conf() {
Ok(o) => o,
Err(err) => {
use log::error;
error!("failed to initialize DNS resolver with system-config, error: {}", err);
// From::from is required because on error type is different on Windows
#[allow(clippy::useless_conversion)]
return Err(From::from(err));
}
};
match DnsResolver::builder(ShadowDnsConnectionProvider::new(ShadowDnsRuntimeProvider::new(
connect_opts,
))) {
Ok(mut builder) => {
let opts = builder.options_mut();
// NOTE: timeout will be set by config (for example, /etc/resolv.conf on UNIX-like system)
//
// Only ip_strategy should be changed. Why Ipv4AndIpv6? See comments above.
@@ -179,15 +168,15 @@ pub async fn create_resolver(
// Enable EDNS0 for large records
opts.edns0 = true;
trace!(
"initializing DNS resolver with system-config {:?} opts {:?}",
config,
opts
);
trace!("initializing DNS resolver with system-config opts {:?}", opts);
Ok(DnsResolver::new(config, opts, ShadowDnsConnectionProvider::new(ShadowDnsRuntimeProvider::new(connect_opts))))
} else {
Err(ResolveError::from("current platform doesn't support hickory-dns resolver with system configured".to_owned()))
Ok(builder.build())
}
Err(err) => {
error!("initialize DNS resolver with system-config failed, error: {}", err);
Err(ResolveError::from(
"current platform doesn't support hickory-dns resolver with system configured".to_owned(),
))
}
}
}
@@ -18,7 +18,7 @@ use hickory_resolver::config::ResolverConfig;
use hickory_resolver::config::ResolverOpts;
#[cfg(all(feature = "hickory-dns", unix, not(target_os = "android")))]
use log::error;
use log::{log_enabled, trace, Level};
use log::{Level, log_enabled, trace};
use tokio::net::lookup_host;
#[cfg(all(feature = "hickory-dns", unix, not(target_os = "android")))]
use tokio::task::JoinHandle;
@@ -290,7 +290,11 @@ impl DnsResolver {
}
/// Resolve address into `SocketAddr`s
pub async fn resolve<'a>(&self, addr: &'a str, port: u16) -> io::Result<impl Iterator<Item = SocketAddr> + 'a + use<'a>> {
pub async fn resolve<'a>(
&self,
addr: &'a str,
port: u16,
) -> io::Result<impl Iterator<Item = SocketAddr> + 'a + use<'a>> {
struct ResolverLogger<'x, 'y> {
resolver: &'x DnsResolver,
addr: &'y str,

Some files were not shown because too many files have changed in this diff Show More