Update On Fri Feb 21 19:39:29 CET 2025

This commit is contained in:
github-action[bot]
2025-02-21 19:39:29 +01:00
parent a3347a4405
commit 2d0e13d01e
49 changed files with 531 additions and 378 deletions
+1
View File
@@ -920,3 +920,4 @@ Update On Mon Feb 17 19:35:15 CET 2025
Update On Tue Feb 18 19:34:22 CET 2025
Update On Wed Feb 19 19:34:28 CET 2025
Update On Thu Feb 20 19:35:19 CET 2025
Update On Fri Feb 21 19:39:19 CET 2025
+2
View File
@@ -42,6 +42,7 @@ type AnyTLSOption struct {
UDP bool `proxy:"udp,omitempty"`
IdleSessionCheckInterval int `proxy:"idle-session-check-interval,omitempty"`
IdleSessionTimeout int `proxy:"idle-session-timeout,omitempty"`
MinIdleSession int `proxy:"min-idle-session,omitempty"`
}
func (t *AnyTLS) DialContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (_ C.Conn, err error) {
@@ -98,6 +99,7 @@ func NewAnyTLS(option AnyTLSOption) (*AnyTLS, error) {
Dialer: singDialer,
IdleSessionCheckInterval: time.Duration(option.IdleSessionCheckInterval) * time.Second,
IdleSessionTimeout: time.Duration(option.IdleSessionTimeout) * time.Second,
MinIdleSession: option.MinIdleSession,
}
tlsConfig := &vmess.TLSConfig{
Host: option.SNI,
+1
View File
@@ -874,6 +874,7 @@ proxies: # socks5
udp: true
# idle-session-check-interval: 30 # seconds
# idle-session-timeout: 30 # seconds
# min-idle-session: 0
# sni: "example.com"
# alpn:
# - h2
+8 -8
View File
@@ -22,19 +22,19 @@ type ClientConfig struct {
Password string
IdleSessionCheckInterval time.Duration
IdleSessionTimeout time.Duration
MinIdleSession int
Server M.Socksaddr
Dialer N.Dialer
TLSConfig *vmess.TLSConfig
}
type Client struct {
passwordSha256 []byte
tlsConfig *vmess.TLSConfig
clientFingerprint string
dialer N.Dialer
server M.Socksaddr
sessionClient *session.Client
padding atomic.TypedValue[*padding.PaddingFactory]
passwordSha256 []byte
tlsConfig *vmess.TLSConfig
dialer N.Dialer
server M.Socksaddr
sessionClient *session.Client
padding atomic.TypedValue[*padding.PaddingFactory]
}
func NewClient(ctx context.Context, config ClientConfig) *Client {
@@ -47,7 +47,7 @@ func NewClient(ctx context.Context, config ClientConfig) *Client {
}
// Initialize the padding state of this client
padding.UpdatePaddingScheme(padding.DefaultPaddingScheme, &c.padding)
c.sessionClient = session.NewClient(ctx, c.CreateOutboundTLSConnection, &c.padding, config.IdleSessionCheckInterval, config.IdleSessionTimeout)
c.sessionClient = session.NewClient(ctx, c.CreateOutboundTLSConnection, &c.padding, config.IdleSessionCheckInterval, config.IdleSessionTimeout, config.MinIdleSession)
return c
}
+21 -6
View File
@@ -28,13 +28,15 @@ type Client struct {
padding *atomic.TypedValue[*padding.PaddingFactory]
idleSessionTimeout time.Duration
minIdleSession int
}
func NewClient(ctx context.Context, dialOut func(ctx context.Context) (net.Conn, error), _padding *atomic.TypedValue[*padding.PaddingFactory], idleSessionCheckInterval, idleSessionTimeout time.Duration) *Client {
func NewClient(ctx context.Context, dialOut func(ctx context.Context) (net.Conn, error), _padding *atomic.TypedValue[*padding.PaddingFactory], idleSessionCheckInterval, idleSessionTimeout time.Duration, minIdleSession int) *Client {
c := &Client{
dialOut: dialOut,
padding: _padding,
idleSessionTimeout: idleSessionTimeout,
minIdleSession: minIdleSession,
}
if idleSessionCheckInterval <= time.Second*5 {
idleSessionCheckInterval = time.Second * 30
@@ -138,17 +140,30 @@ func (c *Client) idleCleanup() {
}
func (c *Client) idleCleanupExpTime(expTime time.Time) {
var sessionToRemove = make([]*Session, 0)
sessionToRemove := make([]*Session, 0, c.idleSession.Len())
c.idleSessionLock.Lock()
it := c.idleSession.Iterate()
activeCount := 0
for it.IsNotEnd() {
session := it.Value()
if session.idleSince.Before(expTime) {
sessionToRemove = append(sessionToRemove, session)
c.idleSession.Remove(it.Key())
}
key := it.Key()
it.MoveToNext()
if !session.idleSince.Before(expTime) {
activeCount++
continue
}
if activeCount < c.minIdleSession {
session.idleSince = time.Now()
activeCount++
continue
}
sessionToRemove = append(sessionToRemove, session)
c.idleSession.Remove(key)
}
c.idleSessionLock.Unlock()
+17 -17
View File
@@ -1461,9 +1461,9 @@ dependencies = [
[[package]]
name = "clap"
version = "4.5.29"
version = "4.5.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8acebd8ad879283633b343856142139f2da2317c96b05b4dd6181c61e2480184"
checksum = "92b7b18d71fad5313a1e320fa9897994228ce274b60faa4d694fe0ea89cd9e6d"
dependencies = [
"clap_builder",
"clap_derive",
@@ -1471,9 +1471,9 @@ dependencies = [
[[package]]
name = "clap_builder"
version = "4.5.29"
version = "4.5.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f6ba32cbda51c7e1dfd49acc1457ba1a7dec5b64fe360e828acb13ca8dc9c2f9"
checksum = "a35db2071778a7344791a4fb4f95308b5673d219dee3ae348b86642574ecc90c"
dependencies = [
"anstream",
"anstyle",
@@ -1701,7 +1701,7 @@ version = "3.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fde0e0ec90c9dfb3b4b1a0891a7dcd0e2bffde2f7efed5fe7c9bb00e5bfb915e"
dependencies = [
"windows-sys 0.59.0",
"windows-sys 0.48.0",
]
[[package]]
@@ -2428,9 +2428,9 @@ checksum = "aac81fa3e28d21450aa4d2ac065992ba96a1d7303efbce51a95f4fd175b67562"
[[package]]
name = "document-features"
version = "0.2.10"
version = "0.2.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cb6969eaabd2421f8a2775cfd2471a2b634372b4a25d41e3bd647b79912850a0"
checksum = "95249b50c6c185bee49034bcb378a49dc2b5dff0be90ff6616d31d64febab05d"
dependencies = [
"litrs",
]
@@ -2794,7 +2794,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d"
dependencies = [
"libc",
"windows-sys 0.59.0",
"windows-sys 0.52.0",
]
[[package]]
@@ -2853,9 +2853,9 @@ checksum = "f8eb564c5c7423d25c886fb561d1e4ee69f72354d16918afa32c08811f6b6a55"
[[package]]
name = "fast_image_resize"
version = "5.1.1"
version = "5.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3d6b088992b0c2db53860aa4b43f299fd45aa85b835c744dec53c3f40231330d"
checksum = "b55264ccc579fc127eebf6c6c1841d0c160d79a44c8f6f97047b7bc4a9c0d1a5"
dependencies = [
"cfg-if",
"document-features",
@@ -4751,7 +4751,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34"
dependencies = [
"cfg-if",
"windows-targets 0.52.6",
"windows-targets 0.48.5",
]
[[package]]
@@ -4835,9 +4835,9 @@ checksum = "9374ef4228402d4b7e403e5838cb880d9ee663314b0a900d5a6aabf0c213552e"
[[package]]
name = "log"
version = "0.4.25"
version = "0.4.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f"
checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e"
[[package]]
name = "loop9"
@@ -6983,7 +6983,7 @@ dependencies = [
"once_cell",
"socket2",
"tracing",
"windows-sys 0.59.0",
"windows-sys 0.52.0",
]
[[package]]
@@ -7574,7 +7574,7 @@ dependencies = [
"errno",
"libc",
"linux-raw-sys",
"windows-sys 0.59.0",
"windows-sys 0.52.0",
]
[[package]]
@@ -9183,7 +9183,7 @@ dependencies = [
"getrandom 0.3.1",
"once_cell",
"rustix",
"windows-sys 0.59.0",
"windows-sys 0.52.0",
]
[[package]]
@@ -10786,7 +10786,7 @@ version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
dependencies = [
"windows-sys 0.59.0",
"windows-sys 0.48.0",
]
[[package]]
@@ -11,7 +11,7 @@
"build": "tsc"
},
"dependencies": {
"@tanstack/react-query": "5.66.7",
"@tanstack/react-query": "5.66.8",
"@tauri-apps/api": "2.2.0",
"ahooks": "3.8.4",
"lodash-es": "4.17.21",
@@ -21,7 +21,7 @@
"@mui/material": "6.4.5",
"@nyanpasu/interface": "workspace:^",
"@nyanpasu/ui": "workspace:^",
"@tailwindcss/postcss": "4.0.6",
"@tailwindcss/postcss": "4.0.7",
"@tanstack/router-zod-adapter": "1.81.5",
"@tauri-apps/api": "2.2.0",
"@types/json-schema": "7.0.15",
@@ -29,7 +29,7 @@
"allotment": "1.20.3",
"country-code-emoji": "2.3.0",
"dayjs": "1.11.13",
"framer-motion": "12.4.5",
"framer-motion": "12.4.7",
"i18next": "24.2.2",
"jotai": "2.12.1",
"json-schema": "0.4.0",
@@ -42,7 +42,7 @@
"react-fast-marquee": "1.6.5",
"react-hook-form-mui": "7.5.0",
"react-i18next": "15.4.1",
"react-markdown": "9.0.3",
"react-markdown": "9.1.0",
"react-split-grid": "1.0.4",
"react-use": "17.6.0",
"swr": "2.3.2",
@@ -53,12 +53,12 @@
"@csstools/normalize.css": "12.1.1",
"@emotion/babel-plugin": "11.13.5",
"@emotion/react": "11.14.0",
"@iconify/json": "2.2.308",
"@iconify/json": "2.2.309",
"@monaco-editor/react": "4.7.0",
"@tanstack/react-query": "5.66.7",
"@tanstack/react-router": "1.105.0",
"@tanstack/router-devtools": "1.105.0",
"@tanstack/router-plugin": "1.105.0",
"@tanstack/react-query": "5.66.8",
"@tanstack/react-router": "1.109.2",
"@tanstack/router-devtools": "1.109.2",
"@tanstack/router-plugin": "1.109.2",
"@tauri-apps/plugin-clipboard-manager": "2.2.1",
"@tauri-apps/plugin-dialog": "2.2.0",
"@tauri-apps/plugin-fs": "2.2.0",
@@ -81,7 +81,7 @@
"monaco-yaml": "5.3.1",
"nanoid": "5.1.0",
"sass-embedded": "1.85.0",
"shiki": "2.4.2",
"shiki": "2.5.0",
"unplugin-auto-import": "19.1.0",
"unplugin-icons": "22.1.0",
"validator": "13.12.0",
+2 -2
View File
@@ -28,13 +28,13 @@
"@vitejs/plugin-react": "4.3.4",
"ahooks": "3.8.4",
"d3": "7.9.0",
"framer-motion": "12.4.5",
"framer-motion": "12.4.7",
"react": "19.0.0",
"react-dom": "19.0.0",
"react-error-boundary": "5.0.0",
"react-i18next": "15.4.1",
"react-use": "17.6.0",
"tailwindcss": "4.0.6",
"tailwindcss": "4.0.7",
"vite": "6.1.1",
"vite-tsconfig-paths": "5.1.4"
},
+3 -3
View File
@@ -84,7 +84,7 @@
"eslint-plugin-react": "7.37.4",
"eslint-plugin-react-compiler": "19.0.0-beta-e552027-20250112",
"eslint-plugin-react-hooks": "5.1.0",
"globals": "15.15.0",
"globals": "16.0.0",
"knip": "5.44.4",
"lint-staged": "15.4.3",
"neostandard": "0.12.1",
@@ -95,7 +95,7 @@
"postcss-scss": "4.0.9",
"prettier": "3.5.1",
"prettier-plugin-tailwindcss": "0.6.11",
"prettier-plugin-toml": "2.0.1",
"prettier-plugin-toml": "2.0.2",
"react-devtools": "6.1.1",
"stylelint": "16.14.1",
"stylelint-config-html": "1.1.0",
@@ -104,7 +104,7 @@
"stylelint-declaration-block-no-ignored-properties": "2.8.0",
"stylelint-order": "6.0.4",
"stylelint-scss": "6.11.0",
"tailwindcss": "4.0.6",
"tailwindcss": "4.0.7",
"tsx": "4.19.3",
"typescript": "5.7.3",
"typescript-eslint": "8.24.1"
+187 -187
View File
@@ -100,8 +100,8 @@ importers:
specifier: 5.1.0
version: 5.1.0(eslint@9.20.1(jiti@2.4.2))
globals:
specifier: 15.15.0
version: 15.15.0
specifier: 16.0.0
version: 16.0.0
knip:
specifier: 5.44.4
version: 5.44.4(@types/node@22.13.4)(typescript@5.7.3)
@@ -133,8 +133,8 @@ importers:
specifier: 0.6.11
version: 0.6.11(@ianvs/prettier-plugin-sort-imports@4.4.1(prettier@3.5.1))(@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.5.1))(prettier@3.5.1)
prettier-plugin-toml:
specifier: 2.0.1
version: 2.0.1(prettier@3.5.1)
specifier: 2.0.2
version: 2.0.2(prettier@3.5.1)
react-devtools:
specifier: 6.1.1
version: 6.1.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)
@@ -160,8 +160,8 @@ importers:
specifier: 6.11.0
version: 6.11.0(stylelint@16.14.1(typescript@5.7.3))
tailwindcss:
specifier: 4.0.6
version: 4.0.6
specifier: 4.0.7
version: 4.0.7
tsx:
specifier: 4.19.3
version: 4.19.3
@@ -175,8 +175,8 @@ importers:
frontend/interface:
dependencies:
'@tanstack/react-query':
specifier: 5.66.7
version: 5.66.7(react@19.0.0)
specifier: 5.66.8
version: 5.66.8(react@19.0.0)
'@tauri-apps/api':
specifier: 2.2.0
version: 2.2.0
@@ -239,11 +239,11 @@ importers:
specifier: workspace:^
version: link:../ui
'@tailwindcss/postcss':
specifier: 4.0.6
version: 4.0.6
specifier: 4.0.7
version: 4.0.7
'@tanstack/router-zod-adapter':
specifier: 1.81.5
version: 1.81.5(@tanstack/react-router@1.105.0(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.109.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(zod@3.24.2)
'@tauri-apps/api':
specifier: 2.2.0
version: 2.2.0
@@ -263,8 +263,8 @@ importers:
specifier: 1.11.13
version: 1.11.13
framer-motion:
specifier: 12.4.5
version: 12.4.5(@emotion/is-prop-valid@1.3.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
specifier: 12.4.7
version: 12.4.7(@emotion/is-prop-valid@1.3.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
i18next:
specifier: 24.2.2
version: 24.2.2(typescript@5.7.3)
@@ -302,8 +302,8 @@ importers:
specifier: 15.4.1
version: 15.4.1(i18next@24.2.2(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
react-markdown:
specifier: 9.0.3
version: 9.0.3(@types/react@19.0.10)(react@19.0.0)
specifier: 9.1.0
version: 9.1.0(@types/react@19.0.10)(react@19.0.0)
react-split-grid:
specifier: 1.0.4
version: 1.0.4(react@19.0.0)
@@ -330,23 +330,23 @@ importers:
specifier: 11.14.0
version: 11.14.0(@types/react@19.0.10)(react@19.0.0)
'@iconify/json':
specifier: 2.2.308
version: 2.2.308
specifier: 2.2.309
version: 2.2.309
'@monaco-editor/react':
specifier: 4.7.0
version: 4.7.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
'@tanstack/react-query':
specifier: 5.66.7
version: 5.66.7(react@19.0.0)
specifier: 5.66.8
version: 5.66.8(react@19.0.0)
'@tanstack/react-router':
specifier: 1.105.0
version: 1.105.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
specifier: 1.109.2
version: 1.109.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
'@tanstack/router-devtools':
specifier: 1.105.0
version: 1.105.0(@tanstack/react-router@1.105.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(csstype@3.1.3)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
specifier: 1.109.2
version: 1.109.2(@tanstack/react-router@1.109.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(csstype@3.1.3)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
'@tanstack/router-plugin':
specifier: 1.105.0
version: 1.105.0(@tanstack/react-router@1.105.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(vite@6.1.1(@types/node@22.13.4)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.0)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))
specifier: 1.109.2
version: 1.109.2(@tanstack/react-router@1.109.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(vite@6.1.1(@types/node@22.13.4)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.0)(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.1
version: 2.2.1
@@ -414,8 +414,8 @@ importers:
specifier: 1.85.0
version: 1.85.0
shiki:
specifier: 2.4.2
version: 2.4.2
specifier: 2.5.0
version: 2.5.0
unplugin-auto-import:
specifier: 19.1.0
version: 19.1.0
@@ -483,8 +483,8 @@ importers:
specifier: 7.9.0
version: 7.9.0
framer-motion:
specifier: 12.4.5
version: 12.4.5(@emotion/is-prop-valid@1.3.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
specifier: 12.4.7
version: 12.4.7(@emotion/is-prop-valid@1.3.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
react:
specifier: 19.0.0
version: 19.0.0
@@ -501,8 +501,8 @@ importers:
specifier: 17.6.0
version: 17.6.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
tailwindcss:
specifier: 4.0.6
version: 4.0.6
specifier: 4.0.7
version: 4.0.7
vite:
specifier: 6.1.1
version: 6.1.1(@types/node@22.13.4)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.0)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)
@@ -1821,8 +1821,8 @@ packages:
'@vue/compiler-sfc':
optional: true
'@iconify/json@2.2.308':
resolution: {integrity: sha512-tT+fOVu/cU9Q6GOZfFE+rcfrK4rqwM7ucn3PnTXG+bIcr9PmuvJExZ4oSXwdgPKLdjPqFnQFGgEvDtWFfJVP2g==}
'@iconify/json@2.2.309':
resolution: {integrity: sha512-xgaPDmVNeHmggEDHrbyntqPw8YzqIf96XOOqC7HbbDS4lf4a6mvYVCDYINSZjsw2Wvak3CL7PZLQ9ZgqoypMtg==}
'@iconify/types@2.0.0':
resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==}
@@ -2618,23 +2618,23 @@ packages:
'@rushstack/ts-command-line@4.23.3':
resolution: {integrity: sha512-HazKL8fv4HMQMzrKJCrOrhyBPPdzk7iajUXgsASwjQ8ROo1cmgyqxt/k9+SdmrNLGE1zATgRqMUH3s/6smbRMA==}
'@shikijs/core@2.4.2':
resolution: {integrity: sha512-V0kXYB/70xA3CO+b2Pz9kcSThaOUfObOEkGeHsKSFqV6rultaWPfeyZPpBlKHMUXO9Bt1ZGINDCctN90pQvnTg==}
'@shikijs/core@2.5.0':
resolution: {integrity: sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==}
'@shikijs/engine-javascript@2.4.2':
resolution: {integrity: sha512-WRg63Lfta+5RJ0y0/ns1e1NqSxo+jSQclMf9kBHvtchLhR/x3R/E3PSNFiCM+t7oo+d9/VCCp1kURqsSVTHWJg==}
'@shikijs/engine-javascript@2.5.0':
resolution: {integrity: sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==}
'@shikijs/engine-oniguruma@2.4.2':
resolution: {integrity: sha512-YmvW7XcvT2f2pf1r1IvKd48fFYcsZRMMISRr2nY1fE2uOF4xcm+84R7+yg4jNAblrFcXU9tDrkllJKH2uD3mBQ==}
'@shikijs/engine-oniguruma@2.5.0':
resolution: {integrity: sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==}
'@shikijs/langs@2.4.2':
resolution: {integrity: sha512-USwSIDIxalwON4FSE2IFMGmAvM250RNdWjOf79zj2JjV2fsNJWn0vvEE9gh1WtvPp2l5BXXhdybFYA6ek7ogFQ==}
'@shikijs/langs@2.5.0':
resolution: {integrity: sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w==}
'@shikijs/themes@2.4.2':
resolution: {integrity: sha512-W6uxyv91JWI6udgBpsSRCdmIp8WPxOq5Ys9Nj9royB+Or8sYmvnEBHLw6f+dZB9DIlFgvRPw5VnlwUx5ofKMKA==}
'@shikijs/themes@2.5.0':
resolution: {integrity: sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw==}
'@shikijs/types@2.4.2':
resolution: {integrity: sha512-e28aFDPwVgK8H2nPrEA5CexLa5yumBvb5aF6nN4SlmqaBFOuGQdxX/Cfh8rwRFALepJtlj0P3wvJ4oL+ndxgSA==}
'@shikijs/types@2.5.0':
resolution: {integrity: sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==}
'@shikijs/vscode-textmate@10.0.2':
resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==}
@@ -2801,81 +2801,81 @@ packages:
resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==}
engines: {node: '>=10'}
'@tailwindcss/node@4.0.6':
resolution: {integrity: sha512-jb6E0WeSq7OQbVYcIJ6LxnZTeC4HjMvbzFBMCrQff4R50HBlo/obmYNk6V2GCUXDeqiXtvtrQgcIbT+/boB03Q==}
'@tailwindcss/node@4.0.7':
resolution: {integrity: sha512-dkFXufkbRB2mu3FPsW5xLAUWJyexpJA+/VtQj18k3SUiJVLdpgzBd1v1gRRcIpEJj7K5KpxBKfOXlZxT3ZZRuA==}
'@tailwindcss/oxide-android-arm64@4.0.6':
resolution: {integrity: sha512-xDbym6bDPW3D2XqQqX3PjqW3CKGe1KXH7Fdkc60sX5ZLVUbzPkFeunQaoP+BuYlLc2cC1FoClrIRYnRzof9Sow==}
'@tailwindcss/oxide-android-arm64@4.0.7':
resolution: {integrity: sha512-5iQXXcAeOHBZy8ASfHFm1k0O/9wR2E3tKh6+P+ilZZbQiMgu+qrnfpBWYPc3FPuQdWiWb73069WT5D+CAfx/tg==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [android]
'@tailwindcss/oxide-darwin-arm64@4.0.6':
resolution: {integrity: sha512-1f71/ju/tvyGl5c2bDkchZHy8p8EK/tDHCxlpYJ1hGNvsYihZNurxVpZ0DefpN7cNc9RTT8DjrRoV8xXZKKRjg==}
'@tailwindcss/oxide-darwin-arm64@4.0.7':
resolution: {integrity: sha512-7yGZtEc5IgVYylqK/2B0yVqoofk4UAbkn1ygNpIJZyrOhbymsfr8uUFCueTu2fUxmAYIfMZ8waWo2dLg/NgLgg==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
'@tailwindcss/oxide-darwin-x64@4.0.6':
resolution: {integrity: sha512-s/hg/ZPgxFIrGMb0kqyeaqZt505P891buUkSezmrDY6lxv2ixIELAlOcUVTkVh245SeaeEiUVUPiUN37cwoL2g==}
'@tailwindcss/oxide-darwin-x64@4.0.7':
resolution: {integrity: sha512-tPQDV20fBjb26yWbPqT1ZSoDChomMCiXTKn4jupMSoMCFyU7+OJvIY1ryjqBuY622dEBJ8LnCDDWsnj1lX9nNQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
'@tailwindcss/oxide-freebsd-x64@4.0.6':
resolution: {integrity: sha512-Z3Wo8FWZnmio8+xlcbb7JUo/hqRMSmhQw8IGIRoRJ7GmLR0C+25Wq+bEX/135xe/yEle2lFkhu9JBHd4wZYiig==}
'@tailwindcss/oxide-freebsd-x64@4.0.7':
resolution: {integrity: sha512-sZqJpTyTZiknU9LLHuByg5GKTW+u3FqM7q7myequAXxKOpAFiOfXpY710FuMY+gjzSapyRbDXJlsTQtCyiTo5w==}
engines: {node: '>= 10'}
cpu: [x64]
os: [freebsd]
'@tailwindcss/oxide-linux-arm-gnueabihf@4.0.6':
resolution: {integrity: sha512-SNSwkkim1myAgmnbHs4EjXsPL7rQbVGtjcok5EaIzkHkCAVK9QBQsWeP2Jm2/JJhq4wdx8tZB9Y7psMzHYWCkA==}
'@tailwindcss/oxide-linux-arm-gnueabihf@4.0.7':
resolution: {integrity: sha512-PBgvULgeSswjd8cbZ91gdIcIDMdc3TUHV5XemEpxlqt9M8KoydJzkuB/Dt910jYdofOIaTWRL6adG9nJICvU4A==}
engines: {node: '>= 10'}
cpu: [arm]
os: [linux]
'@tailwindcss/oxide-linux-arm64-gnu@4.0.6':
resolution: {integrity: sha512-tJ+mevtSDMQhKlwCCuhsFEFg058kBiSy4TkoeBG921EfrHKmexOaCyFKYhVXy4JtkaeeOcjJnCLasEeqml4i+Q==}
'@tailwindcss/oxide-linux-arm64-gnu@4.0.7':
resolution: {integrity: sha512-By/a2yeh+e9b+C67F88ndSwVJl2A3tcUDb29FbedDi+DZ4Mr07Oqw9Y1DrDrtHIDhIZ3bmmiL1dkH2YxrtV+zw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
'@tailwindcss/oxide-linux-arm64-musl@4.0.6':
resolution: {integrity: sha512-IoArz1vfuTR4rALXMUXI/GWWfx2EaO4gFNtBNkDNOYhlTD4NVEwE45nbBoojYiTulajI4c2XH8UmVEVJTOJKxA==}
'@tailwindcss/oxide-linux-arm64-musl@4.0.7':
resolution: {integrity: sha512-WHYs3cpPEJb/ccyT20NOzopYQkl7JKncNBUbb77YFlwlXMVJLLV3nrXQKhr7DmZxz2ZXqjyUwsj2rdzd9stYdw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
'@tailwindcss/oxide-linux-x64-gnu@4.0.6':
resolution: {integrity: sha512-QtsUfLkEAeWAC3Owx9Kg+7JdzE+k9drPhwTAXbXugYB9RZUnEWWx5x3q/au6TvUYcL+n0RBqDEO2gucZRvRFgQ==}
'@tailwindcss/oxide-linux-x64-gnu@4.0.7':
resolution: {integrity: sha512-7bP1UyuX9kFxbOwkeIJhBZNevKYPXB6xZI37v09fqi6rqRJR8elybwjMUHm54GVP+UTtJ14ueB1K54Dy1tIO6w==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
'@tailwindcss/oxide-linux-x64-musl@4.0.6':
resolution: {integrity: sha512-QthvJqIji2KlGNwLcK/PPYo7w1Wsi/8NK0wAtRGbv4eOPdZHkQ9KUk+oCoP20oPO7i2a6X1aBAFQEL7i08nNMA==}
'@tailwindcss/oxide-linux-x64-musl@4.0.7':
resolution: {integrity: sha512-gBQIV8nL/LuhARNGeroqzXymMzzW5wQzqlteVqOVoqwEfpHOP3GMird5pGFbnpY+NP0fOlsZGrxxOPQ4W/84bQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
'@tailwindcss/oxide-win32-arm64-msvc@4.0.6':
resolution: {integrity: sha512-+oka+dYX8jy9iP00DJ9Y100XsqvbqR5s0yfMZJuPR1H/lDVtDfsZiSix1UFBQ3X1HWxoEEl6iXNJHWd56TocVw==}
'@tailwindcss/oxide-win32-arm64-msvc@4.0.7':
resolution: {integrity: sha512-aH530NFfx0kpQpvYMfWoeG03zGnRCMVlQG8do/5XeahYydz+6SIBxA1tl/cyITSJyWZHyVt6GVNkXeAD30v0Xg==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
'@tailwindcss/oxide-win32-x64-msvc@4.0.6':
resolution: {integrity: sha512-+o+juAkik4p8Ue/0LiflQXPmVatl6Av3LEZXpBTfg4qkMIbZdhCGWFzHdt2NjoMiLOJCFDddoV6GYaimvK1Olw==}
'@tailwindcss/oxide-win32-x64-msvc@4.0.7':
resolution: {integrity: sha512-8Cva6bbJN7ZJx320k7vxGGdU0ewmpfS5A4PudyzUuofdi8MgeINuiiWiPQ0VZCda/GX88K6qp+6UpDZNVr8HMQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
'@tailwindcss/oxide@4.0.6':
resolution: {integrity: sha512-lVyKV2y58UE9CeKVcYykULe9QaE1dtKdxDEdrTPIdbzRgBk6bdxHNAoDqvcqXbIGXubn3VOl1O/CFF77v/EqSA==}
'@tailwindcss/oxide@4.0.7':
resolution: {integrity: sha512-yr6w5YMgjy+B+zkJiJtIYGXW+HNYOPfRPtSs+aqLnKwdEzNrGv4ZuJh9hYJ3mcA+HMq/K1rtFV+KsEr65S558g==}
engines: {node: '>= 10'}
'@tailwindcss/postcss@4.0.6':
resolution: {integrity: sha512-noTaGPHjGCXTCc487TWnfAEN0VMjqDAecssWDOsfxV2hFrcZR0AHthX7IdY/0xHTg/EtpmIPdssddlZ5/B7JnQ==}
'@tailwindcss/postcss@4.0.7':
resolution: {integrity: sha512-zXcKs1uGssVDlnsQ+iwrkul5GPKvsXPynGCuk/eXLx3DVhHlQKMpA6tXN2oO28x2ki1xRBTfadKiHy2taVvp7g==}
'@tanstack/history@1.99.13':
resolution: {integrity: sha512-JMd7USmnp8zV8BRGIjALqzPxazvKtQ7PGXQC7n39HpbqdsmfV2ePCzieO84IvN+mwsTrXErpbjI4BfKCa+ZNCg==}
@@ -2888,13 +2888,13 @@ packages:
'@tanstack/query-core@5.66.4':
resolution: {integrity: sha512-skM/gzNX4shPkqmdTCSoHtJAPMTtmIJNS0hE+xwTTUVYwezArCT34NMermABmBVUg5Ls5aiUXEDXfqwR1oVkcA==}
'@tanstack/react-query@5.66.7':
resolution: {integrity: sha512-qd3q/tUpF2K1xItfPZddk1k/8pSXnovg41XyCqJgPoyYEirMBtB0sVEVVQ/CsAOngzgWtBPXimVf4q4kM9uO6A==}
'@tanstack/react-query@5.66.8':
resolution: {integrity: sha512-LqYHYArmM7ycyT1I/Txc/n6KzI8S/hBFw2SQ9Uj1GpbZ89AvZLEvetquiQEHkZ5rFEm+iVNpZ6zYjTiPmJ9N5Q==}
peerDependencies:
react: ^18 || ^19
'@tanstack/react-router@1.105.0':
resolution: {integrity: sha512-k4Umuy7rna/hhfHkmbq9dCmj9Hp8D0V6dPNCrCXceJb0gQWGxl1KWLXFbw8Ywe/sNyzIzPrMwrMit++MXHo8iw==}
'@tanstack/react-router@1.109.2':
resolution: {integrity: sha512-cJZGIvYIrd5lcwbwoB2vxJe379TQZIM5/RAzlDSrvV5KAPlkmK3cqZHZ8zPrsZIBASEyERM8Od+jM9s3qDTXkA==}
engines: {node: '>=12'}
peerDependencies:
react: '>=18.0.0 || >=19.0.0'
@@ -2919,15 +2919,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.104.1':
resolution: {integrity: sha512-8nP/V5paP+S/17rlw+B2F12R2bB9PixU/+qnD2QdCjK1ajnG4qA0pVN3VSTQe2oCKND6GPZpm2ikmQWumwss9Q==}
'@tanstack/router-core@1.108.0':
resolution: {integrity: sha512-lo6Nqdp8gxWNZ8YZ6UhiQgR0CgcAiMaw1cxgKK7M4u3nFFwqW7Hzycl5ik1l3NRh5/pQVK+OVzlKok5rrrHxSg==}
engines: {node: '>=12'}
'@tanstack/router-devtools@1.105.0':
resolution: {integrity: sha512-X583hyUyhL30g5ax1J/lbgb3DYpgsiSUv0ERaF5Gg0PoxPYJSybmw79xwFbrTBDxXCXxfg4AFCAEcmkAQemPWA==}
'@tanstack/router-devtools@1.109.2':
resolution: {integrity: sha512-jz3o5srcbFSUTNJHvBlDGcAW+Q2YETbJAiCiSZ7sjaNhNd3odPwGw0JLc4Dh1mkL0Vp94L7eJdIBfmNMBuOR9w==}
engines: {node: '>=12'}
peerDependencies:
'@tanstack/react-router': ^1.105.0
'@tanstack/react-router': ^1.109.2
csstype: ^3.0.10
react: '>=18.0.0 || >=19.0.0'
react-dom: '>=18.0.0 || >=19.0.0'
@@ -2935,22 +2935,23 @@ packages:
csstype:
optional: true
'@tanstack/router-generator@1.105.0':
resolution: {integrity: sha512-P5e4S7XcaECWKDdR4Zs/FpY4Z127zGv1FcmKEzsFRSGJZm7lHshWayYJIjwkeJ+Ier2IkVN+VRaFWC5GKv0jIg==}
'@tanstack/router-generator@1.109.2':
resolution: {integrity: sha512-CCEH19Vl+ukMkP9gOZPg85U7rMwwlWxJ4hRMPgU7DIyMlzuvv7l6earvXzuGCKLN0m20TO0QuqjJfCFIKkP2RA==}
engines: {node: '>=12'}
peerDependencies:
'@tanstack/react-router': ^1.105.0
'@tanstack/react-router': ^1.109.2
peerDependenciesMeta:
'@tanstack/react-router':
optional: true
'@tanstack/router-plugin@1.105.0':
resolution: {integrity: sha512-iGwKZIyl8+os4PA9v57BlTtKVnQ5mCvxYT4p5TR/Q8zW1KBs4fC5F7EhL1BgH8fY12IL4ByuuJ+porzp+mfmJQ==}
'@tanstack/router-plugin@1.109.2':
resolution: {integrity: sha512-Tap6WQIE6elQkTSJpnBxUZDMNGkaqjEPXiotM2VVpD6qy4euZmYdUV1rAgtD2w8AM18XecIC4tBprNLchLYG3A==}
engines: {node: '>=12'}
peerDependencies:
'@rsbuild/core': '>=1.0.2'
'@tanstack/react-router': ^1.105.0
'@tanstack/react-router': ^1.109.2
vite: '>=5.0.0 || >=6.0.0'
vite-plugin-solid: ^2.11.2
webpack: '>=5.92.0'
peerDependenciesMeta:
'@rsbuild/core':
@@ -2959,6 +2960,8 @@ packages:
optional: true
vite:
optional: true
vite-plugin-solid:
optional: true
webpack:
optional: true
@@ -4486,6 +4489,10 @@ packages:
resolution: {integrity: sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==}
engines: {node: '>=10.13.0'}
enhanced-resolve@5.18.1:
resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==}
engines: {node: '>=10.13.0'}
entities@2.2.0:
resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==}
@@ -4916,8 +4923,8 @@ packages:
fraction.js@4.3.7:
resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
framer-motion@12.4.5:
resolution: {integrity: sha512-9+8wglyIJFeUpVg4U8Ohvoo5x7zmvRqawWXhEUThcYdwL/5A1/OkLvQo68Zz5taUE11HKG/Ex+LPaN2+fMkRdA==}
framer-motion@12.4.7:
resolution: {integrity: sha512-VhrcbtcAMXfxlrjeHPpWVu2+mkcoR31e02aNSR7OUS/hZAciKa8q6o3YN2mA1h+jjscRsSyKvX6E1CiY/7OLMw==}
peerDependencies:
'@emotion/is-prop-valid': '*'
react: ^18.0.0 || ^19.0.0
@@ -5068,6 +5075,10 @@ packages:
resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==}
engines: {node: '>=18'}
globals@16.0.0:
resolution: {integrity: sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==}
engines: {node: '>=18'}
globalthis@1.0.4:
resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
engines: {node: '>= 0.4'}
@@ -6672,10 +6683,6 @@ packages:
resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==}
engines: {node: ^10 || ^12 || >=14}
postcss@8.5.1:
resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==}
engines: {node: ^10 || ^12 || >=14}
postcss@8.5.3:
resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==}
engines: {node: ^10 || ^12 || >=14}
@@ -6747,8 +6754,8 @@ packages:
prettier-plugin-svelte:
optional: true
prettier-plugin-toml@2.0.1:
resolution: {integrity: sha512-99z1YOkViECHtXQjGIigd3talI/ybUI1zB3yniAwUrlWBXupNXThB1hM6bwSMUEj2/+tomTlMtT98F5t4s8IWA==}
prettier-plugin-toml@2.0.2:
resolution: {integrity: sha512-tUIIhyfdVX5DMsLGKX/2qaEwi3W48OkUSR7XC91PRI5jFzhexmaYWkrSP1Xh/eWUcEc0TVMQenM3lB09xLQstQ==}
engines: {node: '>=16.0.0'}
peerDependencies:
prettier: ^3.0.3
@@ -6870,8 +6877,8 @@ packages:
react-is@19.0.0:
resolution: {integrity: sha512-H91OHcwjZsbq3ClIDHMzBShc1rotbfACdWENsmEf0IFvZ3FgGPtdHMcsv45bQ1hAbgdfiA8SnxTKfDS+x/8m2g==}
react-markdown@9.0.3:
resolution: {integrity: sha512-Yk7Z94dbgYTOrdk41Z74GoKA7rThnsbbqBTRYuxoe08qvfQ9tJVhmAKw6BJS/ZORG7kTy/s1QvYzSuaoBA1qfw==}
react-markdown@9.1.0:
resolution: {integrity: sha512-xaijuJB0kzGiUdG7nc2MOMDUDBWPyGAjZtUrow9XxUeua8IqeP+VlIfAZ3bphpcLTnSZXz6z9jcVC/TCwbfgdw==}
peerDependencies:
'@types/react': '>=18'
react: '>=18'
@@ -7308,8 +7315,8 @@ packages:
shell-quote@1.8.1:
resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==}
shiki@2.4.2:
resolution: {integrity: sha512-kPOa6plKRlylb23/qOtO+iBI3HYO84IgMix9oc7oet9WcsnuGHCPK4s/v7635nkUSmv+F6s6xmaDreNs5z6v+w==}
shiki@2.5.0:
resolution: {integrity: sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==}
side-channel-list@1.0.0:
resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==}
@@ -7639,8 +7646,8 @@ packages:
tailwind-merge@3.0.1:
resolution: {integrity: sha512-AvzE8FmSoXC7nC+oU5GlQJbip2UO7tmOhOfQyOmPhrStOGXHU08j8mZEHZ4BmCqY5dWTCo4ClWkNyRNx1wpT0g==}
tailwindcss@4.0.6:
resolution: {integrity: sha512-mysewHYJKaXgNOW6pp5xon/emCsfAMnO8WMaGKZZ35fomnR/T5gYnRg2/yRTTrtXiEl1tiVkeRt0eMO6HxEZqw==}
tailwindcss@4.0.7:
resolution: {integrity: sha512-yH5bPPyapavo7L+547h3c4jcBXcrKwybQRjwdEIVAd9iXRvy/3T1CC6XSQEgZtRySjKfqvo3Cc0ZF1DTheuIdA==}
tapable@2.2.1:
resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
@@ -7950,10 +7957,6 @@ packages:
resolution: {integrity: sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA==}
engines: {node: '>=18.12.0'}
unplugin@2.1.2:
resolution: {integrity: sha512-Q3LU0e4zxKfRko1wMV2HmP8lB9KWislY7hxXpxd+lGx0PRInE4vhMBVEZwpdVYHvtqzhSrzuIfErsob6bQfCzw==}
engines: {node: '>=18.12.0'}
unplugin@2.2.0:
resolution: {integrity: sha512-m1ekpSwuOT5hxkJeZGRxO7gXbXT3gF26NjQ7GdVHoLoF8/nopLcd/QfPigpCy7i51oFHiRJg/CyHhj4vs2+KGw==}
engines: {node: '>=18.12.0'}
@@ -9707,7 +9710,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@iconify/json@2.2.308':
'@iconify/json@2.2.309':
dependencies:
'@iconify/types': 2.0.0
pathe: 1.1.2
@@ -10490,35 +10493,35 @@ snapshots:
transitivePeerDependencies:
- '@types/node'
'@shikijs/core@2.4.2':
'@shikijs/core@2.5.0':
dependencies:
'@shikijs/engine-javascript': 2.4.2
'@shikijs/engine-oniguruma': 2.4.2
'@shikijs/types': 2.4.2
'@shikijs/engine-javascript': 2.5.0
'@shikijs/engine-oniguruma': 2.5.0
'@shikijs/types': 2.5.0
'@shikijs/vscode-textmate': 10.0.2
'@types/hast': 3.0.4
hast-util-to-html: 9.0.4
'@shikijs/engine-javascript@2.4.2':
'@shikijs/engine-javascript@2.5.0':
dependencies:
'@shikijs/types': 2.4.2
'@shikijs/types': 2.5.0
'@shikijs/vscode-textmate': 10.0.2
oniguruma-to-es: 3.1.0
'@shikijs/engine-oniguruma@2.4.2':
'@shikijs/engine-oniguruma@2.5.0':
dependencies:
'@shikijs/types': 2.4.2
'@shikijs/types': 2.5.0
'@shikijs/vscode-textmate': 10.0.2
'@shikijs/langs@2.4.2':
'@shikijs/langs@2.5.0':
dependencies:
'@shikijs/types': 2.4.2
'@shikijs/types': 2.5.0
'@shikijs/themes@2.4.2':
'@shikijs/themes@2.5.0':
dependencies:
'@shikijs/types': 2.4.2
'@shikijs/types': 2.5.0
'@shikijs/types@2.4.2':
'@shikijs/types@2.5.0':
dependencies:
'@shikijs/vscode-textmate': 10.0.2
'@types/hast': 3.0.4
@@ -10671,67 +10674,67 @@ snapshots:
dependencies:
defer-to-connect: 2.0.1
'@tailwindcss/node@4.0.6':
'@tailwindcss/node@4.0.7':
dependencies:
enhanced-resolve: 5.18.0
enhanced-resolve: 5.18.1
jiti: 2.4.2
tailwindcss: 4.0.6
tailwindcss: 4.0.7
'@tailwindcss/oxide-android-arm64@4.0.6':
'@tailwindcss/oxide-android-arm64@4.0.7':
optional: true
'@tailwindcss/oxide-darwin-arm64@4.0.6':
'@tailwindcss/oxide-darwin-arm64@4.0.7':
optional: true
'@tailwindcss/oxide-darwin-x64@4.0.6':
'@tailwindcss/oxide-darwin-x64@4.0.7':
optional: true
'@tailwindcss/oxide-freebsd-x64@4.0.6':
'@tailwindcss/oxide-freebsd-x64@4.0.7':
optional: true
'@tailwindcss/oxide-linux-arm-gnueabihf@4.0.6':
'@tailwindcss/oxide-linux-arm-gnueabihf@4.0.7':
optional: true
'@tailwindcss/oxide-linux-arm64-gnu@4.0.6':
'@tailwindcss/oxide-linux-arm64-gnu@4.0.7':
optional: true
'@tailwindcss/oxide-linux-arm64-musl@4.0.6':
'@tailwindcss/oxide-linux-arm64-musl@4.0.7':
optional: true
'@tailwindcss/oxide-linux-x64-gnu@4.0.6':
'@tailwindcss/oxide-linux-x64-gnu@4.0.7':
optional: true
'@tailwindcss/oxide-linux-x64-musl@4.0.6':
'@tailwindcss/oxide-linux-x64-musl@4.0.7':
optional: true
'@tailwindcss/oxide-win32-arm64-msvc@4.0.6':
'@tailwindcss/oxide-win32-arm64-msvc@4.0.7':
optional: true
'@tailwindcss/oxide-win32-x64-msvc@4.0.6':
'@tailwindcss/oxide-win32-x64-msvc@4.0.7':
optional: true
'@tailwindcss/oxide@4.0.6':
'@tailwindcss/oxide@4.0.7':
optionalDependencies:
'@tailwindcss/oxide-android-arm64': 4.0.6
'@tailwindcss/oxide-darwin-arm64': 4.0.6
'@tailwindcss/oxide-darwin-x64': 4.0.6
'@tailwindcss/oxide-freebsd-x64': 4.0.6
'@tailwindcss/oxide-linux-arm-gnueabihf': 4.0.6
'@tailwindcss/oxide-linux-arm64-gnu': 4.0.6
'@tailwindcss/oxide-linux-arm64-musl': 4.0.6
'@tailwindcss/oxide-linux-x64-gnu': 4.0.6
'@tailwindcss/oxide-linux-x64-musl': 4.0.6
'@tailwindcss/oxide-win32-arm64-msvc': 4.0.6
'@tailwindcss/oxide-win32-x64-msvc': 4.0.6
'@tailwindcss/oxide-android-arm64': 4.0.7
'@tailwindcss/oxide-darwin-arm64': 4.0.7
'@tailwindcss/oxide-darwin-x64': 4.0.7
'@tailwindcss/oxide-freebsd-x64': 4.0.7
'@tailwindcss/oxide-linux-arm-gnueabihf': 4.0.7
'@tailwindcss/oxide-linux-arm64-gnu': 4.0.7
'@tailwindcss/oxide-linux-arm64-musl': 4.0.7
'@tailwindcss/oxide-linux-x64-gnu': 4.0.7
'@tailwindcss/oxide-linux-x64-musl': 4.0.7
'@tailwindcss/oxide-win32-arm64-msvc': 4.0.7
'@tailwindcss/oxide-win32-x64-msvc': 4.0.7
'@tailwindcss/postcss@4.0.6':
'@tailwindcss/postcss@4.0.7':
dependencies:
'@alloc/quick-lru': 5.2.0
'@tailwindcss/node': 4.0.6
'@tailwindcss/oxide': 4.0.6
'@tailwindcss/node': 4.0.7
'@tailwindcss/oxide': 4.0.7
lightningcss: 1.29.1
postcss: 8.5.1
tailwindcss: 4.0.6
postcss: 8.5.3
tailwindcss: 4.0.7
'@tanstack/history@1.99.13': {}
@@ -10741,16 +10744,16 @@ snapshots:
'@tanstack/query-core@5.66.4': {}
'@tanstack/react-query@5.66.7(react@19.0.0)':
'@tanstack/react-query@5.66.8(react@19.0.0)':
dependencies:
'@tanstack/query-core': 5.66.4
react: 19.0.0
'@tanstack/react-router@1.105.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
'@tanstack/react-router@1.109.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
dependencies:
'@tanstack/history': 1.99.13
'@tanstack/react-store': 0.7.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
'@tanstack/router-core': 1.104.1
'@tanstack/router-core': 1.108.0
jsesc: 3.1.0
react: 19.0.0
react-dom: 19.0.0(react@19.0.0)
@@ -10776,14 +10779,14 @@ snapshots:
react: 19.0.0
react-dom: 19.0.0(react@19.0.0)
'@tanstack/router-core@1.104.1':
'@tanstack/router-core@1.108.0':
dependencies:
'@tanstack/history': 1.99.13
'@tanstack/store': 0.7.0
'@tanstack/router-devtools@1.105.0(@tanstack/react-router@1.105.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(csstype@3.1.3)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
'@tanstack/router-devtools@1.109.2(@tanstack/react-router@1.109.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(csstype@3.1.3)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
dependencies:
'@tanstack/react-router': 1.105.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
'@tanstack/react-router': 1.109.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
clsx: 2.1.1
goober: 2.1.16(csstype@3.1.3)
react: 19.0.0
@@ -10791,16 +10794,16 @@ snapshots:
optionalDependencies:
csstype: 3.1.3
'@tanstack/router-generator@1.105.0(@tanstack/react-router@1.105.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))':
'@tanstack/router-generator@1.109.2(@tanstack/react-router@1.109.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))':
dependencies:
'@tanstack/virtual-file-routes': 1.99.0
prettier: 3.5.1
tsx: 4.19.3
zod: 3.24.2
optionalDependencies:
'@tanstack/react-router': 1.105.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
'@tanstack/react-router': 1.109.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
'@tanstack/router-plugin@1.105.0(@tanstack/react-router@1.105.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(vite@6.1.1(@types/node@22.13.4)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.0)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))':
'@tanstack/router-plugin@1.109.2(@tanstack/react-router@1.109.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(vite@6.1.1(@types/node@22.13.4)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.0)(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.8
'@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.8)
@@ -10808,7 +10811,7 @@ snapshots:
'@babel/template': 7.26.8
'@babel/traverse': 7.26.8
'@babel/types': 7.26.8
'@tanstack/router-generator': 1.105.0(@tanstack/react-router@1.105.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))
'@tanstack/router-generator': 1.109.2(@tanstack/react-router@1.109.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))
'@tanstack/router-utils': 1.102.2
'@tanstack/virtual-file-routes': 1.99.0
'@types/babel__core': 7.20.5
@@ -10816,10 +10819,10 @@ snapshots:
'@types/babel__traverse': 7.20.6
babel-dead-code-elimination: 1.0.9
chokidar: 3.6.0
unplugin: 2.1.2
unplugin: 2.2.0
zod: 3.24.2
optionalDependencies:
'@tanstack/react-router': 1.105.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
'@tanstack/react-router': 1.109.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
vite: 6.1.1(@types/node@22.13.4)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.0)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)
transitivePeerDependencies:
- supports-color
@@ -10831,9 +10834,9 @@ snapshots:
ansis: 3.12.0
diff: 7.0.0
'@tanstack/router-zod-adapter@1.81.5(@tanstack/react-router@1.105.0(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.109.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(zod@3.24.2)':
dependencies:
'@tanstack/react-router': 1.105.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
'@tanstack/react-router': 1.109.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
zod: 3.24.2
'@tanstack/store@0.7.0': {}
@@ -12506,6 +12509,11 @@ snapshots:
graceful-fs: 4.2.11
tapable: 2.2.1
enhanced-resolve@5.18.1:
dependencies:
graceful-fs: 4.2.11
tapable: 2.2.1
entities@2.2.0: {}
entities@4.5.0: {}
@@ -13189,7 +13197,7 @@ snapshots:
fraction.js@4.3.7: {}
framer-motion@12.4.5(@emotion/is-prop-valid@1.3.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
framer-motion@12.4.7(@emotion/is-prop-valid@1.3.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
dependencies:
motion-dom: 12.4.5
motion-utils: 12.0.0
@@ -13367,6 +13375,8 @@ snapshots:
globals@15.15.0: {}
globals@16.0.0: {}
globalthis@1.0.4:
dependencies:
define-properties: 1.2.1
@@ -15079,12 +15089,6 @@ snapshots:
picocolors: 1.1.1
source-map-js: 1.2.1
postcss@8.5.1:
dependencies:
nanoid: 3.3.8
picocolors: 1.1.1
source-map-js: 1.2.1
postcss@8.5.3:
dependencies:
nanoid: 3.3.8
@@ -15106,7 +15110,7 @@ snapshots:
'@ianvs/prettier-plugin-sort-imports': 4.4.1(prettier@3.5.1)
'@trivago/prettier-plugin-sort-imports': 4.3.0(prettier@3.5.1)
prettier-plugin-toml@2.0.1(prettier@3.5.1):
prettier-plugin-toml@2.0.2(prettier@3.5.1):
dependencies:
'@taplo/lib': 0.4.0-alpha.2
prettier: 3.5.1
@@ -15218,9 +15222,10 @@ snapshots:
react-is@19.0.0: {}
react-markdown@9.0.3(@types/react@19.0.10)(react@19.0.0):
react-markdown@9.1.0(@types/react@19.0.10)(react@19.0.0):
dependencies:
'@types/hast': 3.0.4
'@types/mdast': 4.0.3
'@types/react': 19.0.10
devlop: 1.1.0
hast-util-to-jsx-runtime: 2.3.0
@@ -15687,14 +15692,14 @@ snapshots:
shell-quote@1.8.1: {}
shiki@2.4.2:
shiki@2.5.0:
dependencies:
'@shikijs/core': 2.4.2
'@shikijs/engine-javascript': 2.4.2
'@shikijs/engine-oniguruma': 2.4.2
'@shikijs/langs': 2.4.2
'@shikijs/themes': 2.4.2
'@shikijs/types': 2.4.2
'@shikijs/core': 2.5.0
'@shikijs/engine-javascript': 2.5.0
'@shikijs/engine-oniguruma': 2.5.0
'@shikijs/langs': 2.5.0
'@shikijs/themes': 2.5.0
'@shikijs/types': 2.5.0
'@shikijs/vscode-textmate': 10.0.2
'@types/hast': 3.0.4
@@ -16092,7 +16097,7 @@ snapshots:
tailwind-merge@3.0.1: {}
tailwindcss@4.0.6: {}
tailwindcss@4.0.7: {}
tapable@2.2.1: {}
@@ -16454,11 +16459,6 @@ snapshots:
pathe: 2.0.3
picomatch: 4.0.2
unplugin@2.1.2:
dependencies:
acorn: 8.14.0
webpack-virtual-modules: 0.6.2
unplugin@2.2.0:
dependencies:
acorn: 8.14.0
@@ -8,12 +8,12 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=linux-firmware
PKG_VERSION:=20241110
PKG_VERSION:=20250211
PKG_RELEASE:=1
PKG_SOURCE_URL:=@KERNEL/linux/kernel/firmware
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
PKG_HASH:=32e6d3eb5c7fcb69fe5d58976c6deafa0d6552719c6e74835064aff049d25bd7
PKG_HASH:=2de1345897bf839d532c5de0fdb348770ca2a5f4edfb21971582597abb45297d
PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name>
+2 -1
View File
@@ -20,8 +20,9 @@ import (
"net"
)
// Dial provides methods to establish stream oriented connections.
type Dialer interface {
DialContext(ctx context.Context, network, address string) (net.Conn, error)
}
var _ Dialer = &net.Dialer{}
var _ Dialer = (*net.Dialer)(nil)
+2 -2
View File
@@ -27,8 +27,8 @@ type DNSResolver interface {
LookupIP(ctx context.Context, network, host string) ([]net.IP, error)
}
// Standard library Resolver implements the DNSResolver interface.
var _ DNSResolver = &net.Resolver{}
// Standard library net.Resolver implements the DNSResolver interface.
var _ DNSResolver = (*net.Resolver)(nil)
// NilDNSResolver implements the DNSResolver interface but
// it is not able to look up IP addresses.
+1 -1
View File
@@ -182,7 +182,7 @@ The format of the simple sharing link is as follows:
A simple sharing link starts with `mierus://`, where `s` stands for `simple`.
The username and password can only use uppercase letters `A-Z`, lowercase letters `a-z`, numbers `0-9`, underscores `_`, and hyphens `-`. Otherwise, a simple sharing link cannot be generated.
Some special characters are not allowed in username or password. In case a character is not allowed, the simple sharing link cannot be generated.
There is only one server address in a simple sharing link. If the client's configuration contains multiple servers, multiple links will be generated.
+1 -1
View File
@@ -182,7 +182,7 @@ mierus://baozi:manlianpenfen@1.2.3.4?mtu=1400&multiplexing=MULTIPLEXING_HIGH&por
简单分享链接以 `mierus://` 开始,其中 `s` 表示 `simple`
用户名和密码只能使用大写字母 `A-Z`,小写字母 `a-z`,数字 `0-9`,下划线 `_` 和横杠 `-`,否则将无法生成简单分享链接。
用户名和密码不允许使用某些特殊字符。如果使用了不允许的字符,则无法生成简单分享链接。
简单分享链接中只有一个服务器地址。如果客户端的设置含有多台服务器,则会生成多个链接。
+3 -3
View File
@@ -4,14 +4,14 @@ go 1.20
require (
github.com/google/btree v1.1.3
golang.org/x/crypto v0.32.0
golang.org/x/sys v0.29.0
golang.org/x/crypto v0.33.0
golang.org/x/sys v0.30.0
google.golang.org/grpc v1.64.1
google.golang.org/protobuf v1.34.2
)
require (
golang.org/x/net v0.26.0 // indirect
golang.org/x/text v0.21.0 // indirect
golang.org/x/text v0.22.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20240610135401-a8a62080eff3 // indirect
)
+6 -6
View File
@@ -1,14 +1,14 @@
github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg=
github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc=
golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc=
golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus=
golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M=
golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ=
golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE=
golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM=
golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
google.golang.org/genproto/googleapis/rpc v0.0.0-20240610135401-a8a62080eff3 h1:9Xyg6I9IWQZhRVfCWjKK+l6kI0jHcPesVlMnT//aHNo=
google.golang.org/genproto/googleapis/rpc v0.0.0-20240610135401-a8a62080eff3/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0=
google.golang.org/grpc v1.64.1 h1:LKtvyfbX3UGVPFcGqJ9ItpVWW6oN/2XqTxfAnwRRXiA=
+7 -3
View File
@@ -30,8 +30,12 @@ import (
"google.golang.org/protobuf/proto"
)
const (
safeURLPattern = `^[0-9A-Za-z_!\$&'\(\)\*\+,;=\.\~-]+$`
)
var (
safeURLRegExp = regexp.MustCompile(`^[0-9A-Za-z_!\$&'\(\)\*\+,;=\.\~-]+$`)
safeURLRegExp = regexp.MustCompile(safeURLPattern)
)
// ClientConfigToURL creates a URL to share the client configuration.
@@ -63,13 +67,13 @@ func ClientProfileToMultiURLs(profile *pb.ClientProfile) (urls []string, err err
return nil, fmt.Errorf("user name in profile %s is empty", profileName)
}
if !isSafeURLString(userName) {
return nil, fmt.Errorf(`user name %q in profile %s can't be safely encoded to URL. Only allow "A-Z", "a-z", "0-9", underscore "_", and hyphen "-"`, userName, profileName)
return nil, fmt.Errorf(`user name %q in profile %s can't be safely encoded to URL. Allowed pattern: %s`, userName, profileName, safeURLPattern)
}
if password == "" {
return nil, fmt.Errorf("password in profile %s is empty", profileName)
}
if !isSafeURLString(password) {
return nil, fmt.Errorf(`password %q in profile %s can't be safely encoded to URL. Only allow "A-Z", "a-z", "0-9", underscore "_", and hyphen "-"`, password, profileName)
return nil, fmt.Errorf(`password %q in profile %s can't be safely encoded to URL. Allowed pattern: %s`, password, profileName, safeURLPattern)
}
if len(servers) == 0 {
return nil, fmt.Errorf("profile %s has no server", profileName)
-40
View File
@@ -329,17 +329,6 @@ func (m *Mux) DialContext(ctx context.Context) (net.Conn, error) {
}
func (m *Mux) ExportSessionInfoList() *appctlpb.SessionInfoList {
// header := SessionInfo{
// ID: "Session ID",
// Protocol: "Protocol",
// LocalAddr: "Local",
// RemoteAddr: "Remote",
// State: "State",
// RecvQBuf: "Recv Q+Buf",
// SendQBuf: "Send Q+Buf",
// LastRecv: "Last Recv",
// LastSend: "Last Send",
// }
items := make([]*appctlpb.SessionInfo, 0)
m.mu.Lock()
for _, underlay := range m.underlays {
@@ -347,35 +336,6 @@ func (m *Mux) ExportSessionInfoList() *appctlpb.SessionInfoList {
}
m.mu.Unlock()
return &appctlpb.SessionInfoList{Items: items}
// var idLen, protocolLen, localAddrLen, remoteAddrLen, stateLen, recvQLen, sendQLen, lastRecvLen, lastSendLen int
// for _, si := range info {
// idLen = mathext.Max(idLen, len(si.ID))
// protocolLen = mathext.Max(protocolLen, len(si.Protocol))
// localAddrLen = mathext.Max(localAddrLen, len(si.LocalAddr))
// remoteAddrLen = mathext.Max(remoteAddrLen, len(si.RemoteAddr))
// stateLen = mathext.Max(stateLen, len(si.State))
// recvQLen = mathext.Max(recvQLen, len(si.RecvQBuf))
// sendQLen = mathext.Max(sendQLen, len(si.SendQBuf))
// lastRecvLen = mathext.Max(lastRecvLen, len(si.LastRecv))
// lastSendLen = mathext.Max(lastSendLen, len(si.LastSend))
// }
// res := make([]string, 0)
// delim := " "
// for _, si := range info {
// line := make([]string, 0)
// line = append(line, fmt.Sprintf("%-"+fmt.Sprintf("%d", idLen)+"s", si.ID))
// line = append(line, fmt.Sprintf("%-"+fmt.Sprintf("%d", protocolLen)+"s", si.Protocol))
// line = append(line, fmt.Sprintf("%-"+fmt.Sprintf("%d", localAddrLen)+"s", si.LocalAddr))
// line = append(line, fmt.Sprintf("%-"+fmt.Sprintf("%d", remoteAddrLen)+"s", si.RemoteAddr))
// line = append(line, fmt.Sprintf("%-"+fmt.Sprintf("%d", stateLen)+"s", si.State))
// line = append(line, fmt.Sprintf("%-"+fmt.Sprintf("%d", recvQLen)+"s", si.RecvQBuf))
// line = append(line, fmt.Sprintf("%-"+fmt.Sprintf("%d", sendQLen)+"s", si.SendQBuf))
// line = append(line, fmt.Sprintf("%-"+fmt.Sprintf("%d", lastRecvLen)+"s", si.LastRecv))
// line = append(line, fmt.Sprintf("%-"+fmt.Sprintf("%d", lastSendLen)+"s", si.LastSend))
// res = append(res, strings.Join(line, delim))
// }
// return res
}
func (m *Mux) newEndpoints(old, new []UnderlayProperties) []UnderlayProperties {
+2
View File
@@ -42,6 +42,7 @@ type AnyTLSOption struct {
UDP bool `proxy:"udp,omitempty"`
IdleSessionCheckInterval int `proxy:"idle-session-check-interval,omitempty"`
IdleSessionTimeout int `proxy:"idle-session-timeout,omitempty"`
MinIdleSession int `proxy:"min-idle-session,omitempty"`
}
func (t *AnyTLS) DialContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (_ C.Conn, err error) {
@@ -98,6 +99,7 @@ func NewAnyTLS(option AnyTLSOption) (*AnyTLS, error) {
Dialer: singDialer,
IdleSessionCheckInterval: time.Duration(option.IdleSessionCheckInterval) * time.Second,
IdleSessionTimeout: time.Duration(option.IdleSessionTimeout) * time.Second,
MinIdleSession: option.MinIdleSession,
}
tlsConfig := &vmess.TLSConfig{
Host: option.SNI,
+1
View File
@@ -874,6 +874,7 @@ proxies: # socks5
udp: true
# idle-session-check-interval: 30 # seconds
# idle-session-timeout: 30 # seconds
# min-idle-session: 0
# sni: "example.com"
# alpn:
# - h2
+8 -8
View File
@@ -22,19 +22,19 @@ type ClientConfig struct {
Password string
IdleSessionCheckInterval time.Duration
IdleSessionTimeout time.Duration
MinIdleSession int
Server M.Socksaddr
Dialer N.Dialer
TLSConfig *vmess.TLSConfig
}
type Client struct {
passwordSha256 []byte
tlsConfig *vmess.TLSConfig
clientFingerprint string
dialer N.Dialer
server M.Socksaddr
sessionClient *session.Client
padding atomic.TypedValue[*padding.PaddingFactory]
passwordSha256 []byte
tlsConfig *vmess.TLSConfig
dialer N.Dialer
server M.Socksaddr
sessionClient *session.Client
padding atomic.TypedValue[*padding.PaddingFactory]
}
func NewClient(ctx context.Context, config ClientConfig) *Client {
@@ -47,7 +47,7 @@ func NewClient(ctx context.Context, config ClientConfig) *Client {
}
// Initialize the padding state of this client
padding.UpdatePaddingScheme(padding.DefaultPaddingScheme, &c.padding)
c.sessionClient = session.NewClient(ctx, c.CreateOutboundTLSConnection, &c.padding, config.IdleSessionCheckInterval, config.IdleSessionTimeout)
c.sessionClient = session.NewClient(ctx, c.CreateOutboundTLSConnection, &c.padding, config.IdleSessionCheckInterval, config.IdleSessionTimeout, config.MinIdleSession)
return c
}
+21 -6
View File
@@ -28,13 +28,15 @@ type Client struct {
padding *atomic.TypedValue[*padding.PaddingFactory]
idleSessionTimeout time.Duration
minIdleSession int
}
func NewClient(ctx context.Context, dialOut func(ctx context.Context) (net.Conn, error), _padding *atomic.TypedValue[*padding.PaddingFactory], idleSessionCheckInterval, idleSessionTimeout time.Duration) *Client {
func NewClient(ctx context.Context, dialOut func(ctx context.Context) (net.Conn, error), _padding *atomic.TypedValue[*padding.PaddingFactory], idleSessionCheckInterval, idleSessionTimeout time.Duration, minIdleSession int) *Client {
c := &Client{
dialOut: dialOut,
padding: _padding,
idleSessionTimeout: idleSessionTimeout,
minIdleSession: minIdleSession,
}
if idleSessionCheckInterval <= time.Second*5 {
idleSessionCheckInterval = time.Second * 30
@@ -138,17 +140,30 @@ func (c *Client) idleCleanup() {
}
func (c *Client) idleCleanupExpTime(expTime time.Time) {
var sessionToRemove = make([]*Session, 0)
sessionToRemove := make([]*Session, 0, c.idleSession.Len())
c.idleSessionLock.Lock()
it := c.idleSession.Iterate()
activeCount := 0
for it.IsNotEnd() {
session := it.Value()
if session.idleSince.Before(expTime) {
sessionToRemove = append(sessionToRemove, session)
c.idleSession.Remove(it.Key())
}
key := it.Key()
it.MoveToNext()
if !session.idleSince.Before(expTime) {
activeCount++
continue
}
if activeCount < c.minIdleSession {
session.idleSince = time.Now()
activeCount++
continue
}
sessionToRemove = append(sessionToRemove, session)
c.idleSession.Remove(key)
}
c.idleSessionLock.Unlock()
@@ -92,6 +92,7 @@ function showMsg_Redirect(redirectUrl, delay)
if (overlay && overlay.parentNode) {
overlay.parentNode.removeChild(overlay);
}
window.location.href = window.location.href;
}
}, delay);
});
+1
View File
@@ -74,6 +74,7 @@ func (t *PredefinedTransport) Exchange(ctx context.Context, message *mDNS.Msg) (
}() {
copyAnswer := *response.answer
copyAnswer.Id = message.Id
copyAnswer.Question = message.Question
return &copyAnswer, nil
}
}
+5 -2
View File
@@ -95,8 +95,11 @@ func (o DNSResponseOptions) Build() ([]dns.Question, *dns.Msg, error) {
}
return questions, &dns.Msg{
MsgHdr: dns.MsgHdr{
Response: true,
Rcode: o.RCode.Build(),
Response: true,
Rcode: o.RCode.Build(),
Authoritative: true,
RecursionDesired: true,
RecursionAvailable: true,
},
Answer: common.Map(o.Answer, DNSRecordOptions.build),
Ns: common.Map(o.Ns, DNSRecordOptions.build),
@@ -92,6 +92,7 @@ function showMsg_Redirect(redirectUrl, delay)
if (overlay && overlay.parentNode) {
overlay.parentNode.removeChild(overlay);
}
window.location.href = window.location.href;
}
}, delay);
});
+2 -2
View File
@@ -5,12 +5,12 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=v2ray-core
PKG_VERSION:=5.29.0
PKG_VERSION:=5.29.1
PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/v2fly/v2ray-core/tar.gz/v$(PKG_VERSION)?
PKG_HASH:=74884fecb10ae7e556b917388928ca942bd15e0a730b658b32a1af7e20e3a7ab
PKG_HASH:=929706448db0aadd812d2fd2978bc4bcbb709e05c401e69919b21c99122806e7
PKG_LICENSE:=MIT
PKG_LICENSE_FILES:=LICENSE
+2 -2
View File
@@ -21,13 +21,13 @@ define Download/geoip
HASH:=f2f5f03da44d007fa91fb6a37c077c9efae8ad0269ef0e4130cf90b0822873e3
endef
GEOSITE_VER:=20250219031756
GEOSITE_VER:=20250221152129
GEOSITE_FILE:=dlc.dat.$(GEOSITE_VER)
define Download/geosite
URL:=https://github.com/v2fly/domain-list-community/releases/download/$(GEOSITE_VER)/
URL_FILE:=dlc.dat
FILE:=$(GEOSITE_FILE)
HASH:=7fb82385fe16e44b4932d9f9fbd12fa7e146e9e7929a7fb1865bc699c50ef705
HASH:=36a6db542b576f23c9cd733c24e55886671d846a223fcf592b2e5189712d625a
endef
GEOSITE_IRAN_VER:=202502170036
+2 -2
View File
@@ -1,12 +1,12 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=xray-core
PKG_VERSION:=25.1.30
PKG_VERSION:=25.2.21
PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/XTLS/Xray-core/tar.gz/v$(PKG_VERSION)?
PKG_HASH:=983ee395f085ed1b7fbe0152cb56a5b605a6f70a5645d427c7186c476f14894e
PKG_HASH:=a565db518d2da12fabb74e123d9bf2bdbc34420b81373938f8fcbc7004fda3ba
PKG_MAINTAINER:=Tianling Shen <cnsztl@immortalwrt.org>
PKG_LICENSE:=MPL-2.0
+4 -3
View File
@@ -54,6 +54,9 @@ func SniffQUIC(b []byte) (*SniffHeader, error) {
cryptoData := bytespool.Alloc(int32(len(b)))
defer bytespool.Free(cryptoData)
cache := buf.New()
defer cache.Release()
// Parse QUIC packets
for len(b) > 0 {
buffer := buf.FromBytes(b)
@@ -139,9 +142,7 @@ func SniffQUIC(b []byte) (*SniffHeader, error) {
return nil, err
}
cache := buf.New()
defer cache.Release()
cache.Clear()
mask := cache.Extend(int32(block.BlockSize()))
block.Encrypt(mask, b[hdrLen+4:hdrLen+4+16])
b[0] ^= mask[0] & 0xf
+1 -1
View File
@@ -18,7 +18,7 @@ import (
)
var (
version = "5.29.0"
version = "5.29.1"
build = "Custom"
codename = "V2Fly, a community-driven edition of V2Ray."
intro = "A unified platform for anti-censorship."
+69
View File
@@ -0,0 +1,69 @@
name: release all platforms
on:
workflow_dispatch:
inputs:
release_tag:
required: false
type: string
jobs:
update:
runs-on: ubuntu-latest
steps:
- name: Trigger build windows
if: github.event.inputs.release_tag != ''
run: |
curl -X POST \
-H "Accept: application/vnd.github.v3+json" \
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
https://api.github.com/repos/${{ github.repository }}/actions/workflows/build-windows.yml/dispatches \
-d "{
\"ref\": \"master\",
\"inputs\": {
\"release_tag\": \"${{ github.event.inputs.release_tag }}\"
}
}"
- name: Trigger build linux
if: github.event.inputs.release_tag != ''
run: |
curl -X POST \
-H "Accept: application/vnd.github.v3+json" \
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
https://api.github.com/repos/${{ github.repository }}/actions/workflows/build-linux.yml/dispatches \
-d "{
\"ref\": \"master\",
\"inputs\": {
\"release_tag\": \"${{ github.event.inputs.release_tag }}\"
}
}"
- name: Trigger build osx
if: github.event.inputs.release_tag != ''
run: |
curl -X POST \
-H "Accept: application/vnd.github.v3+json" \
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
https://api.github.com/repos/${{ github.repository }}/actions/workflows/build-osx.yml/dispatches \
-d "{
\"ref\": \"master\",
\"inputs\": {
\"release_tag\": \"${{ github.event.inputs.release_tag }}\"
}
}"
- name: Trigger build windows desktop
if: github.event.inputs.release_tag != ''
run: |
curl -X POST \
-H "Accept: application/vnd.github.v3+json" \
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
https://api.github.com/repos/${{ github.repository }}/actions/workflows/build-windows-desktop.yml/dispatches \
-d "{
\"ref\": \"master\",
\"inputs\": {
\"release_tag\": \"${{ github.event.inputs.release_tag }}\"
}
}"
+1 -1
View File
@@ -1,7 +1,7 @@
<Project>
<PropertyGroup>
<Version>7.9.2</Version>
<Version>7.9.3</Version>
</PropertyGroup>
<PropertyGroup>
+7
View File
@@ -507,6 +507,13 @@ namespace ServiceLib
{ ECoreType.v2rayN, "2dust/v2rayN" },
};
public static readonly List<string> OtherGeoUrls =
[
@"https://raw.githubusercontent.com/Loyalsoldier/geoip/release/geoip-only-cn-private.dat",
@"https://raw.githubusercontent.com/Loyalsoldier/geoip/release/Country.mmdb",
@"https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip.metadb"
];
#endregion const
}
}
@@ -261,10 +261,17 @@ namespace ServiceLib.Services
if (pid > 0)
{
await Task.Delay(500);
await DoRealPing(downloadHandle, it);
var delay = await DoRealPing(downloadHandle, it);
if (blSpeedTest)
{
await DoSpeedTest(downloadHandle, it);
if (delay > 0)
{
await DoSpeedTest(downloadHandle, it);
}
else
{
UpdateFunc(it.IndexId, "", ResUI.SpeedtestingSkip);
}
}
}
else
@@ -289,13 +296,14 @@ namespace ServiceLib.Services
Task.WaitAll(tasks.ToArray());
}
private async Task DoRealPing(DownloadService downloadHandle, ServerTestItem it)
private async Task<int> DoRealPing(DownloadService downloadHandle, ServerTestItem it)
{
var webProxy = new WebProxy($"socks5://{Global.Loopback}:{it.Port}");
var responseTime = await downloadHandle.GetRealPingTime(_config.SpeedTestItem.SpeedPingTestUrl, webProxy, 10);
ProfileExHandler.Instance.SetTestDelay(it.IndexId, responseTime);
UpdateFunc(it.IndexId, responseTime.ToString());
return responseTime;
}
private async Task DoSpeedTest(DownloadService downloadHandle, ServerTestItem it)
@@ -237,8 +237,8 @@ namespace ServiceLib.Services
public async Task UpdateGeoFileAll(Config config, Action<bool, string> updateFunc)
{
await UpdateGeoFile("geosite", config, updateFunc);
await UpdateGeoFile("geoip", config, updateFunc);
await UpdateGeoFiles(config, updateFunc);
await UpdateOtherFiles(config, updateFunc);
await UpdateSrsFileAll(config, updateFunc);
_updateFunc?.Invoke(true, string.Format(ResUI.MsgDownloadGeoFileSuccessfully, "geo"));
}
@@ -472,14 +472,14 @@ namespace ServiceLib.Services
_ => null,
};
}
return null;
return await Task.FromResult("");
}
#endregion CheckUpdate private
#region Geo private
private async Task UpdateGeoFile(string geoName, Config config, Action<bool, string> updateFunc)
private async Task UpdateGeoFiles(Config config, Action<bool, string> updateFunc)
{
_updateFunc = updateFunc;
@@ -487,11 +487,28 @@ namespace ServiceLib.Services
? Global.GeoUrl
: config.ConstItem.GeoSourceUrl;
var fileName = $"{geoName}.dat";
var targetPath = Utils.GetBinPath($"{fileName}");
var url = string.Format(geoUrl, geoName);
List<string> files = ["geosite", "geoip"];
foreach (var geoName in files)
{
var fileName = $"{geoName}.dat";
var targetPath = Utils.GetBinPath($"{fileName}");
var url = string.Format(geoUrl, geoName);
await DownloadGeoFile(url, fileName, targetPath, updateFunc);
await DownloadGeoFile(url, fileName, targetPath, updateFunc);
}
}
private async Task UpdateOtherFiles(Config config, Action<bool, string> updateFunc)
{
_updateFunc = updateFunc;
foreach (var url in Global.OtherGeoUrls)
{
var fileName = Path.GetFileName(url);
var targetPath = Utils.GetBinPath($"{fileName}");
await DownloadGeoFile(url, fileName, targetPath, updateFunc);
}
}
private async Task UpdateSrsFileAll(Config config, Action<bool, string> updateFunc)
@@ -49,8 +49,7 @@
<ListBox
x:Name="lstCheckUpdates"
BorderThickness="1"
ItemsSource="{Binding CheckUpdateModels}"
Theme="{StaticResource ButtonRadioGroupListBox}">
ItemsSource="{Binding CheckUpdateModels}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical" />
@@ -87,8 +87,7 @@
<ListBox
x:Name="lstProxyGroups"
DockPanel.Dock="Left"
ItemsSource="{Binding ProxyGroups}"
Theme="{StaticResource ButtonRadioGroupListBox}">
ItemsSource="{Binding ProxyGroups}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical" />
@@ -96,11 +95,11 @@
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border
<Label
Width="160"
Margin="-8,-4"
Margin="-4,-6"
Padding="0"
Theme="{StaticResource CardBorder}">
Theme="{DynamicResource TagLabel}">
<Grid Margin="{StaticResource Margin4}" RowDefinitions="1*,8,1*">
<DockPanel Grid.Row="0">
<TextBlock DockPanel.Dock="Right" Text="{Binding Type}" />
@@ -108,15 +107,12 @@
</DockPanel>
<TextBlock Grid.Row="2" Text="{Binding Now}" />
</Grid>
</Border>
</Label>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ListBox>
<ListBox
x:Name="lstProxyDetails"
ItemsSource="{Binding ProxyDetails}"
Theme="{StaticResource ButtonRadioGroupListBox}">
<ListBox x:Name="lstProxyDetails" ItemsSource="{Binding ProxyDetails}">
<ItemsControl.ContextMenu>
<ContextMenu>
<MenuItem x:Name="menuProxiesDelaytestPart" Header="{x:Static resx:ResUI.menuProxiesDelaytestPart}" />
@@ -130,11 +126,11 @@
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border
<Label
Width="160"
Margin="-12,-4"
Margin="-10,-6"
Padding="0"
Theme="{StaticResource CardBorder}">
Theme="{DynamicResource TagLabel}">
<DockPanel>
<Border
Width="5"
@@ -154,7 +150,7 @@
</DockPanel>
</Grid>
</DockPanel>
</Border>
</Label>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ListBox>
+10 -1
View File
@@ -273,7 +273,16 @@ func (h *Handler) Dial(ctx context.Context, dest net.Destination) (stat.Connecti
outbounds := session.OutboundsFromContext(ctx)
ob := outbounds[len(outbounds)-1]
if h.senderSettings.ViaCidr == "" {
ob.Gateway = h.senderSettings.Via.AsAddress()
if h.senderSettings.Via.AsAddress().Family().IsDomain() && h.senderSettings.Via.AsAddress().Domain() == "origin" {
if inbound := session.InboundFromContext(ctx); inbound != nil {
origin, _, err := net.SplitHostPort(inbound.Conn.LocalAddr().String())
if err == nil {
ob.Gateway = net.ParseAddress(origin)
}
}
} else {
ob.Gateway = h.senderSettings.Via.AsAddress()
}
} else { //Get a random address.
ob.Gateway = ParseRandomIPv6(h.senderSettings.Via.AsAddress(), h.senderSettings.ViaCidr)
}
+1 -1
View File
@@ -19,7 +19,7 @@ import (
var (
Version_x byte = 25
Version_y byte = 2
Version_z byte = 18
Version_z byte = 21
)
var (
+1 -1
View File
@@ -12,7 +12,7 @@ require (
github.com/miekg/dns v1.1.63
github.com/pelletier/go-toml v1.9.5
github.com/pires/go-proxyproto v0.8.0
github.com/quic-go/quic-go v0.49.0
github.com/quic-go/quic-go v0.50.0
github.com/refraction-networking/utls v1.6.7
github.com/sagernet/sing v0.5.1
github.com/sagernet/sing-shadowsocks v0.2.7
+2 -2
View File
@@ -54,8 +54,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI=
github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg=
github.com/quic-go/quic-go v0.49.0 h1:w5iJHXwHxs1QxyBv1EHKuC50GX5to8mJAxvtnttJp94=
github.com/quic-go/quic-go v0.49.0/go.mod h1:s2wDnmCdooUQBmQfpUSTCYBl1/D4FcqbULMMkASvR6s=
github.com/quic-go/quic-go v0.50.0 h1:3H/ld1pa3CYhkcc20TPIyG1bNsdhn9qZBGN3b9/UyUo=
github.com/quic-go/quic-go v0.50.0/go.mod h1:Vim6OmUvlYdwBhXP9ZVrtGmCMWa3wEqhq3NgYrI8b4E=
github.com/refraction-networking/utls v1.6.7 h1:zVJ7sP1dJx/WtVuITug3qYUq034cDq9B2MR1K67ULZM=
github.com/refraction-networking/utls v1.6.7/go.mod h1:BC3O4vQzye5hqpmDTWUqi4P5DDhzJfkV1tdqtawQIH0=
github.com/riobard/go-bloom v0.0.0-20200614022211-cdc8013cb5b3 h1:f/FNXud6gA3MNr8meMVVGxhp+QBTqY91tM8HjEuMjGg=
+3 -1
View File
@@ -292,7 +292,9 @@ func (c *OutboundDetourConfig) Build() (*core.OutboundHandlerConfig, error) {
senderSettings.ViaCidr = strings.Split(*c.SendThrough, "/")[1]
} else {
if address.Family().IsDomain() {
return nil, errors.New("unable to send through: " + address.String())
if address.Address.Domain() != "origin" {
return nil, errors.New("unable to send through: " + address.String())
}
}
}
senderSettings.Via = address.Build()
+22 -20
View File
@@ -157,7 +157,7 @@ from .utils import (
write_json_file,
write_string,
)
from .utils._utils import _UnsafeExtensionError, _YDLLogger
from .utils._utils import _UnsafeExtensionError, _YDLLogger, _ProgressState
from .utils.networking import (
HTTPHeaderDict,
clean_headers,
@@ -642,20 +642,19 @@ class YoutubeDL:
self.cache = Cache(self)
self.__header_cookies = []
try:
windows_enable_vt_mode()
except Exception as e:
self.write_debug(f'Failed to enable VT mode: {e}')
stdout = sys.stderr if self.params.get('logtostderr') else sys.stdout
self._out_files = Namespace(
out=stdout,
error=sys.stderr,
screen=sys.stderr if self.params.get('quiet') else stdout,
console=None if os.name == 'nt' else next(
filter(supports_terminal_sequences, (sys.stderr, sys.stdout)), None),
console=next(filter(supports_terminal_sequences, (sys.stderr, sys.stdout)), None),
)
try:
windows_enable_vt_mode()
except Exception as e:
self.write_debug(f'Failed to enable VT mode: {e}')
if self.params.get('no_color'):
if self.params.get('color') is not None:
self.params.setdefault('_warnings', []).append(
@@ -956,21 +955,22 @@ class YoutubeDL:
self._write_string(f'{self._bidi_workaround(message)}\n', self._out_files.error, only_once=only_once)
def _send_console_code(self, code):
if os.name == 'nt' or not self._out_files.console:
return
if not supports_terminal_sequences(self._out_files.console):
return False
self._write_string(code, self._out_files.console)
return True
def to_console_title(self, message):
if not self.params.get('consoletitle', False):
def to_console_title(self, message=None, progress_state=None, percent=None):
if not self.params.get('consoletitle'):
return
message = remove_terminal_sequences(message)
if os.name == 'nt':
if ctypes.windll.kernel32.GetConsoleWindow():
# c_wchar_p() might not be necessary if `message` is
# already of type unicode()
ctypes.windll.kernel32.SetConsoleTitleW(ctypes.c_wchar_p(message))
else:
self._send_console_code(f'\033]0;{message}\007')
if message:
success = self._send_console_code(f'\033]0;{remove_terminal_sequences(message)}\007')
if not success and os.name == 'nt' and ctypes.windll.kernel32.GetConsoleWindow():
ctypes.windll.kernel32.SetConsoleTitleW(message)
if isinstance(progress_state, _ProgressState):
self._send_console_code(progress_state.get_ansi_escape(percent))
def save_console_title(self):
if not self.params.get('consoletitle') or self.params.get('simulate'):
@@ -984,6 +984,7 @@ class YoutubeDL:
def __enter__(self):
self.save_console_title()
self.to_console_title(progress_state=_ProgressState.INDETERMINATE)
return self
def save_cookies(self):
@@ -992,6 +993,7 @@ class YoutubeDL:
def __exit__(self, *args):
self.restore_console_title()
self.to_console_title(progress_state=_ProgressState.HIDDEN)
self.close()
def close(self):
+9 -5
View File
@@ -31,6 +31,7 @@ from ..utils import (
timetuple_from_msec,
try_call,
)
from ..utils._utils import _ProgressState
class FileDownloader:
@@ -333,7 +334,7 @@ class FileDownloader:
progress_dict), s.get('progress_idx') or 0)
self.to_console_title(self.ydl.evaluate_outtmpl(
progress_template.get('download-title') or 'yt-dlp %(progress._default_template)s',
progress_dict))
progress_dict), _ProgressState.from_dict(s), s.get('_percent'))
def _format_progress(self, *args, **kwargs):
return self.ydl._format_text(
@@ -357,6 +358,7 @@ class FileDownloader:
'_speed_str': self.format_speed(speed).strip(),
'_total_bytes_str': _format_bytes('total_bytes'),
'_elapsed_str': self.format_seconds(s.get('elapsed')),
'_percent': 100.0,
'_percent_str': self.format_percent(100),
})
self._report_progress_status(s, join_nonempty(
@@ -375,13 +377,15 @@ class FileDownloader:
return
self._progress_delta_time += update_delta
progress = try_call(
lambda: 100 * s['downloaded_bytes'] / s['total_bytes'],
lambda: 100 * s['downloaded_bytes'] / s['total_bytes_estimate'],
lambda: s['downloaded_bytes'] == 0 and 0)
s.update({
'_eta_str': self.format_eta(s.get('eta')).strip(),
'_speed_str': self.format_speed(s.get('speed')),
'_percent_str': self.format_percent(try_call(
lambda: 100 * s['downloaded_bytes'] / s['total_bytes'],
lambda: 100 * s['downloaded_bytes'] / s['total_bytes_estimate'],
lambda: s['downloaded_bytes'] == 0 and 0)),
'_percent': progress,
'_percent_str': self.format_percent(progress),
'_total_bytes_str': _format_bytes('total_bytes'),
'_total_bytes_estimate_str': _format_bytes('total_bytes_estimate'),
'_downloaded_bytes_str': _format_bytes('downloaded_bytes'),
+2 -1
View File
@@ -10,6 +10,7 @@ from ..utils import (
_configuration_args,
deprecation_warning,
)
from ..utils._utils import _ProgressState
class PostProcessorMetaClass(type):
@@ -189,7 +190,7 @@ class PostProcessor(metaclass=PostProcessorMetaClass):
self._downloader.to_console_title(self._downloader.evaluate_outtmpl(
progress_template.get('postprocess-title') or 'yt-dlp %(progress._default_template)s',
progress_dict))
progress_dict), _ProgressState.from_dict(s), s.get('_percent'))
def _retry_download(self, err, count, retries):
# While this is not an extractor, it behaves similar to one and
+30
View File
@@ -8,6 +8,7 @@ import contextlib
import datetime as dt
import email.header
import email.utils
import enum
import errno
import functools
import hashlib
@@ -5677,3 +5678,32 @@ class _YDLLogger:
def stderr(self, message):
if self._ydl:
self._ydl.to_stderr(message)
class _ProgressState(enum.Enum):
"""
Represents a state for a progress bar.
See: https://conemu.github.io/en/AnsiEscapeCodes.html#ConEmu_specific_OSC
"""
HIDDEN = 0
INDETERMINATE = 3
VISIBLE = 1
WARNING = 4
ERROR = 2
@classmethod
def from_dict(cls, s, /):
if s['status'] == 'finished':
return cls.INDETERMINATE
# Not currently used
if s['status'] == 'error':
return cls.ERROR
return cls.INDETERMINATE if s.get('_percent') is None else cls.VISIBLE
def get_ansi_escape(self, /, percent=None):
percent = 0 if percent is None else int(percent)
return f'\033]9;4;{self.value};{percent}\007'