diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index a0656e6162c..6c43a31d2c1 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -22,6 +22,10 @@ updates:
- "axum"
- "tower"
- "tower-http"
+ webrtc:
+ patterns:
+ - "rcgen"
+ - "webrtc"
- package-ecosystem: "github-actions"
directory: "/"
schedule:
diff --git a/.github/workflows/cache-factory.yml b/.github/workflows/cache-factory.yml
index 07e2bb1f7cf..66b88a8a606 100644
--- a/.github/workflows/cache-factory.yml
+++ b/.github/workflows/cache-factory.yml
@@ -22,7 +22,7 @@ jobs:
- uses: dtolnay/rust-toolchain@stable
- - uses: Swatinem/rust-cache@3cf7f8cc28d1b4e7d01e3783be10a97d55d483c8 # v2.7.1
+ - uses: Swatinem/rust-cache@a22603398250b864f7190077025cf752307154dc # v2.7.2
with:
shared-key: stable-cache
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 04dab309902..3dbb50353ba 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -40,7 +40,7 @@ jobs:
- uses: dtolnay/rust-toolchain@stable
- - uses: Swatinem/rust-cache@3cf7f8cc28d1b4e7d01e3783be10a97d55d483c8 # v2.7.1
+ - uses: Swatinem/rust-cache@a22603398250b864f7190077025cf752307154dc # v2.7.2
with:
shared-key: stable-cache
save-if: false
@@ -158,7 +158,7 @@ jobs:
- uses: r7kamura/rust-problem-matchers@2c2f1016021a7455a6b5b4bbae31145f3b3cd83a #v1.4.0
- - uses: Swatinem/rust-cache@3cf7f8cc28d1b4e7d01e3783be10a97d55d483c8 # v2.7.1
+ - uses: Swatinem/rust-cache@a22603398250b864f7190077025cf752307154dc # v2.7.2
with:
key: ${{ matrix.target }}
save-if: ${{ github.ref == 'refs/heads/master' }}
@@ -183,7 +183,7 @@ jobs:
- uses: r7kamura/rust-problem-matchers@2c2f1016021a7455a6b5b4bbae31145f3b3cd83a #v1.4.0
- - uses: Swatinem/rust-cache@3cf7f8cc28d1b4e7d01e3783be10a97d55d483c8 # v2.7.1
+ - uses: Swatinem/rust-cache@a22603398250b864f7190077025cf752307154dc # v2.7.2
with:
save-if: ${{ github.ref == 'refs/heads/master' }}
@@ -204,7 +204,7 @@ jobs:
- uses: r7kamura/rust-problem-matchers@2c2f1016021a7455a6b5b4bbae31145f3b3cd83a #v1.4.0
- - uses: Swatinem/rust-cache@3cf7f8cc28d1b4e7d01e3783be10a97d55d483c8 # v2.7.1
+ - uses: Swatinem/rust-cache@a22603398250b864f7190077025cf752307154dc # v2.7.2
with:
key: ${{ matrix.features }}
save-if: ${{ github.ref == 'refs/heads/master' }}
@@ -221,7 +221,7 @@ jobs:
- uses: r7kamura/rust-problem-matchers@2c2f1016021a7455a6b5b4bbae31145f3b3cd83a #v1.4.0
- - uses: Swatinem/rust-cache@3cf7f8cc28d1b4e7d01e3783be10a97d55d483c8 # v2.7.1
+ - uses: Swatinem/rust-cache@a22603398250b864f7190077025cf752307154dc # v2.7.2
with:
save-if: ${{ github.ref == 'refs/heads/master' }}
@@ -234,9 +234,8 @@ jobs:
fail-fast: false
matrix:
rust-version: [
- # 1.72.0, # current stable
- # beta,
- nightly-2023-09-10
+ 1.75.0, # current stable
+ beta,
]
steps:
- uses: actions/checkout@v4
@@ -248,7 +247,7 @@ jobs:
- uses: r7kamura/rust-problem-matchers@2c2f1016021a7455a6b5b4bbae31145f3b3cd83a #v1.4.0
- - uses: Swatinem/rust-cache@3cf7f8cc28d1b4e7d01e3783be10a97d55d483c8 # v2.7.1
+ - uses: Swatinem/rust-cache@a22603398250b864f7190077025cf752307154dc # v2.7.2
with:
save-if: ${{ github.ref == 'refs/heads/master' }}
@@ -264,7 +263,7 @@ jobs:
- uses: r7kamura/rust-problem-matchers@2c2f1016021a7455a6b5b4bbae31145f3b3cd83a #v1.4.0
- - uses: Swatinem/rust-cache@3cf7f8cc28d1b4e7d01e3783be10a97d55d483c8 # v2.7.1
+ - uses: Swatinem/rust-cache@a22603398250b864f7190077025cf752307154dc # v2.7.2
with:
save-if: ${{ github.ref == 'refs/heads/master' }}
@@ -283,7 +282,7 @@ jobs:
- uses: r7kamura/rust-problem-matchers@2c2f1016021a7455a6b5b4bbae31145f3b3cd83a #v1.4.0
- - uses: Swatinem/rust-cache@3cf7f8cc28d1b4e7d01e3783be10a97d55d483c8 # v2.7.1
+ - uses: Swatinem/rust-cache@a22603398250b864f7190077025cf752307154dc # v2.7.2
with:
shared-key: stable-cache
save-if: false
@@ -307,6 +306,15 @@ jobs:
semver:
runs-on: ubuntu-latest
+ env:
+ # Unset the global `RUSTFLAGS` env to allow warnings.
+ # cargo-semver-checks intentionally re-locks dependency versions
+ # before checking, and we shouldn't fail here if a dep has a warning.
+ #
+ # More context:
+ # https://github.com/libp2p/rust-libp2p/pull/4932#issuecomment-1829014527
+ # https://github.com/obi1kenobi/cargo-semver-checks/issues/589
+ RUSTFLAGS: ''
steps:
- uses: actions/checkout@v4
- run: wget -q -O- https://github.com/obi1kenobi/cargo-semver-checks/releases/download/v0.25.0/cargo-semver-checks-x86_64-unknown-linux-gnu.tar.gz | tar -xz -C ~/.cargo/bin
@@ -366,12 +374,12 @@ jobs:
steps:
- uses: actions/checkout@v4
- - uses: Swatinem/rust-cache@3cf7f8cc28d1b4e7d01e3783be10a97d55d483c8 # v2.7.1
+ - uses: Swatinem/rust-cache@a22603398250b864f7190077025cf752307154dc # v2.7.2
- run: cargo install --version 0.10.0 pb-rs --locked
- name: Glob match
- uses: tj-actions/glob@v17
+ uses: tj-actions/glob@v18
id: glob
with:
files: |
@@ -392,7 +400,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- - uses: Swatinem/rust-cache@3cf7f8cc28d1b4e7d01e3783be10a97d55d483c8 # v2.7.1
+ - uses: Swatinem/rust-cache@a22603398250b864f7190077025cf752307154dc # v2.7.2
- run: cargo metadata --locked --format-version=1 > /dev/null
cargo-deny:
diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
index bffcc60d2ea..f1e478c4d80 100644
--- a/.github/workflows/docs.yml
+++ b/.github/workflows/docs.yml
@@ -24,7 +24,7 @@ jobs:
echo "" > target/doc/index.html
cp -r target/doc/* ./host-docs
- name: Upload documentation
- uses: actions/upload-pages-artifact@v2.0.0
+ uses: actions/upload-pages-artifact@v3.0.0
with:
path: "host-docs/"
@@ -42,5 +42,5 @@ jobs:
steps:
- name: Deploy to GitHub Pages
id: deployment
- uses: actions/deploy-pages@v2
+ uses: actions/deploy-pages@v4
diff --git a/Cargo.lock b/Cargo.lock
index 617d54e9b2b..044ea9687ab 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -143,9 +143,9 @@ dependencies = [
[[package]]
name = "anyhow"
-version = "1.0.75"
+version = "1.0.79"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6"
+checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca"
[[package]]
name = "arbitrary"
@@ -300,9 +300,9 @@ dependencies = [
[[package]]
name = "async-io"
-version = "2.2.1"
+version = "2.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d6d3b15875ba253d1110c740755e246537483f152fa334f91abd7fe84c88b3ff"
+checksum = "6afaa937395a620e33dc6a742c593c01aced20aa376ffb0f628121198578ccc7"
dependencies = [
"async-lock 3.1.0",
"cfg-if",
@@ -311,7 +311,7 @@ dependencies = [
"futures-lite 2.0.1",
"parking",
"polling 3.3.0",
- "rustix 0.38.21",
+ "rustix 0.38.28",
"slab",
"tracing",
"windows-sys 0.52.0",
@@ -418,13 +418,13 @@ checksum = "ecc7ab41815b3c653ccd2978ec3255c81349336702dfdf62ee6f7069b12a3aae"
[[package]]
name = "async-trait"
-version = "0.1.74"
+version = "0.1.77"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9"
+checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.39",
+ "syn 2.0.48",
]
[[package]]
@@ -452,7 +452,7 @@ version = "0.24.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8d9a9bf8b79a749ee0b911b91b671cc2b6c670bdbc7e3dfd537576ddc94bb2a2"
dependencies = [
- "http",
+ "http 0.2.9",
"log",
"url",
]
@@ -482,13 +482,42 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf"
dependencies = [
"async-trait",
- "axum-core",
+ "axum-core 0.3.4",
"bitflags 1.3.2",
"bytes",
"futures-util",
- "http",
- "http-body",
- "hyper",
+ "http 0.2.9",
+ "http-body 0.4.5",
+ "hyper 0.14.27",
+ "itoa",
+ "matchit",
+ "memchr",
+ "mime",
+ "percent-encoding",
+ "pin-project-lite",
+ "rustversion",
+ "serde",
+ "sync_wrapper",
+ "tower",
+ "tower-layer",
+ "tower-service",
+]
+
+[[package]]
+name = "axum"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d09dbe0e490df5da9d69b36dca48a76635288a82f92eca90024883a56202026d"
+dependencies = [
+ "async-trait",
+ "axum-core 0.4.2",
+ "bytes",
+ "futures-util",
+ "http 1.0.0",
+ "http-body 1.0.0",
+ "http-body-util",
+ "hyper 1.1.0",
+ "hyper-util",
"itoa",
"matchit",
"memchr",
@@ -505,6 +534,7 @@ dependencies = [
"tower",
"tower-layer",
"tower-service",
+ "tracing",
]
[[package]]
@@ -516,12 +546,33 @@ dependencies = [
"async-trait",
"bytes",
"futures-util",
- "http",
- "http-body",
+ "http 0.2.9",
+ "http-body 0.4.5",
+ "mime",
+ "rustversion",
+ "tower-layer",
+ "tower-service",
+]
+
+[[package]]
+name = "axum-core"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e87c8503f93e6d144ee5690907ba22db7ba79ab001a932ab99034f0fe836b3df"
+dependencies = [
+ "async-trait",
+ "bytes",
+ "futures-util",
+ "http 1.0.0",
+ "http-body 1.0.0",
+ "http-body-util",
"mime",
+ "pin-project-lite",
"rustversion",
+ "sync_wrapper",
"tower-layer",
"tower-service",
+ "tracing",
]
[[package]]
@@ -559,9 +610,9 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8"
[[package]]
name = "base64"
-version = "0.21.5"
+version = "0.21.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9"
+checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"
[[package]]
name = "base64ct"
@@ -571,9 +622,9 @@ checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b"
[[package]]
name = "basic-toml"
-version = "0.1.4"
+version = "0.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7bfc506e7a2370ec239e1d072507b2a80c833083699d3c6fa176fbb4de8448c6"
+checksum = "2db21524cad41c5591204d22d75e1970a2d1f71060214ca931dc7d5afe2c14e5"
dependencies = [
"serde",
]
@@ -661,7 +712,7 @@ name = "browser-webrtc-example"
version = "0.1.0"
dependencies = [
"anyhow",
- "axum",
+ "axum 0.7.3",
"futures",
"js-sys",
"libp2p",
@@ -849,9 +900,9 @@ dependencies = [
[[package]]
name = "clap"
-version = "4.4.10"
+version = "4.4.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41fffed7514f420abec6d183b1d3acfd9099c79c3a10a06ade4f8203f1411272"
+checksum = "52bdc885e4cacc7f7c9eedc1ef6da641603180c783c41a15c264944deeaab642"
dependencies = [
"clap_builder",
"clap_derive",
@@ -859,9 +910,9 @@ dependencies = [
[[package]]
name = "clap_builder"
-version = "4.4.9"
+version = "4.4.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "63361bae7eef3771745f02d8d892bec2fee5f6e34af316ba556e7f97a7069ff1"
+checksum = "fb7fb5e4e979aec3be7791562fcba452f94ad85e954da024396433e0e25a79e9"
dependencies = [
"anstream",
"anstyle",
@@ -878,7 +929,7 @@ dependencies = [
"heck",
"proc-macro2",
"quote",
- "syn 2.0.39",
+ "syn 2.0.48",
]
[[package]]
@@ -1155,7 +1206,7 @@ checksum = "83fdaf97f4804dcebfa5862639bc9ce4121e82140bec2a987ac5140294865b5b"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.39",
+ "syn 2.0.48",
]
[[package]]
@@ -1272,7 +1323,7 @@ checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.39",
+ "syn 2.0.48",
]
[[package]]
@@ -1377,7 +1428,7 @@ dependencies = [
"heck",
"proc-macro2",
"quote",
- "syn 2.0.39",
+ "syn 2.0.48",
]
[[package]]
@@ -1411,23 +1462,12 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
[[package]]
name = "errno"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a"
-dependencies = [
- "errno-dragonfly",
- "libc",
- "windows-sys 0.48.0",
-]
-
-[[package]]
-name = "errno-dragonfly"
-version = "0.1.2"
+version = "0.3.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"
+checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245"
dependencies = [
- "cc",
"libc",
+ "windows-sys 0.52.0",
]
[[package]]
@@ -1467,8 +1507,8 @@ dependencies = [
"cookie",
"futures-core",
"futures-util",
- "http",
- "hyper",
+ "http 0.2.9",
+ "hyper 0.14.27",
"hyper-rustls",
"mime",
"serde",
@@ -1557,9 +1597,9 @@ dependencies = [
[[package]]
name = "futures"
-version = "0.3.29"
+version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335"
+checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0"
dependencies = [
"futures-channel",
"futures-core",
@@ -1582,9 +1622,9 @@ dependencies = [
[[package]]
name = "futures-channel"
-version = "0.3.29"
+version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb"
+checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78"
dependencies = [
"futures-core",
"futures-sink",
@@ -1592,15 +1632,15 @@ dependencies = [
[[package]]
name = "futures-core"
-version = "0.3.29"
+version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c"
+checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d"
[[package]]
name = "futures-executor"
-version = "0.3.29"
+version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc"
+checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d"
dependencies = [
"futures-core",
"futures-task",
@@ -1610,9 +1650,9 @@ dependencies = [
[[package]]
name = "futures-io"
-version = "0.3.29"
+version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa"
+checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1"
[[package]]
name = "futures-lite"
@@ -1641,13 +1681,13 @@ dependencies = [
[[package]]
name = "futures-macro"
-version = "0.3.29"
+version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb"
+checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.39",
+ "syn 2.0.48",
]
[[package]]
@@ -1662,15 +1702,15 @@ dependencies = [
[[package]]
name = "futures-sink"
-version = "0.3.29"
+version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817"
+checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5"
[[package]]
name = "futures-task"
-version = "0.3.29"
+version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2"
+checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004"
[[package]]
name = "futures-ticker"
@@ -1695,9 +1735,9 @@ dependencies = [
[[package]]
name = "futures-util"
-version = "0.3.29"
+version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104"
+checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48"
dependencies = [
"futures-channel",
"futures-core",
@@ -1827,7 +1867,7 @@ dependencies = [
"futures-core",
"futures-sink",
"futures-util",
- "http",
+ "http 0.2.9",
"indexmap 1.9.3",
"slab",
"tokio",
@@ -1835,6 +1875,25 @@ dependencies = [
"tracing",
]
+[[package]]
+name = "h2"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e1d308f63daf4181410c242d34c11f928dcb3aa105852019e043c9d1f4e4368a"
+dependencies = [
+ "bytes",
+ "fnv",
+ "futures-core",
+ "futures-sink",
+ "futures-util",
+ "http 1.0.0",
+ "indexmap 2.0.0",
+ "slab",
+ "tokio",
+ "tokio-util",
+ "tracing",
+]
+
[[package]]
name = "half"
version = "1.8.2"
@@ -1935,9 +1994,9 @@ dependencies = [
[[package]]
name = "hkdf"
-version = "0.12.3"
+version = "0.12.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437"
+checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7"
dependencies = [
"hmac 0.12.1",
]
@@ -2010,6 +2069,17 @@ dependencies = [
"itoa",
]
+[[package]]
+name = "http"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b32afd38673a8016f7c9ae69e5af41a58f81b1d31689040f2f1959594ce194ea"
+dependencies = [
+ "bytes",
+ "fnv",
+ "itoa",
+]
+
[[package]]
name = "http-body"
version = "0.4.5"
@@ -2017,15 +2087,38 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1"
dependencies = [
"bytes",
- "http",
+ "http 0.2.9",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "http-body"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643"
+dependencies = [
+ "bytes",
+ "http 1.0.0",
+]
+
+[[package]]
+name = "http-body-util"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "41cb79eb393015dadd30fc252023adb0b2400a0caee0fa2a077e6e21a551e840"
+dependencies = [
+ "bytes",
+ "futures-util",
+ "http 1.0.0",
+ "http-body 1.0.0",
"pin-project-lite",
]
[[package]]
name = "http-range-header"
-version = "0.3.1"
+version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "add0ab9360ddbd88cfeb3bd9574a1d85cfdfa14db10b3e21d3700dbc4328758f"
+checksum = "3ce4ef31cda248bbdb6e6820603b82dfcd9e833db65a43e997a0ccec777d11fe"
[[package]]
name = "httparse"
@@ -2055,9 +2148,9 @@ dependencies = [
"futures-channel",
"futures-core",
"futures-util",
- "h2",
- "http",
- "http-body",
+ "h2 0.3.20",
+ "http 0.2.9",
+ "http-body 0.4.5",
"httparse",
"httpdate",
"itoa",
@@ -2069,14 +2162,33 @@ dependencies = [
"want",
]
+[[package]]
+name = "hyper"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb5aa53871fc917b1a9ed87b683a5d86db645e23acb32c2e0785a353e522fb75"
+dependencies = [
+ "bytes",
+ "futures-channel",
+ "futures-util",
+ "h2 0.4.0",
+ "http 1.0.0",
+ "http-body 1.0.0",
+ "httparse",
+ "httpdate",
+ "itoa",
+ "pin-project-lite",
+ "tokio",
+]
+
[[package]]
name = "hyper-rustls"
version = "0.23.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1788965e61b367cd03a62950836d5cd41560c3577d90e40e0819373194d1661c"
dependencies = [
- "http",
- "hyper",
+ "http 0.2.9",
+ "hyper 0.14.27",
"log",
"rustls 0.20.8",
"rustls-native-certs",
@@ -2090,7 +2202,7 @@ version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1"
dependencies = [
- "hyper",
+ "hyper 0.14.27",
"pin-project-lite",
"tokio",
"tokio-io-timeout",
@@ -2103,12 +2215,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905"
dependencies = [
"bytes",
- "hyper",
+ "hyper 0.14.27",
"native-tls",
"tokio",
"tokio-native-tls",
]
+[[package]]
+name = "hyper-util"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bdea9aac0dbe5a9240d68cfd9501e2db94222c6dc06843e06640b9e07f0fdc67"
+dependencies = [
+ "bytes",
+ "futures-channel",
+ "futures-util",
+ "http 1.0.0",
+ "http-body 1.0.0",
+ "hyper 1.1.0",
+ "pin-project-lite",
+ "socket2 0.5.5",
+ "tokio",
+ "tracing",
+]
+
[[package]]
name = "identify-example"
version = "0.1.0"
@@ -2157,7 +2287,7 @@ version = "3.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d6b0422c86d7ce0e97169cc42e04ae643caf278874a7a3c87b8150a220dc7e1e"
dependencies = [
- "async-io 2.2.1",
+ "async-io 2.2.2",
"core-foundation",
"fnv",
"futures",
@@ -2181,8 +2311,8 @@ dependencies = [
"attohttpc",
"bytes",
"futures",
- "http",
- "hyper",
+ "http 0.2.9",
+ "hyper 0.14.27",
"log",
"rand 0.8.5",
"tokio",
@@ -2256,7 +2386,7 @@ name = "interop-tests"
version = "0.1.0"
dependencies = [
"anyhow",
- "axum",
+ "axum 0.7.3",
"console_error_panic_hook",
"either",
"futures",
@@ -2349,7 +2479,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b"
dependencies = [
"hermit-abi",
- "rustix 0.38.21",
+ "rustix 0.38.28",
"windows-sys 0.48.0",
]
@@ -2370,9 +2500,9 @@ checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38"
[[package]]
name = "js-sys"
-version = "0.3.66"
+version = "0.3.67"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca"
+checksum = "9a1d36f1235bc969acba30b7f5990b864423a6068a10f7c90ae8f0112e3a59d1"
dependencies = [
"wasm-bindgen",
]
@@ -2390,7 +2520,7 @@ dependencies = [
name = "keygen"
version = "0.1.0"
dependencies = [
- "base64 0.21.5",
+ "base64 0.21.7",
"clap",
"libp2p-core",
"libp2p-identity",
@@ -2416,13 +2546,13 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
[[package]]
name = "libc"
-version = "0.2.150"
+version = "0.2.152"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c"
+checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7"
[[package]]
name = "libp2p"
-version = "0.53.1"
+version = "0.53.2"
dependencies = [
"async-std",
"async-trait",
@@ -2510,7 +2640,7 @@ dependencies = [
[[package]]
name = "libp2p-connection-limits"
-version = "0.3.0"
+version = "0.3.1"
dependencies = [
"async-std",
"libp2p-core",
@@ -2527,7 +2657,7 @@ dependencies = [
[[package]]
name = "libp2p-core"
-version = "0.41.1"
+version = "0.41.2"
dependencies = [
"async-std",
"either",
@@ -2634,7 +2764,7 @@ version = "0.46.1"
dependencies = [
"async-std",
"asynchronous-codec",
- "base64 0.21.5",
+ "base64 0.21.7",
"byteorder",
"bytes",
"either",
@@ -2694,7 +2824,7 @@ name = "libp2p-identity"
version = "0.2.8"
dependencies = [
"asn1_der",
- "base64 0.21.5",
+ "base64 0.21.7",
"bs58",
"criterion",
"ed25519-dalek",
@@ -2720,7 +2850,7 @@ dependencies = [
[[package]]
name = "libp2p-kad"
-version = "0.45.2"
+version = "0.45.3"
dependencies = [
"arrayvec",
"async-std",
@@ -2757,7 +2887,7 @@ dependencies = [
name = "libp2p-mdns"
version = "0.45.1"
dependencies = [
- "async-io 2.2.1",
+ "async-io 2.2.2",
"async-std",
"data-encoding",
"futures",
@@ -2969,7 +3099,7 @@ dependencies = [
[[package]]
name = "libp2p-quic"
-version = "0.10.1"
+version = "0.10.2"
dependencies = [
"async-std",
"bytes",
@@ -3057,7 +3187,7 @@ dependencies = [
[[package]]
name = "libp2p-request-response"
-version = "0.26.0"
+version = "0.26.1"
dependencies = [
"anyhow",
"async-std",
@@ -3086,13 +3216,13 @@ dependencies = [
[[package]]
name = "libp2p-server"
-version = "0.12.4"
+version = "0.12.5"
dependencies = [
- "base64 0.21.5",
+ "base64 0.21.7",
"clap",
"futures",
"futures-timer",
- "hyper",
+ "hyper 0.14.27",
"libp2p",
"prometheus-client",
"serde",
@@ -3106,7 +3236,7 @@ dependencies = [
[[package]]
name = "libp2p-swarm"
-version = "0.44.0"
+version = "0.44.1"
dependencies = [
"async-std",
"either",
@@ -3139,12 +3269,12 @@ dependencies = [
[[package]]
name = "libp2p-swarm-derive"
-version = "0.34.0"
+version = "0.34.2"
dependencies = [
"heck",
"proc-macro2",
"quote",
- "syn 2.0.39",
+ "syn 2.0.48",
]
[[package]]
@@ -3168,7 +3298,7 @@ dependencies = [
name = "libp2p-tcp"
version = "0.41.0"
dependencies = [
- "async-io 2.2.1",
+ "async-io 2.2.2",
"async-std",
"futures",
"futures-timer",
@@ -3232,7 +3362,7 @@ dependencies = [
[[package]]
name = "libp2p-webrtc"
-version = "0.6.1-alpha"
+version = "0.7.0-alpha"
dependencies = [
"async-trait",
"bytes",
@@ -3261,7 +3391,7 @@ dependencies = [
[[package]]
name = "libp2p-webrtc-utils"
-version = "0.1.0"
+version = "0.2.0"
dependencies = [
"asynchronous-codec",
"bytes",
@@ -3283,23 +3413,17 @@ dependencies = [
[[package]]
name = "libp2p-webrtc-websys"
-version = "0.2.0-alpha"
+version = "0.3.0-alpha"
dependencies = [
"bytes",
"futures",
- "futures-timer",
"getrandom 0.2.11",
"hex",
- "hex-literal",
"js-sys",
"libp2p-core",
"libp2p-identity",
- "libp2p-noise",
- "libp2p-ping",
- "libp2p-swarm",
"libp2p-webrtc-utils",
"send_wrapper 0.6.0",
- "serde",
"thiserror",
"tracing",
"wasm-bindgen",
@@ -3373,12 +3497,14 @@ name = "libp2p-yamux"
version = "0.45.1"
dependencies = [
"async-std",
+ "either",
"futures",
"libp2p-core",
"libp2p-muxer-test-harness",
"thiserror",
"tracing",
- "yamux",
+ "yamux 0.12.1",
+ "yamux 0.13.1",
]
[[package]]
@@ -3443,9 +3569,9 @@ checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519"
[[package]]
name = "linux-raw-sys"
-version = "0.4.10"
+version = "0.4.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "da2479e8c062e40bf0066ffa0bc823de0a9368974af99c9f6df941d2c231e03f"
+checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456"
[[package]]
name = "lock_api"
@@ -3553,7 +3679,7 @@ name = "metrics-example"
version = "0.1.0"
dependencies = [
"futures",
- "hyper",
+ "hyper 0.14.27",
"libp2p",
"opentelemetry",
"opentelemetry-otlp",
@@ -3873,9 +3999,9 @@ dependencies = [
[[package]]
name = "once_cell"
-version = "1.18.0"
+version = "1.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"
+checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
[[package]]
name = "oorandom"
@@ -3912,7 +4038,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.39",
+ "syn 2.0.48",
]
[[package]]
@@ -3951,7 +4077,7 @@ checksum = "7e5e5a5c4135864099f3faafbe939eb4d7f9b80ebf68a8448da961b32a7c1275"
dependencies = [
"async-trait",
"futures-core",
- "http",
+ "http 0.2.9",
"opentelemetry-proto",
"opentelemetry-semantic-conventions",
"opentelemetry_api",
@@ -4102,7 +4228,7 @@ version = "3.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3163d2912b7c3b52d651a055f2c7eec9ba5cd22d26ef75b8dd3a59980b185923"
dependencies = [
- "base64 0.21.5",
+ "base64 0.21.7",
"serde",
]
@@ -4138,7 +4264,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.39",
+ "syn 2.0.48",
]
[[package]]
@@ -4239,7 +4365,7 @@ dependencies = [
"cfg-if",
"concurrent-queue",
"pin-project-lite",
- "rustix 0.38.21",
+ "rustix 0.38.28",
"tracing",
"windows-sys 0.48.0",
]
@@ -4308,9 +4434,9 @@ dependencies = [
[[package]]
name = "proc-macro2"
-version = "1.0.69"
+version = "1.0.76"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da"
+checksum = "95fc56cda0b5c3325f5fbbd7ff9fda9e02bb00bb3dac51252d2f1bfa1cb8cc8c"
dependencies = [
"unicode-ident",
]
@@ -4335,7 +4461,7 @@ checksum = "440f724eba9f6996b75d63681b0a92b06947f1457076d503a4d2e2c8f56442b8"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.39",
+ "syn 2.0.48",
]
[[package]]
@@ -4461,9 +4587,9 @@ dependencies = [
[[package]]
name = "quote"
-version = "1.0.33"
+version = "1.0.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
+checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef"
dependencies = [
"proc-macro2",
]
@@ -4703,19 +4829,19 @@ dependencies = [
[[package]]
name = "reqwest"
-version = "0.11.22"
+version = "0.11.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b"
+checksum = "37b1ae8d9ac08420c66222fb9096fc5de435c3c48542bc5336c51892cffafb41"
dependencies = [
- "base64 0.21.5",
+ "base64 0.21.7",
"bytes",
"encoding_rs",
"futures-core",
"futures-util",
- "h2",
- "http",
- "http-body",
- "hyper",
+ "h2 0.3.20",
+ "http 0.2.9",
+ "http-body 0.4.5",
+ "hyper 0.14.27",
"hyper-tls",
"ipnet",
"js-sys",
@@ -4861,9 +4987,9 @@ dependencies = [
[[package]]
name = "rust-embed"
-version = "8.0.0"
+version = "8.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b1e7d90385b59f0a6bf3d3b757f3ca4ece2048265d70db20a2016043d4509a40"
+checksum = "a82c0bbc10308ed323529fd3c1dce8badda635aa319a5ff0e6466f33b8101e3f"
dependencies = [
"rust-embed-impl",
"rust-embed-utils",
@@ -4872,23 +4998,23 @@ dependencies = [
[[package]]
name = "rust-embed-impl"
-version = "8.0.0"
+version = "8.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c3d8c6fd84090ae348e63a84336b112b5c3918b3bf0493a581f7bd8ee623c29"
+checksum = "6227c01b1783cdfee1bcf844eb44594cd16ec71c35305bf1c9fb5aade2735e16"
dependencies = [
"proc-macro2",
"quote",
"rust-embed-utils",
"shellexpand",
- "syn 2.0.39",
+ "syn 2.0.48",
"walkdir",
]
[[package]]
name = "rust-embed-utils"
-version = "8.0.0"
+version = "8.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "873feff8cb7bf86fdf0a71bb21c95159f4e4a37dd7a4bd1855a940909b583ada"
+checksum = "8cb0a25bfbb2d4b4402179c2cf030387d9990857ce08a32592c6238db9fa8665"
dependencies = [
"globset",
"sha2 0.10.8",
@@ -4941,15 +5067,15 @@ dependencies = [
[[package]]
name = "rustix"
-version = "0.38.21"
+version = "0.38.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b426b0506e5d50a7d8dafcf2e81471400deb602392c7dd110815afb4eaf02a3"
+checksum = "72e572a5e8ca657d7366229cdde4bd14c4eb5499a9573d4d366fe1b599daa316"
dependencies = [
"bitflags 2.4.1",
"errno",
"libc",
- "linux-raw-sys 0.4.10",
- "windows-sys 0.48.0",
+ "linux-raw-sys 0.4.12",
+ "windows-sys 0.52.0",
]
[[package]]
@@ -4994,7 +5120,7 @@ version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2"
dependencies = [
- "base64 0.21.5",
+ "base64 0.21.7",
]
[[package]]
@@ -5150,29 +5276,29 @@ dependencies = [
[[package]]
name = "serde"
-version = "1.0.193"
+version = "1.0.195"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89"
+checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
-version = "1.0.193"
+version = "1.0.195"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3"
+checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.39",
+ "syn 2.0.48",
]
[[package]]
name = "serde_json"
-version = "1.0.108"
+version = "1.0.111"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b"
+checksum = "176e46fa42316f18edd598015a5166857fc835ec732f5215eac6b7bdbf0a84f4"
dependencies = [
"indexmap 2.0.0",
"itoa",
@@ -5198,7 +5324,7 @@ checksum = "8725e1dfadb3a50f7e5ce0b1a540466f6ed3fe7a0fca2ac2b8b831d31316bd00"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.39",
+ "syn 2.0.48",
]
[[package]]
@@ -5282,9 +5408,9 @@ dependencies = [
[[package]]
name = "shellexpand"
-version = "2.1.2"
+version = "3.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ccc8076840c4da029af4f87e4e8daeb0fca6b87bbb02e10cb60b791450e11e4"
+checksum = "da03fa3b94cc19e3ebfc88c4229c49d8f08cdbd1228870a45f0ffdf84988e14b"
dependencies = [
"dirs",
]
@@ -5460,7 +5586,7 @@ version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7beb1624a3ea34778d58d30e2b8606b4d29fe65e87c4d50b87ed30afd5c3830c"
dependencies = [
- "base64 0.21.5",
+ "base64 0.21.7",
"crc",
"lazy_static",
"md-5",
@@ -5501,9 +5627,9 @@ dependencies = [
[[package]]
name = "syn"
-version = "2.0.39"
+version = "2.0.48"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a"
+checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f"
dependencies = [
"proc-macro2",
"quote",
@@ -5566,15 +5692,15 @@ dependencies = [
[[package]]
name = "tempfile"
-version = "3.8.1"
+version = "3.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5"
+checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa"
dependencies = [
"cfg-if",
"fastrand 2.0.0",
"redox_syscall 0.4.1",
- "rustix 0.38.21",
- "windows-sys 0.48.0",
+ "rustix 0.38.28",
+ "windows-sys 0.52.0",
]
[[package]]
@@ -5593,11 +5719,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bf0fe180d5f1f7dd32bb5f1a8d19231bb63dc9bbb1985e1dbb6f07163b6a8578"
dependencies = [
"async-trait",
- "base64 0.21.5",
+ "base64 0.21.7",
"cookie",
"fantoccini",
"futures",
- "http",
+ "http 0.2.9",
"indexmap 1.9.3",
"log",
"parking_lot",
@@ -5626,22 +5752,22 @@ dependencies = [
[[package]]
name = "thiserror"
-version = "1.0.50"
+version = "1.0.56"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2"
+checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad"
dependencies = [
"thiserror-impl",
]
[[package]]
name = "thiserror-impl"
-version = "1.0.50"
+version = "1.0.56"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8"
+checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.39",
+ "syn 2.0.48",
]
[[package]]
@@ -5708,9 +5834,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
[[package]]
name = "tokio"
-version = "1.34.0"
+version = "1.35.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9"
+checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104"
dependencies = [
"backtrace",
"bytes",
@@ -5743,7 +5869,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.39",
+ "syn 2.0.48",
]
[[package]]
@@ -5800,15 +5926,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3082666a3a6433f7f511c7192923fa1fe07c69332d3c6a2e6bb040b569199d5a"
dependencies = [
"async-trait",
- "axum",
- "base64 0.21.5",
+ "axum 0.6.20",
+ "base64 0.21.7",
"bytes",
"futures-core",
"futures-util",
- "h2",
- "http",
- "http-body",
- "hyper",
+ "h2 0.3.20",
+ "http 0.2.9",
+ "http-body 0.4.5",
+ "hyper 0.14.27",
"hyper-timeout",
"percent-encoding",
"pin-project",
@@ -5843,16 +5969,16 @@ dependencies = [
[[package]]
name = "tower-http"
-version = "0.4.4"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "61c5bb1d698276a2443e5ecfabc1008bf15a36c12e6a7176e7bf089ea9131140"
+checksum = "09e12e6351354851911bdf8c2b8f2ab15050c567d70a8b9a37ae7b8301a4080d"
dependencies = [
"bitflags 2.4.1",
"bytes",
- "futures-core",
"futures-util",
- "http",
- "http-body",
+ "http 1.0.0",
+ "http-body 1.0.0",
+ "http-body-util",
"http-range-header",
"httpdate",
"mime",
@@ -5898,7 +6024,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.39",
+ "syn 2.0.48",
]
[[package]]
@@ -5986,9 +6112,9 @@ checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed"
[[package]]
name = "trybuild"
-version = "1.0.85"
+version = "1.0.89"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "196a58260a906cedb9bf6d8034b6379d0c11f552416960452f267402ceeddff1"
+checksum = "9a9d3ba662913483d6722303f619e75ea10b7855b0f8e0d72799cf8621bb488f"
dependencies = [
"basic-toml",
"glob",
@@ -6006,7 +6132,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "58f4fcb97da0426e8146fe0e9b78cc13120161087256198701d12d9df77f7701"
dependencies = [
"async-trait",
- "base64 0.21.5",
+ "base64 0.21.7",
"futures",
"log",
"md-5",
@@ -6236,9 +6362,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
[[package]]
name = "wasm-bindgen"
-version = "0.2.89"
+version = "0.2.90"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e"
+checksum = "b1223296a201415c7fad14792dbefaace9bd52b62d33453ade1c5b5f07555406"
dependencies = [
"cfg-if",
"wasm-bindgen-macro",
@@ -6246,24 +6372,24 @@ dependencies = [
[[package]]
name = "wasm-bindgen-backend"
-version = "0.2.89"
+version = "0.2.90"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826"
+checksum = "fcdc935b63408d58a32f8cc9738a0bffd8f05cc7c002086c6ef20b7312ad9dcd"
dependencies = [
"bumpalo",
"log",
"once_cell",
"proc-macro2",
"quote",
- "syn 2.0.39",
+ "syn 2.0.48",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-futures"
-version = "0.4.38"
+version = "0.4.39"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9afec9963e3d0994cac82455b2b3502b81a7f40f9a0d32181f7528d9f4b43e02"
+checksum = "ac36a15a220124ac510204aec1c3e5db8a22ab06fd6706d881dc6149f8ed9a12"
dependencies = [
"cfg-if",
"js-sys",
@@ -6273,9 +6399,9 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro"
-version = "0.2.89"
+version = "0.2.90"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2"
+checksum = "3e4c238561b2d428924c49815533a8b9121c664599558a5d9ec51f8a1740a999"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
@@ -6283,28 +6409,28 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro-support"
-version = "0.2.89"
+version = "0.2.90"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283"
+checksum = "bae1abb6806dc1ad9e560ed242107c0f6c84335f1749dd4e8ddb012ebd5e25a7"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.39",
+ "syn 2.0.48",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-shared"
-version = "0.2.89"
+version = "0.2.90"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f"
+checksum = "4d91413b1c31d7539ba5ef2451af3f0b833a005eb27a631cec32bc0635a8602b"
[[package]]
name = "wasm-bindgen-test"
-version = "0.3.38"
+version = "0.3.39"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c6433b7c56db97397842c46b67e11873eda263170afeb3a2dc74a7cb370fee0d"
+checksum = "2cf9242c0d27999b831eae4767b2a146feb0b27d332d553e605864acd2afd403"
dependencies = [
"console_error_panic_hook",
"js-sys",
@@ -6316,13 +6442,13 @@ dependencies = [
[[package]]
name = "wasm-bindgen-test-macro"
-version = "0.3.38"
+version = "0.3.39"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "493fcbab756bb764fa37e6bee8cec2dd709eb4273d06d0c282a5e74275ded735"
+checksum = "794645f5408c9a039fd09f4d113cdfb2e7eba5ff1956b07bcf701cf4b394fe89"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.39",
+ "syn 2.0.48",
]
[[package]]
@@ -6338,9 +6464,9 @@ dependencies = [
[[package]]
name = "web-sys"
-version = "0.3.65"
+version = "0.3.66"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5db499c5f66323272151db0e666cd34f78617522fb0c1604d31a27c50c206a85"
+checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f"
dependencies = [
"js-sys",
"wasm-bindgen",
@@ -6355,7 +6481,7 @@ dependencies = [
"base64 0.13.1",
"bytes",
"cookie",
- "http",
+ "http 0.2.9",
"log",
"serde",
"serde_derive",
@@ -6863,6 +6989,22 @@ dependencies = [
"static_assertions",
]
+[[package]]
+name = "yamux"
+version = "0.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ad1d0148b89300047e72994bee99ecdabd15a9166a7b70c8b8c37c314dcc9002"
+dependencies = [
+ "futures",
+ "instant",
+ "log",
+ "nohash-hasher",
+ "parking_lot",
+ "pin-project",
+ "rand 0.8.5",
+ "static_assertions",
+]
+
[[package]]
name = "yasna"
version = "0.5.2"
@@ -6889,5 +7031,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.39",
+ "syn 2.0.48",
]
diff --git a/Cargo.toml b/Cargo.toml
index 346b316d4dc..d10ed7e3bbf 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -72,18 +72,18 @@ rust-version = "1.73.0"
[workspace.dependencies]
asynchronous-codec = { version = "0.7.0" }
futures-bounded = { version = "0.2.3", path = "misc/futures-bounded" }
-libp2p = { version = "0.53.0", path = "libp2p" }
+libp2p = { version = "0.53.2", path = "libp2p" }
libp2p-allow-block-list = { version = "0.3.0", path = "misc/allow-block-list" }
libp2p-autonat = { version = "0.12.0", path = "protocols/autonat" }
-libp2p-connection-limits = { version = "0.3.0", path = "misc/connection-limits" }
-libp2p-core = { version = "0.41.1", path = "core" }
+libp2p-connection-limits = { version = "0.3.1", path = "misc/connection-limits" }
+libp2p-core = { version = "0.41.2", path = "core" }
libp2p-dcutr = { version = "0.11.0", path = "protocols/dcutr" }
libp2p-dns = { version = "0.41.1", path = "transports/dns" }
libp2p-floodsub = { version = "0.44.0", path = "protocols/floodsub" }
libp2p-gossipsub = { version = "0.46.1", path = "protocols/gossipsub" }
libp2p-identify = { version = "0.44.1", path = "protocols/identify" }
libp2p-identity = { version = "0.2.8" }
-libp2p-kad = { version = "0.45.2", path = "protocols/kad" }
+libp2p-kad = { version = "0.45.3", path = "protocols/kad" }
libp2p-mdns = { version = "0.45.1", path = "protocols/mdns" }
libp2p-memory-connection-limits = { version = "0.2.0", path = "misc/memory-connection-limits" }
libp2p-metrics = { version = "0.14.1", path = "misc/metrics" }
@@ -94,21 +94,21 @@ libp2p-perf = { version = "0.3.0", path = "protocols/perf" }
libp2p-ping = { version = "0.44.0", path = "protocols/ping" }
libp2p-plaintext = { version = "0.41.0", path = "transports/plaintext" }
libp2p-pnet = { version = "0.24.0", path = "transports/pnet" }
-libp2p-quic = { version = "0.10.1", path = "transports/quic" }
+libp2p-quic = { version = "0.10.2", path = "transports/quic" }
libp2p-relay = { version = "0.17.1", path = "protocols/relay" }
libp2p-rendezvous = { version = "0.14.0", path = "protocols/rendezvous" }
-libp2p-request-response = { version = "0.26.0", path = "protocols/request-response" }
-libp2p-server = { version = "0.12.4", path = "misc/server" }
-libp2p-swarm = { version = "0.44.0", path = "swarm" }
-libp2p-swarm-derive = { version = "=0.34.0", path = "swarm-derive" } # `libp2p-swarm-derive` may not be compatible with different `libp2p-swarm` non-breaking releases. E.g. `libp2p-swarm` might introduce a new enum variant `FromSwarm` (which is `#[non-exhaustive]`) in a non-breaking release. Older versions of `libp2p-swarm-derive` would not forward this enum variant within the `NetworkBehaviour` hierarchy. Thus the version pinning is required.
+libp2p-request-response = { version = "0.26.1", path = "protocols/request-response" }
+libp2p-server = { version = "0.12.5", path = "misc/server" }
+libp2p-swarm = { version = "0.44.1", path = "swarm" }
+libp2p-swarm-derive = { version = "=0.34.2", path = "swarm-derive" } # `libp2p-swarm-derive` may not be compatible with different `libp2p-swarm` non-breaking releases. E.g. `libp2p-swarm` might introduce a new enum variant `FromSwarm` (which is `#[non-exhaustive]`) in a non-breaking release. Older versions of `libp2p-swarm-derive` would not forward this enum variant within the `NetworkBehaviour` hierarchy. Thus the version pinning is required.
libp2p-swarm-test = { version = "0.3.0", path = "swarm-test" }
libp2p-tcp = { version = "0.41.0", path = "transports/tcp" }
libp2p-tls = { version = "0.3.0", path = "transports/tls" }
libp2p-uds = { version = "0.40.0", path = "transports/uds" }
libp2p-upnp = { version = "0.2.0", path = "protocols/upnp" }
-libp2p-webrtc = { version = "0.6.1-alpha", path = "transports/webrtc" }
-libp2p-webrtc-utils = { version = "0.1.0", path = "misc/webrtc-utils" }
-libp2p-webrtc-websys = { version = "0.2.0-alpha", path = "transports/webrtc-websys" }
+libp2p-webrtc = { version = "0.7.0-alpha", path = "transports/webrtc" }
+libp2p-webrtc-utils = { version = "0.2.0", path = "misc/webrtc-utils" }
+libp2p-webrtc-websys = { version = "0.3.0-alpha", path = "transports/webrtc-websys" }
libp2p-websocket = { version = "0.43.0", path = "transports/websocket" }
libp2p-websocket-websys = { version = "0.3.1", path = "transports/websocket-websys" }
libp2p-webtransport-websys = { version = "0.2.0", path = "transports/webtransport-websys" }
diff --git a/README.md b/README.md
index 62375b3dab0..48fa976635a 100644
--- a/README.md
+++ b/README.md
@@ -16,9 +16,8 @@ This repository is the central place for Rust development of the [libp2p](https:
many protocols in this repository.
- For **security related issues** please [file a private security vulnerability
- report](https://github.com/libp2p/rust-libp2p/security/advisories/new)
- or reach out to [security@libp2p.io](mailto:security@libp2p.io). Please do not
- file a public issue on GitHub.
+ report](https://github.com/libp2p/rust-libp2p/security/advisories/new) . Please do not file a
+ public issue on GitHub.
- To **report bugs, suggest improvements or request new features** please open a
GitHub issue on this repository.
diff --git a/SECURITY.md b/SECURITY.md
index 0e5a3f2e55f..f3ae83405e8 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -7,5 +7,3 @@ By default we provide security patches for the latest released version only. On
## Reporting a Vulnerability
Please do not file a public issue on GitHub. Instead, please [file a private security vulnerability report](https://github.com/libp2p/rust-libp2p/security/advisories/new).
-
-If you need further assistance, please reach out to [security@libp2p.io](mailto:security@libp2p.io).
diff --git a/core/CHANGELOG.md b/core/CHANGELOG.md
index 833af07982c..a7cd7fd46b4 100644
--- a/core/CHANGELOG.md
+++ b/core/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 0.41.2
+
+- Implement `std::fmt::Display` on `ListenerId`.
+ See [PR 4936](https://github.com/libp2p/rust-libp2p/pull/4936).
+
## 0.41.1
- Implement `{In,Out}boundConnectionUpgrade` for `SelectUpgrade`.
diff --git a/core/Cargo.toml b/core/Cargo.toml
index 7380695023b..34b2202c166 100644
--- a/core/Cargo.toml
+++ b/core/Cargo.toml
@@ -3,7 +3,7 @@ name = "libp2p-core"
edition = "2021"
rust-version = { workspace = true }
description = "Core traits and structs of libp2p"
-version = "0.41.1"
+version = "0.41.2"
authors = ["Parity Technologies "]
license = "MIT"
repository = "https://github.com/libp2p/rust-libp2p"
@@ -13,14 +13,14 @@ categories = ["network-programming", "asynchronous"]
[dependencies]
either = "1.9"
fnv = "1.0"
-futures = { version = "0.3.29", features = ["executor", "thread-pool"] }
+futures = { version = "0.3.30", features = ["executor", "thread-pool"] }
futures-timer = "3"
instant = "0.1.12"
libp2p-identity = { workspace = true, features = ["peerid", "ed25519"] }
multiaddr = { workspace = true }
multihash = { workspace = true }
multistream-select = { workspace = true }
-once_cell = "1.18.0"
+once_cell = "1.19.0"
parking_lot = "0.12.0"
pin-project = "1.1.3"
quick-protobuf = "0.8"
diff --git a/core/src/transport.rs b/core/src/transport.rs
index 8656b89228c..22e7a0532fa 100644
--- a/core/src/transport.rs
+++ b/core/src/transport.rs
@@ -256,6 +256,12 @@ impl ListenerId {
}
}
+impl std::fmt::Display for ListenerId {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ write!(f, "{}", self.0)
+ }
+}
+
/// Event produced by [`Transport`]s.
pub enum TransportEvent {
/// A new address is being listened on.
diff --git a/examples/README.md b/examples/README.md
index 28e085587b7..0a3e55aed39 100644
--- a/examples/README.md
+++ b/examples/README.md
@@ -20,6 +20,6 @@ A set of examples showcasing how to use rust-libp2p.
- [IPFS Private](./ipfs-private) Implementation using the gossipsub, ping and identify protocols to implement the ipfs private swarms feature.
-- [Ping](./ping) Small `ping` clone, sending a ping to a peer, expecting a pong as a response. See [tutorial](../src/tutorials/ping.rs) for a step-by-step guide building the example.
+- [Ping](./ping) Small `ping` clone, sending a ping to a peer, expecting a pong as a response. See [tutorial](../libp2p/src/tutorials/ping.rs) for a step-by-step guide building the example.
- [Rendezvous](./rendezvous) Rendezvous Protocol. See [specs](https://github.com/libp2p/specs/blob/master/rendezvous/README.md).
diff --git a/examples/autonat/Cargo.toml b/examples/autonat/Cargo.toml
index cca3b5e326e..17c456e4334 100644
--- a/examples/autonat/Cargo.toml
+++ b/examples/autonat/Cargo.toml
@@ -9,9 +9,9 @@ license = "MIT"
release = false
[dependencies]
-tokio = { version = "1.34", features = ["full"] }
-clap = { version = "4.4.10", features = ["derive"] }
-futures = "0.3.29"
+tokio = { version = "1.35", features = ["full"] }
+clap = { version = "4.4.13", features = ["derive"] }
+futures = "0.3.30"
libp2p = { path = "../../libp2p", features = ["tokio", "tcp", "noise", "yamux", "autonat", "identify", "macros"] }
tracing = "0.1.37"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
diff --git a/examples/browser-webrtc/Cargo.toml b/examples/browser-webrtc/Cargo.toml
index 57232abeb5e..d8bf9232514 100644
--- a/examples/browser-webrtc/Cargo.toml
+++ b/examples/browser-webrtc/Cargo.toml
@@ -16,30 +16,30 @@ release = false
crate-type = ["cdylib"]
[dependencies]
-anyhow = "1.0.72"
-futures = "0.3.29"
+anyhow = "1.0.79"
+futures = "0.3.30"
rand = "0.8"
tracing = "0.1.37"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
-axum = "0.6.19"
+axum = "0.7.3"
libp2p = { path = "../../libp2p", features = [ "ed25519", "macros", "ping", "tokio"] }
libp2p-webrtc = { workspace = true, features = ["tokio"] }
-rust-embed = { version = "8.0.0", features = ["include-exclude", "interpolate-folder-path"] }
-tokio = { version = "1.34", features = ["macros", "net", "rt", "signal"] }
+rust-embed = { version = "8.2.0", features = ["include-exclude", "interpolate-folder-path"] }
+tokio = { version = "1.35", features = ["macros", "net", "rt", "signal"] }
tokio-util = { version = "0.7", features = ["compat"] }
tower = "0.4"
-tower-http = { version = "0.4.0", features = ["cors"] }
+tower-http = { version = "0.5.0", features = ["cors"] }
mime_guess = "2.0.4"
[target.'cfg(target_arch = "wasm32")'.dependencies]
-js-sys = "0.3.66"
+js-sys = "0.3.67"
libp2p = { path = "../../libp2p", features = [ "ed25519", "macros", "ping", "wasm-bindgen"] }
libp2p-webrtc-websys = { workspace = true }
tracing-wasm = "0.2.1"
-wasm-bindgen = "0.2.89"
-wasm-bindgen-futures = "0.4.38"
+wasm-bindgen = "0.2.90"
+wasm-bindgen-futures = "0.4.39"
web-sys = { version = "0.3", features = ['Document', 'Element', 'HtmlElement', 'Node', 'Response', 'Window'] }
[lints]
diff --git a/examples/browser-webrtc/README.md b/examples/browser-webrtc/README.md
index d44cf879905..eec2c9c0494 100644
--- a/examples/browser-webrtc/README.md
+++ b/examples/browser-webrtc/README.md
@@ -5,6 +5,8 @@ It uses [wasm-pack](https://rustwasm.github.io/docs/wasm-pack/) to build the pro
## Running the example
+Ensure you have `wasm-pack` [installed](https://rustwasm.github.io/wasm-pack/).
+
1. Build the client library:
```shell
wasm-pack build --target web --out-dir static
diff --git a/examples/browser-webrtc/src/lib.rs b/examples/browser-webrtc/src/lib.rs
index 2112919c6de..9499ccbd158 100644
--- a/examples/browser-webrtc/src/lib.rs
+++ b/examples/browser-webrtc/src/lib.rs
@@ -15,8 +15,13 @@ use web_sys::{Document, HtmlElement};
pub async fn run(libp2p_endpoint: String) -> Result<(), JsError> {
tracing_wasm::set_as_global_default();
+ let ping_duration = Duration::from_secs(30);
+
let body = Body::from_current_window()?;
- body.append_p("Let's ping the WebRTC Server!")?;
+ body.append_p(&format!(
+ "Let's ping the rust-libp2p server over WebRTC for {:?}:",
+ ping_duration
+ ))?;
let mut swarm = libp2p::SwarmBuilder::with_new_identity()
.with_wasm_bindgen()
@@ -24,7 +29,7 @@ pub async fn run(libp2p_endpoint: String) -> Result<(), JsError> {
webrtc_websys::Transport::new(webrtc_websys::Config::new(&key))
})?
.with_behaviour(|_| ping::Behaviour::new(ping::Config::new()))?
- .with_swarm_config(|c| c.with_idle_connection_timeout(Duration::from_secs(5)))
+ .with_swarm_config(|c| c.with_idle_connection_timeout(ping_duration))
.build();
let addr = libp2p_endpoint.parse::()?;
@@ -46,6 +51,18 @@ pub async fn run(libp2p_endpoint: String) -> Result<(), JsError> {
tracing::info!("Ping successful: RTT: {rtt:?}, from {peer}");
body.append_p(&format!("RTT: {rtt:?} at {}", Date::new_0().to_string()))?;
}
+ SwarmEvent::ConnectionClosed {
+ cause: Some(cause), ..
+ } => {
+ tracing::info!("Swarm event: {:?}", cause);
+
+ if let libp2p::swarm::ConnectionError::KeepAliveTimeout = cause {
+ body.append_p("All done with pinging! ")?;
+
+ break;
+ }
+ body.append_p(&format!("Connection closed due to: {:?}", cause))?;
+ }
evt => tracing::info!("Swarm event: {:?}", evt),
}
}
diff --git a/examples/browser-webrtc/src/main.rs b/examples/browser-webrtc/src/main.rs
index 098b70f3054..7f06b0d0d99 100644
--- a/examples/browser-webrtc/src/main.rs
+++ b/examples/browser-webrtc/src/main.rs
@@ -18,6 +18,7 @@ use libp2p_webrtc as webrtc;
use rand::thread_rng;
use std::net::{Ipv4Addr, SocketAddr};
use std::time::Duration;
+use tokio::net::TcpListener;
use tower_http::cors::{Any, CorsLayer};
#[tokio::main]
@@ -38,7 +39,7 @@ async fn main() -> anyhow::Result<()> {
.with_behaviour(|_| ping::Behaviour::default())?
.with_swarm_config(|cfg| {
cfg.with_idle_connection_timeout(
- Duration::from_secs(30), // Allows us to observe the pings.
+ Duration::from_secs(u64::MAX), // Allows us to observe the pings.
)
})
.build();
@@ -112,10 +113,12 @@ pub(crate) async fn serve(libp2p_transport: Multiaddr) {
tracing::info!(url=%format!("http://{addr}"), "Serving client files at url");
- axum::Server::bind(&addr)
- .serve(server.into_make_service())
- .await
- .unwrap();
+ axum::serve(
+ TcpListener::bind((listen_addr, 8080)).await.unwrap(),
+ server.into_make_service(),
+ )
+ .await
+ .unwrap();
}
#[derive(Clone)]
diff --git a/examples/chat/Cargo.toml b/examples/chat/Cargo.toml
index 9b3561dab48..a8349344c03 100644
--- a/examples/chat/Cargo.toml
+++ b/examples/chat/Cargo.toml
@@ -9,9 +9,9 @@ license = "MIT"
release = false
[dependencies]
-tokio = { version = "1.34", features = ["full"] }
+tokio = { version = "1.35", features = ["full"] }
async-trait = "0.1"
-futures = "0.3.29"
+futures = "0.3.30"
libp2p = { path = "../../libp2p", features = [ "tokio", "gossipsub", "mdns", "noise", "macros", "tcp", "yamux", "quic"] }
tracing = "0.1.37"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
diff --git a/examples/dcutr/Cargo.toml b/examples/dcutr/Cargo.toml
index 8dcb403218e..b07b66ab69f 100644
--- a/examples/dcutr/Cargo.toml
+++ b/examples/dcutr/Cargo.toml
@@ -9,12 +9,12 @@ license = "MIT"
release = false
[dependencies]
-clap = { version = "4.4.10", features = ["derive"] }
-futures = "0.3.29"
+clap = { version = "4.4.13", features = ["derive"] }
+futures = "0.3.30"
futures-timer = "3.0"
libp2p = { path = "../../libp2p", features = [ "dns", "dcutr", "identify", "macros", "noise", "ping", "quic", "relay", "rendezvous", "tcp", "tokio", "yamux"] }
log = "0.4"
-tokio = { version = "1.34", features = ["macros", "net", "rt", "signal"] }
+tokio = { version = "1.35", features = ["macros", "net", "rt", "signal"] }
tracing = "0.1.37"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
diff --git a/examples/distributed-key-value-store/Cargo.toml b/examples/distributed-key-value-store/Cargo.toml
index dc084b30091..a7efe3c0697 100644
--- a/examples/distributed-key-value-store/Cargo.toml
+++ b/examples/distributed-key-value-store/Cargo.toml
@@ -11,7 +11,7 @@ release = false
[dependencies]
async-std = { version = "1.12", features = ["attributes"] }
async-trait = "0.1"
-futures = "0.3.29"
+futures = "0.3.30"
libp2p = { path = "../../libp2p", features = [ "async-std", "dns", "kad", "mdns", "noise", "macros", "tcp", "yamux"] }
tracing = "0.1.37"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
diff --git a/examples/file-sharing/Cargo.toml b/examples/file-sharing/Cargo.toml
index 52d1b3b9b20..1bac0306649 100644
--- a/examples/file-sharing/Cargo.toml
+++ b/examples/file-sharing/Cargo.toml
@@ -11,9 +11,9 @@ release = false
[dependencies]
serde = { version = "1.0", features = ["derive"] }
async-std = { version = "1.12", features = ["attributes"] }
-clap = { version = "4.4.10", features = ["derive"] }
+clap = { version = "4.4.13", features = ["derive"] }
either = "1.9"
-futures = "0.3.29"
+futures = "0.3.30"
libp2p = { path = "../../libp2p", features = [ "async-std", "cbor", "dns", "kad", "noise", "macros", "request-response", "tcp", "websocket", "yamux"] }
tracing = "0.1.37"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
diff --git a/examples/identify/Cargo.toml b/examples/identify/Cargo.toml
index 48449636c61..2dcc780ac22 100644
--- a/examples/identify/Cargo.toml
+++ b/examples/identify/Cargo.toml
@@ -11,7 +11,7 @@ release = false
[dependencies]
async-std = { version = "1.12", features = ["attributes"] }
async-trait = "0.1"
-futures = "0.3.29"
+futures = "0.3.30"
libp2p = { path = "../../libp2p", features = ["async-std", "dns", "dcutr", "identify", "macros", "noise", "ping", "relay", "rendezvous", "tcp", "tokio","yamux"] }
tracing = "0.1.37"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
diff --git a/examples/ipfs-kad/Cargo.toml b/examples/ipfs-kad/Cargo.toml
index 7870d3adb79..9b7c760b36b 100644
--- a/examples/ipfs-kad/Cargo.toml
+++ b/examples/ipfs-kad/Cargo.toml
@@ -9,12 +9,12 @@ license = "MIT"
release = false
[dependencies]
-tokio = { version = "1.34", features = ["rt-multi-thread", "macros"] }
+tokio = { version = "1.35", features = ["rt-multi-thread", "macros"] }
async-trait = "0.1"
-clap = { version = "4.4.10", features = ["derive"] }
+clap = { version = "4.4.13", features = ["derive"] }
env_logger = "0.10"
-futures = "0.3.29"
-anyhow = "1.0.75"
+futures = "0.3.30"
+anyhow = "1.0.79"
libp2p = { path = "../../libp2p", features = [ "tokio", "dns", "kad", "noise", "tcp", "yamux", "rsa"] }
tracing = "0.1.37"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
diff --git a/examples/ipfs-private/Cargo.toml b/examples/ipfs-private/Cargo.toml
index 97c1ca59368..3b266cf35a6 100644
--- a/examples/ipfs-private/Cargo.toml
+++ b/examples/ipfs-private/Cargo.toml
@@ -9,10 +9,10 @@ license = "MIT"
release = false
[dependencies]
-tokio = { version = "1.34", features = ["rt-multi-thread", "macros", "io-std"] }
+tokio = { version = "1.35", features = ["rt-multi-thread", "macros", "io-std"] }
async-trait = "0.1"
either = "1.9"
-futures = "0.3.29"
+futures = "0.3.30"
libp2p = { path = "../../libp2p", features = [ "tokio", "gossipsub", "dns", "identify", "kad", "macros", "noise", "ping", "pnet", "tcp", "websocket", "yamux"] }
tracing = "0.1.37"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
diff --git a/examples/metrics/Cargo.toml b/examples/metrics/Cargo.toml
index c8f74a17ebd..39412d29aea 100644
--- a/examples/metrics/Cargo.toml
+++ b/examples/metrics/Cargo.toml
@@ -9,7 +9,7 @@ license = "MIT"
release = false
[dependencies]
-futures = "0.3.29"
+futures = "0.3.30"
hyper = { version = "0.14", features = ["server", "tcp", "http1"] }
libp2p = { path = "../../libp2p", features = ["tokio", "metrics", "ping", "noise", "identify", "tcp", "yamux", "macros"] }
opentelemetry = { version = "0.20.0", features = ["rt-tokio", "metrics"] }
diff --git a/examples/ping/Cargo.toml b/examples/ping/Cargo.toml
index 66d2847cb8f..93128c3ed13 100644
--- a/examples/ping/Cargo.toml
+++ b/examples/ping/Cargo.toml
@@ -9,9 +9,9 @@ license = "MIT"
release = false
[dependencies]
-futures = "0.3.29"
+futures = "0.3.30"
libp2p = { path = "../../libp2p", features = ["noise", "ping", "tcp", "tokio", "yamux"] }
-tokio = { version = "1.34.0", features = ["full"] }
+tokio = { version = "1.35.1", features = ["full"] }
tracing = "0.1.37"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
diff --git a/examples/relay-server/Cargo.toml b/examples/relay-server/Cargo.toml
index fe18106e60c..449e27b299e 100644
--- a/examples/relay-server/Cargo.toml
+++ b/examples/relay-server/Cargo.toml
@@ -9,10 +9,10 @@ license = "MIT"
release = false
[dependencies]
-clap = { version = "4.4.10", features = ["derive"] }
+clap = { version = "4.4.13", features = ["derive"] }
async-std = { version = "1.12", features = ["attributes"] }
async-trait = "0.1"
-futures = "0.3.2"
+futures = "0.3.30"
libp2p = { path = "../../libp2p", features = [ "async-std", "noise", "macros", "ping", "tcp", "identify", "yamux", "relay", "quic"] }
tracing = "0.1.37"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
diff --git a/examples/rendezvous/Cargo.toml b/examples/rendezvous/Cargo.toml
index fbb2ed44a03..4ee410f503f 100644
--- a/examples/rendezvous/Cargo.toml
+++ b/examples/rendezvous/Cargo.toml
@@ -11,9 +11,9 @@ release = false
[dependencies]
async-std = { version = "1.12", features = ["attributes"] }
async-trait = "0.1"
-futures = "0.3.29"
+futures = "0.3.30"
libp2p = { path = "../../libp2p", features = [ "async-std", "identify", "macros", "noise", "ping", "rendezvous", "tcp", "tokio", "yamux"] }
-tokio = { version = "1.34", features = ["rt-multi-thread", "macros", "time"] }
+tokio = { version = "1.35", features = ["rt-multi-thread", "macros", "time"] }
tracing = "0.1.37"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
diff --git a/examples/upnp/Cargo.toml b/examples/upnp/Cargo.toml
index 940f3dff65f..db9825c8742 100644
--- a/examples/upnp/Cargo.toml
+++ b/examples/upnp/Cargo.toml
@@ -10,7 +10,7 @@ release = false
[dependencies]
tokio = { version = "1", features = ["rt-multi-thread", "macros"] }
-futures = "0.3.29"
+futures = "0.3.30"
libp2p = { path = "../../libp2p", features = ["tokio", "dns", "macros", "noise", "ping", "tcp", "yamux", "upnp"] }
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
diff --git a/hole-punching-tests/Cargo.toml b/hole-punching-tests/Cargo.toml
index a6f1bd6571c..201b493e90a 100644
--- a/hole-punching-tests/Cargo.toml
+++ b/hole-punching-tests/Cargo.toml
@@ -8,11 +8,11 @@ license = "MIT"
[dependencies]
anyhow = "1"
env_logger = "0.10.1"
-futures = "0.3.29"
+futures = "0.3.30"
libp2p = { path = "../libp2p", features = ["tokio", "dcutr", "identify", "macros", "noise", "ping", "relay", "tcp", "yamux", "quic"] }
tracing = "0.1.37"
redis = { version = "0.23.0", default-features = false, features = ["tokio-comp"] }
-tokio = { version = "1.34.0", features = ["full"] }
+tokio = { version = "1.35.1", features = ["full"] }
serde = { version = "1.0.193", features = ["derive"] }
-serde_json = "1.0.108"
+serde_json = "1.0.111"
either = "1.9.0"
diff --git a/identity/Cargo.toml b/identity/Cargo.toml
index e7aa15fef07..920b9a990e4 100644
--- a/identity/Cargo.toml
+++ b/identity/Cargo.toml
@@ -15,7 +15,7 @@ categories = ["cryptography"]
asn1_der = { version = "0.7.6", optional = true }
bs58 = { version = "0.5.0", optional = true }
ed25519-dalek = { version = "2.1", optional = true }
-hkdf = { version = "0.12.3", optional = true }
+hkdf = { version = "0.12.4", optional = true }
libsecp256k1 = { version = "0.7.0", optional = true }
tracing = "0.1.37"
multihash = { version = "0.19.1", optional = true }
@@ -42,7 +42,7 @@ rand = ["dep:rand", "ed25519-dalek?/rand_core"]
[dev-dependencies]
quickcheck = { workspace = true }
-base64 = "0.21.5"
+base64 = "0.21.7"
serde_json = "1.0"
rmp-serde = "1.1"
criterion = "0.5"
diff --git a/interop-tests/Cargo.toml b/interop-tests/Cargo.toml
index eba65b782e7..d4663c9d41f 100644
--- a/interop-tests/Cargo.toml
+++ b/interop-tests/Cargo.toml
@@ -14,14 +14,14 @@ crate-type = ["cdylib", "rlib"]
[dependencies]
anyhow = "1"
either = "1.9.0"
-futures = "0.3.29"
+futures = "0.3.30"
rand = "0.8.5"
serde = { version = "1", features = ["derive"] }
tracing = "0.1.37"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
-axum = "0.6"
+axum = "0.7"
libp2p = { path = "../libp2p", features = [ "ping", "noise", "tls", "rsa", "macros", "websocket", "tokio", "yamux", "tcp", "dns", "identify", "quic"] }
libp2p-mplex = { path = "../muxers/mplex" }
libp2p-noise = { workspace = true }
@@ -31,11 +31,11 @@ mime_guess = "2.0"
redis = { version = "0.23.3", default-features = false, features = [
"tokio-comp",
] }
-rust-embed = "8.0"
+rust-embed = "8.2"
serde_json = "1"
thirtyfour = "=0.32.0-rc.8" # https://github.com/stevepryde/thirtyfour/issues/169
-tokio = { version = "1.34.0", features = ["full"] }
-tower-http = { version = "0.4", features = ["cors", "fs", "trace"] }
+tokio = { version = "1.35.1", features = ["full"] }
+tower-http = { version = "0.5", features = ["cors", "fs", "trace"] }
tracing = "0.1.37"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
diff --git a/interop-tests/src/bin/wasm_ping.rs b/interop-tests/src/bin/wasm_ping.rs
index 8269ff064ad..e1bb2ea49fb 100644
--- a/interop-tests/src/bin/wasm_ping.rs
+++ b/interop-tests/src/bin/wasm_ping.rs
@@ -1,9 +1,10 @@
#![allow(non_upper_case_globals)]
+
+use std::future::IntoFuture;
use std::process::Stdio;
use std::time::Duration;
use anyhow::{bail, Context, Result};
-use axum::body;
use axum::http::{header, Uri};
use axum::response::{Html, IntoResponse, Response};
use axum::routing::get;
@@ -11,6 +12,7 @@ use axum::{extract::State, http::StatusCode, routing::post, Json, Router};
use redis::{AsyncCommands, Client};
use thirtyfour::prelude::*;
use tokio::io::{AsyncBufReadExt, BufReader};
+use tokio::net::TcpListener;
use tokio::process::Child;
use tokio::sync::mpsc;
use tower_http::cors::CorsLayer;
@@ -76,7 +78,7 @@ async fn main() -> Result<()> {
.with_state(state);
// Run the service in background
- tokio::spawn(axum::Server::bind(&BIND_ADDR.parse()?).serve(app.into_make_service()));
+ tokio::spawn(axum::serve(TcpListener::bind(BIND_ADDR).await?, app).into_future());
// Start executing the test in a browser
let (mut chrome, driver) = open_in_browser().await?;
@@ -229,7 +231,7 @@ async fn serve_wasm_pkg(uri: Uri) -> Result {
let mime = mime_guess::from_path(&path).first_or_octet_stream();
Ok(Response::builder()
.header(header::CONTENT_TYPE, mime.as_ref())
- .body(body::boxed(body::Full::from(content.data)))
+ .body(content.data.into())
.unwrap())
} else {
Err(StatusCode::NOT_FOUND)
diff --git a/libp2p/CHANGELOG.md b/libp2p/CHANGELOG.md
index bb6d8211bd5..80b32c35643 100644
--- a/libp2p/CHANGELOG.md
+++ b/libp2p/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 0.53.2
+
+- Allow `SwarmBuilder::with_bandwidth_metrics` after `SwarmBuilder::with_websocket`.
+ See [PR 4937](https://github.com/libp2p/rust-libp2p/pull/4937).
+
## 0.53.1
- Allow `SwarmBuilder::with_quic_config` to be called without `with_tcp` first.
diff --git a/libp2p/Cargo.toml b/libp2p/Cargo.toml
index 6ced40e1dfe..9dc9667be10 100644
--- a/libp2p/Cargo.toml
+++ b/libp2p/Cargo.toml
@@ -3,7 +3,7 @@ name = "libp2p"
edition = "2021"
rust-version = { workspace = true }
description = "Peer-to-peer networking library"
-version = "0.53.1"
+version = "0.53.2"
authors = ["Parity Technologies "]
license = "MIT"
repository = "https://github.com/libp2p/rust-libp2p"
diff --git a/libp2p/src/builder/phase/relay.rs b/libp2p/src/builder/phase/relay.rs
index 2d47810ca9e..f8305f9d246 100644
--- a/libp2p/src/builder/phase/relay.rs
+++ b/libp2p/src/builder/phase/relay.rs
@@ -116,11 +116,28 @@ impl SwarmBuilder> {
}
// Shortcuts
+#[cfg(feature = "metrics")]
+impl SwarmBuilder> {
+ pub fn with_bandwidth_metrics(
+ self,
+ registry: &mut libp2p_metrics::Registry,
+ ) -> SwarmBuilder<
+ Provider,
+ BehaviourPhase,
+ > {
+ self.without_relay()
+ .without_bandwidth_logging()
+ .with_bandwidth_metrics(registry)
+ }
+}
impl SwarmBuilder> {
pub fn with_behaviour>(
self,
constructor: impl FnOnce(&libp2p_identity::Keypair) -> R,
) -> Result>, R::Error> {
- self.without_relay().with_behaviour(constructor)
+ self.without_relay()
+ .without_bandwidth_logging()
+ .without_bandwidth_metrics()
+ .with_behaviour(constructor)
}
}
diff --git a/libp2p/src/transport_ext.rs b/libp2p/src/transport_ext.rs
index bca0b8f4576..4f07484fc1f 100644
--- a/libp2p/src/transport_ext.rs
+++ b/libp2p/src/transport_ext.rs
@@ -33,7 +33,7 @@ use std::sync::Arc;
/// Trait automatically implemented on all objects that implement `Transport`. Provides some
/// additional utilities.
pub trait TransportExt: Transport {
- /// Adds a layer on the `Transport` that logs all trafic that passes through the streams
+ /// Adds a layer on the `Transport` that logs all traffic that passes through the streams
/// created by it.
///
/// This method returns an `Arc` that can be used to retrieve the total number
diff --git a/misc/connection-limits/CHANGELOG.md b/misc/connection-limits/CHANGELOG.md
index a5b68a6f51b..4654281a83e 100644
--- a/misc/connection-limits/CHANGELOG.md
+++ b/misc/connection-limits/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 0.3.1
+
+- Add function to mutate `ConnectionLimits`.
+ See [PR 4964](https://github.com/libp2p/rust-libp2p/pull/4964).
+
## 0.3.0
diff --git a/misc/connection-limits/Cargo.toml b/misc/connection-limits/Cargo.toml
index 2aa26ad44f1..8ecb0005cb1 100644
--- a/misc/connection-limits/Cargo.toml
+++ b/misc/connection-limits/Cargo.toml
@@ -3,7 +3,7 @@ name = "libp2p-connection-limits"
edition = "2021"
rust-version = { workspace = true }
description = "Connection limits for libp2p."
-version = "0.3.0"
+version = "0.3.1"
license = "MIT"
repository = "https://github.com/libp2p/rust-libp2p"
keywords = ["peer-to-peer", "libp2p", "networking"]
diff --git a/misc/connection-limits/src/lib.rs b/misc/connection-limits/src/lib.rs
index af76e9a57d9..dbe68a8ad11 100644
--- a/misc/connection-limits/src/lib.rs
+++ b/misc/connection-limits/src/lib.rs
@@ -80,21 +80,22 @@ impl Behaviour {
}
}
- fn check_limit(
- &mut self,
- limit: Option,
- current: usize,
- kind: Kind,
- ) -> Result<(), ConnectionDenied> {
- let limit = limit.unwrap_or(u32::MAX);
- let current = current as u32;
+ /// Returns a mutable reference to [`ConnectionLimits`].
+ /// > **Note**: A new limit will not be enforced against existing connections.
+ pub fn limits_mut(&mut self) -> &mut ConnectionLimits {
+ &mut self.limits
+ }
+}
- if current >= limit {
- return Err(ConnectionDenied::new(Exceeded { limit, kind }));
- }
+fn check_limit(limit: Option, current: usize, kind: Kind) -> Result<(), ConnectionDenied> {
+ let limit = limit.unwrap_or(u32::MAX);
+ let current = current as u32;
- Ok(())
+ if current >= limit {
+ return Err(ConnectionDenied::new(Exceeded { limit, kind }));
}
+
+ Ok(())
}
/// A connection limit has been exceeded.
@@ -210,7 +211,7 @@ impl NetworkBehaviour for Behaviour {
_: &Multiaddr,
_: &Multiaddr,
) -> Result<(), ConnectionDenied> {
- self.check_limit(
+ check_limit(
self.limits.max_pending_incoming,
self.pending_inbound_connections.len(),
Kind::PendingIncoming,
@@ -230,12 +231,12 @@ impl NetworkBehaviour for Behaviour {
) -> Result, ConnectionDenied> {
self.pending_inbound_connections.remove(&connection_id);
- self.check_limit(
+ check_limit(
self.limits.max_established_incoming,
self.established_inbound_connections.len(),
Kind::EstablishedIncoming,
)?;
- self.check_limit(
+ check_limit(
self.limits.max_established_per_peer,
self.established_per_peer
.get(&peer)
@@ -243,7 +244,7 @@ impl NetworkBehaviour for Behaviour {
.unwrap_or(0),
Kind::EstablishedPerPeer,
)?;
- self.check_limit(
+ check_limit(
self.limits.max_established_total,
self.established_inbound_connections.len()
+ self.established_outbound_connections.len(),
@@ -260,7 +261,7 @@ impl NetworkBehaviour for Behaviour {
_: &[Multiaddr],
_: Endpoint,
) -> Result, ConnectionDenied> {
- self.check_limit(
+ check_limit(
self.limits.max_pending_outgoing,
self.pending_outbound_connections.len(),
Kind::PendingOutgoing,
@@ -280,12 +281,12 @@ impl NetworkBehaviour for Behaviour {
) -> Result, ConnectionDenied> {
self.pending_outbound_connections.remove(&connection_id);
- self.check_limit(
+ check_limit(
self.limits.max_established_outgoing,
self.established_outbound_connections.len(),
Kind::EstablishedOutgoing,
)?;
- self.check_limit(
+ check_limit(
self.limits.max_established_per_peer,
self.established_per_peer
.get(&peer)
@@ -293,7 +294,7 @@ impl NetworkBehaviour for Behaviour {
.unwrap_or(0),
Kind::EstablishedPerPeer,
)?;
- self.check_limit(
+ check_limit(
self.limits.max_established_total,
self.established_inbound_connections.len()
+ self.established_outbound_connections.len(),
diff --git a/misc/futures-bounded/Cargo.toml b/misc/futures-bounded/Cargo.toml
index b375242bb3c..3262f90821b 100644
--- a/misc/futures-bounded/Cargo.toml
+++ b/misc/futures-bounded/Cargo.toml
@@ -13,12 +13,12 @@ publish = true
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
-futures-util = { version = "0.3.29" }
+futures-util = { version = "0.3.30" }
futures-timer = "3.0.2"
[dev-dependencies]
-tokio = { version = "1.34.0", features = ["macros", "rt", "sync"] }
-futures = "0.3.28"
+tokio = { version = "1.35.1", features = ["macros", "rt", "sync"] }
+futures = "0.3.30"
[lints]
workspace = true
diff --git a/misc/keygen/Cargo.toml b/misc/keygen/Cargo.toml
index 9c1c37bd428..447616d0b52 100644
--- a/misc/keygen/Cargo.toml
+++ b/misc/keygen/Cargo.toml
@@ -13,12 +13,12 @@ publish = false
release = false
[dependencies]
-clap = { version = "4.4.10", features = ["derive"] }
+clap = { version = "4.4.13", features = ["derive"] }
zeroize = "1"
serde = { version = "1.0.193", features = ["derive"] }
-serde_json = "1.0.108"
+serde_json = "1.0.111"
libp2p-core = { workspace = true }
-base64 = "0.21.5"
+base64 = "0.21.7"
libp2p-identity = { workspace = true }
[lints]
diff --git a/misc/metrics/Cargo.toml b/misc/metrics/Cargo.toml
index 0607808214c..41eed8f2c36 100644
--- a/misc/metrics/Cargo.toml
+++ b/misc/metrics/Cargo.toml
@@ -19,7 +19,7 @@ ping = ["libp2p-ping"]
relay = ["libp2p-relay"]
[dependencies]
-futures = "0.3.26"
+futures = "0.3.30"
instant = "0.1.12"
libp2p-core = { workspace = true }
libp2p-dcutr = { workspace = true, optional = true }
diff --git a/misc/quick-protobuf-codec/Cargo.toml b/misc/quick-protobuf-codec/Cargo.toml
index 484e2c9bc8b..bc07b86b427 100644
--- a/misc/quick-protobuf-codec/Cargo.toml
+++ b/misc/quick-protobuf-codec/Cargo.toml
@@ -19,7 +19,7 @@ quick-protobuf = "0.8"
[dev-dependencies]
criterion = "0.5.1"
-futures = "0.3.28"
+futures = "0.3.30"
quickcheck = { workspace = true }
[[bench]]
diff --git a/misc/rw-stream-sink/Cargo.toml b/misc/rw-stream-sink/Cargo.toml
index ae10cbc35b2..8e093ac3db0 100644
--- a/misc/rw-stream-sink/Cargo.toml
+++ b/misc/rw-stream-sink/Cargo.toml
@@ -11,7 +11,7 @@ keywords = ["networking"]
categories = ["network-programming", "asynchronous"]
[dependencies]
-futures = "0.3.29"
+futures = "0.3.30"
pin-project = "1.1.3"
static_assertions = "1"
diff --git a/misc/server/CHANGELOG.md b/misc/server/CHANGELOG.md
index d476a8722eb..e4c5dd4a103 100644
--- a/misc/server/CHANGELOG.md
+++ b/misc/server/CHANGELOG.md
@@ -1,3 +1,10 @@
+## 0.12.5
+
+### Added
+
+- Add `/wss` support.
+ See [PR 4937](https://github.com/libp2p/rust-libp2p/pull/4937).
+
## 0.12.4
### Added
diff --git a/misc/server/Cargo.toml b/misc/server/Cargo.toml
index ba848eaeadb..38980d1894a 100644
--- a/misc/server/Cargo.toml
+++ b/misc/server/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "libp2p-server"
-version = "0.12.4"
+version = "0.12.5"
authors = ["Max Inden "]
edition = "2021"
repository = "https://github.com/libp2p/rust-libp2p"
@@ -12,11 +12,11 @@ license = "MIT"
[dependencies]
base64 = "0.21"
-clap = { version = "4.4.10", features = ["derive"] }
+clap = { version = "4.4.13", features = ["derive"] }
futures = "0.3"
futures-timer = "3"
hyper = { version = "0.14", features = ["server", "tcp", "http1"] }
-libp2p = { workspace = true, features = ["autonat", "dns", "tokio", "noise", "tcp", "yamux", "identify", "kad", "ping", "relay", "metrics", "rsa", "macros", "quic"] }
+libp2p = { workspace = true, features = ["autonat", "dns", "tokio", "noise", "tcp", "yamux", "identify", "kad", "ping", "relay", "metrics", "rsa", "macros", "quic", "websocket"] }
prometheus-client = { workspace = true }
serde = "1.0.193"
serde_derive = "1.0.125"
diff --git a/misc/server/src/main.rs b/misc/server/src/main.rs
index 2349ebf6485..16e6530e946 100644
--- a/misc/server/src/main.rs
+++ b/misc/server/src/main.rs
@@ -82,6 +82,8 @@ async fn main() -> Result<(), Box> {
)?
.with_quic()
.with_dns()?
+ .with_websocket(noise::Config::new, yamux::Config::default)
+ .await?
.with_bandwidth_metrics(&mut metric_registry)
.with_behaviour(|key| {
behaviour::Behaviour::new(key.public(), opt.enable_kademlia, opt.enable_autonat)
diff --git a/misc/webrtc-utils/CHANGELOG.md b/misc/webrtc-utils/CHANGELOG.md
index c3485aa1dbf..6949113a377 100644
--- a/misc/webrtc-utils/CHANGELOG.md
+++ b/misc/webrtc-utils/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 0.2.0
+
+- Update to latest version of `libp2p-noise`.
+ See [PR 4968](https://github.com/libp2p/rust-libp2p/pull/4968).
+
## 0.1.0
- Initial release.
diff --git a/misc/webrtc-utils/Cargo.toml b/misc/webrtc-utils/Cargo.toml
index 8ae36754d0f..7173dedae7b 100644
--- a/misc/webrtc-utils/Cargo.toml
+++ b/misc/webrtc-utils/Cargo.toml
@@ -7,7 +7,7 @@ license = "MIT"
name = "libp2p-webrtc-utils"
repository = "https://github.com/libp2p/rust-libp2p"
rust-version = { workspace = true }
-version = "0.1.0"
+version = "0.2.0"
publish = true
[dependencies]
diff --git a/misc/webrtc-utils/src/noise.rs b/misc/webrtc-utils/src/noise.rs
index ac2e58c9163..9180acfc1ca 100644
--- a/misc/webrtc-utils/src/noise.rs
+++ b/misc/webrtc-utils/src/noise.rs
@@ -27,12 +27,14 @@ use libp2p_noise as noise;
use crate::fingerprint::Fingerprint;
+pub use noise::Error;
+
pub async fn inbound(
id_keys: identity::Keypair,
stream: T,
client_fingerprint: Fingerprint,
server_fingerprint: Fingerprint,
-) -> Result
+) -> Result
where
T: AsyncRead + AsyncWrite + Unpin + Send + 'static,
{
@@ -54,7 +56,7 @@ pub async fn outbound(
stream: T,
server_fingerprint: Fingerprint,
client_fingerprint: Fingerprint,
-) -> Result
+) -> Result
where
T: AsyncRead + AsyncWrite + Unpin + Send + 'static,
{
diff --git a/muxers/mplex/Cargo.toml b/muxers/mplex/Cargo.toml
index 1980fd5be0a..726e8a8434f 100644
--- a/muxers/mplex/Cargo.toml
+++ b/muxers/mplex/Cargo.toml
@@ -12,7 +12,7 @@ categories = ["network-programming", "asynchronous"]
[dependencies]
bytes = "1"
-futures = "0.3.29"
+futures = "0.3.30"
asynchronous-codec = { workspace = true }
libp2p-core = { workspace = true }
libp2p-identity = { workspace = true }
diff --git a/muxers/mplex/benches/split_send_size.rs b/muxers/mplex/benches/split_send_size.rs
index 9a9814d2f2a..0125d49dcef 100644
--- a/muxers/mplex/benches/split_send_size.rs
+++ b/muxers/mplex/benches/split_send_size.rs
@@ -101,7 +101,7 @@ fn prepare(c: &mut Criterion) {
fn run(
receiver_trans: &mut BenchTransport,
sender_trans: &mut BenchTransport,
- payload: &Vec,
+ payload: &[u8],
listen_addr: &Multiaddr,
) {
receiver_trans
diff --git a/muxers/mplex/src/io.rs b/muxers/mplex/src/io.rs
index 753294a7845..50fc0fc1d3f 100644
--- a/muxers/mplex/src/io.rs
+++ b/muxers/mplex/src/io.rs
@@ -224,7 +224,7 @@ where
// yield to give the current task a chance to read
// from the respective substreams.
if num_buffered == self.config.max_buffer_len {
- cx.waker().clone().wake();
+ cx.waker().wake_by_ref();
return Poll::Pending;
}
@@ -456,7 +456,7 @@ where
// next frame for `id`, yield to give the current task
// a chance to read from the other substream(s).
if num_buffered == self.config.max_buffer_len {
- cx.waker().clone().wake();
+ cx.waker().wake_by_ref();
return Poll::Pending;
}
@@ -663,7 +663,7 @@ where
connection=%self.id,
"No task to read from blocked stream. Waking current task."
);
- cx.waker().clone().wake();
+ cx.waker().wake_by_ref();
} else if let Some(id) = stream_id {
// We woke some other task, but are still interested in
// reading `Data` frames from the current stream when unblocked.
diff --git a/muxers/test-harness/Cargo.toml b/muxers/test-harness/Cargo.toml
index 05cef9ad49f..7aad5f1985a 100644
--- a/muxers/test-harness/Cargo.toml
+++ b/muxers/test-harness/Cargo.toml
@@ -12,7 +12,7 @@ release = false
[dependencies]
libp2p-core = { workspace = true }
-futures = "0.3.29"
+futures = "0.3.30"
futures-timer = "3.0.2"
futures_ringbuf = "0.4.0"
tracing = "0.1.37"
diff --git a/muxers/yamux/CHANGELOG.md b/muxers/yamux/CHANGELOG.md
index c8534166ea6..de608b195f8 100644
--- a/muxers/yamux/CHANGELOG.md
+++ b/muxers/yamux/CHANGELOG.md
@@ -4,6 +4,12 @@
It does not enforce flow-control, i.e. breaks backpressure.
Use `WindowUpdateMode::on_read` instead.
See `yamux` crate version `v0.12.1` and [Yamux PR #177](https://github.com/libp2p/rust-yamux/pull/177).
+- `yamux` `v0.13` enables auto-tuning for the Yamux stream receive window.
+ While preserving small buffers on low-latency and/or low-bandwidth connections, this change allows for high-latency and/or high-bandwidth connections to exhaust the available bandwidth on a single stream.
+ Have `libp2p-yamux` use `yamux` `v0.13` (new version) by default and fall back to `yamux` `v0.12` (old version) when setting any configuration options.
+ Thus default users benefit from the increased performance, while power users with custom configurations maintain the old behavior.
+ `libp2p-yamux` will switch over to `yamux` `v0.13` entirely with the next breaking release.
+ See [PR 4970](https://github.com/libp2p/rust-libp2p/pull/4970).
## 0.45.0
diff --git a/muxers/yamux/Cargo.toml b/muxers/yamux/Cargo.toml
index 1456238121b..14a5c0fe145 100644
--- a/muxers/yamux/Cargo.toml
+++ b/muxers/yamux/Cargo.toml
@@ -11,10 +11,12 @@ keywords = ["peer-to-peer", "libp2p", "networking"]
categories = ["network-programming", "asynchronous"]
[dependencies]
-futures = "0.3.29"
+either = "1"
+futures = "0.3.30"
libp2p-core = { workspace = true }
thiserror = "1.0"
-yamux = "0.12"
+yamux012 = { version = "0.12.1", package = "yamux" }
+yamux013 = { version = "0.13.1", package = "yamux" }
tracing = "0.1.37"
[dev-dependencies]
diff --git a/muxers/yamux/src/lib.rs b/muxers/yamux/src/lib.rs
index fc7ff430396..2b5eb52a11e 100644
--- a/muxers/yamux/src/lib.rs
+++ b/muxers/yamux/src/lib.rs
@@ -22,6 +22,7 @@
#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))]
+use either::Either;
use futures::{future, prelude::*, ready};
use libp2p_core::muxing::{StreamMuxer, StreamMuxerEvent};
use libp2p_core::upgrade::{InboundConnectionUpgrade, OutboundConnectionUpgrade, UpgradeInfo};
@@ -34,15 +35,14 @@ use std::{
task::{Context, Poll},
};
use thiserror::Error;
-use yamux::ConnectionError;
/// A Yamux connection.
#[derive(Debug)]
pub struct Muxer {
- connection: yamux::Connection,
+ connection: Either, yamux013::Connection>,
/// Temporarily buffers inbound streams in case our node is performing backpressure on the remote.
///
- /// The only way how yamux can make progress is by calling [`yamux::Connection::poll_next_inbound`]. However, the
+ /// The only way how yamux can make progress is by calling [`yamux013::Connection::poll_next_inbound`]. However, the
/// [`StreamMuxer`] interface is designed to allow a caller to selectively make progress via
/// [`StreamMuxer::poll_inbound`] and [`StreamMuxer::poll_outbound`] whilst the more general
/// [`StreamMuxer::poll`] is designed to make progress on existing streams etc.
@@ -65,9 +65,9 @@ where
C: AsyncRead + AsyncWrite + Send + Unpin + 'static,
{
/// Create a new Yamux connection.
- fn new(io: C, cfg: yamux::Config, mode: yamux::Mode) -> Self {
+ fn new(connection: Either, yamux013::Connection>) -> Self {
Muxer {
- connection: yamux::Connection::new(io, cfg, mode),
+ connection,
inbound_stream_buffer: VecDeque::default(),
inbound_stream_waker: None,
}
@@ -103,16 +103,23 @@ where
mut self: Pin<&mut Self>,
cx: &mut Context<'_>,
) -> Poll> {
- let stream = ready!(self.connection.poll_new_outbound(cx).map_err(Error)?);
-
- Poll::Ready(Ok(Stream(stream)))
+ let stream = match self.connection.as_mut() {
+ Either::Left(c) => ready!(c.poll_new_outbound(cx))
+ .map_err(|e| Error(Either::Left(e)))
+ .map(|s| Stream(Either::Left(s))),
+ Either::Right(c) => ready!(c.poll_new_outbound(cx))
+ .map_err(|e| Error(Either::Right(e)))
+ .map(|s| Stream(Either::Right(s))),
+ }?;
+ Poll::Ready(Ok(stream))
}
#[tracing::instrument(level = "trace", name = "StreamMuxer::poll_close", skip(self, cx))]
fn poll_close(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> {
- ready!(self.connection.poll_close(cx).map_err(Error)?);
-
- Poll::Ready(Ok(()))
+ match self.connection.as_mut() {
+ Either::Left(c) => c.poll_close(cx).map_err(|e| Error(Either::Left(e))),
+ Either::Right(c) => c.poll_close(cx).map_err(|e| Error(Either::Right(e))),
+ }
}
#[tracing::instrument(level = "trace", name = "StreamMuxer::poll", skip(self, cx))]
@@ -146,7 +153,7 @@ where
/// A stream produced by the yamux multiplexer.
#[derive(Debug)]
-pub struct Stream(yamux::Stream);
+pub struct Stream(Either);
impl AsyncRead for Stream {
fn poll_read(
@@ -154,7 +161,7 @@ impl AsyncRead for Stream {
cx: &mut Context<'_>,
buf: &mut [u8],
) -> Poll> {
- Pin::new(&mut self.0).poll_read(cx, buf)
+ either::for_both!(self.0.as_mut(), s => Pin::new(s).poll_read(cx, buf))
}
fn poll_read_vectored(
@@ -162,7 +169,7 @@ impl AsyncRead for Stream {
cx: &mut Context<'_>,
bufs: &mut [IoSliceMut<'_>],
) -> Poll> {
- Pin::new(&mut self.0).poll_read_vectored(cx, bufs)
+ either::for_both!(self.0.as_mut(), s => Pin::new(s).poll_read_vectored(cx, bufs))
}
}
@@ -172,7 +179,7 @@ impl AsyncWrite for Stream {
cx: &mut Context<'_>,
buf: &[u8],
) -> Poll> {
- Pin::new(&mut self.0).poll_write(cx, buf)
+ either::for_both!(self.0.as_mut(), s => Pin::new(s).poll_write(cx, buf))
}
fn poll_write_vectored(
@@ -180,15 +187,15 @@ impl AsyncWrite for Stream {
cx: &mut Context<'_>,
bufs: &[IoSlice<'_>],
) -> Poll> {
- Pin::new(&mut self.0).poll_write_vectored(cx, bufs)
+ either::for_both!(self.0.as_mut(), s => Pin::new(s).poll_write_vectored(cx, bufs))
}
fn poll_flush(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> {
- Pin::new(&mut self.0).poll_flush(cx)
+ either::for_both!(self.0.as_mut(), s => Pin::new(s).poll_flush(cx))
}
fn poll_close(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> {
- Pin::new(&mut self.0).poll_close(cx)
+ either::for_both!(self.0.as_mut(), s => Pin::new(s).poll_close(cx))
}
}
@@ -197,11 +204,16 @@ where
C: AsyncRead + AsyncWrite + Unpin + 'static,
{
fn poll_inner(&mut self, cx: &mut Context<'_>) -> Poll> {
- let stream = ready!(self.connection.poll_next_inbound(cx))
- .transpose()
- .map_err(Error)?
- .map(Stream)
- .ok_or(Error(ConnectionError::Closed))?;
+ let stream = match self.connection.as_mut() {
+ Either::Left(c) => ready!(c.poll_next_inbound(cx))
+ .ok_or(Error(Either::Left(yamux012::ConnectionError::Closed)))?
+ .map_err(|e| Error(Either::Left(e)))
+ .map(|s| Stream(Either::Left(s)))?,
+ Either::Right(c) => ready!(c.poll_next_inbound(cx))
+ .ok_or(Error(Either::Right(yamux013::ConnectionError::Closed)))?
+ .map_err(|e| Error(Either::Right(e)))
+ .map(|s| Stream(Either::Right(s)))?,
+ };
Poll::Ready(Ok(stream))
}
@@ -209,14 +221,33 @@ where
/// The yamux configuration.
#[derive(Debug, Clone)]
-pub struct Config {
- inner: yamux::Config,
- mode: Option,
+pub struct Config(Either);
+
+impl Default for Config {
+ fn default() -> Self {
+ Self(Either::Right(Config013::default()))
+ }
+}
+
+#[derive(Debug, Clone)]
+struct Config012 {
+ inner: yamux012::Config,
+ mode: Option,
+}
+
+impl Default for Config012 {
+ fn default() -> Self {
+ let mut inner = yamux012::Config::default();
+ // For conformity with mplex, read-after-close on a multiplexed
+ // connection is never permitted and not configurable.
+ inner.set_read_after_close(false);
+ Self { inner, mode: None }
+ }
}
/// The window update mode determines when window updates are
/// sent to the remote, giving it new credit to send more data.
-pub struct WindowUpdateMode(yamux::WindowUpdateMode);
+pub struct WindowUpdateMode(yamux012::WindowUpdateMode);
impl WindowUpdateMode {
/// The window update mode whereby the remote is given
@@ -234,7 +265,7 @@ impl WindowUpdateMode {
#[deprecated(note = "Use `WindowUpdateMode::on_read` instead.")]
pub fn on_receive() -> Self {
#[allow(deprecated)]
- WindowUpdateMode(yamux::WindowUpdateMode::OnReceive)
+ WindowUpdateMode(yamux012::WindowUpdateMode::OnReceive)
}
/// The window update mode whereby the remote is given new
@@ -252,62 +283,71 @@ impl WindowUpdateMode {
/// > **Note**: With this strategy, there is usually no point in the
/// > receive buffer being larger than the window size.
pub fn on_read() -> Self {
- WindowUpdateMode(yamux::WindowUpdateMode::OnRead)
+ WindowUpdateMode(yamux012::WindowUpdateMode::OnRead)
}
}
impl Config {
/// Creates a new `YamuxConfig` in client mode, regardless of whether
/// it will be used for an inbound or outbound upgrade.
+ #[deprecated(note = "Will be removed with the next breaking release.")]
pub fn client() -> Self {
- Self {
- mode: Some(yamux::Mode::Client),
+ Self(Either::Left(Config012 {
+ mode: Some(yamux012::Mode::Client),
..Default::default()
- }
+ }))
}
/// Creates a new `YamuxConfig` in server mode, regardless of whether
/// it will be used for an inbound or outbound upgrade.
+ #[deprecated(note = "Will be removed with the next breaking release.")]
pub fn server() -> Self {
- Self {
- mode: Some(yamux::Mode::Server),
+ Self(Either::Left(Config012 {
+ mode: Some(yamux012::Mode::Server),
..Default::default()
- }
+ }))
}
/// Sets the size (in bytes) of the receive window per substream.
+ #[deprecated(
+ note = "Will be replaced in the next breaking release with a connection receive window size limit."
+ )]
pub fn set_receive_window_size(&mut self, num_bytes: u32) -> &mut Self {
- self.inner.set_receive_window(num_bytes);
- self
+ self.set(|cfg| cfg.set_receive_window(num_bytes))
}
/// Sets the maximum size (in bytes) of the receive buffer per substream.
+ #[deprecated(note = "Will be removed with the next breaking release.")]
pub fn set_max_buffer_size(&mut self, num_bytes: usize) -> &mut Self {
- self.inner.set_max_buffer_size(num_bytes);
- self
+ self.set(|cfg| cfg.set_max_buffer_size(num_bytes))
}
/// Sets the maximum number of concurrent substreams.
pub fn set_max_num_streams(&mut self, num_streams: usize) -> &mut Self {
- self.inner.set_max_num_streams(num_streams);
- self
+ self.set(|cfg| cfg.set_max_num_streams(num_streams))
}
/// Sets the window update mode that determines when the remote
/// is given new credit for sending more data.
+ #[deprecated(
+ note = "`WindowUpdate::OnRead` is the default. `WindowUpdate::OnReceive` breaks backpressure, is thus not recommended, and will be removed in the next breaking release. Thus this method becomes obsolete and will be removed with the next breaking release."
+ )]
pub fn set_window_update_mode(&mut self, mode: WindowUpdateMode) -> &mut Self {
- self.inner.set_window_update_mode(mode.0);
- self
+ self.set(|cfg| cfg.set_window_update_mode(mode.0))
}
-}
-impl Default for Config {
- fn default() -> Self {
- let mut inner = yamux::Config::default();
- // For conformity with mplex, read-after-close on a multiplexed
- // connection is never permitted and not configurable.
- inner.set_read_after_close(false);
- Config { inner, mode: None }
+ fn set(&mut self, f: impl FnOnce(&mut yamux012::Config) -> &mut yamux012::Config) -> &mut Self {
+ let cfg012 = match self.0.as_mut() {
+ Either::Left(c) => &mut c.inner,
+ Either::Right(_) => {
+ self.0 = Either::Left(Config012::default());
+ &mut self.0.as_mut().unwrap_left().inner
+ }
+ };
+
+ f(cfg012);
+
+ self
}
}
@@ -329,8 +369,18 @@ where
type Future = future::Ready>;
fn upgrade_inbound(self, io: C, _: Self::Info) -> Self::Future {
- let mode = self.mode.unwrap_or(yamux::Mode::Server);
- future::ready(Ok(Muxer::new(io, self.inner, mode)))
+ let connection = match self.0 {
+ Either::Left(Config012 { inner, mode }) => Either::Left(yamux012::Connection::new(
+ io,
+ inner,
+ mode.unwrap_or(yamux012::Mode::Server),
+ )),
+ Either::Right(Config013(cfg)) => {
+ Either::Right(yamux013::Connection::new(io, cfg, yamux013::Mode::Server))
+ }
+ };
+
+ future::ready(Ok(Muxer::new(connection)))
}
}
@@ -343,21 +393,69 @@ where
type Future = future::Ready>;
fn upgrade_outbound(self, io: C, _: Self::Info) -> Self::Future {
- let mode = self.mode.unwrap_or(yamux::Mode::Client);
- future::ready(Ok(Muxer::new(io, self.inner, mode)))
+ let connection = match self.0 {
+ Either::Left(Config012 { inner, mode }) => Either::Left(yamux012::Connection::new(
+ io,
+ inner,
+ mode.unwrap_or(yamux012::Mode::Client),
+ )),
+ Either::Right(Config013(cfg)) => {
+ Either::Right(yamux013::Connection::new(io, cfg, yamux013::Mode::Client))
+ }
+ };
+
+ future::ready(Ok(Muxer::new(connection)))
+ }
+}
+
+#[derive(Debug, Clone)]
+struct Config013(yamux013::Config);
+
+impl Default for Config013 {
+ fn default() -> Self {
+ let mut cfg = yamux013::Config::default();
+ // For conformity with mplex, read-after-close on a multiplexed
+ // connection is never permitted and not configurable.
+ cfg.set_read_after_close(false);
+ Self(cfg)
}
}
/// The Yamux [`StreamMuxer`] error type.
#[derive(Debug, Error)]
#[error(transparent)]
-pub struct Error(yamux::ConnectionError);
+pub struct Error(Either);
impl From for io::Error {
fn from(err: Error) -> Self {
match err.0 {
- yamux::ConnectionError::Io(e) => e,
- e => io::Error::new(io::ErrorKind::Other, e),
+ Either::Left(err) => match err {
+ yamux012::ConnectionError::Io(e) => e,
+ e => io::Error::new(io::ErrorKind::Other, e),
+ },
+ Either::Right(err) => match err {
+ yamux013::ConnectionError::Io(e) => e,
+ e => io::Error::new(io::ErrorKind::Other, e),
+ },
}
}
}
+
+#[cfg(test)]
+mod test {
+ use super::*;
+ #[test]
+ fn config_set_switches_to_v012() {
+ // By default we use yamux v0.13. Thus we provide the benefits of yamux v0.13 to all users
+ // that do not depend on any of the behaviors (i.e. configuration options) of v0.12.
+ let mut cfg = Config::default();
+ assert!(matches!(
+ cfg,
+ Config(Either::Right(Config013(yamux013::Config { .. })))
+ ));
+
+ // In case a user makes any configurations, use yamux v0.12 instead.
+ cfg.set_max_num_streams(42);
+ assert!(matches!(cfg, Config(Either::Left(Config012 { .. }))));
+ }
+}
diff --git a/protocols/autonat/src/behaviour.rs b/protocols/autonat/src/behaviour.rs
index 0b80a079c0f..e95163ab23f 100644
--- a/protocols/autonat/src/behaviour.rs
+++ b/protocols/autonat/src/behaviour.rs
@@ -35,12 +35,9 @@ use libp2p_request_response::{
self as request_response, InboundRequestId, OutboundRequestId, ProtocolSupport, ResponseChannel,
};
use libp2p_swarm::{
- behaviour::{
- AddressChange, ConnectionClosed, ConnectionEstablished, DialFailure, ExpiredListenAddr,
- ExternalAddrExpired, FromSwarm,
- },
- ConnectionDenied, ConnectionId, ListenAddresses, NetworkBehaviour, NewExternalAddrCandidate,
- THandler, THandlerInEvent, THandlerOutEvent, ToSwarm,
+ behaviour::{AddressChange, ConnectionClosed, ConnectionEstablished, DialFailure, FromSwarm},
+ ConnectionDenied, ConnectionId, ListenAddresses, NetworkBehaviour, THandler, THandlerInEvent,
+ THandlerOutEvent, ToSwarm,
};
use std::{
collections::{HashMap, HashSet, VecDeque},
@@ -363,18 +360,10 @@ impl Behaviour {
ConnectionClosed {
peer_id,
connection_id,
- endpoint,
remaining_established,
+ ..
}: ConnectionClosed,
) {
- self.inner
- .on_swarm_event(FromSwarm::ConnectionClosed(ConnectionClosed {
- peer_id,
- connection_id,
- endpoint,
- remaining_established,
- }));
-
if remaining_established == 0 {
self.connected.remove(&peer_id);
} else {
@@ -386,20 +375,7 @@ impl Behaviour {
}
}
- fn on_dial_failure(
- &mut self,
- DialFailure {
- peer_id,
- connection_id,
- error,
- }: DialFailure,
- ) {
- self.inner
- .on_swarm_event(FromSwarm::DialFailure(DialFailure {
- peer_id,
- connection_id,
- error,
- }));
+ fn on_dial_failure(&mut self, DialFailure { peer_id, error, .. }: DialFailure) {
if let Some(event) = self.as_server().on_outbound_dial_error(peer_id, error) {
self.pending_actions
.push_back(ToSwarm::GenerateEvent(Event::InboundProbe(event)));
@@ -542,57 +518,25 @@ impl NetworkBehaviour for Behaviour {
fn on_swarm_event(&mut self, event: FromSwarm) {
self.listen_addresses.on_swarm_event(&event);
+ self.inner.on_swarm_event(event);
match event {
- FromSwarm::ConnectionEstablished(connection_established) => {
- self.inner
- .on_swarm_event(FromSwarm::ConnectionEstablished(connection_established));
- self.on_connection_established(connection_established)
- }
- FromSwarm::ConnectionClosed(connection_closed) => {
- self.on_connection_closed(connection_closed)
- }
- FromSwarm::DialFailure(dial_failure) => self.on_dial_failure(dial_failure),
- FromSwarm::AddressChange(address_change) => {
- self.inner
- .on_swarm_event(FromSwarm::AddressChange(address_change));
- self.on_address_change(address_change)
- }
- listen_addr @ FromSwarm::NewListenAddr(_) => {
- self.inner.on_swarm_event(listen_addr);
+ FromSwarm::ConnectionEstablished(e) => self.on_connection_established(e),
+ FromSwarm::ConnectionClosed(e) => self.on_connection_closed(e),
+ FromSwarm::DialFailure(e) => self.on_dial_failure(e),
+ FromSwarm::AddressChange(e) => self.on_address_change(e),
+ FromSwarm::NewListenAddr(_) => {
self.as_client().on_new_address();
}
- FromSwarm::ExpiredListenAddr(ExpiredListenAddr { listener_id, addr }) => {
- self.inner
- .on_swarm_event(FromSwarm::ExpiredListenAddr(ExpiredListenAddr {
- listener_id,
- addr,
- }));
- self.as_client().on_expired_address(addr);
- }
- FromSwarm::ExternalAddrExpired(ExternalAddrExpired { addr }) => {
- self.inner
- .on_swarm_event(FromSwarm::ExternalAddrExpired(ExternalAddrExpired { addr }));
- self.as_client().on_expired_address(addr);
- }
- FromSwarm::NewExternalAddrCandidate(NewExternalAddrCandidate { addr }) => {
- self.inner
- .on_swarm_event(FromSwarm::NewExternalAddrCandidate(
- NewExternalAddrCandidate { addr },
- ));
- self.probe_address(addr.to_owned());
- }
- listen_failure @ FromSwarm::ListenFailure(_) => {
- self.inner.on_swarm_event(listen_failure)
+ FromSwarm::ExpiredListenAddr(e) => {
+ self.as_client().on_expired_address(e.addr);
}
- new_listener @ FromSwarm::NewListener(_) => self.inner.on_swarm_event(new_listener),
- listener_error @ FromSwarm::ListenerError(_) => {
- self.inner.on_swarm_event(listener_error)
+ FromSwarm::ExternalAddrExpired(e) => {
+ self.as_client().on_expired_address(e.addr);
}
- listener_closed @ FromSwarm::ListenerClosed(_) => {
- self.inner.on_swarm_event(listener_closed)
+ FromSwarm::NewExternalAddrCandidate(e) => {
+ self.probe_address(e.addr.to_owned());
}
- confirmed @ FromSwarm::ExternalAddrConfirmed(_) => self.inner.on_swarm_event(confirmed),
_ => {}
}
}
diff --git a/protocols/dcutr/Cargo.toml b/protocols/dcutr/Cargo.toml
index 1fc4b367dc8..4359f2f02d7 100644
--- a/protocols/dcutr/Cargo.toml
+++ b/protocols/dcutr/Cargo.toml
@@ -13,7 +13,7 @@ categories = ["network-programming", "asynchronous"]
[dependencies]
asynchronous-codec = { workspace = true }
either = "1.9.0"
-futures = "0.3.29"
+futures = "0.3.30"
futures-timer = "3.0"
instant = "0.1.12"
libp2p-core = { workspace = true }
@@ -29,7 +29,7 @@ futures-bounded = { workspace = true }
[dev-dependencies]
async-std = { version = "1.12.0", features = ["attributes"] }
-clap = { version = "4.4.10", features = ["derive"] }
+clap = { version = "4.4.13", features = ["derive"] }
libp2p-dns = { workspace = true, features = ["async-std"] }
libp2p-identify = { workspace = true }
libp2p-noise = { workspace = true }
diff --git a/protocols/floodsub/Cargo.toml b/protocols/floodsub/Cargo.toml
index 87f0e636272..6e26579310d 100644
--- a/protocols/floodsub/Cargo.toml
+++ b/protocols/floodsub/Cargo.toml
@@ -15,7 +15,7 @@ asynchronous-codec = { workspace = true }
cuckoofilter = "0.5.0"
fnv = "1.0"
bytes = "1.5"
-futures = "0.3.29"
+futures = "0.3.30"
libp2p-core = { workspace = true }
libp2p-swarm = { workspace = true }
libp2p-identity = { workspace = true }
@@ -23,7 +23,7 @@ quick-protobuf = "0.8"
quick-protobuf-codec = { workspace = true }
rand = "0.8"
smallvec = "1.11.2"
-thiserror = "1.0.50"
+thiserror = "1.0.56"
tracing = "0.1.37"
# Passing arguments to the docsrs builder in order to properly document cfg's.
diff --git a/protocols/gossipsub/Cargo.toml b/protocols/gossipsub/Cargo.toml
index 37873de39f9..d3d84fe301f 100644
--- a/protocols/gossipsub/Cargo.toml
+++ b/protocols/gossipsub/Cargo.toml
@@ -15,12 +15,12 @@ wasm-bindgen = ["getrandom/js", "instant/wasm-bindgen"]
[dependencies]
asynchronous-codec = { workspace = true }
-base64 = "0.21.5"
+base64 = "0.21.7"
byteorder = "1.5.0"
bytes = "1.5"
either = "1.9"
fnv = "1.0.7"
-futures = "0.3.29"
+futures = "0.3.30"
futures-ticker = "0.0.3"
getrandom = "0.2.11"
hex_fmt = "0.3.0"
diff --git a/protocols/identify/Cargo.toml b/protocols/identify/Cargo.toml
index 8168a3a3fc6..cd5a26d79ac 100644
--- a/protocols/identify/Cargo.toml
+++ b/protocols/identify/Cargo.toml
@@ -12,7 +12,7 @@ categories = ["network-programming", "asynchronous"]
[dependencies]
asynchronous-codec = { workspace = true }
-futures = "0.3.29"
+futures = "0.3.30"
futures-timer = "3.0.2"
futures-bounded = { workspace = true }
libp2p-core = { workspace = true }
diff --git a/protocols/kad/CHANGELOG.md b/protocols/kad/CHANGELOG.md
index 4740e4b1f95..b27a6943659 100644
--- a/protocols/kad/CHANGELOG.md
+++ b/protocols/kad/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 0.45.3
+
+- The progress of the close query iterator shall be decided by ANY of the new peers.
+ See [PR 4932](https://github.com/libp2p/rust-libp2p/pull/4932).
+
## 0.45.2
- Ensure `Multiaddr` handled and returned by `Behaviour` are `/p2p` terminated.
diff --git a/protocols/kad/Cargo.toml b/protocols/kad/Cargo.toml
index 1e4c788cf00..7acb73f074f 100644
--- a/protocols/kad/Cargo.toml
+++ b/protocols/kad/Cargo.toml
@@ -3,7 +3,7 @@ name = "libp2p-kad"
edition = "2021"
rust-version = { workspace = true }
description = "Kademlia protocol for libp2p"
-version = "0.45.2"
+version = "0.45.3"
authors = ["Parity Technologies "]
license = "MIT"
repository = "https://github.com/libp2p/rust-libp2p"
@@ -16,7 +16,7 @@ bytes = "1"
either = "1.9"
fnv = "1.0"
asynchronous-codec = { workspace = true }
-futures = "0.3.29"
+futures = "0.3.30"
libp2p-core = { workspace = true }
libp2p-swarm = { workspace = true }
futures-bounded = { workspace = true }
diff --git a/protocols/kad/src/behaviour.rs b/protocols/kad/src/behaviour.rs
index cde4fbb8536..f7e2fb3a032 100644
--- a/protocols/kad/src/behaviour.rs
+++ b/protocols/kad/src/behaviour.rs
@@ -519,7 +519,7 @@ where
};
let key = kbucket::Key::from(*peer);
match self.kbuckets.entry(&key) {
- kbucket::Entry::Present(mut entry, _) => {
+ Some(kbucket::Entry::Present(mut entry, _)) => {
if entry.value().insert(address) {
self.queued_events
.push_back(ToSwarm::GenerateEvent(Event::RoutingUpdated {
@@ -536,11 +536,11 @@ where
}
RoutingUpdate::Success
}
- kbucket::Entry::Pending(mut entry, _) => {
+ Some(kbucket::Entry::Pending(mut entry, _)) => {
entry.value().insert(address);
RoutingUpdate::Pending
}
- kbucket::Entry::Absent(entry) => {
+ Some(kbucket::Entry::Absent(entry)) => {
let addresses = Addresses::new(address);
let status = if self.connected_peers.contains(peer) {
NodeStatus::Connected
@@ -578,7 +578,7 @@ where
}
}
}
- kbucket::Entry::SelfEntry => RoutingUpdate::Failed,
+ None => RoutingUpdate::Failed,
}
}
@@ -599,7 +599,7 @@ where
) -> Option, Addresses>> {
let address = &address.to_owned().with_p2p(*peer).ok()?;
let key = kbucket::Key::from(*peer);
- match self.kbuckets.entry(&key) {
+ match self.kbuckets.entry(&key)? {
kbucket::Entry::Present(mut entry, _) => {
if entry.value().remove(address).is_err() {
Some(entry.remove()) // it is the last address, thus remove the peer.
@@ -614,7 +614,7 @@ where
None
}
}
- kbucket::Entry::Absent(..) | kbucket::Entry::SelfEntry => None,
+ kbucket::Entry::Absent(..) => None,
}
}
@@ -627,10 +627,10 @@ where
peer: &PeerId,
) -> Option, Addresses>> {
let key = kbucket::Key::from(*peer);
- match self.kbuckets.entry(&key) {
+ match self.kbuckets.entry(&key)? {
kbucket::Entry::Present(entry, _) => Some(entry.remove()),
kbucket::Entry::Pending(entry, _) => Some(entry.remove()),
- kbucket::Entry::Absent(..) | kbucket::Entry::SelfEntry => None,
+ kbucket::Entry::Absent(..) => None,
}
}
@@ -1164,7 +1164,8 @@ where
let key = kbucket::Key::from(node_id);
kbuckets
.entry(&key)
- .view()
+ .as_mut()
+ .and_then(|e| e.view())
.map(|e| e.node.value.clone().into_vec())
}
} else {
@@ -1220,7 +1221,7 @@ where
) {
let key = kbucket::Key::from(peer);
match self.kbuckets.entry(&key) {
- kbucket::Entry::Present(mut entry, old_status) => {
+ Some(kbucket::Entry::Present(mut entry, old_status)) => {
if old_status != new_status {
entry.update(new_status)
}
@@ -1243,7 +1244,7 @@ where
}
}
- kbucket::Entry::Pending(mut entry, old_status) => {
+ Some(kbucket::Entry::Pending(mut entry, old_status)) => {
if let Some(address) = address {
entry.value().insert(address);
}
@@ -1252,7 +1253,7 @@ where
}
}
- kbucket::Entry::Absent(entry) => {
+ Some(kbucket::Entry::Absent(entry)) => {
// Only connected nodes with a known address are newly inserted.
if new_status != NodeStatus::Connected {
return;
@@ -1863,7 +1864,7 @@ where
fn address_failed(&mut self, peer_id: PeerId, address: &Multiaddr) {
let key = kbucket::Key::from(peer_id);
- if let Some(addrs) = self.kbuckets.entry(&key).value() {
+ if let Some(addrs) = self.kbuckets.entry(&key).as_mut().and_then(|e| e.value()) {
// TODO: Ideally, the address should only be removed if the error can
// be classified as "permanent" but since `err` is currently a borrowed
// trait object without a `'static` bound, even downcasting for inspection
@@ -1931,7 +1932,12 @@ where
let (old, new) = (old.get_remote_address(), new.get_remote_address());
// Update routing table.
- if let Some(addrs) = self.kbuckets.entry(&kbucket::Key::from(peer)).value() {
+ if let Some(addrs) = self
+ .kbuckets
+ .entry(&kbucket::Key::from(peer))
+ .as_mut()
+ .and_then(|e| e.value())
+ {
if addrs.replace(old, new) {
tracing::debug!(
%peer,
@@ -2132,7 +2138,7 @@ where
// the addresses of that peer in the k-buckets.
let key = kbucket::Key::from(peer_id);
let mut peer_addrs =
- if let kbucket::Entry::Present(mut entry, _) = self.kbuckets.entry(&key) {
+ if let Some(kbucket::Entry::Present(mut entry, _)) = self.kbuckets.entry(&key) {
let addrs = entry.value().iter().cloned().collect::>();
debug_assert!(!addrs.is_empty(), "Empty peer addresses in routing table.");
addrs
diff --git a/protocols/kad/src/handler.rs b/protocols/kad/src/handler.rs
index 318261d8d21..5e7c2e21b8b 100644
--- a/protocols/kad/src/handler.rs
+++ b/protocols/kad/src/handler.rs
@@ -60,7 +60,8 @@ pub struct Handler {
next_connec_unique_id: UniqueConnecId,
/// List of active outbound streams.
- outbound_substreams: futures_bounded::FuturesMap>>,
+ outbound_substreams:
+ futures_bounded::FuturesTupleSet>, QueryId>,
/// Contains one [`oneshot::Sender`] per outbound stream that we have requested.
pending_streams:
@@ -453,7 +454,7 @@ impl Handler {
remote_peer_id,
next_connec_unique_id: UniqueConnecId(0),
inbound_substreams: Default::default(),
- outbound_substreams: futures_bounded::FuturesMap::new(
+ outbound_substreams: futures_bounded::FuturesTupleSet::new(
Duration::from_secs(10),
MAX_NUM_STREAMS,
),
@@ -552,32 +553,36 @@ impl Handler {
let (sender, receiver) = oneshot::channel();
self.pending_streams.push_back(sender);
- let result = self.outbound_substreams.try_push(id, async move {
- let mut stream = receiver
- .await
- .map_err(|_| io::Error::from(io::ErrorKind::BrokenPipe))?
- .map_err(|e| match e {
- StreamUpgradeError::Timeout => io::ErrorKind::TimedOut.into(),
- StreamUpgradeError::Apply(e) => e,
- StreamUpgradeError::NegotiationFailed => {
- io::Error::new(io::ErrorKind::ConnectionRefused, "protocol not supported")
- }
- StreamUpgradeError::Io(e) => e,
- })?;
-
- let has_answer = !matches!(msg, KadRequestMsg::AddProvider { .. });
-
- stream.send(msg).await?;
- stream.close().await?;
-
- if !has_answer {
- return Ok(None);
- }
+ let result = self.outbound_substreams.try_push(
+ async move {
+ let mut stream = receiver
+ .await
+ .map_err(|_| io::Error::from(io::ErrorKind::BrokenPipe))?
+ .map_err(|e| match e {
+ StreamUpgradeError::Timeout => io::ErrorKind::TimedOut.into(),
+ StreamUpgradeError::Apply(e) => e,
+ StreamUpgradeError::NegotiationFailed => io::Error::new(
+ io::ErrorKind::ConnectionRefused,
+ "protocol not supported",
+ ),
+ StreamUpgradeError::Io(e) => e,
+ })?;
+
+ let has_answer = !matches!(msg, KadRequestMsg::AddProvider { .. });
+
+ stream.send(msg).await?;
+ stream.close().await?;
+
+ if !has_answer {
+ return Ok(None);
+ }
- let msg = stream.next().await.ok_or(io::ErrorKind::UnexpectedEof)??;
+ let msg = stream.next().await.ok_or(io::ErrorKind::UnexpectedEof)??;
- Ok(Some(msg))
- });
+ Ok(Some(msg))
+ },
+ id,
+ );
debug_assert!(
result.is_ok(),
@@ -728,15 +733,15 @@ impl ConnectionHandler for Handler {
}
match self.outbound_substreams.poll_unpin(cx) {
- Poll::Ready((query, Ok(Ok(Some(response))))) => {
+ Poll::Ready((Ok(Ok(Some(response))), query_id)) => {
return Poll::Ready(ConnectionHandlerEvent::NotifyBehaviour(
- process_kad_response(response, query),
+ process_kad_response(response, query_id),
))
}
- Poll::Ready((_, Ok(Ok(None)))) => {
+ Poll::Ready((Ok(Ok(None)), _)) => {
continue;
}
- Poll::Ready((query_id, Ok(Err(e)))) => {
+ Poll::Ready((Ok(Err(e)), query_id)) => {
return Poll::Ready(ConnectionHandlerEvent::NotifyBehaviour(
HandlerEvent::QueryError {
error: HandlerQueryErr::Io(e),
@@ -744,7 +749,7 @@ impl ConnectionHandler for Handler {
},
))
}
- Poll::Ready((query_id, Err(_timeout))) => {
+ Poll::Ready((Err(_timeout), query_id)) => {
return Poll::Ready(ConnectionHandlerEvent::NotifyBehaviour(
HandlerEvent::QueryError {
error: HandlerQueryErr::Io(io::ErrorKind::TimedOut.into()),
diff --git a/protocols/kad/src/kbucket.rs b/protocols/kad/src/kbucket.rs
index b42806fcf3c..a0d272c31f1 100644
--- a/protocols/kad/src/kbucket.rs
+++ b/protocols/kad/src/kbucket.rs
@@ -172,17 +172,16 @@ where
/// Returns an `Entry` for the given key, representing the state of the entry
/// in the routing table.
- pub(crate) fn entry<'a>(&'a mut self, key: &'a TKey) -> Entry<'a, TKey, TVal> {
- let index = BucketIndex::new(&self.local_key.as_ref().distance(key));
- if let Some(i) = index {
- let bucket = &mut self.buckets[i.get()];
- if let Some(applied) = bucket.apply_pending() {
- self.applied_pending.push_back(applied)
- }
- Entry::new(bucket, key)
- } else {
- Entry::SelfEntry
+ ///
+ /// Returns `None` in case the key points to the local node.
+ pub(crate) fn entry<'a>(&'a mut self, key: &'a TKey) -> Option> {
+ let index = BucketIndex::new(&self.local_key.as_ref().distance(key))?;
+
+ let bucket = &mut self.buckets[index.get()];
+ if let Some(applied) = bucket.apply_pending() {
+ self.applied_pending.push_back(applied)
}
+ Some(Entry::new(bucket, key))
}
/// Returns an iterator over all buckets.
@@ -627,7 +626,7 @@ mod tests {
let other_id = Key::from(PeerId::random());
let mut table = KBucketsTable::<_, ()>::new(local_key, Duration::from_secs(5));
- if let Entry::Absent(entry) = table.entry(&other_id) {
+ if let Some(Entry::Absent(entry)) = table.entry(&other_id) {
match entry.insert((), NodeStatus::Connected) {
InsertResult::Inserted => (),
_ => panic!(),
@@ -645,10 +644,8 @@ mod tests {
fn entry_self() {
let local_key = Key::from(PeerId::random());
let mut table = KBucketsTable::<_, ()>::new(local_key.clone(), Duration::from_secs(5));
- match table.entry(&local_key) {
- Entry::SelfEntry => (),
- _ => panic!(),
- }
+
+ assert!(table.entry(&local_key).is_none())
}
#[test]
@@ -661,7 +658,7 @@ mod tests {
break;
}
let key = Key::from(PeerId::random());
- if let Entry::Absent(e) = table.entry(&key) {
+ if let Some(Entry::Absent(e)) = table.entry(&key) {
match e.insert((), NodeStatus::Connected) {
InsertResult::Inserted => count += 1,
_ => continue,
@@ -694,10 +691,10 @@ mod tests {
let full_bucket_index;
loop {
let key = Key::from(PeerId::random());
- if let Entry::Absent(e) = table.entry(&key) {
+ if let Some(Entry::Absent(e)) = table.entry(&key) {
match e.insert((), NodeStatus::Disconnected) {
InsertResult::Full => {
- if let Entry::Absent(e) = table.entry(&key) {
+ if let Some(Entry::Absent(e)) = table.entry(&key) {
match e.insert((), NodeStatus::Connected) {
InsertResult::Pending { disconnected } => {
expected_applied = AppliedPending {
@@ -732,12 +729,12 @@ mod tests {
full_bucket.pending_mut().unwrap().set_ready_at(elapsed);
match table.entry(&expected_applied.inserted.key) {
- Entry::Present(_, NodeStatus::Connected) => {}
+ Some(Entry::Present(_, NodeStatus::Connected)) => {}
x => panic!("Unexpected entry: {x:?}"),
}
match table.entry(&expected_applied.evicted.as_ref().unwrap().key) {
- Entry::Absent(_) => {}
+ Some(Entry::Absent(_)) => {}
x => panic!("Unexpected entry: {x:?}"),
}
diff --git a/protocols/kad/src/kbucket/entry.rs b/protocols/kad/src/kbucket/entry.rs
index c38aac4a483..02c90fdfcc7 100644
--- a/protocols/kad/src/kbucket/entry.rs
+++ b/protocols/kad/src/kbucket/entry.rs
@@ -81,8 +81,6 @@ pub(crate) enum Entry<'a, TPeerId, TVal> {
Pending(PendingEntry<'a, TPeerId, TVal>, NodeStatus),
/// The entry is absent and may be inserted.
Absent(AbsentEntry<'a, TPeerId, TVal>),
- /// The entry represents the local node.
- SelfEntry,
}
/// The internal representation of the different states of an `Entry`,
@@ -144,7 +142,6 @@ where
Entry::Present(entry, _) => Some(entry.value()),
Entry::Pending(entry, _) => Some(entry.value()),
Entry::Absent(_) => None,
- Entry::SelfEntry => None,
}
}
}
diff --git a/protocols/kad/src/query/peers/closest.rs b/protocols/kad/src/query/peers/closest.rs
index 01155b7f010..dc913f1bbca 100644
--- a/protocols/kad/src/query/peers/closest.rs
+++ b/protocols/kad/src/query/peers/closest.rs
@@ -175,10 +175,14 @@ impl ClosestPeersIter {
},
}
- let num_closest = self.closest_peers.len();
- let mut progress = false;
-
// Incorporate the reported closer peers into the iterator.
+ //
+ // The iterator makes progress if:
+ // 1, the iterator did not yet accumulate enough closest peers.
+ // OR
+ // 2, any of the new peers is closer to the target than any peer seen so far
+ // (i.e. is the first entry after being incorporated)
+ let mut progress = self.closest_peers.len() < self.config.num_results.get();
for peer in closer_peers {
let key = peer.into();
let distance = self.target.distance(&key);
@@ -187,11 +191,8 @@ impl ClosestPeersIter {
state: PeerState::NotContacted,
};
self.closest_peers.entry(distance).or_insert(peer);
- // The iterator makes progress if the new peer is either closer to the target
- // than any peer seen so far (i.e. is the first entry), or the iterator did
- // not yet accumulate enough closest peers.
- progress = self.closest_peers.keys().next() == Some(&distance)
- || num_closest < self.config.num_results.get();
+
+ progress = self.closest_peers.keys().next() == Some(&distance) || progress;
}
// Update the iterator state.
diff --git a/protocols/mdns/Cargo.toml b/protocols/mdns/Cargo.toml
index 97e7204cd63..b18c87dcc71 100644
--- a/protocols/mdns/Cargo.toml
+++ b/protocols/mdns/Cargo.toml
@@ -12,9 +12,9 @@ categories = ["network-programming", "asynchronous"]
[dependencies]
async-std = { version = "1.12.0", optional = true }
-async-io = { version = "2.2.1", optional = true }
+async-io = { version = "2.2.2", optional = true }
data-encoding = "2.5.0"
-futures = "0.3.29"
+futures = "0.3.30"
if-watch = "3.2.0"
libp2p-core = { workspace = true }
libp2p-swarm = { workspace = true }
@@ -22,7 +22,7 @@ libp2p-identity = { workspace = true }
rand = "0.8.3"
smallvec = "1.11.2"
socket2 = { version = "0.5.5", features = ["all"] }
-tokio = { version = "1.34", default-features = false, features = ["net", "time"], optional = true}
+tokio = { version = "1.35", default-features = false, features = ["net", "time"], optional = true}
tracing = "0.1.37"
hickory-proto = { version = "0.24.0", default-features = false, features = ["mdns"] }
void = "1.0.2"
@@ -37,7 +37,7 @@ libp2p-noise = { workspace = true }
libp2p-swarm = { workspace = true, features = ["tokio", "async-std"] }
libp2p-tcp = { workspace = true, features = ["tokio", "async-io"] }
libp2p-yamux = { workspace = true }
-tokio = { version = "1.34", default-features = false, features = ["macros", "rt", "rt-multi-thread", "time"] }
+tokio = { version = "1.35", default-features = false, features = ["macros", "rt", "rt-multi-thread", "time"] }
libp2p-swarm-test = { path = "../../swarm-test" }
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
diff --git a/protocols/perf/Cargo.toml b/protocols/perf/Cargo.toml
index c2fc146f231..705b4e93729 100644
--- a/protocols/perf/Cargo.toml
+++ b/protocols/perf/Cargo.toml
@@ -12,8 +12,8 @@ categories = ["network-programming", "asynchronous"]
[dependencies]
anyhow = "1"
-clap = { version = "4.4.10", features = ["derive"] }
-futures = "0.3.29"
+clap = { version = "4.4.13", features = ["derive"] }
+futures = "0.3.30"
futures-bounded = { workspace = true }
futures-timer = "3.0"
instant = "0.1.12"
@@ -31,7 +31,7 @@ serde_json = "1.0"
thiserror = "1.0"
tracing = "0.1.37"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
-tokio = { version = "1.34", default-features = false, features = ["macros", "rt", "rt-multi-thread"] }
+tokio = { version = "1.35", default-features = false, features = ["macros", "rt", "rt-multi-thread"] }
void = "1"
[dev-dependencies]
diff --git a/protocols/ping/Cargo.toml b/protocols/ping/Cargo.toml
index 28ae5d39b62..a4d9259e9aa 100644
--- a/protocols/ping/Cargo.toml
+++ b/protocols/ping/Cargo.toml
@@ -12,7 +12,7 @@ categories = ["network-programming", "asynchronous"]
[dependencies]
either = "1.9.0"
-futures = "0.3.29"
+futures = "0.3.30"
futures-timer = "3.0.2"
instant = "0.1.12"
libp2p-core = { workspace = true }
diff --git a/protocols/relay/Cargo.toml b/protocols/relay/Cargo.toml
index 2ef9ed41019..94b9deb1a64 100644
--- a/protocols/relay/Cargo.toml
+++ b/protocols/relay/Cargo.toml
@@ -14,7 +14,7 @@ categories = ["network-programming", "asynchronous"]
asynchronous-codec = { workspace = true }
bytes = "1"
either = "1.9.0"
-futures = "0.3.29"
+futures = "0.3.30"
futures-timer = "3"
futures-bounded = { workspace = true }
instant = "0.1.12"
diff --git a/protocols/relay/src/behaviour.rs b/protocols/relay/src/behaviour.rs
index 59f679c9890..df8443e8359 100644
--- a/protocols/relay/src/behaviour.rs
+++ b/protocols/relay/src/behaviour.rs
@@ -202,12 +202,12 @@ pub enum Event {
dst_peer_id: PeerId,
error: inbound_hop::Error,
},
- /// An inbound cirucit request has been accepted.
+ /// An inbound circuit request has been accepted.
CircuitReqAccepted {
src_peer_id: PeerId,
dst_peer_id: PeerId,
},
- /// An outbound connect for an inbound cirucit request failed.
+ /// An outbound connect for an inbound circuit request failed.
#[deprecated(
note = "Will be removed in favor of logging them internally, see for details."
)]
diff --git a/protocols/relay/src/behaviour/rate_limiter.rs b/protocols/relay/src/behaviour/rate_limiter.rs
index a4a127e1253..9c4f67d04a8 100644
--- a/protocols/relay/src/behaviour/rate_limiter.rs
+++ b/protocols/relay/src/behaviour/rate_limiter.rs
@@ -124,7 +124,7 @@ impl GenericRateLimiter {
// Note when used with a high number of buckets: This loop refills all the to-be-refilled
// buckets at once, thus potentially delaying the parent call to `try_next`.
loop {
- match self.refill_schedule.get(0) {
+ match self.refill_schedule.front() {
// Only continue if (a) there is a bucket and (b) the bucket has not already been
// refilled recently.
Some((last_refill, _)) if now.duration_since(*last_refill) >= self.interval => {}
diff --git a/protocols/rendezvous/Cargo.toml b/protocols/rendezvous/Cargo.toml
index 4dfd77e1eba..edc0ec8a38a 100644
--- a/protocols/rendezvous/Cargo.toml
+++ b/protocols/rendezvous/Cargo.toml
@@ -37,7 +37,7 @@ libp2p-swarm-test = { path = "../../swarm-test" }
libp2p-tcp = { workspace = true, features = ["tokio"] }
libp2p-yamux = { workspace = true }
rand = "0.8"
-tokio = { version = "1.34", features = [ "rt-multi-thread", "time", "macros", "sync", "process", "fs", "net" ] }
+tokio = { version = "1.35", features = [ "rt-multi-thread", "time", "macros", "sync", "process", "fs", "net" ] }
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
# Passing arguments to the docsrs builder in order to properly document cfg's.
diff --git a/protocols/rendezvous/src/server.rs b/protocols/rendezvous/src/server.rs
index 78aa42043cd..667c71e20e3 100644
--- a/protocols/rendezvous/src/server.rs
+++ b/protocols/rendezvous/src/server.rs
@@ -215,20 +215,12 @@ impl NetworkBehaviour for Behaviour {
}) => {
continue;
}
- ToSwarm::Dial { .. }
- | ToSwarm::ListenOn { .. }
- | ToSwarm::RemoveListener { .. }
- | ToSwarm::NotifyHandler { .. }
- | ToSwarm::NewExternalAddrCandidate(_)
- | ToSwarm::ExternalAddrConfirmed(_)
- | ToSwarm::ExternalAddrExpired(_)
- | ToSwarm::CloseConnection { .. } => {
- let new_to_swarm = to_swarm
+ other => {
+ let new_to_swarm = other
.map_out(|_| unreachable!("we manually map `GenerateEvent` variants"));
return Poll::Ready(new_to_swarm);
}
- _ => {}
};
}
diff --git a/protocols/request-response/CHANGELOG.md b/protocols/request-response/CHANGELOG.md
index 30fc700da3c..d53ff479ee2 100644
--- a/protocols/request-response/CHANGELOG.md
+++ b/protocols/request-response/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 0.26.1
+
+- Derive `PartialOrd` and `Ord` for `{Out,In}boundRequestId`.
+ See [PR 4956](https://github.com/libp2p/rust-libp2p/pull/4956).
+
## 0.26.0
- Remove `request_response::Config::set_connection_keep_alive` in favor of `SwarmBuilder::idle_connection_timeout`.
diff --git a/protocols/request-response/Cargo.toml b/protocols/request-response/Cargo.toml
index 2c7692fb9b4..67536294696 100644
--- a/protocols/request-response/Cargo.toml
+++ b/protocols/request-response/Cargo.toml
@@ -3,7 +3,7 @@ name = "libp2p-request-response"
edition = "2021"
rust-version = { workspace = true }
description = "Generic Request/Response Protocols"
-version = "0.26.0"
+version = "0.26.1"
authors = ["Parity Technologies "]
license = "MIT"
repository = "https://github.com/libp2p/rust-libp2p"
@@ -13,14 +13,14 @@ categories = ["network-programming", "asynchronous"]
[dependencies]
async-trait = "0.1"
cbor4ii = { version = "0.3.2", features = ["serde1", "use_std"], optional = true }
-futures = "0.3.29"
+futures = "0.3.30"
instant = "0.1.12"
libp2p-core = { workspace = true }
libp2p-swarm = { workspace = true }
libp2p-identity = { workspace = true }
rand = "0.8"
serde = { version = "1.0", optional = true}
-serde_json = { version = "1.0.108", optional = true }
+serde_json = { version = "1.0.111", optional = true }
smallvec = "1.11.2"
tracing = "0.1.37"
void = "1.0.2"
@@ -32,7 +32,7 @@ json = ["dep:serde", "dep:serde_json", "libp2p-swarm/macros"]
cbor = ["dep:serde", "dep:cbor4ii", "libp2p-swarm/macros"]
[dev-dependencies]
-anyhow = "1.0.75"
+anyhow = "1.0.79"
async-std = { version = "1.6.2", features = ["attributes"] }
libp2p-noise = { workspace = true }
libp2p-tcp = { workspace = true, features = ["async-io"] }
diff --git a/protocols/request-response/src/lib.rs b/protocols/request-response/src/lib.rs
index 824839ebac8..fc68bd6cf1f 100644
--- a/protocols/request-response/src/lib.rs
+++ b/protocols/request-response/src/lib.rs
@@ -274,7 +274,7 @@ impl ResponseChannel {
///
/// Note: [`InboundRequestId`]'s uniqueness is only guaranteed between
/// inbound requests of the same originating [`Behaviour`].
-#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
+#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct InboundRequestId(u64);
impl fmt::Display for InboundRequestId {
@@ -287,7 +287,7 @@ impl fmt::Display for InboundRequestId {
///
/// Note: [`OutboundRequestId`]'s uniqueness is only guaranteed between
/// outbound requests of the same originating [`Behaviour`].
-#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
+#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct OutboundRequestId(u64);
impl fmt::Display for OutboundRequestId {
diff --git a/protocols/upnp/Cargo.toml b/protocols/upnp/Cargo.toml
index f00c80aabb3..2118dd4a728 100644
--- a/protocols/upnp/Cargo.toml
+++ b/protocols/upnp/Cargo.toml
@@ -11,12 +11,12 @@ categories = ["network-programming", "asynchronous"]
publish = true
[dependencies]
-futures = "0.3.29"
+futures = "0.3.30"
futures-timer = "3.0.2"
igd-next = "0.14.2"
libp2p-core = { workspace = true }
libp2p-swarm = { workspace = true }
-tokio = { version = "1.34", default-features = false, features = ["rt"], optional = true }
+tokio = { version = "1.35", default-features = false, features = ["rt"], optional = true }
tracing = "0.1.37"
void = "1.0.2"
diff --git a/swarm-derive/CHANGELOG.md b/swarm-derive/CHANGELOG.md
index 08adba00cdb..74f35806eec 100644
--- a/swarm-derive/CHANGELOG.md
+++ b/swarm-derive/CHANGELOG.md
@@ -1,3 +1,13 @@
+## 0.34.2
+
+- Restore support for generic constraints on behaviours combined with `out_event` generated by `NetworkBehaviour` where no where clause is used.
+ See [PR 5003](https://github.com/libp2p/rust-libp2p/pull/5003).
+
+## 0.34.1
+
+- Always forward all variants of `FromSwarm`.
+ See [PR 4825](https://github.com/libp2p/rust-libp2p/pull/4825).
+
## 0.34.0
- Adapt to interface changes in `libp2p-swarm`.
diff --git a/swarm-derive/Cargo.toml b/swarm-derive/Cargo.toml
index 11cc4b6a12a..7740d57feb1 100644
--- a/swarm-derive/Cargo.toml
+++ b/swarm-derive/Cargo.toml
@@ -3,7 +3,7 @@ name = "libp2p-swarm-derive"
edition = "2021"
rust-version = { workspace = true }
description = "Procedural macros of libp2p-swarm"
-version = "0.34.0"
+version = "0.34.2"
authors = ["Parity Technologies "]
license = "MIT"
repository = "https://github.com/libp2p/rust-libp2p"
@@ -16,7 +16,7 @@ proc-macro = true
[dependencies]
heck = "0.4"
quote = "1.0"
-syn = { version = "2.0.39", default-features = false, features = ["clone-impls", "derive", "parsing", "printing", "proc-macro"] }
+syn = { version = "2.0.43", default-features = false, features = ["clone-impls", "derive", "parsing", "printing", "proc-macro"] }
proc-macro2 = "1.0"
# Passing arguments to the docsrs builder in order to properly document cfg's.
diff --git a/swarm-derive/src/lib.rs b/swarm-derive/src/lib.rs
index 514975390b0..2e7daf7acc4 100644
--- a/swarm-derive/src/lib.rs
+++ b/swarm-derive/src/lib.rs
@@ -71,19 +71,6 @@ fn build_struct(ast: &DeriveInput, data_struct: &DataStruct) -> syn::Result syn::Result syn::Result quote! {
- self.#i.on_swarm_event(#from_swarm::ConnectionEstablished(#connection_established {
- peer_id,
- connection_id,
- endpoint,
- failed_addresses,
- other_established,
- }));
+ self.#i.on_swarm_event(event);
},
None => quote! {
- self.#field_n.on_swarm_event(#from_swarm::ConnectionEstablished(#connection_established {
- peer_id,
- connection_id,
- endpoint,
- failed_addresses,
- other_established,
- }));
- },
- })
- };
-
- // Build the list of statements to put in the body of `on_swarm_event()`
- // for the `FromSwarm::AddressChange variant`.
- let on_address_change_stmts = {
- data_struct
- .fields
- .iter()
- .enumerate()
- .map(|(field_n, field)| match field.ident {
- Some(ref i) => quote! {
- self.#i.on_swarm_event(#from_swarm::AddressChange(#address_change {
- peer_id,
- connection_id,
- old,
- new,
- }));
- },
- None => quote! {
- self.#field_n.on_swarm_event(#from_swarm::AddressChange(#address_change {
- peer_id,
- connection_id,
- old,
- new,
- }));
- },
- })
- };
-
- // Build the list of statements to put in the body of `on_swarm_event()`
- // for the `FromSwarm::ConnectionClosed` variant.
- let on_connection_closed_stmts = {
- data_struct
- .fields
- .iter()
- .rev()
- .enumerate()
- .map(|(enum_n, field)| {
- let inject = match field.ident {
- Some(ref i) => quote! {
- self.#i.on_swarm_event(#from_swarm::ConnectionClosed(#connection_closed {
- peer_id,
- connection_id,
- endpoint,
- remaining_established,
- }));
- },
- None => quote! {
- self.#enum_n.on_swarm_event(#from_swarm::ConnectionClosed(#connection_closed {
- peer_id,
- connection_id,
- endpoint,
- remaining_established,
- }));
- },
- };
-
- quote! {
- #inject;
- }
- })
- };
-
- // Build the list of statements to put in the body of `on_swarm_event()`
- // for the `FromSwarm::DialFailure` variant.
- let on_dial_failure_stmts = data_struct
- .fields
- .iter()
- .enumerate()
- .map(|(enum_n, field)| match field.ident {
- Some(ref i) => quote! {
- self.#i.on_swarm_event(#from_swarm::DialFailure(#dial_failure {
- peer_id,
- connection_id,
- error,
- }));
- },
- None => quote! {
- self.#enum_n.on_swarm_event(#from_swarm::DialFailure(#dial_failure {
- peer_id,
- connection_id,
- error,
- }));
- },
- });
-
- // Build the list of statements to put in the body of `on_swarm_event()`
- // for the `FromSwarm::ListenFailure` variant.
- let on_listen_failure_stmts = data_struct
- .fields
- .iter()
- .enumerate()
- .map(|(enum_n, field)| match field.ident {
- Some(ref i) => quote! {
- self.#i.on_swarm_event(#from_swarm::ListenFailure(#listen_failure {
- local_addr,
- send_back_addr,
- connection_id,
- error
- }));
- },
- None => quote! {
- self.#enum_n.on_swarm_event(#from_swarm::ListenFailure(#listen_failure {
- local_addr,
- send_back_addr,
- connection_id,
- error
- }));
- },
- });
-
- // Build the list of statements to put in the body of `on_swarm_event()`
- // for the `FromSwarm::NewListener` variant.
- let on_new_listener_stmts = {
- data_struct
- .fields
- .iter()
- .enumerate()
- .map(|(field_n, field)| match field.ident {
- Some(ref i) => quote! {
- self.#i.on_swarm_event(#from_swarm::NewListener(#new_listener {
- listener_id,
- }));
- },
- None => quote! {
- self.#field_n.on_swarm_event(#from_swarm::NewListener(#new_listener {
- listener_id,
- }));
- },
- })
- };
-
- // Build the list of statements to put in the body of `on_swarm_event()`
- // for the `FromSwarm::NewListenAddr` variant.
- let on_new_listen_addr_stmts = {
- data_struct
- .fields
- .iter()
- .enumerate()
- .map(|(field_n, field)| match field.ident {
- Some(ref i) => quote! {
- self.#i.on_swarm_event(#from_swarm::NewListenAddr(#new_listen_addr {
- listener_id,
- addr,
- }));
- },
- None => quote! {
- self.#field_n.on_swarm_event(#from_swarm::NewListenAddr(#new_listen_addr {
- listener_id,
- addr,
- }));
- },
- })
- };
-
- // Build the list of statements to put in the body of `on_swarm_event()`
- // for the `FromSwarm::ExpiredListenAddr` variant.
- let on_expired_listen_addr_stmts = {
- data_struct
- .fields
- .iter()
- .enumerate()
- .map(|(field_n, field)| match field.ident {
- Some(ref i) => quote! {
- self.#i.on_swarm_event(#from_swarm::ExpiredListenAddr(#expired_listen_addr {
- listener_id,
- addr,
- }));
- },
- None => quote! {
- self.#field_n.on_swarm_event(#from_swarm::ExpiredListenAddr(#expired_listen_addr {
- listener_id,
- addr,
- }));
- },
- })
- };
-
- // Build the list of statements to put in the body of `on_swarm_event()`
- // for the `FromSwarm::NewExternalAddr` variant.
- let on_new_external_addr_candidate_stmts = {
- data_struct
- .fields
- .iter()
- .enumerate()
- .map(|(field_n, field)| match field.ident {
- Some(ref i) => quote! {
- self.#i.on_swarm_event(#from_swarm::NewExternalAddrCandidate(#new_external_addr_candidate {
- addr,
- }));
- },
- None => quote! {
- self.#field_n.on_swarm_event(#from_swarm::NewExternalAddrCandidate(#new_external_addr_candidate {
- addr,
- }));
- },
- })
- };
-
- // Build the list of statements to put in the body of `on_swarm_event()`
- // for the `FromSwarm::ExternalAddrExpired` variant.
- let on_external_addr_expired_stmts = {
- data_struct
- .fields
- .iter()
- .enumerate()
- .map(|(field_n, field)| match field.ident {
- Some(ref i) => quote! {
- self.#i.on_swarm_event(#from_swarm::ExternalAddrExpired(#external_addr_expired {
- addr,
- }));
- },
- None => quote! {
- self.#field_n.on_swarm_event(#from_swarm::ExternalAddrExpired(#external_addr_expired {
- addr,
- }));
- },
- })
- };
-
- // Build the list of statements to put in the body of `on_swarm_event()`
- // for the `FromSwarm::ExternalAddrConfirmed` variant.
- let on_external_addr_confirmed_stmts = {
- data_struct
- .fields
- .iter()
- .enumerate()
- .map(|(field_n, field)| match field.ident {
- Some(ref i) => quote! {
- self.#i.on_swarm_event(#from_swarm::ExternalAddrConfirmed(#external_addr_confirmed {
- addr,
- }));
- },
- None => quote! {
- self.#field_n.on_swarm_event(#from_swarm::ExternalAddrConfirmed(#external_addr_confirmed {
- addr,
- }));
- },
- })
- };
-
- // Build the list of statements to put in the body of `on_swarm_event()`
- // for the `FromSwarm::ListenerError` variant.
- let on_listener_error_stmts = {
- data_struct
- .fields
- .iter()
- .enumerate()
- .map(|(field_n, field)| match field.ident {
- Some(ref i) => quote! {
- self.#i.on_swarm_event(#from_swarm::ListenerError(#listener_error {
- listener_id,
- err,
- }));
- },
- None => quote! {
- self.#field_n.on_swarm_event(#from_swarm::ListenerError(#listener_error {
- listener_id,
- err,
- }));
- },
- })
- };
-
- // Build the list of statements to put in the body of `on_swarm_event()`
- // for the `FromSwarm::ListenerClosed` variant.
- let on_listener_closed_stmts = {
- data_struct
- .fields
- .iter()
- .enumerate()
- .map(|(field_n, field)| match field.ident {
- Some(ref i) => quote! {
- self.#i.on_swarm_event(#from_swarm::ListenerClosed(#listener_closed {
- listener_id,
- reason,
- }));
- },
- None => quote! {
- self.#field_n.on_swarm_event(#from_swarm::ListenerClosed(#listener_closed {
- listener_id,
- reason,
- }));
+ self.#field_n.on_swarm_event(event);
},
})
};
@@ -792,48 +481,7 @@ fn build_struct(ast: &DeriveInput, data_struct: &DataStruct) -> syn::Result { #(#on_connection_established_stmts)* }
- #from_swarm::AddressChange(
- #address_change { peer_id, connection_id, old, new })
- => { #(#on_address_change_stmts)* }
- #from_swarm::ConnectionClosed(
- #connection_closed { peer_id, connection_id, endpoint, remaining_established })
- => { #(#on_connection_closed_stmts)* }
- #from_swarm::DialFailure(
- #dial_failure { peer_id, connection_id, error })
- => { #(#on_dial_failure_stmts)* }
- #from_swarm::ListenFailure(
- #listen_failure { local_addr, send_back_addr, connection_id, error })
- => { #(#on_listen_failure_stmts)* }
- #from_swarm::NewListener(
- #new_listener { listener_id })
- => { #(#on_new_listener_stmts)* }
- #from_swarm::NewListenAddr(
- #new_listen_addr { listener_id, addr })
- => { #(#on_new_listen_addr_stmts)* }
- #from_swarm::ExpiredListenAddr(
- #expired_listen_addr { listener_id, addr })
- => { #(#on_expired_listen_addr_stmts)* }
- #from_swarm::NewExternalAddrCandidate(
- #new_external_addr_candidate { addr })
- => { #(#on_new_external_addr_candidate_stmts)* }
- #from_swarm::ExternalAddrExpired(
- #external_addr_expired { addr })
- => { #(#on_external_addr_expired_stmts)* }
- #from_swarm::ExternalAddrConfirmed(
- #external_addr_confirmed { addr })
- => { #(#on_external_addr_confirmed_stmts)* }
- #from_swarm::ListenerError(
- #listener_error { listener_id, err })
- => { #(#on_listener_error_stmts)* }
- #from_swarm::ListenerClosed(
- #listener_closed { listener_id, reason })
- => { #(#on_listener_closed_stmts)* }
- _ => {}
- }
+ #(#on_swarm_event_stmts)*
}
}
};
diff --git a/swarm-test/Cargo.toml b/swarm-test/Cargo.toml
index 12f8be2a1d8..ca66e115746 100644
--- a/swarm-test/Cargo.toml
+++ b/swarm-test/Cargo.toml
@@ -12,14 +12,14 @@ categories = ["network-programming", "asynchronous"]
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
-async-trait = "0.1.74"
+async-trait = "0.1.77"
libp2p-core = { workspace = true }
libp2p-identity = { workspace = true, features = ["rand"] }
libp2p-plaintext = { workspace = true }
libp2p-swarm = { workspace = true, features = ["async-std"] }
libp2p-tcp = { workspace = true, features = ["async-io"] }
libp2p-yamux = { workspace = true }
-futures = "0.3.29"
+futures = "0.3.30"
rand = "0.8.5"
tracing = "0.1.37"
futures-timer = "3.0.2"
diff --git a/swarm/CHANGELOG.md b/swarm/CHANGELOG.md
index 48cafee6ced..26022508d49 100644
--- a/swarm/CHANGELOG.md
+++ b/swarm/CHANGELOG.md
@@ -1,3 +1,11 @@
+## 0.44.1
+
+- Add `PeerId` to `ListenFailure`
+
+- Implement `Clone` & `Copy` for `FromSwarm.
+ This makes it easier to forward these events when wrapping other behaviours.
+ See [PR 4825](https://github.com/libp2p/rust-libp2p/pull/4825).
+
## 0.44.0
- Add `#[non_exhaustive]` to `FromSwarm`, `ToSwarm`, `SwarmEvent`, `ConnectionHandlerEvent`, `ConnectionEvent`.
diff --git a/swarm/Cargo.toml b/swarm/Cargo.toml
index 3b706df6d2b..7c329ea6cce 100644
--- a/swarm/Cargo.toml
+++ b/swarm/Cargo.toml
@@ -3,7 +3,7 @@ name = "libp2p-swarm"
edition = "2021"
rust-version = { workspace = true }
description = "The libp2p swarm"
-version = "0.44.0"
+version = "0.44.1"
authors = ["Parity Technologies "]
license = "MIT"
repository = "https://github.com/libp2p/rust-libp2p"
@@ -13,7 +13,7 @@ categories = ["network-programming", "asynchronous"]
[dependencies]
either = "1.9.0"
fnv = "1.0"
-futures = "0.3.29"
+futures = "0.3.30"
futures-timer = "3.0.2"
getrandom = { version = "0.2.11", features = ["js"], optional = true } # Explicit dependency to be used in `wasm-bindgen` feature
instant = "0.1.12"
@@ -21,16 +21,16 @@ libp2p-core = { workspace = true }
libp2p-identity = { workspace = true }
libp2p-swarm-derive = { workspace = true, optional = true }
multistream-select = { workspace = true }
-once_cell = "1.18.0"
+once_cell = "1.19.0"
rand = "0.8"
smallvec = "1.11.2"
tracing = "0.1.37"
void = "1"
-wasm-bindgen-futures = { version = "0.4.38", optional = true }
+wasm-bindgen-futures = { version = "0.4.39", optional = true }
[target.'cfg(not(any(target_os = "emscripten", target_os = "wasi", target_os = "unknown")))'.dependencies]
async-std = { version = "1.6.2", optional = true }
-tokio = { version = "1.34", features = ["rt"], optional = true }
+tokio = { version = "1.35", features = ["rt"], optional = true }
[features]
macros = ["dep:libp2p-swarm-derive"]
@@ -41,7 +41,7 @@ wasm-bindgen = ["dep:wasm-bindgen-futures", "dep:getrandom"]
[dev-dependencies]
async-std = { version = "1.6.2", features = ["attributes"] }
either = "1.9.0"
-futures = "0.3.29"
+futures = "0.3.30"
libp2p-identify = { path = "../protocols/identify" } # Using `path` here because this is a cyclic dev-dependency which otherwise breaks releasing.
libp2p-identity = { workspace = true, features = ["ed25519"] }
libp2p-kad = { path = "../protocols/kad" } # Using `path` here because this is a cyclic dev-dependency which otherwise breaks releasing.
@@ -52,9 +52,9 @@ libp2p-swarm-test = { path = "../swarm-test" } # Using `pat
libp2p-yamux = { path = "../muxers/yamux" } # Using `path` here because this is a cyclic dev-dependency which otherwise breaks releasing.
quickcheck = { workspace = true }
void = "1"
-once_cell = "1.18.0"
-trybuild = "1.0.85"
-tokio = { version = "1.34.0", features = ["time", "rt", "macros", "rt-multi-thread"] }
+once_cell = "1.19.0"
+trybuild = "1.0.89"
+tokio = { version = "1.35.1", features = ["time", "rt", "macros", "rt-multi-thread"] }
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
[[test]]
diff --git a/swarm/src/behaviour.rs b/swarm/src/behaviour.rs
index c25b14e75e3..d3f3b491950 100644
--- a/swarm/src/behaviour.rs
+++ b/swarm/src/behaviour.rs
@@ -267,7 +267,7 @@ pub enum ToSwarm {
/// The emphasis on a **new** candidate is important.
/// Protocols MUST take care to only emit a candidate once per "source".
/// For example, the observed address of a TCP connection does not change throughout its lifetime.
- /// Thus, only one candidate should be emitted per connection.
+ /// Thus, only one candidate should be emitted per connection.
///
/// This makes the report frequency of an address a meaningful data-point for consumers of this event.
/// This address will be shared with all [`NetworkBehaviour`]s via [`FromSwarm::NewExternalAddrCandidate`].
@@ -391,7 +391,7 @@ pub enum CloseConnection {
/// Enumeration with the list of the possible events
/// to pass to [`on_swarm_event`](NetworkBehaviour::on_swarm_event).
-#[derive(Debug)]
+#[derive(Debug, Clone, Copy)]
#[non_exhaustive]
pub enum FromSwarm<'a> {
/// Informs the behaviour about a newly established connection to a peer.
@@ -449,7 +449,7 @@ pub struct ConnectionEstablished<'a> {
/// This event is always paired with an earlier
/// [`FromSwarm::ConnectionEstablished`] with the same peer ID, connection ID
/// and endpoint.
-#[derive(Debug)]
+#[derive(Debug, Clone, Copy)]
pub struct ConnectionClosed<'a> {
pub peer_id: PeerId,
pub connection_id: ConnectionId,
@@ -487,6 +487,7 @@ pub struct ListenFailure<'a> {
pub send_back_addr: &'a Multiaddr,
pub error: &'a ListenError,
pub connection_id: ConnectionId,
+ pub peer_id: Option,
}
/// [`FromSwarm`] variant that informs the behaviour that a new listener was created.
diff --git a/swarm/src/lib.rs b/swarm/src/lib.rs
index 0354f39cfdc..d673e41170e 100644
--- a/swarm/src/lib.rs
+++ b/swarm/src/lib.rs
@@ -741,6 +741,7 @@ where
send_back_addr: &send_back_addr,
error: &listen_error,
connection_id: id,
+ peer_id: Some(peer_id),
},
));
@@ -854,6 +855,7 @@ where
send_back_addr: &send_back_addr,
error: &error,
connection_id: id,
+ peer_id: None,
}));
self.pending_swarm_events
.push_back(SwarmEvent::IncomingConnectionError {
@@ -957,6 +959,7 @@ where
send_back_addr: &send_back_addr,
error: &listen_error,
connection_id,
+ peer_id: None,
}));
self.pending_swarm_events
diff --git a/swarm/src/test.rs b/swarm/src/test.rs
index 4f6adfc37b0..547277550bb 100644
--- a/swarm/src/test.rs
+++ b/swarm/src/test.rs
@@ -437,6 +437,8 @@ where
}
fn on_swarm_event(&mut self, event: FromSwarm) {
+ self.inner.on_swarm_event(event);
+
match event {
FromSwarm::ConnectionEstablished(connection_established) => {
self.on_connection_established(connection_established)
@@ -444,68 +446,33 @@ where
FromSwarm::ConnectionClosed(connection_closed) => {
self.on_connection_closed(connection_closed)
}
- FromSwarm::DialFailure(DialFailure {
- peer_id,
- connection_id,
- error,
- }) => {
+ FromSwarm::DialFailure(DialFailure { peer_id, .. }) => {
self.on_dial_failure.push(peer_id);
- self.inner
- .on_swarm_event(FromSwarm::DialFailure(DialFailure {
- peer_id,
- connection_id,
- error,
- }));
}
FromSwarm::NewListener(NewListener { listener_id }) => {
self.on_new_listener.push(listener_id);
- self.inner
- .on_swarm_event(FromSwarm::NewListener(NewListener { listener_id }));
}
FromSwarm::NewListenAddr(NewListenAddr { listener_id, addr }) => {
self.on_new_listen_addr.push((listener_id, addr.clone()));
- self.inner
- .on_swarm_event(FromSwarm::NewListenAddr(NewListenAddr {
- listener_id,
- addr,
- }));
}
FromSwarm::ExpiredListenAddr(ExpiredListenAddr { listener_id, addr }) => {
self.on_expired_listen_addr
.push((listener_id, addr.clone()));
- self.inner
- .on_swarm_event(FromSwarm::ExpiredListenAddr(ExpiredListenAddr {
- listener_id,
- addr,
- }));
}
FromSwarm::NewExternalAddrCandidate(NewExternalAddrCandidate { addr }) => {
self.on_new_external_addr.push(addr.clone());
- self.inner
- .on_swarm_event(FromSwarm::NewExternalAddrCandidate(
- NewExternalAddrCandidate { addr },
- ));
}
FromSwarm::ExternalAddrExpired(ExternalAddrExpired { addr }) => {
self.on_expired_external_addr.push(addr.clone());
- self.inner
- .on_swarm_event(FromSwarm::ExternalAddrExpired(ExternalAddrExpired { addr }));
}
- FromSwarm::ListenerError(ListenerError { listener_id, err }) => {
+ FromSwarm::ListenerError(ListenerError { listener_id, .. }) => {
self.on_listener_error.push(listener_id);
- self.inner
- .on_swarm_event(FromSwarm::ListenerError(ListenerError { listener_id, err }));
}
FromSwarm::ListenerClosed(ListenerClosed {
listener_id,
reason,
}) => {
self.on_listener_closed.push((listener_id, reason.is_ok()));
- self.inner
- .on_swarm_event(FromSwarm::ListenerClosed(ListenerClosed {
- listener_id,
- reason,
- }));
}
_ => {}
}
diff --git a/swarm/tests/swarm_derive.rs b/swarm/tests/swarm_derive.rs
index 3337cb7b137..707abb03d6e 100644
--- a/swarm/tests/swarm_derive.rs
+++ b/swarm/tests/swarm_derive.rs
@@ -371,6 +371,91 @@ fn with_generics_mixed() {
}
}
+#[test]
+fn with_generics_constrained() {
+ use std::task::{Context, Poll};
+ trait Mark {}
+ struct Marked;
+ impl Mark for Marked {}
+
+ /// A struct with a generic constraint, for which we manually implement `NetworkBehaviour`.
+ #[allow(dead_code)]
+ struct Bar {
+ a: A,
+ }
+
+ impl NetworkBehaviour for Bar {
+ type ConnectionHandler = dummy::ConnectionHandler;
+ type ToSwarm = void::Void;
+
+ fn handle_established_inbound_connection(
+ &mut self,
+ _: libp2p_swarm::ConnectionId,
+ _: libp2p_identity::PeerId,
+ _: &Multiaddr,
+ _: &Multiaddr,
+ ) -> Result, ConnectionDenied> {
+ Ok(dummy::ConnectionHandler)
+ }
+
+ fn handle_established_outbound_connection(
+ &mut self,
+ _: libp2p_swarm::ConnectionId,
+ _: libp2p_identity::PeerId,
+ _: &Multiaddr,
+ _: Endpoint,
+ ) -> Result, ConnectionDenied> {
+ Ok(dummy::ConnectionHandler)
+ }
+
+ fn on_swarm_event(&mut self, _event: FromSwarm) {}
+
+ fn on_connection_handler_event(
+ &mut self,
+ _: libp2p_identity::PeerId,
+ _: libp2p_swarm::ConnectionId,
+ _: THandlerOutEvent,
+ ) {
+ }
+
+ fn poll(
+ &mut self,
+ _: &mut Context<'_>,
+ ) -> Poll>> {
+ Poll::Pending
+ }
+ }
+
+ /// A struct which uses the above, inheriting the generic constraint,
+ /// for which we want to derive the `NetworkBehaviour`.
+ #[allow(dead_code)]
+ #[derive(NetworkBehaviour)]
+ #[behaviour(prelude = "libp2p_swarm::derive_prelude")]
+ struct Foo1 {
+ bar: Bar,
+ }
+
+ /// A struct which uses the above, inheriting the generic constraint,
+ /// for which we want to derive the `NetworkBehaviour`.
+ ///
+ /// Using a where clause instead of inline constraint.
+ #[allow(dead_code)]
+ #[derive(NetworkBehaviour)]
+ #[behaviour(prelude = "libp2p_swarm::derive_prelude")]
+ struct Foo2
+ where
+ A: Mark,
+ {
+ bar: Bar,
+ }
+
+ #[allow(dead_code)]
+ fn foo() {
+ require_net_behaviour::>();
+ require_net_behaviour::>();
+ }
+}
+
#[test]
fn custom_event_with_either() {
use either::Either;
diff --git a/transports/dns/Cargo.toml b/transports/dns/Cargo.toml
index f1946af7c0e..d2a85ac1f16 100644
--- a/transports/dns/Cargo.toml
+++ b/transports/dns/Cargo.toml
@@ -12,8 +12,8 @@ categories = ["network-programming", "asynchronous"]
[dependencies]
async-std-resolver = { version = "0.24", optional = true }
-async-trait = "0.1.74"
-futures = "0.3.28"
+async-trait = "0.1.77"
+futures = "0.3.30"
libp2p-core = { workspace = true }
libp2p-identity = { workspace = true }
parking_lot = "0.12.0"
diff --git a/transports/dns/src/lib.rs b/transports/dns/src/lib.rs
index 0c41990fab1..be847e568ed 100644
--- a/transports/dns/src/lib.rs
+++ b/transports/dns/src/lib.rs
@@ -277,7 +277,7 @@ where
let resolver = self.resolver.clone();
let inner = self.inner.clone();
- // Asynchronlously resolve all DNS names in the address before proceeding
+ // Asynchronously resolve all DNS names in the address before proceeding
// with dialing on the underlying transport.
Ok(async move {
let mut last_err = None;
@@ -416,6 +416,7 @@ pub enum Error {
/// The underlying transport encountered an error.
Transport(TErr),
/// DNS resolution failed.
+ #[allow(clippy::enum_variant_names)]
ResolveError(ResolveError),
/// DNS resolution was successful, but the underlying transport refused the resolved address.
MultiaddrNotSupported(Multiaddr),
diff --git a/transports/noise/Cargo.toml b/transports/noise/Cargo.toml
index 772b74c7acb..4621a5112ab 100644
--- a/transports/noise/Cargo.toml
+++ b/transports/noise/Cargo.toml
@@ -12,17 +12,17 @@ repository = "https://github.com/libp2p/rust-libp2p"
asynchronous-codec = { workspace = true }
bytes = "1"
curve25519-dalek = "4.1.1"
-futures = "0.3.29"
+futures = "0.3.30"
libp2p-core = { workspace = true }
libp2p-identity = { workspace = true, features = ["ed25519"] }
multiaddr = { workspace = true }
multihash = { workspace = true }
-once_cell = "1.18.0"
+once_cell = "1.19.0"
quick-protobuf = "0.8"
rand = "0.8.3"
sha2 = "0.10.8"
static_assertions = "1"
-thiserror = "1.0.50"
+thiserror = "1.0.56"
tracing = "0.1.37"
x25519-dalek = "2"
zeroize = "1"
diff --git a/transports/noise/src/lib.rs b/transports/noise/src/lib.rs
index 70fae9d7ee6..2557e76e276 100644
--- a/transports/noise/src/lib.rs
+++ b/transports/noise/src/lib.rs
@@ -240,6 +240,7 @@ pub enum Error {
#[error("failed to decode protobuf ")]
InvalidPayload(#[from] DecodeError),
#[error(transparent)]
+ #[allow(clippy::enum_variant_names)]
SigningError(#[from] libp2p_identity::SigningError),
#[error("Expected WebTransport certhashes ({}) are not a subset of received ones ({})", certhashes_to_string(.0), certhashes_to_string(.1))]
UnknownWebTransportCerthashes(HashSet>, HashSet>),
diff --git a/transports/noise/tests/smoke.rs b/transports/noise/tests/smoke.rs
index 0afebc0cbea..7100e7c7a8d 100644
--- a/transports/noise/tests/smoke.rs
+++ b/transports/noise/tests/smoke.rs
@@ -30,7 +30,7 @@ use tracing_subscriber::EnvFilter;
#[allow(dead_code)]
fn core_upgrade_compat() {
- // Tests API compaibility with the libp2p-core upgrade API,
+ // Tests API compatibility with the libp2p-core upgrade API,
// i.e. if it compiles, the "test" is considered a success.
let id_keys = identity::Keypair::generate_ed25519();
let noise = noise::Config::new(&id_keys).unwrap();
diff --git a/transports/plaintext/Cargo.toml b/transports/plaintext/Cargo.toml
index 96cb83c7d69..e3f1e280851 100644
--- a/transports/plaintext/Cargo.toml
+++ b/transports/plaintext/Cargo.toml
@@ -13,7 +13,7 @@ categories = ["network-programming", "asynchronous"]
[dependencies]
asynchronous-codec = { workspace = true }
bytes = "1"
-futures = "0.3.29"
+futures = "0.3.30"
libp2p-core = { workspace = true }
libp2p-identity = { workspace = true }
quick-protobuf = "0.8"
diff --git a/transports/pnet/CHANGELOG.md b/transports/pnet/CHANGELOG.md
index e6c3d1974dc..1fbc2d08807 100644
--- a/transports/pnet/CHANGELOG.md
+++ b/transports/pnet/CHANGELOG.md
@@ -3,7 +3,7 @@
## 0.23.1
-