diff --git a/Cargo.lock b/Cargo.lock index 8c864df..dc2266c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -86,9 +86,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.11" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5" +checksum = "96b09b5178381e0874812a9b157f7fe84982617e48f71f4e3235482775e5b540" dependencies = [ "anstyle", "anstyle-parse", @@ -100,9 +100,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.5" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2faccea4cc4ab4a667ce676a30e8ec13922a692c99bb8f5b11f1502c72e04220" +checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" [[package]] name = "anstyle-parse" @@ -134,9 +134,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.79" +version = "1.0.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" +checksum = "5ad32ce52e4161730f7098c077cd2ed6229b5804ccf99e5366be1ab72a98b4e1" [[package]] name = "arc-swap" @@ -202,7 +202,7 @@ checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -349,9 +349,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.14.0" +version = "3.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +checksum = "d32a994c2b3ca201d9b263612a374263f05e7adde37c4707f693dcd375076d1f" [[package]] name = "byte_string" @@ -361,9 +361,9 @@ checksum = "11aade7a05aa8c3a351cedc44c3fc45806430543382fcc4743a9b757a2a0b4ed" [[package]] name = "bytemuck" -version = "1.14.1" +version = "1.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2490600f404f2b94c167e31d3ed1d5f3c225a0f3b80230053b3e0b7b962bd9" +checksum = "a2ef034f05691a48569bd920a96c81b9d91bbad1ab5ac7c4616c1f6ef36cb79f" dependencies = [ "bytemuck_derive", ] @@ -376,7 +376,7 @@ checksum = "965ab7eb5f8f97d2a083c799f3a1b994fc397b2fe2da5d1da1626ce15a39f2b1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -409,9 +409,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.33" +version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f13690e35a5e4ace198e7beea2895d29f3a9cc55015fcebe6336bd2010af9eb" +checksum = "5bc015644b92d5890fab7489e49d21f879d5c990186827d42ec511919404f38b" dependencies = [ "android-tzdata", "iana-time-zone", @@ -425,7 +425,7 @@ version = "1.0.0-alpha.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9c28d4e5dd9a9262a38b231153591da6ce1471b818233f4727985d3dd0ed93c" dependencies = [ - "hashbrown 0.14.3", + "hashbrown", "regex-automata 0.3.9", "serde", "stacker", @@ -434,9 +434,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.4.18" +version = "4.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e578d6ec4194633722ccf9544794b71b1385c3c027efe0c55db226fc880865c" +checksum = "c918d541ef2913577a0f9566e9ce27cb35b6df072075769e0b26cb5a554520da" dependencies = [ "clap_builder", "clap_derive", @@ -444,9 +444,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.18" +version = "4.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4df4df40ec50c46000231c914968278b1eb05098cf8f1b3a518a95030e71d1c7" +checksum = "9f3e7391dad68afb0c2ede1bf619f579a3dc9c2ec67f089baa397123a2f3d1eb" dependencies = [ "anstream", "anstyle", @@ -456,21 +456,21 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.4.7" +version = "4.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" +checksum = "307bc0538d5f0f83b8248db3087aa92fe504e4691294d0c96c0eabc33f47ba47" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] name = "clap_lex" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" +checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" [[package]] name = "colorchoice" @@ -644,7 +644,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" dependencies = [ "cfg-if", - "hashbrown 0.14.3", + "hashbrown", "lock_api", "once_cell", "parking_lot_core", @@ -663,9 +663,9 @@ dependencies = [ [[package]] name = "dhat" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f2aaf837aaf456f6706cb46386ba8dffd4013a757e36f4ea05c20dd46b209a3" +checksum = "98cd11d84628e233de0ce467de10b8633f4ddaecafadefc86e13b84b8739b827" dependencies = [ "backtrace", "lazy_static", @@ -695,9 +695,9 @@ checksum = "545b22097d44f8a9581187cdf93de7a71e4722bf51200cfaba810865b49a495d" [[package]] name = "either" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" [[package]] name = "enum_dispatch" @@ -708,7 +708,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -719,9 +719,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "erased-serde" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55d05712b2d8d88102bc9868020c9e5c7a1f5527c452b9b97450a1d006140ba7" +checksum = "388979d208a049ffdfb22fa33b9c81942215b940910bccfe258caeb25d125cb3" dependencies = [ "serde", ] @@ -870,7 +870,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -958,28 +958,13 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 2.2.1", + "indexmap", "slab", "tokio", "tokio-util", "tracing", ] -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - -[[package]] -name = "hashbrown" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ff8ae62cd3a9102e5637afc8452c55acf3844001bd5374e0b0bd7b6616c038" -dependencies = [ - "ahash", -] - [[package]] name = "hashbrown" version = "0.14.3" @@ -999,9 +984,9 @@ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" -version = "0.3.4" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d3d0e0f38255e7fa3cf31335b3a56f05febd18025f4db5ef7a0cfb4f8da651f" +checksum = "bd5256b483761cd23699d0da46cc6fd2ee3be420bbe6d020ae4a091e70b7e9fd" [[package]] name = "home" @@ -1080,12 +1065,11 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdea9aac0dbe5a9240d68cfd9501e2db94222c6dc06843e06640b9e07f0fdc67" +checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" dependencies = [ "bytes", - "futures-channel", "futures-util", "http", "http-body", @@ -1093,14 +1077,13 @@ dependencies = [ "pin-project-lite", "socket2", "tokio", - "tracing", ] [[package]] name = "iana-time-zone" -version = "0.1.59" +version = "0.1.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6a67363e2aa4443928ce15e57ebae94fd8949958fd1223c4cfc0cd473ad7539" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -1121,22 +1104,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "1.9.3" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", -] - -[[package]] -name = "indexmap" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "433de089bd45971eecf4668ee0ee8f4cec17db4f8bd8f7bc3197a6ce37aa7d9b" +checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" dependencies = [ "equivalent", - "hashbrown 0.14.3", + "hashbrown", ] [[package]] @@ -1167,18 +1140,18 @@ checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" [[package]] name = "jobserver" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" +checksum = "ab46a6e9526ddef3ae7f787c06f0f2600639ba80ea3eade3d8e670a2230f51d6" dependencies = [ "libc", ] [[package]] name = "js-sys" -version = "0.3.67" +version = "0.3.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a1d36f1235bc969acba30b7f5990b864423a6068a10f7c90ae8f0112e3a59d1" +checksum = "406cda4b368d531c842222cf9d2600a9a4acce8d29423695379c6868a143a9ee" dependencies = [ "wasm-bindgen", ] @@ -1222,9 +1195,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.152" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "libm" @@ -1266,7 +1239,7 @@ version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db2c024b41519440580066ba82aab04092b333e09066a5eb86c7c4890df31f22" dependencies = [ - "hashbrown 0.14.3", + "hashbrown", ] [[package]] @@ -1332,9 +1305,9 @@ dependencies = [ [[package]] name = "metrics" -version = "0.22.0" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77b9e10a211c839210fd7f99954bda26e5f8e26ec686ad68da6a32df7c80e782" +checksum = "cd71d9db2e4287c3407fa04378b8c2ee570aebe0854431562cdd89ca091854f4" dependencies = [ "ahash", "portable-atomic", @@ -1342,12 +1315,12 @@ dependencies = [ [[package]] name = "metrics-exporter-prometheus" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83a4c4718a371ddfb7806378f23617876eea8b82e5ff1324516bcd283249d9ea" +checksum = "9bf4e7146e30ad172c42c39b3246864bd2d3c6396780711a1baf749cfe423e21" dependencies = [ "base64", - "indexmap 1.9.3", + "indexmap", "metrics", "metrics-util", "quanta", @@ -1356,13 +1329,13 @@ dependencies = [ [[package]] name = "metrics-util" -version = "0.16.0" +version = "0.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2670b8badcc285d486261e2e9f1615b506baff91427b61bd336a472b65bbf5ed" +checksum = "ece71ab046dcf45604e573329966ec1db5ff4b81cfa170a924ff4c959ab5451a" dependencies = [ "crossbeam-epoch", "crossbeam-utils", - "hashbrown 0.13.1", + "hashbrown", "metrics", "num_cpus", "quanta", @@ -1377,9 +1350,9 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "miniz_oxide" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" dependencies = [ "adler", ] @@ -1515,19 +1488,18 @@ dependencies = [ [[package]] name = "num-integer" -version = "0.1.45" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "autocfg", "num-traits", ] [[package]] name = "num-traits" -version = "0.2.17" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" dependencies = [ "autocfg", "libm", @@ -1610,7 +1582,7 @@ checksum = "266c042b60c9c76b8d53061e52b2e0d1116abc57cefc8c5cd671619a56ac3690" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -1627,9 +1599,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2900ede94e305130c13ddd391e0ab7cbaeb783945ae07a279c268cb05109c6cb" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "planus" @@ -1673,7 +1645,7 @@ dependencies = [ "fast-float", "foreign_vec", "getrandom", - "hashbrown 0.14.3", + "hashbrown", "itoa", "lz4", "multiversion", @@ -1713,8 +1685,8 @@ dependencies = [ "chrono", "comfy-table", "either", - "hashbrown 0.14.3", - "indexmap 2.2.1", + "hashbrown", + "indexmap", "num-traits", "once_cell", "polars-arrow", @@ -1807,8 +1779,8 @@ dependencies = [ "argminmax", "bytemuck", "either", - "hashbrown 0.14.3", - "indexmap 2.2.1", + "hashbrown", + "indexmap", "memchr", "num-traits", "polars-arrow", @@ -1831,7 +1803,7 @@ dependencies = [ "crossbeam-channel", "crossbeam-queue", "enum_dispatch", - "hashbrown 0.14.3", + "hashbrown", "num-traits", "polars-arrow", "polars-compute", @@ -1924,8 +1896,8 @@ checksum = "b174ca4a77ad47d7b91a0460aaae65bbf874c8bfbaaa5308675dadef3976bbda" dependencies = [ "ahash", "bytemuck", - "hashbrown 0.14.3", - "indexmap 2.2.1", + "hashbrown", + "indexmap", "num-traits", "once_cell", "polars-error", @@ -2227,9 +2199,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustix" -version = "0.38.30" +version = "0.38.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "322394588aaf33c24007e8bb3238ee3e4c5c09c084ab32bc73890b99ff326bca" +checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" dependencies = [ "bitflags 2.4.2", "errno", @@ -2246,9 +2218,9 @@ checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" [[package]] name = "ryu" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" [[package]] name = "same-file" @@ -2282,7 +2254,7 @@ checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -2349,7 +2321,7 @@ checksum = "b93fb4adc70021ac1b47f7d45e8cc4169baaa7ea58483bc5b721d19a26202212" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -2405,9 +2377,9 @@ checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" [[package]] name = "sketches-ddsketch" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68a406c1882ed7f29cd5e248c9848a80e7cb6ae0fea82346d2746f2f941c07e1" +checksum = "85636c14b73d81f541e525f585c0a2109e6744e1565b5c1668e31c70c10ed65c" [[package]] name = "slab" @@ -2515,9 +2487,9 @@ dependencies = [ [[package]] name = "strsim" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" [[package]] name = "strum" @@ -2535,7 +2507,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -2559,9 +2531,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.48" +version = "2.0.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +checksum = "915aea9e586f80826ee59f8453c1101f9d1c4b3964cd2460185ee8e299ada496" dependencies = [ "proc-macro2", "quote", @@ -2606,13 +2578,12 @@ checksum = "cfb5fa503293557c5158bd215fdc225695e567a77e453f5d4452a50a193969bd" [[package]] name = "tempfile" -version = "3.9.0" +version = "3.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa" +checksum = "a365e8cd18e44762ef95d87f284f4b5cd04107fec2ff3052bd6a3e6069669e67" dependencies = [ "cfg-if", "fastrand", - "redox_syscall", "rustix", "windows-sys 0.52.0", ] @@ -2636,22 +2607,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.56" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" +checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.56" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" +checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -2672,9 +2643,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.35.1" +version = "1.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104" +checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" dependencies = [ "backtrace", "bytes", @@ -2707,7 +2678,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -2779,9 +2750,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.8" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1a195ec8c9da26928f773888e0742ca3ca1040c6cd859c919c9f59c1954ab35" +checksum = "9a9aad4a3066010876e8dcf5a8a06e70a558751117a145c6ce2b82c2e2054290" dependencies = [ "serde", "serde_spanned", @@ -2800,11 +2771,11 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.21.0" +version = "0.22.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" +checksum = "2c1b5fd4128cc8d3e0cb74d4ed9a9cc7c7284becd4df68f5f940e1ad123606f6" dependencies = [ - "indexmap 2.2.1", + "indexmap", "serde", "serde_spanned", "toml_datetime", @@ -2859,7 +2830,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -2964,9 +2935,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.90" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1223296a201415c7fad14792dbefaace9bd52b62d33453ade1c5b5f07555406" +checksum = "c1e124130aee3fb58c5bdd6b639a0509486b0338acaaae0c84a5124b0f588b7f" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -2974,24 +2945,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.90" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcdc935b63408d58a32f8cc9738a0bffd8f05cc7c002086c6ef20b7312ad9dcd" +checksum = "c9e7e1900c352b609c8488ad12639a311045f40a35491fb69ba8c12f758af70b" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.90" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e4c238561b2d428924c49815533a8b9121c664599558a5d9ec51f8a1740a999" +checksum = "b30af9e2d358182b5c7449424f017eba305ed32a7010509ede96cdc4696c46ed" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2999,28 +2970,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.90" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bae1abb6806dc1ad9e560ed242107c0f6c84335f1749dd4e8ddb012ebd5e25a7" +checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.90" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d91413b1c31d7539ba5ef2451af3f0b833a005eb27a631cec32bc0635a8602b" +checksum = "4f186bd2dcf04330886ce82d6f33dd75a7bfcf69ecf5763b89fcde53b6ac9838" [[package]] name = "web-sys" -version = "0.3.67" +version = "0.3.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58cd2333b6e0be7a39605f0e255892fd7418a682d8da8fe042fe25128794d2ed" +checksum = "96565907687f7aceb35bc5fc03770a8a0471d82e479f25832f54a0e3f4b28446" dependencies = [ "js-sys", "wasm-bindgen", @@ -3210,18 +3181,18 @@ checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" [[package]] name = "winnow" -version = "0.5.35" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1931d78a9c73861da0134f453bb1f790ce49b2e30eba8410b4b79bac72b46a2d" +checksum = "d90f4e0f530c4c69f62b80d839e9ef3855edc9cba471a160c4d692deed62b401" dependencies = [ "memchr", ] [[package]] name = "xxhash-rust" -version = "0.8.8" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53be06678ed9e83edb1745eb72efc0bbcd7b5c3c35711a860906aed827a13d61" +checksum = "927da81e25be1e1a2901d59b81b37dd2efd1fc9c9345a55007f09bf5a2d3ee03" [[package]] name = "zerocopy" @@ -3240,7 +3211,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] diff --git a/access_server/src/lib.rs b/access_server/src/lib.rs index f864983..92d89a3 100644 --- a/access_server/src/lib.rs +++ b/access_server/src/lib.rs @@ -1,7 +1,8 @@ use std::{collections::HashMap, sync::Arc}; use common::{ - error::AnyResult, + config::{merge_map, Merge}, + error::{AnyError, AnyResult}, filter::{self, FilterBuilder, MatcherBuilder}, loading, stream::proxy_table::StreamProxyConfig, @@ -27,7 +28,7 @@ pub mod socks5; pub mod stream; pub mod udp; -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize, Default)] #[serde(deny_unknown_fields)] pub struct AccessServerConfig { #[serde(default)] @@ -49,7 +50,6 @@ pub struct AccessServerConfig { #[serde(default)] pub filters: HashMap, FilterBuilder>, } - impl AccessServerConfig { pub fn new() -> AccessServerConfig { AccessServerConfig { @@ -190,13 +190,37 @@ impl AccessServerConfig { Ok(()) } } +impl Merge for AccessServerConfig { + type Error = AnyError; -impl Default for AccessServerConfig { - fn default() -> Self { - Self::new() + fn merge(mut self, other: Self) -> Result + where + Self: Sized, + { + self.tcp_server.extend(other.tcp_server); + self.udp_server.extend(other.udp_server); + self.http_server.extend(other.http_server); + self.socks5_tcp_server.extend(other.socks5_tcp_server); + self.socks5_udp_server.extend(other.socks5_udp_server); + let stream_proxy_tables = merge_map(self.stream_proxy_tables, other.stream_proxy_tables)?; + let udp_proxy_tables = merge_map(self.udp_proxy_tables, other.udp_proxy_tables)?; + let matchers = merge_map(self.matchers, other.matchers)?; + let filters = merge_map(self.filters, other.filters)?; + Ok(Self { + tcp_server: self.tcp_server, + udp_server: self.udp_server, + http_server: self.http_server, + socks5_tcp_server: self.socks5_tcp_server, + socks5_udp_server: self.socks5_udp_server, + stream_proxy_tables, + udp_proxy_tables, + matchers, + filters, + }) } } +#[derive(Default)] pub struct AccessServerLoader { tcp_server: loading::Loader, udp_server: loading::Loader, @@ -204,7 +228,6 @@ pub struct AccessServerLoader { socks5_tcp_server: loading::Loader, socks5_udp_server: loading::Loader, } - impl AccessServerLoader { pub fn new() -> Self { Self { @@ -216,9 +239,3 @@ impl AccessServerLoader { } } } - -impl Default for AccessServerLoader { - fn default() -> Self { - Self::new() - } -} diff --git a/common/src/config.rs b/common/src/config.rs index 433e009..34402cb 100644 --- a/common/src/config.rs +++ b/common/src/config.rs @@ -1,6 +1,7 @@ -use std::sync::Arc; +use std::{collections::HashMap, sync::Arc}; use serde::{Deserialize, Serialize}; +use thiserror::Error; #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(untagged)] @@ -8,3 +9,32 @@ pub enum SharableConfig { SharingKey(Arc), Private(T), } + +pub trait Merge: Default { + type Error; + /// # Error + /// + /// - Attempted key overriding + fn merge(self, other: Self) -> Result + where + Self: Sized; +} + +pub fn merge_map( + mut a: HashMap, + b: HashMap, +) -> Result, RepeatKeyMergeError> +where + K: Eq + std::hash::Hash, +{ + for (k, v) in b { + if a.contains_key(&k) { + return Err(RepeatKeyMergeError(k)); + } + a.insert(k, v); + } + Ok(a) +} +#[derive(Debug, Error)] +#[error("Repeated key: {0}")] +pub struct RepeatKeyMergeError(pub K); diff --git a/common/src/stream/pool.rs b/common/src/stream/pool.rs index 3aba4c8..31d1cd1 100644 --- a/common/src/stream/pool.rs +++ b/common/src/stream/pool.rs @@ -1,5 +1,6 @@ use std::{ - collections::HashMap, io, marker::PhantomData, net::SocketAddr, sync::Arc, time::Duration, + collections::HashMap, convert::Infallible, io, marker::PhantomData, net::SocketAddr, sync::Arc, + time::Duration, }; use async_trait::async_trait; @@ -8,7 +9,7 @@ use thiserror::Error; use tokio_conn_pool::{ConnPool, ConnPoolEntry}; use crate::{ - config::SharableConfig, + config::{Merge, SharableConfig}, header::heartbeat::send_noop, proxy_table::ProxyConfig, stream::{ @@ -70,11 +71,6 @@ where Ok(pool) } } -impl Default for PoolBuilder { - fn default() -> Self { - Self::new() - } -} #[derive(Debug, Error)] pub enum PoolBuildError { #[error("{0}")] @@ -82,6 +78,22 @@ pub enum PoolBuildError { #[error("Key not found: {0}")] KeyNotFound(Arc), } +impl Default for PoolBuilder { + fn default() -> Self { + Self::new() + } +} +impl Merge for PoolBuilder { + type Error = Infallible; + + fn merge(mut self, other: Self) -> Result + where + Self: Sized, + { + self.0.extend(other.0); + Ok(Self(self.0)) + } +} fn pool_entries_from_proxy_configs( proxy_configs: impl Iterator>>, diff --git a/proxy_server/src/lib.rs b/proxy_server/src/lib.rs index 09da27b..8968e4d 100644 --- a/proxy_server/src/lib.rs +++ b/proxy_server/src/lib.rs @@ -1,6 +1,6 @@ -use std::io; +use std::{convert::Infallible, io}; -use common::{error::AnyResult, loading}; +use common::{config::Merge, error::AnyResult, loading}; use protocol::context::ConcreteContext; use serde::Deserialize; use stream::{ @@ -13,7 +13,7 @@ use udp::{UdpProxy, UdpProxyServerBuilder, UdpProxyServerConfig}; pub mod stream; pub mod udp; -#[derive(Debug, Clone, Deserialize)] +#[derive(Debug, Clone, Deserialize, Default)] #[serde(deny_unknown_fields)] pub struct ProxyServerConfig { #[serde(default)] @@ -25,7 +25,6 @@ pub struct ProxyServerConfig { #[serde(default)] pub mptcp_server: Vec, } - impl ProxyServerConfig { pub fn new() -> Self { Self { @@ -92,10 +91,23 @@ impl ProxyServerConfig { Ok(()) } } +impl Merge for ProxyServerConfig { + type Error = Infallible; -impl Default for ProxyServerConfig { - fn default() -> Self { - Self::new() + fn merge(mut self, other: Self) -> Result + where + Self: Sized, + { + self.tcp_server.extend(other.tcp_server); + self.udp_server.extend(other.udp_server); + self.kcp_server.extend(other.kcp_server); + self.mptcp_server.extend(other.mptcp_server); + Ok(Self { + tcp_server: self.tcp_server, + udp_server: self.udp_server, + kcp_server: self.kcp_server, + mptcp_server: self.mptcp_server, + }) } } diff --git a/proxy_server/src/stream/tcp.rs b/proxy_server/src/stream/tcp.rs index 7032737..bef8235 100644 --- a/proxy_server/src/stream/tcp.rs +++ b/proxy_server/src/stream/tcp.rs @@ -92,7 +92,7 @@ mod tests { use swap::Swap; use tokio::{ io::{AsyncReadExt, AsyncWriteExt}, - net::{TcpListener, TcpStream}, + net::TcpStream, }; #[tokio::test(flavor = "multi_thread")] diff --git a/server/src/config/mod.rs b/server/src/config/mod.rs index 6decf45..255dfea 100644 --- a/server/src/config/mod.rs +++ b/server/src/config/mod.rs @@ -4,6 +4,7 @@ use common::error::AnyError; use file_watcher_tokio::EventActor; pub mod multi_file_config; +pub mod toml; pub trait ConfigReader { type Config; diff --git a/server/src/config/multi_file_config.rs b/server/src/config/multi_file_config.rs index 8a4ea54..d6330e0 100644 --- a/server/src/config/multi_file_config.rs +++ b/server/src/config/multi_file_config.rs @@ -1,11 +1,11 @@ use std::{marker::PhantomData, sync::Arc}; -use common::error::AnyError; +use common::{config::Merge, error::AnyError}; use serde::Deserialize; use crate::ConfigReader; -use super::ConfigWatcher; +use super::{toml::human_toml_error, ConfigWatcher}; pub fn spawn_watch_tasks(config_file_paths: &[Arc]) -> Arc { let watcher = ConfigWatcher::new(); @@ -18,12 +18,12 @@ pub fn spawn_watch_tasks(config_file_paths: &[Arc]) -> Arc { +pub struct MultiConfigReader { config_file_paths: Arc<[Arc]>, phantom_config: PhantomData, } -impl MultiFileConfigReader { +impl MultiConfigReader { pub fn new(config_file_paths: Arc<[Arc]>) -> Self { Self { config_file_paths, @@ -32,60 +32,19 @@ impl MultiFileConfigReader { } } -impl ConfigReader for MultiFileConfigReader +impl ConfigReader for MultiConfigReader where for<'de> C: Deserialize<'de> + Send + Sync + 'static, + C: Merge, { type Config = C; async fn read_config(&self) -> Result { - read_multi_file_config(&self.config_file_paths).await - } -} - -pub async fn read_multi_file_config(config_file_paths: &[Arc]) -> Result -where - for<'de> C: Deserialize<'de>, -{ - let mut config_str = String::new(); - for path in config_file_paths { - let src = tokio::fs::read_to_string(path.as_ref()).await?; - config_str.push_str(&src); - } - let config: C = toml::from_str(&config_str).map_err(|e| human_toml_error(&config_str, e))?; - Ok(config) -} - -fn human_toml_error(src: &str, e: toml::de::Error) -> String { - let Some(span) = e.span() else { - return format!("{e}"); - }; - let affected = src - .chars() - .skip(span.start) - .take(span.end - span.start) - .collect::(); - let (line, col) = { - let mut line = 1; - let mut col = 1; - - for (i, char) in src.chars().enumerate() { - if i == span.start { - break; - } - if char == '\n' { - line += 1; - col = 1; - } - col += 1; + let mut config = C::default(); + for path in self.config_file_paths.iter() { + let src = tokio::fs::read_to_string(path.as_ref()).await?; + let c: C = toml::from_str(&src).map_err(|e| human_toml_error(path, &src, e))?; + config = config.merge(c)?; } - - (line, col) - }; - let msg = e.message(); - let e = format!( - "{msg} -Line {line}, Column {col} -Affected: #'{affected}'#" - ); - e + Ok(config) + } } diff --git a/server/src/config/toml.rs b/server/src/config/toml.rs new file mode 100644 index 0000000..846425c --- /dev/null +++ b/server/src/config/toml.rs @@ -0,0 +1,35 @@ +pub fn human_toml_error(file_path: &str, src: &str, e: toml::de::Error) -> String { + let Some(span) = e.span() else { + return format!("{e}"); + }; + let affected = src + .chars() + .skip(span.start) + .take(span.end - span.start) + .collect::(); + let (line, col) = { + let mut line = 1; + let mut col = 1; + + for (i, char) in src.chars().enumerate() { + if i == span.start { + break; + } + if char == '\n' { + line += 1; + col = 1; + } + col += 1; + } + + (line, col) + }; + let msg = e.message(); + let e = format!( + "{msg} +File `{file_path}` +Line {line}, Column {col} +Affected: #'{affected}'#" + ); + e +} diff --git a/server/src/lib.rs b/server/src/lib.rs index 4ef82ef..b3edd2b 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -1,7 +1,8 @@ -use std::{collections::HashMap, sync::Arc}; +use std::{collections::HashMap, convert::Infallible, sync::Arc}; use access_server::{AccessServerConfig, AccessServerLoader}; use common::{ + config::{merge_map, Merge}, context::Context, error::{AnyError, AnyResult}, stream::{proxy_table::StreamProxyConfigBuilder, session_table::StreamSessionTable}, @@ -195,7 +196,7 @@ pub async fn load_and_clean( Ok(()) } -#[derive(Debug, Deserialize)] +#[derive(Debug, Deserialize, Default)] #[serde(deny_unknown_fields)] pub struct ServerConfig { #[serde(default)] @@ -209,6 +210,27 @@ pub struct ServerConfig { #[serde(default)] pub udp_proxy: HashMap, UdpProxyConfigBuilder>, } +impl Merge for ServerConfig { + type Error = AnyError; + + fn merge(self, other: Self) -> Result + where + Self: Sized, + { + let access_server = self.access_server.merge(other.access_server)?; + let proxy_server = self.proxy_server.merge(other.proxy_server)?; + let global = self.global.merge(other.global)?; + let stream_proxy = merge_map(self.stream_proxy, other.stream_proxy)?; + let udp_proxy = merge_map(self.udp_proxy, other.udp_proxy)?; + Ok(Self { + access_server, + proxy_server, + global, + stream_proxy, + udp_proxy, + }) + } +} #[derive(Debug, Default, Deserialize)] #[serde(deny_unknown_fields)] @@ -216,3 +238,14 @@ pub struct Global { #[serde(default)] pub stream_pool: ConcretePoolBuilder, } +impl Merge for Global { + type Error = Infallible; + + fn merge(self, other: Self) -> Result + where + Self: Sized, + { + let stream_pool = self.stream_pool.merge(other.stream_pool)?; + Ok(Self { stream_pool }) + } +} diff --git a/server/src/main.rs b/server/src/main.rs index 01a7823..f9bf146 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -4,7 +4,7 @@ use axum::Router; use clap::Parser; use common::error::AnyResult; use server::{ - config::multi_file_config::{spawn_watch_tasks, MultiFileConfigReader}, + config::multi_file_config::{spawn_watch_tasks, MultiConfigReader}, monitor::monitor_router, serve, ServeContext, }; @@ -32,6 +32,10 @@ struct Args { async fn main() -> AnyResult { tracing_subscriber::fmt::init(); let args = Args::parse(); + if args.config_file_paths.is_empty() { + tracing::error!("No config files provided. Check --help for usage."); + std::process::abort(); + } if let Some(path) = args.csv_log_path { csv_logger::init( path, @@ -76,7 +80,7 @@ async fn main() -> AnyResult { } let notify_rx = spawn_watch_tasks(&args.config_file_paths); - let config_reader = MultiFileConfigReader::new(args.config_file_paths.into()); + let config_reader = MultiConfigReader::new(args.config_file_paths.into()); serve(notify_rx, config_reader, serve_context) .await .map_err(Into::into)