From e1955a8a5a99f63f2e7721563085c15a4074de44 Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Thu, 3 Oct 2024 12:50:34 -0700
Subject: [PATCH 001/499] chore: boxo v0.24.0 and go-libp2p v0.36.4 (#10531)
* Upgrade to Boxo v0.24.0
* Update to boxo release v0.24.0
---
docs/examples/kubo-as-a-library/go.mod | 6 +++---
docs/examples/kubo-as-a-library/go.sum | 12 ++++++------
go.mod | 6 +++---
go.sum | 12 ++++++------
test/dependencies/go.mod | 6 +++---
test/dependencies/go.sum | 21 ++++++---------------
6 files changed, 27 insertions(+), 36 deletions(-)
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index 7478ae14d..9cdd51319 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -7,9 +7,9 @@ go 1.22
replace github.com/ipfs/kubo => ./../../..
require (
- github.com/ipfs/boxo v0.23.1-0.20240927234853-19a402b7dc34
+ github.com/ipfs/boxo v0.24.0
github.com/ipfs/kubo v0.0.0-00010101000000-000000000000
- github.com/libp2p/go-libp2p v0.36.3
+ github.com/libp2p/go-libp2p v0.36.4
github.com/multiformats/go-multiaddr v0.13.0
)
@@ -131,7 +131,7 @@ require (
github.com/mr-tron/base58 v1.2.0 // indirect
github.com/multiformats/go-base32 v0.1.0 // indirect
github.com/multiformats/go-base36 v0.2.0 // indirect
- github.com/multiformats/go-multiaddr-dns v0.3.1 // indirect
+ github.com/multiformats/go-multiaddr-dns v0.4.0 // indirect
github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect
github.com/multiformats/go-multibase v0.2.0 // indirect
github.com/multiformats/go-multicodec v0.9.0 // indirect
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index fff159908..387634d3a 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -266,8 +266,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.13.2-0.20231027223058-cde3b5ba964c h1:7Uy
github.com/ipfs-shipyard/nopfs/ipfs v0.13.2-0.20231027223058-cde3b5ba964c/go.mod h1:6EekK/jo+TynwSE/ZOiOJd4eEvRXoavEC3vquKtv4yI=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.23.1-0.20240927234853-19a402b7dc34 h1:/Etgc4IR0OUF+nIoNdqwu12EYuaSMpd7/Nc5wRLd67U=
-github.com/ipfs/boxo v0.23.1-0.20240927234853-19a402b7dc34/go.mod h1:ulu5I6avTmgGmvjuCaBRKwsaOOKjBfQw1EiOOQp8M6E=
+github.com/ipfs/boxo v0.24.0 h1:D9gTU3QdxyjPMlJ6QfqhHTG3TIJPplKzjXLO2J30h9U=
+github.com/ipfs/boxo v0.24.0/go.mod h1:iP7xUPpHq2QAmVAjwtQvsNBTxTwLpFuy6ZpiRFwmzDA=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-bitswap v0.11.0 h1:j1WVvhDX1yhG32NTC9xfxnqycqYIlhzEzLXG/cU1HyQ=
@@ -427,8 +427,8 @@ github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZ
github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs=
github.com/libp2p/go-flow-metrics v0.1.0 h1:0iPhMI8PskQwzh57jB9WxIuIOQ0r+15PChFGkx3Q3WM=
github.com/libp2p/go-flow-metrics v0.1.0/go.mod h1:4Xi8MX8wj5aWNDAZttg6UPmc0ZrnFNsMtpsYUClFtro=
-github.com/libp2p/go-libp2p v0.36.3 h1:NHz30+G7D8Y8YmznrVZZla0ofVANrvBl2c+oARfMeDQ=
-github.com/libp2p/go-libp2p v0.36.3/go.mod h1:4Y5vFyCUiJuluEPmpnKYf6WFx5ViKPUYs/ixe9ANFZ8=
+github.com/libp2p/go-libp2p v0.36.4 h1:ZaKyKSHBFbzs6CnAYMhaMc5QgV1UoCN+9WXrg8SEwI4=
+github.com/libp2p/go-libp2p v0.36.4/go.mod h1:4Y5vFyCUiJuluEPmpnKYf6WFx5ViKPUYs/ixe9ANFZ8=
github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94=
github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8=
github.com/libp2p/go-libp2p-core v0.2.4/go.mod h1:STh4fdfa5vDYr0/SzYYeqnt+E6KfEV5VxfIrm0bcI0g=
@@ -522,8 +522,8 @@ github.com/multiformats/go-multiaddr v0.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y9
github.com/multiformats/go-multiaddr v0.13.0 h1:BCBzs61E3AGHcYYTv8dqRH43ZfyrqM8RXVPT8t13tLQ=
github.com/multiformats/go-multiaddr v0.13.0/go.mod h1:sBXrNzucqkFJhvKOiwwLyqamGa/P5EIXNPLovyhQCII=
github.com/multiformats/go-multiaddr-dns v0.3.0/go.mod h1:mNzQ4eTGDg0ll1N9jKPOUogZPoJ30W8a7zk66FQPpdQ=
-github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A=
-github.com/multiformats/go-multiaddr-dns v0.3.1/go.mod h1:G/245BRQ6FJGmryJCrOuTdB37AMA5AMOVuO6NY3JwTk=
+github.com/multiformats/go-multiaddr-dns v0.4.0 h1:P76EJ3qzBXpUXZ3twdCDx/kvagMsNo0LMFXpyms/zgU=
+github.com/multiformats/go-multiaddr-dns v0.4.0/go.mod h1:7hfthtB4E4pQwirrz+J0CcDUfbWzTqEzVyYKKIKpgkc=
github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E=
github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo=
github.com/multiformats/go-multiaddr-net v0.1.1/go.mod h1:5JNbcfBOP4dnhoZOv10JJVkJO0pCCEf8mTnipAo2UZQ=
diff --git a/go.mod b/go.mod
index e188c1968..db6a05c0c 100644
--- a/go.mod
+++ b/go.mod
@@ -18,7 +18,7 @@ require (
github.com/hashicorp/go-version v1.6.0
github.com/ipfs-shipyard/nopfs v0.0.12
github.com/ipfs-shipyard/nopfs/ipfs v0.13.2-0.20231027223058-cde3b5ba964c
- github.com/ipfs/boxo v0.23.1-0.20240927234853-19a402b7dc34
+ github.com/ipfs/boxo v0.24.0
github.com/ipfs/go-block-format v0.2.0
github.com/ipfs/go-cid v0.4.1
github.com/ipfs/go-cidutil v0.1.0
@@ -48,7 +48,7 @@ require (
github.com/jbenet/goprocess v0.1.4
github.com/julienschmidt/httprouter v1.3.0
github.com/libp2p/go-doh-resolver v0.4.0
- github.com/libp2p/go-libp2p v0.36.3
+ github.com/libp2p/go-libp2p v0.36.4
github.com/libp2p/go-libp2p-http v0.5.0
github.com/libp2p/go-libp2p-kad-dht v0.26.1
github.com/libp2p/go-libp2p-kbucket v0.6.3
@@ -60,7 +60,7 @@ require (
github.com/libp2p/go-socket-activation v0.1.0
github.com/mitchellh/go-homedir v1.1.0
github.com/multiformats/go-multiaddr v0.13.0
- github.com/multiformats/go-multiaddr-dns v0.3.1
+ github.com/multiformats/go-multiaddr-dns v0.4.0
github.com/multiformats/go-multibase v0.2.0
github.com/multiformats/go-multicodec v0.9.0
github.com/multiformats/go-multihash v0.2.3
diff --git a/go.sum b/go.sum
index 246eef96b..4453c254d 100644
--- a/go.sum
+++ b/go.sum
@@ -330,8 +330,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.13.2-0.20231027223058-cde3b5ba964c h1:7Uy
github.com/ipfs-shipyard/nopfs/ipfs v0.13.2-0.20231027223058-cde3b5ba964c/go.mod h1:6EekK/jo+TynwSE/ZOiOJd4eEvRXoavEC3vquKtv4yI=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.23.1-0.20240927234853-19a402b7dc34 h1:/Etgc4IR0OUF+nIoNdqwu12EYuaSMpd7/Nc5wRLd67U=
-github.com/ipfs/boxo v0.23.1-0.20240927234853-19a402b7dc34/go.mod h1:ulu5I6avTmgGmvjuCaBRKwsaOOKjBfQw1EiOOQp8M6E=
+github.com/ipfs/boxo v0.24.0 h1:D9gTU3QdxyjPMlJ6QfqhHTG3TIJPplKzjXLO2J30h9U=
+github.com/ipfs/boxo v0.24.0/go.mod h1:iP7xUPpHq2QAmVAjwtQvsNBTxTwLpFuy6ZpiRFwmzDA=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-bitswap v0.11.0 h1:j1WVvhDX1yhG32NTC9xfxnqycqYIlhzEzLXG/cU1HyQ=
@@ -504,8 +504,8 @@ github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZ
github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs=
github.com/libp2p/go-flow-metrics v0.1.0 h1:0iPhMI8PskQwzh57jB9WxIuIOQ0r+15PChFGkx3Q3WM=
github.com/libp2p/go-flow-metrics v0.1.0/go.mod h1:4Xi8MX8wj5aWNDAZttg6UPmc0ZrnFNsMtpsYUClFtro=
-github.com/libp2p/go-libp2p v0.36.3 h1:NHz30+G7D8Y8YmznrVZZla0ofVANrvBl2c+oARfMeDQ=
-github.com/libp2p/go-libp2p v0.36.3/go.mod h1:4Y5vFyCUiJuluEPmpnKYf6WFx5ViKPUYs/ixe9ANFZ8=
+github.com/libp2p/go-libp2p v0.36.4 h1:ZaKyKSHBFbzs6CnAYMhaMc5QgV1UoCN+9WXrg8SEwI4=
+github.com/libp2p/go-libp2p v0.36.4/go.mod h1:4Y5vFyCUiJuluEPmpnKYf6WFx5ViKPUYs/ixe9ANFZ8=
github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94=
github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8=
github.com/libp2p/go-libp2p-core v0.2.4/go.mod h1:STh4fdfa5vDYr0/SzYYeqnt+E6KfEV5VxfIrm0bcI0g=
@@ -618,8 +618,8 @@ github.com/multiformats/go-multiaddr v0.4.0/go.mod h1:YcpyLH8ZPudLxQlemYBPhSm0/o
github.com/multiformats/go-multiaddr v0.13.0 h1:BCBzs61E3AGHcYYTv8dqRH43ZfyrqM8RXVPT8t13tLQ=
github.com/multiformats/go-multiaddr v0.13.0/go.mod h1:sBXrNzucqkFJhvKOiwwLyqamGa/P5EIXNPLovyhQCII=
github.com/multiformats/go-multiaddr-dns v0.3.0/go.mod h1:mNzQ4eTGDg0ll1N9jKPOUogZPoJ30W8a7zk66FQPpdQ=
-github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A=
-github.com/multiformats/go-multiaddr-dns v0.3.1/go.mod h1:G/245BRQ6FJGmryJCrOuTdB37AMA5AMOVuO6NY3JwTk=
+github.com/multiformats/go-multiaddr-dns v0.4.0 h1:P76EJ3qzBXpUXZ3twdCDx/kvagMsNo0LMFXpyms/zgU=
+github.com/multiformats/go-multiaddr-dns v0.4.0/go.mod h1:7hfthtB4E4pQwirrz+J0CcDUfbWzTqEzVyYKKIKpgkc=
github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E=
github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo=
github.com/multiformats/go-multiaddr-net v0.1.1/go.mod h1:5JNbcfBOP4dnhoZOv10JJVkJO0pCCEf8mTnipAo2UZQ=
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index 24af83852..5f77201ee 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -111,7 +111,7 @@ require (
github.com/hexops/gotextdiff v1.0.3 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/ipfs/bbloom v0.0.4 // indirect
- github.com/ipfs/boxo v0.23.1-0.20240927234853-19a402b7dc34 // indirect
+ github.com/ipfs/boxo v0.24.0 // indirect
github.com/ipfs/go-block-format v0.2.0 // indirect
github.com/ipfs/go-cid v0.4.1 // indirect
github.com/ipfs/go-datastore v0.6.0 // indirect
@@ -142,7 +142,7 @@ require (
github.com/leonklingele/grouper v1.1.2 // indirect
github.com/libp2p/go-buffer-pool v0.1.0 // indirect
github.com/libp2p/go-cidranger v1.1.0 // indirect
- github.com/libp2p/go-libp2p v0.36.3 // indirect
+ github.com/libp2p/go-libp2p v0.36.4 // indirect
github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect
github.com/libp2p/go-libp2p-kad-dht v0.26.1 // indirect
github.com/libp2p/go-libp2p-kbucket v0.6.3 // indirect
@@ -168,7 +168,7 @@ require (
github.com/mr-tron/base58 v1.2.0 // indirect
github.com/multiformats/go-base32 v0.1.0 // indirect
github.com/multiformats/go-base36 v0.2.0 // indirect
- github.com/multiformats/go-multiaddr-dns v0.3.1 // indirect
+ github.com/multiformats/go-multiaddr-dns v0.4.0 // indirect
github.com/multiformats/go-multibase v0.2.0 // indirect
github.com/multiformats/go-multicodec v0.9.0 // indirect
github.com/multiformats/go-multistream v0.5.0 // indirect
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index 7d9722814..168d9abd8 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -281,8 +281,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.23.1-0.20240927234853-19a402b7dc34 h1:/Etgc4IR0OUF+nIoNdqwu12EYuaSMpd7/Nc5wRLd67U=
-github.com/ipfs/boxo v0.23.1-0.20240927234853-19a402b7dc34/go.mod h1:ulu5I6avTmgGmvjuCaBRKwsaOOKjBfQw1EiOOQp8M6E=
+github.com/ipfs/boxo v0.24.0 h1:D9gTU3QdxyjPMlJ6QfqhHTG3TIJPplKzjXLO2J30h9U=
+github.com/ipfs/boxo v0.24.0/go.mod h1:iP7xUPpHq2QAmVAjwtQvsNBTxTwLpFuy6ZpiRFwmzDA=
github.com/ipfs/go-block-format v0.2.0 h1:ZqrkxBA2ICbDRbK8KJs/u0O3dlp6gmAuuXUJNiW1Ycs=
github.com/ipfs/go-block-format v0.2.0/go.mod h1:+jpL11nFx5A/SPpsoBn6Bzkra/zaArfSmsknbPMYgzM=
github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s=
@@ -388,8 +388,8 @@ github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38y
github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic=
github.com/libp2p/go-flow-metrics v0.1.0 h1:0iPhMI8PskQwzh57jB9WxIuIOQ0r+15PChFGkx3Q3WM=
github.com/libp2p/go-flow-metrics v0.1.0/go.mod h1:4Xi8MX8wj5aWNDAZttg6UPmc0ZrnFNsMtpsYUClFtro=
-github.com/libp2p/go-libp2p v0.36.3 h1:NHz30+G7D8Y8YmznrVZZla0ofVANrvBl2c+oARfMeDQ=
-github.com/libp2p/go-libp2p v0.36.3/go.mod h1:4Y5vFyCUiJuluEPmpnKYf6WFx5ViKPUYs/ixe9ANFZ8=
+github.com/libp2p/go-libp2p v0.36.4 h1:ZaKyKSHBFbzs6CnAYMhaMc5QgV1UoCN+9WXrg8SEwI4=
+github.com/libp2p/go-libp2p v0.36.4/go.mod h1:4Y5vFyCUiJuluEPmpnKYf6WFx5ViKPUYs/ixe9ANFZ8=
github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94=
github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8=
github.com/libp2p/go-libp2p-kad-dht v0.26.1 h1:AazV3LCImYVkDUGAHx5lIEgZ9iUI2QQKH5GMRQU8uEA=
@@ -441,15 +441,12 @@ github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZ
github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
github.com/mgechev/revive v1.3.9 h1:18Y3R4a2USSBF+QZKFQwVkBROUda7uoBlkEuBD+YD1A=
github.com/mgechev/revive v1.3.9/go.mod h1:+uxEIr5UH0TjXWHTno3xh4u7eg6jDpXKzQccA9UGhHU=
-github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=
github.com/miekg/dns v1.1.61 h1:nLxbwF3XxhwVSm8g9Dghm9MHPaUZuqhPiGL+675ZmEs=
github.com/miekg/dns v1.1.61/go.mod h1:mnAarhS3nWaW+NVP2wTkYVIZyHNJ098SJZUki3eykwQ=
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc=
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b/go.mod h1:lxPUiZwKoFL8DUUmalo2yJJUCxbPKtm8OKfqr2/FTNU=
github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc h1:PTfri+PuQmWDqERdnNMiD9ZejrlswWrCpBEZgWOiTrc=
github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc/go.mod h1:cGKTAVKx4SxOuR/czcZ/E2RSJ3sfHs8FpHhQ5CWMf9s=
-github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ=
-github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM=
github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM=
github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8=
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
@@ -458,30 +455,26 @@ github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyua
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/moricho/tparallel v0.3.2 h1:odr8aZVFA3NZrNybggMkYO3rgPRcqjeQUlBBFVxKHTI=
github.com/moricho/tparallel v0.3.2/go.mod h1:OQ+K3b4Ln3l2TZveGCywybl68glfLEwFGqvnjok8b+U=
-github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o=
github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aGkbLYxPE=
github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI=
github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0=
github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4=
-github.com/multiformats/go-multiaddr v0.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4=
github.com/multiformats/go-multiaddr v0.13.0 h1:BCBzs61E3AGHcYYTv8dqRH43ZfyrqM8RXVPT8t13tLQ=
github.com/multiformats/go-multiaddr v0.13.0/go.mod h1:sBXrNzucqkFJhvKOiwwLyqamGa/P5EIXNPLovyhQCII=
-github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A=
-github.com/multiformats/go-multiaddr-dns v0.3.1/go.mod h1:G/245BRQ6FJGmryJCrOuTdB37AMA5AMOVuO6NY3JwTk=
+github.com/multiformats/go-multiaddr-dns v0.4.0 h1:P76EJ3qzBXpUXZ3twdCDx/kvagMsNo0LMFXpyms/zgU=
+github.com/multiformats/go-multiaddr-dns v0.4.0/go.mod h1:7hfthtB4E4pQwirrz+J0CcDUfbWzTqEzVyYKKIKpgkc=
github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E=
github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo=
github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g=
github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk=
github.com/multiformats/go-multicodec v0.9.0 h1:pb/dlPnzee/Sxv/j4PmkDRxCOi3hXTz3IbPKOXWJkmg=
github.com/multiformats/go-multicodec v0.9.0/go.mod h1:L3QTQvMIaVBkXOXXtVmYE+LI16i14xuaojr/H7Ai54k=
-github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew=
github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U=
github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM=
github.com/multiformats/go-multistream v0.5.0 h1:5htLSLl7lvJk3xx3qT/8Zm9J4K8vEOf/QGkvOGQAyiE=
github.com/multiformats/go-multistream v0.5.0/go.mod h1:n6tMZiwiP2wUsR8DgfDWw1dydlEqV3l6N3/GBsX6ILA=
-github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE=
github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8=
github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU=
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
@@ -760,7 +753,6 @@ go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
@@ -852,7 +844,6 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
From 1bc773fd8b16393847b8d8df388095fa97fa520a Mon Sep 17 00:00:00 2001
From: Marcin Rataj Full Changelog
+
+- github.com/ipfs/kubo:
+ - fix: go 1.23(.2) (#10540) ([ipfs/kubo#10540](https://github.com/ipfs/kubo/pull/10540))
+ - chore: bump version to 0.32.0-dev
+ - feat(routing/http): support IPIP-484 and streaming (#10534) ([ipfs/kubo#10534](https://github.com/ipfs/kubo/pull/10534))
+ - fix(daemon): webui URL when rpc is catch-all (#10520) ([ipfs/kubo#10520](https://github.com/ipfs/kubo/pull/10520))
+ - chore: update changelog and config doc with more info about pebble (#10533) ([ipfs/kubo#10533](https://github.com/ipfs/kubo/pull/10533))
+ - feat: pebbleds profile and plugin (#10530) ([ipfs/kubo#10530](https://github.com/ipfs/kubo/pull/10530))
+ - chore: dependency updates for 0.31 (#10511) ([ipfs/kubo#10511](https://github.com/ipfs/kubo/pull/10511))
+ - feat: explicit announce-on/off profiles (#10524) ([ipfs/kubo#10524](https://github.com/ipfs/kubo/pull/10524))
+ - fix(core): look for MFS root in local repo only (#8661) ([ipfs/kubo#8661](https://github.com/ipfs/kubo/pull/8661))
+ - Fix issue in ResourceManager and nopfsPlugin about repo path (#10492) ([ipfs/kubo#10492](https://github.com/ipfs/kubo/pull/10492))
+ - feat(bitswap): allow configuring WithWantHaveReplaceSize (#10512) ([ipfs/kubo#10512](https://github.com/ipfs/kubo/pull/10512))
+ - refactor: simplify logic for MFS pinning (#10506) ([ipfs/kubo#10506](https://github.com/ipfs/kubo/pull/10506))
+ - docs: clarify Gateway.PublicGateways (#10525) ([ipfs/kubo#10525](https://github.com/ipfs/kubo/pull/10525))
+ - chore: clarify dep update in RELEASE_CHECKLIST.md (#10518) ([ipfs/kubo#10518](https://github.com/ipfs/kubo/pull/10518))
+ - feat: ipfs-webui v4.3.2 (#10523) ([ipfs/kubo#10523](https://github.com/ipfs/kubo/pull/10523))
+ - docs(config): add useful references
+ - docs(config): improve profile descriptions (#10517) ([ipfs/kubo#10517](https://github.com/ipfs/kubo/pull/10517))
+ - docs: update RELEASE_CHECKLIST.md (#10496) ([ipfs/kubo#10496](https://github.com/ipfs/kubo/pull/10496))
+ - chore: create next changelog (#10510) ([ipfs/kubo#10510](https://github.com/ipfs/kubo/pull/10510))
+ - Merge Release: v0.30.0 [skip changelog] ([ipfs/kubo#10508](https://github.com/ipfs/kubo/pull/10508))
+ - chore: boxo v0.23.0 and go-libp2p v0.36.3 (#10507) ([ipfs/kubo#10507](https://github.com/ipfs/kubo/pull/10507))
+ - docs: replace outdated package paths described in rpc README (#10505) ([ipfs/kubo#10505](https://github.com/ipfs/kubo/pull/10505))
+ - fix: switch back to go 1.22 (#10502) ([ipfs/kubo#10502](https://github.com/ipfs/kubo/pull/10502))
+ - fix(cli): preserve hostname specified with --api in http request headers (#10497) ([ipfs/kubo#10497](https://github.com/ipfs/kubo/pull/10497))
+ - chore: upgrade to go 1.23 (#10486) ([ipfs/kubo#10486](https://github.com/ipfs/kubo/pull/10486))
+ - fix: error during config when running benchmarks (#10495) ([ipfs/kubo#10495](https://github.com/ipfs/kubo/pull/10495))
+ - chore: update go-unixfsnode, cmds, and boxo (#10494) ([ipfs/kubo#10494](https://github.com/ipfs/kubo/pull/10494))
+ - Docs fix spelling issues (#10493) ([ipfs/kubo#10493](https://github.com/ipfs/kubo/pull/10493))
+ - chore: update version (#10491) ([ipfs/kubo#10491](https://github.com/ipfs/kubo/pull/10491))
+- github.com/ipfs/boxo (v0.23.0 -> v0.24.0):
+ - Release v0.24.0 ([ipfs/boxo#683](https://github.com/ipfs/boxo/pull/683))
+- github.com/ipfs/go-ipld-cbor (v0.1.0 -> v0.2.0):
+ - v0.2.0
+ - deprecate DumpObject() in favor of better named Encode()
+ - add an EncodeWriter method, using the pooled marshallers
+ - fix expCid vs actualCid guard
+- github.com/ipld/go-car/v2 (v2.13.1 -> v2.14.2):
+ - v2.14.2 bump
+ - fix: goreleaser v2 compat, trigger release-binaries with workflow_run
+ - v2.14.1 bump
+ - chore: update fuzz to Go 1.22
+ - v2.14.0 bump
+ - fix(cmd): properly pick up --inverse and --cid-file args ([ipld/go-car#531](https://github.com/ipld/go-car/pull/531))
+ - Re-factor cmd functions to library ([ipld/go-car#524](https://github.com/ipld/go-car/pull/524))
+ - ci: uci/copy-templates ([ipld/go-car#521](https://github.com/ipld/go-car/pull/521))
+ - Add a `car ls --unixfs-blocks` to render two-column output ([ipld/go-car#514](https://github.com/ipld/go-car/pull/514))
+- github.com/libp2p/go-libp2p (v0.36.3 -> v0.36.5):
+ - chore: remove Roadmap file (#2954) ([libp2p/go-libp2p#2954](https://github.com/libp2p/go-libp2p/pull/2954))
+ - fix: Release v0.36.5
+ - autonatv2: recover from panics (#2992) ([libp2p/go-libp2p#2992](https://github.com/libp2p/go-libp2p/pull/2992))
+ - basichost: ensure no duplicates in Addrs output (#2980) ([libp2p/go-libp2p#2980](https://github.com/libp2p/go-libp2p/pull/2980))
+ - Release v0.36.4
+ - peerstore: better GC in membacked peerstore (#2960) ([libp2p/go-libp2p#2960](https://github.com/libp2p/go-libp2p/pull/2960))
+ - fix: use quic.Version instead of the deprecated quic.VersionNumber (#2955) ([libp2p/go-libp2p#2955](https://github.com/libp2p/go-libp2p/pull/2955))
+ - tcp: fix metrics for multiple calls to Close (#2953) ([libp2p/go-libp2p#2953](https://github.com/libp2p/go-libp2p/pull/2953))
+- github.com/libp2p/go-libp2p-kbucket (v0.6.3 -> v0.6.4):
+ - release v0.6.4 ([libp2p/go-libp2p-kbucket#135](https://github.com/libp2p/go-libp2p-kbucket/pull/135))
+ - feat: add log printing when peer added and removed table ([libp2p/go-libp2p-kbucket#134](https://github.com/libp2p/go-libp2p-kbucket/pull/134))
+ - Upgrade to go-log v2.5.1 ([libp2p/go-libp2p-kbucket#132](https://github.com/libp2p/go-libp2p-kbucket/pull/132))
+ - chore: update go-libp2p-asn-util
+- github.com/multiformats/go-multiaddr-dns (v0.3.1 -> v0.4.0):
+ - Release v0.4.0 (#64) ([multiformats/go-multiaddr-dns#64](https://github.com/multiformats/go-multiaddr-dns/pull/64))
+ - Limit total number of resolved addresses from DNS response (#63) ([multiformats/go-multiaddr-dns#63](https://github.com/multiformats/go-multiaddr-dns/pull/63))
+ - fix!: Only resolve the first DNS-like component (#61) ([multiformats/go-multiaddr-dns#61](https://github.com/multiformats/go-multiaddr-dns/pull/61))
+ - sync: update CI config files (#43) ([multiformats/go-multiaddr-dns#43](https://github.com/multiformats/go-multiaddr-dns/pull/43))
+ - remove deprecated types ([multiformats/go-multiaddr-dns#37](https://github.com/multiformats/go-multiaddr-dns/pull/37))
+ - remove Jenkinsfile ([multiformats/go-multiaddr-dns#40](https://github.com/multiformats/go-multiaddr-dns/pull/40))
+ - sync: update CI config files (#29) ([multiformats/go-multiaddr-dns#29](https://github.com/multiformats/go-multiaddr-dns/pull/29))
+ - use net.IP.Equal to compare IP addresses ([multiformats/go-multiaddr-dns#30](https://github.com/multiformats/go-multiaddr-dns/pull/30))
+
+Full Changelog
+
+- github.com/ipfs/kubo:
+ - fix: go 1.23(.2) (#10540) ([ipfs/kubo#10540](https://github.com/ipfs/kubo/pull/10540))
+ - chore: bump version to 0.32.0-dev
+ - feat(routing/http): support IPIP-484 and streaming (#10534) ([ipfs/kubo#10534](https://github.com/ipfs/kubo/pull/10534))
+ - fix(daemon): webui URL when rpc is catch-all (#10520) ([ipfs/kubo#10520](https://github.com/ipfs/kubo/pull/10520))
+ - chore: update changelog and config doc with more info about pebble (#10533) ([ipfs/kubo#10533](https://github.com/ipfs/kubo/pull/10533))
+ - feat: pebbleds profile and plugin (#10530) ([ipfs/kubo#10530](https://github.com/ipfs/kubo/pull/10530))
+ - chore: dependency updates for 0.31 (#10511) ([ipfs/kubo#10511](https://github.com/ipfs/kubo/pull/10511))
+ - feat: explicit announce-on/off profiles (#10524) ([ipfs/kubo#10524](https://github.com/ipfs/kubo/pull/10524))
+ - fix(core): look for MFS root in local repo only (#8661) ([ipfs/kubo#8661](https://github.com/ipfs/kubo/pull/8661))
+ - Fix issue in ResourceManager and nopfsPlugin about repo path (#10492) ([ipfs/kubo#10492](https://github.com/ipfs/kubo/pull/10492))
+ - feat(bitswap): allow configuring WithWantHaveReplaceSize (#10512) ([ipfs/kubo#10512](https://github.com/ipfs/kubo/pull/10512))
+ - refactor: simplify logic for MFS pinning (#10506) ([ipfs/kubo#10506](https://github.com/ipfs/kubo/pull/10506))
+ - docs: clarify Gateway.PublicGateways (#10525) ([ipfs/kubo#10525](https://github.com/ipfs/kubo/pull/10525))
+ - chore: clarify dep update in RELEASE_CHECKLIST.md (#10518) ([ipfs/kubo#10518](https://github.com/ipfs/kubo/pull/10518))
+ - feat: ipfs-webui v4.3.2 (#10523) ([ipfs/kubo#10523](https://github.com/ipfs/kubo/pull/10523))
+ - docs(config): add useful references
+ - docs(config): improve profile descriptions (#10517) ([ipfs/kubo#10517](https://github.com/ipfs/kubo/pull/10517))
+ - docs: update RELEASE_CHECKLIST.md (#10496) ([ipfs/kubo#10496](https://github.com/ipfs/kubo/pull/10496))
+ - chore: create next changelog (#10510) ([ipfs/kubo#10510](https://github.com/ipfs/kubo/pull/10510))
+ - Merge Release: v0.30.0 [skip changelog] ([ipfs/kubo#10508](https://github.com/ipfs/kubo/pull/10508))
+ - chore: boxo v0.23.0 and go-libp2p v0.36.3 (#10507) ([ipfs/kubo#10507](https://github.com/ipfs/kubo/pull/10507))
+ - docs: replace outdated package paths described in rpc README (#10505) ([ipfs/kubo#10505](https://github.com/ipfs/kubo/pull/10505))
+ - fix: switch back to go 1.22 (#10502) ([ipfs/kubo#10502](https://github.com/ipfs/kubo/pull/10502))
+ - fix(cli): preserve hostname specified with --api in http request headers (#10497) ([ipfs/kubo#10497](https://github.com/ipfs/kubo/pull/10497))
+ - chore: upgrade to go 1.23 (#10486) ([ipfs/kubo#10486](https://github.com/ipfs/kubo/pull/10486))
+ - fix: error during config when running benchmarks (#10495) ([ipfs/kubo#10495](https://github.com/ipfs/kubo/pull/10495))
+ - chore: update go-unixfsnode, cmds, and boxo (#10494) ([ipfs/kubo#10494](https://github.com/ipfs/kubo/pull/10494))
+ - Docs fix spelling issues (#10493) ([ipfs/kubo#10493](https://github.com/ipfs/kubo/pull/10493))
+ - chore: update version (#10491) ([ipfs/kubo#10491](https://github.com/ipfs/kubo/pull/10491))
+- github.com/ipfs/boxo (v0.23.0 -> v0.24.0):
+ - Release v0.24.0 ([ipfs/boxo#683](https://github.com/ipfs/boxo/pull/683))
+- github.com/ipfs/go-ipld-cbor (v0.1.0 -> v0.2.0):
+ - v0.2.0
+ - deprecate DumpObject() in favor of better named Encode()
+ - add an EncodeWriter method, using the pooled marshallers
+ - fix expCid vs actualCid guard
+- github.com/ipld/go-car/v2 (v2.13.1 -> v2.14.2):
+ - v2.14.2 bump
+ - fix: goreleaser v2 compat, trigger release-binaries with workflow_run
+ - v2.14.1 bump
+ - chore: update fuzz to Go 1.22
+ - v2.14.0 bump
+ - fix(cmd): properly pick up --inverse and --cid-file args ([ipld/go-car#531](https://github.com/ipld/go-car/pull/531))
+ - Re-factor cmd functions to library ([ipld/go-car#524](https://github.com/ipld/go-car/pull/524))
+ - ci: uci/copy-templates ([ipld/go-car#521](https://github.com/ipld/go-car/pull/521))
+ - Add a `car ls --unixfs-blocks` to render two-column output ([ipld/go-car#514](https://github.com/ipld/go-car/pull/514))
+- github.com/libp2p/go-libp2p (v0.36.3 -> v0.36.5):
+ - chore: remove Roadmap file (#2954) ([libp2p/go-libp2p#2954](https://github.com/libp2p/go-libp2p/pull/2954))
+ - fix: Release v0.36.5
+ - autonatv2: recover from panics (#2992) ([libp2p/go-libp2p#2992](https://github.com/libp2p/go-libp2p/pull/2992))
+ - basichost: ensure no duplicates in Addrs output (#2980) ([libp2p/go-libp2p#2980](https://github.com/libp2p/go-libp2p/pull/2980))
+ - Release v0.36.4
+ - peerstore: better GC in membacked peerstore (#2960) ([libp2p/go-libp2p#2960](https://github.com/libp2p/go-libp2p/pull/2960))
+ - fix: use quic.Version instead of the deprecated quic.VersionNumber (#2955) ([libp2p/go-libp2p#2955](https://github.com/libp2p/go-libp2p/pull/2955))
+ - tcp: fix metrics for multiple calls to Close (#2953) ([libp2p/go-libp2p#2953](https://github.com/libp2p/go-libp2p/pull/2953))
+- github.com/libp2p/go-libp2p-kbucket (v0.6.3 -> v0.6.4):
+ - release v0.6.4 ([libp2p/go-libp2p-kbucket#135](https://github.com/libp2p/go-libp2p-kbucket/pull/135))
+ - feat: add log printing when peer added and removed table ([libp2p/go-libp2p-kbucket#134](https://github.com/libp2p/go-libp2p-kbucket/pull/134))
+ - Upgrade to go-log v2.5.1 ([libp2p/go-libp2p-kbucket#132](https://github.com/libp2p/go-libp2p-kbucket/pull/132))
+ - chore: update go-libp2p-asn-util
+- github.com/multiformats/go-multiaddr-dns (v0.3.1 -> v0.4.0):
+ - Release v0.4.0 (#64) ([multiformats/go-multiaddr-dns#64](https://github.com/multiformats/go-multiaddr-dns/pull/64))
+ - Limit total number of resolved addresses from DNS response (#63) ([multiformats/go-multiaddr-dns#63](https://github.com/multiformats/go-multiaddr-dns/pull/63))
+ - fix!: Only resolve the first DNS-like component (#61) ([multiformats/go-multiaddr-dns#61](https://github.com/multiformats/go-multiaddr-dns/pull/61))
+ - sync: update CI config files (#43) ([multiformats/go-multiaddr-dns#43](https://github.com/multiformats/go-multiaddr-dns/pull/43))
+ - remove deprecated types ([multiformats/go-multiaddr-dns#37](https://github.com/multiformats/go-multiaddr-dns/pull/37))
+ - remove Jenkinsfile ([multiformats/go-multiaddr-dns#40](https://github.com/multiformats/go-multiaddr-dns/pull/40))
+ - sync: update CI config files (#29) ([multiformats/go-multiaddr-dns#29](https://github.com/multiformats/go-multiaddr-dns/pull/29))
+ - use net.IP.Equal to compare IP addresses ([multiformats/go-multiaddr-dns#30](https://github.com/multiformats/go-multiaddr-dns/pull/30))
+
+using `./kuboreleaser release --version vX.Y.Z(-rcN) publish-to-distributions` or ...
- [ ] check out [ipfs/distributions](https://github.com/ipfs/distributions)
+ - [ ] create new branch: run `git checkout -b release-kubo-X.Y.Z(-rcN)`
- [ ] run `./dist.sh add-version kubo vX.Y.Z(-RCN)` to add the new version to the `versions` file
- [usage](https://github.com/ipfs/distributions#usage)
- - [ ] create and merge the PR which updates `dists/kubo/versions` and `dists/go-ipfs/versions` ( and `dists/kubo/current_version` and `dists/go-ipfs/current_version`)
+ - [ ] create and merge the PR which updates `dists/kubo/versions` and `dists/go-ipfs/versions` ( and `dists/kubo/current` and `dists/go-ipfs/current`)
- [example](https://github.com/ipfs/distributions/pull/760)
- [ ] wait for the [CI](https://github.com/ipfs/distributions/actions/workflows/main.yml) workflow run initiated by the merge to master to finish
- [ ] verify the release is available on [dist.ipfs.tech](https://dist.ipfs.tech/#kubo)
From b3366025970acbf64d3f272a002f5fc175972943 Mon Sep 17 00:00:00 2001
From: Marcin Rataj using `./kuboreleaser release --version vX.Y.Z(-rcN) publish-to-npm` (โ ๏ธ you might need to run the command a couple of times because GHA might not be able to see the new distribution straight away due to caching) or ...
+ - [ ] Publish the release to [NPM](https://www.npmjs.com/package/kubo?activeTab=versions) using `./kuboreleaser release --version vX.Y.Z(-rcN) publish-to-npm` (โ ๏ธ you might need to run the command a couple of times because GHA might not be able to see the new distribution straight away due to caching) or ...
- [ ] run the [Release to npm](https://github.com/ipfs/npm-go-ipfs/actions/workflows/main.yml) workflow
- [ ] check [Release to npm](https://github.com/ipfs/npm-go-ipfs/actions/workflows/main.yml) workflow run logs to verify it discovered the new release
- - [ ] verify the release is available on [NPM](https://www.npmjs.com/package/go-ipfs?activeTab=versions)
+ - [ ] verify the release is available on [NPM](https://www.npmjs.com/package/kubo?activeTab=versions)
using `./kuboreleaser release --version vX.Y.Z(-rcN) publish-to-github` or ...
- [ ] create a new release on [GitHub](https://docs.github.com/en/repositories/releasing-projects-on-github/managing-releases-in-a-repository#creating-a-release)
From 5cc979f15fbc3d431ce7962a14247b9f7354294e Mon Sep 17 00:00:00 2001
From: gammazero <11790789+gammazero@users.noreply.github.com>
Date: Wed, 16 Oct 2024 22:03:21 -1000
Subject: [PATCH 021/499] Create Changelog: v0.32
This PR creates changelog: v0.32
---
CHANGELOG.md | 1 +
docs/changelogs/v0.32.md | 18 ++++++++++++++++++
2 files changed, 19 insertions(+)
create mode 100644 docs/changelogs/v0.32.md
diff --git a/CHANGELOG.md b/CHANGELOG.md
index fa40e1625..621e07d7f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,6 @@
# Kubo Changelogs
+- [v0.32](docs/changelogs/v0.32.md)
- [v0.31](docs/changelogs/v0.31.md)
- [v0.30](docs/changelogs/v0.30.md)
- [v0.29](docs/changelogs/v0.29.md)
diff --git a/docs/changelogs/v0.32.md b/docs/changelogs/v0.32.md
new file mode 100644
index 000000000..0744bd628
--- /dev/null
+++ b/docs/changelogs/v0.32.md
@@ -0,0 +1,18 @@
+# Kubo changelog v0.32
+
+- [v0.31.0](#v0320)
+
+## v0.32.0
+
+- [Overview](#overview)
+- [๐ฆ Highlights](#-highlights)
+- [๐ Changelog](#-changelog)
+- [๐จโ๐ฉโ๐งโ๐ฆ Contributors](#-contributors)
+
+### Overview
+
+### ๐ฆ Highlights
+
+### ๐ Changelog
+
+### ๐จโ๐ฉโ๐งโ๐ฆ Contributors
From 550f4642634ccc8bfd5f07c63be87a1160e4d02c Mon Sep 17 00:00:00 2001
From: Marcin Rataj
+
+[p2p-forge]: https://github.com/ipshipyard/p2p-forge
+
+Default: `{}`
+
+Type: `object`
+
+### `AutoTLS.Enabled`
+
+> [!CAUTION]
+> This is an **EXPERIMENTAL** opt-in feature and should not be used in production yet.
+> Feel free to enable it and [report issues](https://github.com/ipfs/kubo/issues/new/choose) if you want to help with testing.
+> Track progress in [kubo#10560](https://github.com/ipfs/kubo/issues/10560).
+
+Enables AutoTLS feature to get DNS+TLS for [libp2p Secure WebSocket](https://github.com/libp2p/specs/blob/master/websockets/README.md) listeners defined in [`Addresses.Swarm`](#addressesswarm), such as `/ip4/0.0.0.0/tcp/4002/tls/sni/*.libp2p.direct/ws` and `/ip6/::/tcp/4002/tls/sni/*.libp2p.direct/ws`.
+
+If `.../tls/sni/*.libp2p.direct/ws` [multiaddr] is present in [`Addresses.Swarm`](#addressesswarm)
+with SNI segment ending with [`AutoTLS.DomainSuffix`](#autotlsdomainsuffix),
+Kubo will obtain and set up a trusted PKI TLS certificate for it, making it diallable from web browser's [Secure Contexts](https://w3c.github.io/webappsec-secure-contexts/).
+
+> [!IMPORTANT]
+> Caveats:
+> - Requires your Kubo node to be publicly diallable.
+> - If you want to test this with a node that is behind a NAT and uses manual port forwarding or UPnP (`Swarm.DisableNatPortMap=false`),
+> add catch-all `/ip4/0.0.0.0/tcp/4002/tls/sni/*.libp2p.direct/ws` and `/ip6/::/tcp/4002/tls/sni/*.libp2p.direct/ws` to [`Addresses.Swarm`](#addressesswarm)
+> and **wait 5-15 minutes** for libp2p node to set up and learn about own public addresses via [AutoNAT](#autonat).
+> - If your node is fresh and just started, the [p2p-forge] client may produce and log ERRORs during this time, but once a publicly diallable addresses are set up, a subsequent retry should be successful.
+> - Requires manually updating [`Addresses.Swarm`](#addressesswarm) and opening a new port
+> - A separate port has to be used instead of `4001` because we wait for TCP port sharing ([go-libp2p#2984](https://github.com/libp2p/go-libp2p/issues/2684)) to be implemented.
+> - If you use manual port forwarding, make sure incoming connections to this additional port are allowed the same way `4001` ones already are.
+> - The TLS certificate is used only for [libp2p WebSocket](https://github.com/libp2p/specs/blob/master/websockets/README.md) connections.
+> - Right now, this is NOT used for hosting a [Gateway](#gateway) over HTTPS (that use case still requires manual TLS setup on reverse proxy, and your own domain).
+
+> [!TIP]
+> Debugging can be enabled by setting environment variable `GOLOG_LOG_LEVEL="error,autotls=debug,p2p-forge/client=debug"`
+
+Default: `false`
+
+Type: `flag`
+
+### `AutoTLS.DomainSuffix`
+
+Optional override of the parent domain suffix that will be used in DNS+TLS+WebSockets multiaddrs generated by [p2p-forge] client.
+Do not change this unless you self-host [p2p-forge].
+
+Default: `libp2p.direct` (public good run by [Interplanetary Shipyard](https://ipshipyard.com))
+
+Type: `optionalString`
+
+### `AutoTLS.RegistrationEndpoint`
+
+Optional override of [p2p-forge] HTTP registration API.
+Do not change this unless you self-host [p2p-forge].
+
+> [!IMPORTANT]
+> The default endpoint performs [libp2p Peer ID Authentication over HTTP](https://github.com/libp2p/specs/blob/master/http/peer-id-auth.md)
+> (prooving ownership of PeerID), probes if your Kubo node can correctly answer to a [libp2p Identify](https://github.com/libp2p/specs/tree/master/identify) query.
+> This ensures only a correctly configured, publicly diallable Kubo can initiate [ACME DNS-01 challenge](https://letsencrypt.org/docs/challenge-types/#dns-01-challenge) for `peerid.libp2p.direct`.
+
+Default: `https://registration.libp2p.direct` (public good run by [Interplanetary Shipyard](https://ipshipyard.com))
+
+Type: `optionalString`
+
+### `AutoTLS.RegistrationToken`
+
+Optional value for `Forge-Authorization` token sent with request to `RegistrationEndpoint`
+(useful for private/self-hosted/test instances of [p2p-forge], unset by default).
+
+Default: `""`
+
+Type: `optionalString`
+
+### `AutoTLS.CAEndpoint`
+
+Optional override of CA ACME API used by [p2p-forge] system.
+
+Default: [certmagic.LetsEncryptProductionCA](https://pkg.go.dev/github.com/caddyserver/certmagic#pkg-constants) (see [community.letsencrypt.org discussion](https://community.letsencrypt.org/t/feedback-on-raising-certificates-per-registered-domain-to-enable-peer-to-peer-networking/223003))
+
+Type: `optionalString`
+
## `Bootstrap`
Bootstrap is an array of [multiaddrs][multiaddr] of trusted nodes that your node connects to, to fetch other nodes of the network on startup.
@@ -1835,7 +1944,7 @@ Type: `optionalInteger`
#### `Swarm.RelayService.MaxReservationsPerPeer`
-**REMOVED in kubo 0.32 due to removal from go-libp2p v0.37**
+**REMOVED in kubo 0.32 due to [go-libp2p#2974](https://github.com/libp2p/go-libp2p/pull/2974)**
#### `Swarm.RelayService.MaxReservationsPerIP`
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index 633457f2d..6fed80107 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -23,6 +23,8 @@ require (
github.com/benbjohnson/clock v1.3.5 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/blang/semver/v4 v4.0.0 // indirect
+ github.com/caddyserver/certmagic v0.21.4 // indirect
+ github.com/caddyserver/zerossl v0.1.3 // indirect
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
github.com/ceramicnetwork/go-dag-jose v0.1.0 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
@@ -36,7 +38,7 @@ require (
github.com/coreos/go-systemd/v22 v22.5.0 // indirect
github.com/crackcomm/go-gitignore v0.0.0-20231225121904-e25f5bc08668 // indirect
github.com/cskr/pubsub v1.0.2 // indirect
- github.com/davecgh/go-spew v1.1.1 // indirect
+ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect
github.com/dgraph-io/badger v1.6.2 // indirect
@@ -106,6 +108,7 @@ require (
github.com/ipld/go-car/v2 v2.14.2 // indirect
github.com/ipld/go-codec-dagpb v1.6.0 // indirect
github.com/ipld/go-ipld-prime v0.21.0 // indirect
+ github.com/ipshipyard/p2p-forge v0.0.0-20241028231853-f599f4803109 // indirect
github.com/jackpal/go-nat-pmp v1.0.2 // indirect
github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect
github.com/jbenet/goprocess v0.1.4 // indirect
@@ -114,6 +117,7 @@ require (
github.com/koron/go-ssdp v0.0.4 // indirect
github.com/kr/pretty v0.3.1 // indirect
github.com/kr/text v0.2.0 // indirect
+ github.com/libdns/libdns v0.2.2 // indirect
github.com/libp2p/go-buffer-pool v0.1.0 // indirect
github.com/libp2p/go-cidranger v1.1.0 // indirect
github.com/libp2p/go-doh-resolver v0.4.0 // indirect
@@ -134,6 +138,7 @@ require (
github.com/libp2p/zeroconf/v2 v2.2.0 // indirect
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
+ github.com/mholt/acmez/v2 v2.0.3 // indirect
github.com/miekg/dns v1.1.62 // indirect
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect
github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect
@@ -173,7 +178,7 @@ require (
github.com/pion/turn/v2 v2.1.6 // indirect
github.com/pion/webrtc/v3 v3.3.4 // indirect
github.com/pkg/errors v0.9.1 // indirect
- github.com/pmezard/go-difflib v1.0.0 // indirect
+ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/polydawn/refmt v0.89.0 // indirect
github.com/prometheus/client_golang v1.20.5 // indirect
github.com/prometheus/client_model v0.6.1 // indirect
@@ -187,7 +192,7 @@ require (
github.com/samber/lo v1.46.0 // indirect
github.com/spaolacci/murmur3 v1.1.0 // indirect
github.com/stretchr/testify v1.9.0 // indirect
- github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect
+ github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect
github.com/ucarion/urlpath v0.0.0-20200424170820-7ccc79b76bbb // indirect
github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc // indirect
github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 // indirect
@@ -196,6 +201,7 @@ require (
github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 // indirect
github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 // indirect
github.com/wlynxg/anet v0.0.5 // indirect
+ github.com/zeebo/blake3 v0.2.4 // indirect
go.opencensus.io v0.24.0 // indirect
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect
go.opentelemetry.io/otel v1.28.0 // indirect
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index 077a67e6c..774aa59fe 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -61,6 +61,10 @@ github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku
github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY=
github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs=
github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s=
+github.com/caddyserver/certmagic v0.21.4 h1:e7VobB8rffHv8ZZpSiZtEwnLDHUwLVYLWzWSa1FfKI0=
+github.com/caddyserver/certmagic v0.21.4/go.mod h1:swUXjQ1T9ZtMv95qj7/InJvWLXURU85r+CfG0T+ZbDE=
+github.com/caddyserver/zerossl v0.1.3 h1:onS+pxp3M8HnHpN5MMbOMyNjmTheJyWRaZYwn+YTAyA=
+github.com/caddyserver/zerossl v0.1.3/go.mod h1:CxA0acn7oEGO6//4rtrRjYgEoa4MFw/XofZnrYwGqG4=
github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
@@ -111,8 +115,9 @@ github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0=
github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis=
github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
+github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR6AkioZ1ySsx5yxlDQZ8stG2b88gTPxgJU=
github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U=
github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y=
@@ -155,6 +160,7 @@ github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHk
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
+github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
github.com/gabriel-vasile/mimetype v1.4.4 h1:QjV6pZ7/XZ7ryI2KuyeEDE8wnh7fHP9YnQy+R0LnH8I=
@@ -174,6 +180,7 @@ github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
+github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0=
@@ -212,6 +219,8 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
@@ -227,6 +236,7 @@ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
@@ -238,6 +248,7 @@ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXi
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20241017200806-017d972448fc h1:NGyrhhFhwvRAZg02jnYVg3GBQy0qGBKmFQJwaPmpmxs=
github.com/google/pprof v0.0.0-20241017200806-017d972448fc/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
@@ -279,6 +290,7 @@ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpO
github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc=
github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8=
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
+github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/ipfs-shipyard/nopfs v0.0.12 h1:mvwaoefDF5VI9jyvgWCmaoTJIJFAfrbyQV5fJz35hlk=
github.com/ipfs-shipyard/nopfs v0.0.12/go.mod h1:mQyd0BElYI2gB/kq/Oue97obP4B3os4eBmgfPZ+hnrE=
@@ -390,6 +402,8 @@ github.com/ipld/go-ipld-prime v0.21.0 h1:n4JmcpOlPDIxBcY037SVfpd1G+Sj1nKZah0m6QH
github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOanyMctpPjsvxQ=
github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd h1:gMlw/MhNr2Wtp5RwGdsW23cs+yCuj9k2ON7i9MiJlRo=
github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd/go.mod h1:wZ8hH8UxeryOs4kJEJaiui/s00hDSbE37OKsL47g+Sw=
+github.com/ipshipyard/p2p-forge v0.0.0-20241028231853-f599f4803109 h1:Od9XhliY3EzRDCd/H6fMQ225+DSaS+CT0daHjEwbZTM=
+github.com/ipshipyard/p2p-forge v0.0.0-20241028231853-f599f4803109/go.mod h1:taPeh3PDSO8Ual0/N2tIOAUXPV8gZoPF3uPXoUyiq14=
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
github.com/jbenet/go-cienv v0.1.0 h1:Vc/s0QbQtoxX8MwwSLWWh+xNNZvM3Lw7NsTcHrvvhMc=
@@ -435,6 +449,8 @@ github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/libdns/libdns v0.2.2 h1:O6ws7bAfRPaBsgAYt8MDe2HcNBGC29hkZ9MX2eUSX3s=
+github.com/libdns/libdns v0.2.2/go.mod h1:4Bj9+5CQiNMVGf87wjX4CY3HQJypUHRuLvlsfsZqLWQ=
github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ=
github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM=
github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8=
@@ -502,6 +518,8 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
+github.com/mholt/acmez/v2 v2.0.3 h1:CgDBlEwg3QBp6s45tPQmFIBrkRIkBT4rW4orMM6p4sw=
+github.com/mholt/acmez/v2 v2.0.3/go.mod h1:pQ1ysaDeGrIMvJ9dfJMk5kJNkn7L2sb3UhyrX6Q91cw=
github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4=
github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=
github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4=
@@ -575,19 +593,23 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8m
github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo=
github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM=
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
+github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY=
github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc=
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
-github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
+github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
+github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
github.com/onsi/ginkgo/v2 v2.20.2 h1:7NVCeyIWROIAheY21RLS+3j2bb52W0W82tkberYytp4=
github.com/onsi/ginkgo/v2 v2.20.2/go.mod h1:K9gyxPIlb+aIvnZ8bd9Ak+YP18w3APlR+5coaZoE2ag=
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
+github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
+github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro=
github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k=
github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY=
github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
@@ -653,8 +675,9 @@ github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsK
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
+github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o=
github.com/polydawn/refmt v0.89.0 h1:ADJTApkvkeBZsN0tBTx8QjpD9JkmxbKp0cxfr9qszm4=
github.com/polydawn/refmt v0.89.0/go.mod h1:/zvteZs/GwLtCgZ4BL6CBsk9IKIlexP43ObX9AxTqTw=
@@ -744,8 +767,10 @@ github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
@@ -753,8 +778,8 @@ github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXl
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
-github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY=
-github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc=
+github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs=
+github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48=
github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA=
github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c h1:u6SKchux2yDvFQnDHS3lPnIRmfVJ5Sxy3ao2SIdysLQ=
github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9Kjc7aWznkXaL4U4TWaDSs8zcsY4Ka08nM=
@@ -795,6 +820,12 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
+github.com/zeebo/assert v1.1.0 h1:hU1L1vLTHsnO8x8c9KAR5GmM5QscxHg5RNU5z5qbUWY=
+github.com/zeebo/assert v1.1.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0=
+github.com/zeebo/blake3 v0.2.4 h1:KYQPkhpRtcqh0ssGYcKLG1JYvddkEA8QwCM/yBqhaZI=
+github.com/zeebo/blake3 v0.2.4/go.mod h1:7eeQ6d2iXWRGF6npfaxl2CU+xy2Fjo2gxeyZGCRUjcE=
+github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo=
+github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4=
go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA=
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
@@ -933,13 +964,15 @@ golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLL
golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
+golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
+golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
@@ -999,11 +1032,10 @@ golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -1012,6 +1044,8 @@ golang.org/x/sys v0.0.0-20210426080607-c94f62235c83/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@@ -1083,6 +1117,7 @@ golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapK
golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
@@ -1093,6 +1128,7 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY=
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90=
gonum.org/v1/gonum v0.15.0 h1:2lYxjRbTYyxkJxlhC+LvJIx3SsANPdRybu1tGj9/OrQ=
@@ -1160,6 +1196,8 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA=
google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
diff --git a/go.mod b/go.mod
index 1699a1e1b..ca181eea1 100644
--- a/go.mod
+++ b/go.mod
@@ -7,6 +7,7 @@ require (
contrib.go.opencensus.io/exporter/prometheus v0.4.2
github.com/benbjohnson/clock v1.3.5
github.com/blang/semver/v4 v4.0.0
+ github.com/caddyserver/certmagic v0.21.4
github.com/cenkalti/backoff/v4 v4.3.0
github.com/ceramicnetwork/go-dag-jose v0.1.0
github.com/cheggaaa/pb v1.0.29
@@ -48,6 +49,7 @@ require (
github.com/ipld/go-car/v2 v2.14.2
github.com/ipld/go-codec-dagpb v1.6.0
github.com/ipld/go-ipld-prime v0.21.0
+ github.com/ipshipyard/p2p-forge v0.0.0-20241028231853-f599f4803109
github.com/jbenet/go-temp-err-catcher v0.1.0
github.com/jbenet/goprocess v0.1.4
github.com/julienschmidt/httprouter v1.3.0
@@ -72,8 +74,8 @@ require (
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58
github.com/prometheus/client_golang v1.20.5
github.com/stretchr/testify v1.9.0
- github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7
- github.com/tidwall/gjson v1.14.4
+ github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d
+ github.com/tidwall/gjson v1.16.0
github.com/tidwall/sjson v1.2.5
github.com/whyrusleeping/go-sysinfo v0.0.0-20190219211824-4a357d4b90b1
github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7
@@ -102,7 +104,7 @@ require (
github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30 // indirect
github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5 // indirect
github.com/beorn7/perks v1.0.1 // indirect
- github.com/cespare/xxhash v1.1.0 // indirect
+ github.com/caddyserver/zerossl v0.1.3 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/cockroachdb/errors v1.11.3 // indirect
github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect
@@ -112,13 +114,14 @@ require (
github.com/containerd/cgroups v1.1.0 // indirect
github.com/crackcomm/go-gitignore v0.0.0-20231225121904-e25f5bc08668 // indirect
github.com/cskr/pubsub v1.0.2 // indirect
- github.com/davecgh/go-spew v1.1.1 // indirect
+ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect
github.com/dgraph-io/badger v1.6.2 // indirect
- github.com/dgraph-io/ristretto v0.0.2 // indirect
+ github.com/dgraph-io/ristretto v0.1.1 // indirect
github.com/docker/go-units v0.5.0 // indirect
github.com/elastic/gosigar v0.14.3 // indirect
+ github.com/fatih/color v1.15.0 // indirect
github.com/felixge/httpsnoop v1.0.4 // indirect
github.com/flynn/noise v1.1.0 // indirect
github.com/francoispqt/gojay v1.2.13 // indirect
@@ -131,6 +134,7 @@ require (
github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
github.com/godbus/dbus/v5 v5.1.0 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
+ github.com/golang/glog v1.2.0 // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/golang/protobuf v1.5.4 // indirect
github.com/golang/snappy v0.0.4 // indirect
@@ -162,6 +166,7 @@ require (
github.com/koron/go-ssdp v0.0.4 // indirect
github.com/kr/pretty v0.3.1 // indirect
github.com/kr/text v0.2.0 // indirect
+ github.com/libdns/libdns v0.2.2 // indirect
github.com/libp2p/go-buffer-pool v0.1.0 // indirect
github.com/libp2p/go-cidranger v1.1.0 // indirect
github.com/libp2p/go-flow-metrics v0.2.0 // indirect
@@ -177,8 +182,9 @@ require (
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
- github.com/mattn/go-runewidth v0.0.4 // indirect
+ github.com/mattn/go-runewidth v0.0.15 // indirect
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect
+ github.com/mholt/acmez/v2 v2.0.3 // indirect
github.com/miekg/dns v1.1.62 // indirect
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect
github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect
@@ -211,7 +217,7 @@ require (
github.com/pion/turn/v2 v2.1.6 // indirect
github.com/pion/webrtc/v3 v3.3.4 // indirect
github.com/pkg/errors v0.9.1 // indirect
- github.com/pmezard/go-difflib v1.0.0 // indirect
+ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/polydawn/refmt v0.89.0 // indirect
github.com/prometheus/client_model v0.6.1 // indirect
github.com/prometheus/common v0.60.0 // indirect
@@ -221,13 +227,14 @@ require (
github.com/quic-go/quic-go v0.48.1 // indirect
github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 // indirect
github.com/raulk/go-watchdog v1.3.0 // indirect
+ github.com/rivo/uniseg v0.4.4 // indirect
github.com/rogpeppe/go-internal v1.12.0 // indirect
github.com/rs/cors v1.10.1 // indirect
github.com/samber/lo v1.46.0 // indirect
github.com/spaolacci/murmur3 v1.1.0 // indirect
github.com/texttheater/golang-levenshtein v1.0.1 // indirect
github.com/tidwall/match v1.1.1 // indirect
- github.com/tidwall/pretty v1.2.0 // indirect
+ github.com/tidwall/pretty v1.2.1 // indirect
github.com/ucarion/urlpath v0.0.0-20200424170820-7ccc79b76bbb // indirect
github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc // indirect
github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 // indirect
@@ -235,6 +242,7 @@ require (
github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f // indirect
github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 // indirect
github.com/wlynxg/anet v0.0.5 // indirect
+ github.com/zeebo/blake3 v0.2.4 // indirect
go.opentelemetry.io/contrib/propagators/aws v1.21.1 // indirect
go.opentelemetry.io/contrib/propagators/b3 v1.21.1 // indirect
go.opentelemetry.io/contrib/propagators/jaeger v1.21.1 // indirect
diff --git a/go.sum b/go.sum
index 5c426d6c7..2c513c5a5 100644
--- a/go.sum
+++ b/go.sum
@@ -51,7 +51,6 @@ github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ=
github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo=
github.com/Jorropo/jsync v1.0.1 h1:6HgRolFZnsdfzRUj+ImB9og1JYOxQoReSywkHOGSaUU=
github.com/Jorropo/jsync v1.0.1/go.mod h1:jCOZj3vrBCri3bSU3ErUYvevKlnbssrXeCivybS5ABQ=
-github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE=
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII=
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
@@ -87,12 +86,15 @@ github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku
github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY=
github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs=
github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s=
+github.com/caddyserver/certmagic v0.21.4 h1:e7VobB8rffHv8ZZpSiZtEwnLDHUwLVYLWzWSa1FfKI0=
+github.com/caddyserver/certmagic v0.21.4/go.mod h1:swUXjQ1T9ZtMv95qj7/InJvWLXURU85r+CfG0T+ZbDE=
+github.com/caddyserver/zerossl v0.1.3 h1:onS+pxp3M8HnHpN5MMbOMyNjmTheJyWRaZYwn+YTAyA=
+github.com/caddyserver/zerossl v0.1.3/go.mod h1:CxA0acn7oEGO6//4rtrRjYgEoa4MFw/XofZnrYwGqG4=
github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/ceramicnetwork/go-dag-jose v0.1.0 h1:yJ/HVlfKpnD3LdYP03AHyTvbm3BpPiz2oZiOeReJRdU=
github.com/ceramicnetwork/go-dag-jose v0.1.0/go.mod h1:qYA1nYt0X8u4XoMAVoOV3upUVKtrxy/I670Dg5F0wjI=
-github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
@@ -142,8 +144,9 @@ github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0=
github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis=
github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
+github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR6AkioZ1ySsx5yxlDQZ8stG2b88gTPxgJU=
github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U=
github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y=
@@ -153,8 +156,9 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3
github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4=
github.com/dgraph-io/badger v1.6.2 h1:mNw0qs90GVgGGWylh0umH5iag1j6n/PeJtNvL6KY/x8=
github.com/dgraph-io/badger v1.6.2/go.mod h1:JW2yswe3V058sS0kZ2h/AXeDSqFjxnZcRrVH//y2UQE=
-github.com/dgraph-io/ristretto v0.0.2 h1:a5WaUrDa0qm0YrAAS1tUykT5El3kt62KNZZeMxQn3po=
github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E=
+github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8=
+github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA=
github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA=
github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
@@ -174,8 +178,9 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5 h1:BBso6MBKW8ncyZLv37o+KNyy0HrrHgfnOaGQC2qvN+A=
github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5/go.mod h1:JpoxHjuQauoxiFMl1ie8Xc/7TfLuMZ5eOCONd1sUBHg=
-github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s=
github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
+github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs=
+github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw=
github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
@@ -189,6 +194,7 @@ github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHk
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
+github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
github.com/gabriel-vasile/mimetype v1.4.4 h1:QjV6pZ7/XZ7ryI2KuyeEDE8wnh7fHP9YnQy+R0LnH8I=
@@ -221,6 +227,7 @@ github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ4
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0=
@@ -235,6 +242,8 @@ github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68=
+github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
@@ -300,6 +309,7 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf
github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20241017200806-017d972448fc h1:NGyrhhFhwvRAZg02jnYVg3GBQy0qGBKmFQJwaPmpmxs=
github.com/google/pprof v0.0.0-20241017200806-017d972448fc/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
@@ -343,6 +353,7 @@ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpO
github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc=
github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8=
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
+github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/ipfs-shipyard/nopfs v0.0.12 h1:mvwaoefDF5VI9jyvgWCmaoTJIJFAfrbyQV5fJz35hlk=
github.com/ipfs-shipyard/nopfs v0.0.12/go.mod h1:mQyd0BElYI2gB/kq/Oue97obP4B3os4eBmgfPZ+hnrE=
@@ -458,6 +469,8 @@ github.com/ipld/go-ipld-prime v0.21.0 h1:n4JmcpOlPDIxBcY037SVfpd1G+Sj1nKZah0m6QH
github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOanyMctpPjsvxQ=
github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd h1:gMlw/MhNr2Wtp5RwGdsW23cs+yCuj9k2ON7i9MiJlRo=
github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd/go.mod h1:wZ8hH8UxeryOs4kJEJaiui/s00hDSbE37OKsL47g+Sw=
+github.com/ipshipyard/p2p-forge v0.0.0-20241028231853-f599f4803109 h1:Od9XhliY3EzRDCd/H6fMQ225+DSaS+CT0daHjEwbZTM=
+github.com/ipshipyard/p2p-forge v0.0.0-20241028231853-f599f4803109/go.mod h1:taPeh3PDSO8Ual0/N2tIOAUXPV8gZoPF3uPXoUyiq14=
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
github.com/jbenet/go-cienv v0.1.0 h1:Vc/s0QbQtoxX8MwwSLWWh+xNNZvM3Lw7NsTcHrvvhMc=
@@ -514,6 +527,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
+github.com/libdns/libdns v0.2.2 h1:O6ws7bAfRPaBsgAYt8MDe2HcNBGC29hkZ9MX2eUSX3s=
+github.com/libdns/libdns v0.2.2/go.mod h1:4Bj9+5CQiNMVGf87wjX4CY3HQJypUHRuLvlsfsZqLWQ=
github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ=
github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM=
github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8=
@@ -591,11 +606,14 @@ github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27k
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
-github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y=
github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
+github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U=
+github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4=
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
+github.com/mholt/acmez/v2 v2.0.3 h1:CgDBlEwg3QBp6s45tPQmFIBrkRIkBT4rW4orMM6p4sw=
+github.com/mholt/acmez/v2 v2.0.3/go.mod h1:pQ1ysaDeGrIMvJ9dfJMk5kJNkn7L2sb3UhyrX6Q91cw=
github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4=
github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=
github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4=
@@ -675,19 +693,23 @@ github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRW
github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo=
github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM=
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
+github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY=
github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc=
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
-github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
+github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
+github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
github.com/onsi/ginkgo/v2 v2.20.2 h1:7NVCeyIWROIAheY21RLS+3j2bb52W0W82tkberYytp4=
github.com/onsi/ginkgo/v2 v2.20.2/go.mod h1:K9gyxPIlb+aIvnZ8bd9Ak+YP18w3APlR+5coaZoE2ag=
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
+github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
+github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro=
github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k=
github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY=
github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
@@ -754,8 +776,9 @@ github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
+github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o=
github.com/polydawn/refmt v0.89.0 h1:ADJTApkvkeBZsN0tBTx8QjpD9JkmxbKp0cxfr9qszm4=
github.com/polydawn/refmt v0.89.0/go.mod h1:/zvteZs/GwLtCgZ4BL6CBsk9IKIlexP43ObX9AxTqTw=
@@ -803,6 +826,9 @@ github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 h1:4WFk6
github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66/go.mod h1:Vp72IJajgeOL6ddqrAhmp7IM9zbTcgkQxD/YdxrVwMw=
github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk=
github.com/raulk/go-watchdog v1.3.0/go.mod h1:fIvOnLbF0b0ZwkB9YU4mOW9Did//4vPZtDqv66NfsMU=
+github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
+github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis=
+github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
@@ -872,9 +898,11 @@ github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
@@ -883,18 +911,19 @@ github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsT
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/stvp/go-udp-testing v0.0.0-20201019212854-469649b16807/go.mod h1:7jxmlfBCDBXRzr0eAQJ48XC1hBu1np4CS5+cHEYfwpc=
github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
-github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY=
-github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc=
+github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs=
+github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48=
github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA=
github.com/texttheater/golang-levenshtein v1.0.1 h1:+cRNoVrfiwufQPhoMzB6N0Yf/Mqajr6t1lOv8GyGE2U=
github.com/texttheater/golang-levenshtein v1.0.1/go.mod h1:PYAKrbF5sAiq9wd+H82hs7gNaen0CplQ9uvm6+enD/8=
github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
-github.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM=
-github.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
+github.com/tidwall/gjson v1.16.0 h1:SyXa+dsSPpUlcwEDuKuEBJEz5vzTvOea+9rjyYodQFg=
+github.com/tidwall/gjson v1.16.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
-github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=
github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
+github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=
+github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY=
github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28=
github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c h1:u6SKchux2yDvFQnDHS3lPnIRmfVJ5Sxy3ao2SIdysLQ=
@@ -940,6 +969,12 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
+github.com/zeebo/assert v1.1.0 h1:hU1L1vLTHsnO8x8c9KAR5GmM5QscxHg5RNU5z5qbUWY=
+github.com/zeebo/assert v1.1.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0=
+github.com/zeebo/blake3 v0.2.4 h1:KYQPkhpRtcqh0ssGYcKLG1JYvddkEA8QwCM/yBqhaZI=
+github.com/zeebo/blake3 v0.2.4/go.mod h1:7eeQ6d2iXWRGF6npfaxl2CU+xy2Fjo2gxeyZGCRUjcE=
+github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo=
+github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4=
go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA=
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
@@ -1105,7 +1140,6 @@ golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/
golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
-golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
@@ -1113,9 +1147,11 @@ golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
+golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
@@ -1195,15 +1231,14 @@ golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -1216,10 +1251,12 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@@ -1307,6 +1344,7 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY
golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
@@ -1317,6 +1355,7 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY=
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90=
gonum.org/v1/gonum v0.15.0 h1:2lYxjRbTYyxkJxlhC+LvJIx3SsANPdRybu1tGj9/OrQ=
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index 56ce421ae..80f598e62 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -39,6 +39,7 @@ require (
github.com/alingse/asasalint v0.0.11 // indirect
github.com/ashanbrown/forbidigo v1.6.0 // indirect
github.com/ashanbrown/makezero v1.1.1 // indirect
+ github.com/benbjohnson/clock v1.3.5 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/bitfield/gotestdox v0.2.2 // indirect
github.com/bkielbasa/cyclop v1.2.1 // indirect
@@ -48,6 +49,8 @@ require (
github.com/breml/errchkjson v0.3.6 // indirect
github.com/butuzov/ireturn v0.3.0 // indirect
github.com/butuzov/mirror v1.2.0 // indirect
+ github.com/caddyserver/certmagic v0.21.4 // indirect
+ github.com/caddyserver/zerossl v0.1.3 // indirect
github.com/catenacyber/perfsprint v0.7.1 // indirect
github.com/ccojocar/zxcvbn-go v1.0.2 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
@@ -58,6 +61,7 @@ require (
github.com/curioswitch/go-reassign v0.2.0 // indirect
github.com/daixiang0/gci v0.13.4 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
+ github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect
github.com/denis-tingaikin/go-header v0.5.0 // indirect
github.com/dnephin/pflag v1.0.7 // indirect
@@ -67,12 +71,15 @@ require (
github.com/fatih/color v1.17.0 // indirect
github.com/fatih/structtag v1.2.0 // indirect
github.com/firefart/nonamedreturns v1.0.5 // indirect
+ github.com/flynn/noise v1.1.0 // indirect
+ github.com/francoispqt/gojay v1.2.13 // indirect
github.com/fsnotify/fsnotify v1.7.0 // indirect
github.com/fzipp/gocyclo v0.6.0 // indirect
github.com/ghostiam/protogetter v0.3.6 // indirect
github.com/go-critic/go-critic v0.11.4 // indirect
github.com/go-logr/logr v1.4.2 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
+ github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
github.com/go-toolsmith/astcast v1.1.0 // indirect
github.com/go-toolsmith/astcopy v1.1.0 // indirect
github.com/go-toolsmith/astequal v1.2.0 // indirect
@@ -94,6 +101,7 @@ require (
github.com/golangci/unconvert v0.0.0-20240309020433-c5143eacb3ed // indirect
github.com/google/go-cmp v0.6.0 // indirect
github.com/google/gopacket v1.1.19 // indirect
+ github.com/google/pprof v0.0.0-20241017200806-017d972448fc // indirect
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/gordonklaus/ineffassign v0.1.0 // indirect
@@ -108,6 +116,7 @@ require (
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/hexops/gotextdiff v1.0.3 // indirect
+ github.com/huin/goupnp v1.3.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/ipfs/bbloom v0.0.4 // indirect
github.com/ipfs/boxo v0.24.2 // indirect
@@ -121,6 +130,9 @@ require (
github.com/ipfs/kubo v0.31.0 // indirect
github.com/ipld/go-codec-dagpb v1.6.0 // indirect
github.com/ipld/go-ipld-prime v0.21.0 // indirect
+ github.com/ipshipyard/p2p-forge v0.0.0-20241028231853-f599f4803109 // indirect
+ github.com/jackpal/go-nat-pmp v1.0.2 // indirect
+ github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect
github.com/jbenet/goprocess v0.1.4 // indirect
github.com/jgautheron/goconst v1.7.1 // indirect
github.com/jingyugao/rowserrcheck v1.1.1 // indirect
@@ -130,7 +142,9 @@ require (
github.com/karamaru-alpha/copyloopvar v1.1.0 // indirect
github.com/kisielk/errcheck v1.7.0 // indirect
github.com/kkHAIKE/contextcheck v1.1.5 // indirect
+ github.com/klauspost/compress v1.17.11 // indirect
github.com/klauspost/cpuid/v2 v2.2.8 // indirect
+ github.com/koron/go-ssdp v0.0.4 // indirect
github.com/kulti/thelper v0.6.3 // indirect
github.com/kunwardeep/paralleltest v1.0.10 // indirect
github.com/kyoh86/exportloopref v0.1.11 // indirect
@@ -138,8 +152,10 @@ require (
github.com/ldez/gomoddirectives v0.2.4 // indirect
github.com/ldez/tagliatelle v0.5.0 // indirect
github.com/leonklingele/grouper v1.1.2 // indirect
+ github.com/libdns/libdns v0.2.2 // indirect
github.com/libp2p/go-buffer-pool v0.1.0 // indirect
github.com/libp2p/go-cidranger v1.1.0 // indirect
+ github.com/libp2p/go-flow-metrics v0.2.0 // indirect
github.com/libp2p/go-libp2p v0.37.0 // indirect
github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect
github.com/libp2p/go-libp2p-kad-dht v0.27.0 // indirect
@@ -147,6 +163,7 @@ require (
github.com/libp2p/go-libp2p-record v0.2.0 // indirect
github.com/libp2p/go-libp2p-routing-helpers v0.7.4 // indirect
github.com/libp2p/go-msgio v0.3.0 // indirect
+ github.com/libp2p/go-nat v0.2.0 // indirect
github.com/libp2p/go-netroute v0.2.1 // indirect
github.com/lufeee/execinquery v1.2.1 // indirect
github.com/macabu/inamedparam v0.1.3 // indirect
@@ -159,6 +176,7 @@ require (
github.com/mattn/go-runewidth v0.0.15 // indirect
github.com/mattn/go-shellwords v1.0.12 // indirect
github.com/mgechev/revive v1.3.9 // indirect
+ github.com/mholt/acmez/v2 v2.0.3 // indirect
github.com/miekg/dns v1.1.62 // indirect
github.com/minio/sha256-simd v1.0.1 // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect
@@ -168,6 +186,7 @@ require (
github.com/multiformats/go-base32 v0.1.0 // indirect
github.com/multiformats/go-base36 v0.2.0 // indirect
github.com/multiformats/go-multiaddr-dns v0.4.0 // indirect
+ github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect
github.com/multiformats/go-multibase v0.2.0 // indirect
github.com/multiformats/go-multicodec v0.9.0 // indirect
github.com/multiformats/go-multistream v0.5.0 // indirect
@@ -178,7 +197,25 @@ require (
github.com/nishanths/predeclared v0.2.2 // indirect
github.com/nunnatsa/ginkgolinter v0.16.2 // indirect
github.com/olekukonko/tablewriter v0.0.5 // indirect
+ github.com/onsi/ginkgo/v2 v2.20.2 // indirect
+ github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
+ github.com/pion/datachannel v1.5.9 // indirect
+ github.com/pion/dtls/v2 v2.2.12 // indirect
+ github.com/pion/ice/v2 v2.3.36 // indirect
+ github.com/pion/interceptor v0.1.37 // indirect
+ github.com/pion/logging v0.2.2 // indirect
+ github.com/pion/mdns v0.0.12 // indirect
+ github.com/pion/randutil v0.1.0 // indirect
+ github.com/pion/rtcp v1.2.14 // indirect
+ github.com/pion/rtp v1.8.9 // indirect
+ github.com/pion/sctp v1.8.33 // indirect
+ github.com/pion/sdp/v3 v3.0.9 // indirect
+ github.com/pion/srtp/v2 v2.0.20 // indirect
+ github.com/pion/stun v0.6.1 // indirect
+ github.com/pion/transport/v2 v2.2.10 // indirect
+ github.com/pion/turn/v2 v2.1.6 // indirect
+ github.com/pion/webrtc/v3 v3.3.4 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/polydawn/refmt v0.89.0 // indirect
github.com/polyfloyd/go-errorlint v1.6.0 // indirect
@@ -191,6 +228,9 @@ require (
github.com/quasilyte/gogrep v0.5.0 // indirect
github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 // indirect
github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 // indirect
+ github.com/quic-go/qpack v0.5.1 // indirect
+ github.com/quic-go/quic-go v0.48.1 // indirect
+ github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 // indirect
github.com/rivo/uniseg v0.4.7 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/ryancurrah/gomodguard v1.3.3 // indirect
@@ -233,10 +273,12 @@ require (
github.com/uudashr/gocognit v1.1.3 // indirect
github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc // indirect
github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 // indirect
+ github.com/wlynxg/anet v0.0.5 // indirect
github.com/xen0n/gosmopolitan v1.2.2 // indirect
github.com/yagipy/maintidx v1.0.0 // indirect
github.com/yeya24/promlinter v0.3.0 // indirect
github.com/ykadowak/zerologlint v0.1.5 // indirect
+ github.com/zeebo/blake3 v0.2.4 // indirect
gitlab.com/bosi/decorder v0.4.2 // indirect
go-simpler.org/musttag v0.12.2 // indirect
go-simpler.org/sloglint v0.7.2 // indirect
@@ -245,6 +287,9 @@ require (
go.opentelemetry.io/otel/metric v1.28.0 // indirect
go.opentelemetry.io/otel/trace v1.28.0 // indirect
go.uber.org/automaxprocs v1.5.3 // indirect
+ go.uber.org/dig v1.18.0 // indirect
+ go.uber.org/fx v1.23.0 // indirect
+ go.uber.org/mock v0.5.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.27.0 // indirect
golang.org/x/crypto v0.28.0 // indirect
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index df758ace8..3f49a4a46 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -3,6 +3,14 @@
4d63.com/gochecknoglobals v0.2.1 h1:1eiorGsgHOFOuoOiJDy2psSrQbRdIHrlge0IJIkUgDc=
4d63.com/gochecknoglobals v0.2.1/go.mod h1:KRE8wtJB3CXCsb1xy421JfTHIIbmT3U5ruxw2Qu8fSU=
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.37.0/go.mod h1:TS1dMSSfndXH133OKGwekG838Om/cQT0BUHV3HcBgoo=
+dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU=
+dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU=
+dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4=
+dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU=
+git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg=
github.com/4meepo/tagalign v1.3.4 h1:P51VcvBnf04YkHzjfclN6BbsopfJR5rxs1n+5zHt+w8=
github.com/4meepo/tagalign v1.3.4/go.mod h1:M+pnkHH2vG8+qhE5bVc/zeP7HS/j910Fwa9TUSyZVI0=
github.com/Abirdcfly/dupword v0.0.14 h1:3U4ulkc8EUo+CaT105/GJ1BQwtgyj6+VaBVbAX11Ba8=
@@ -41,6 +49,7 @@ github.com/alexkohler/prealloc v1.0.0 h1:Hbq0/3fJPQhNkN0dR95AVrr6R7tou91y0uHG5pO
github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE=
github.com/alingse/asasalint v0.0.11 h1:SFwnQXJ49Kx/1GghOFz1XGqHYKp21Kq1nHad/0WQRnw=
github.com/alingse/asasalint v0.0.11/go.mod h1:nCaoMhw7a9kSJObvQyVzNTPBDbNpdocqrSP7t/cW5+I=
+github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
github.com/ashanbrown/forbidigo v1.6.0 h1:D3aewfM37Yb3pxHujIPSpTf6oQk9sc9WZi8gerOIVIY=
github.com/ashanbrown/forbidigo v1.6.0/go.mod h1:Y8j9jy9ZYAEHXdu723cUlraTqbzjKF1MUyfOKL+AjcU=
github.com/ashanbrown/makezero v1.1.1 h1:iCQ87C0V0vSyO+M9E/FZYbu65auqH0lnsOkf5FcB28s=
@@ -48,6 +57,7 @@ github.com/ashanbrown/makezero v1.1.1/go.mod h1:i1bJLCRSCHOcOa9Y6MyF2FTfMZMFdHvx
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o=
github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
+github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/bitfield/gotestdox v0.2.2 h1:x6RcPAbBbErKLnapz1QeAlf3ospg8efBsedU93CDsnE=
@@ -58,14 +68,20 @@ github.com/blizzy78/varnamelen v0.8.0 h1:oqSblyuQvFsW1hbBHh1zfwrKe3kcSj0rnXkKzsQ
github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k=
github.com/bombsimon/wsl/v4 v4.4.1 h1:jfUaCkN+aUpobrMO24zwyAMwMAV5eSziCkOKEauOLdw=
github.com/bombsimon/wsl/v4 v4.4.1/go.mod h1:Xu/kDxGZTofQcDGCtQe9KCzhHphIe0fDuyWTxER9Feo=
+github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g=
github.com/breml/bidichk v0.2.7 h1:dAkKQPLl/Qrk7hnP6P+E0xOodrq8Us7+U0o4UBOAlQY=
github.com/breml/bidichk v0.2.7/go.mod h1:YodjipAGI9fGcYM7II6wFvGhdMYsC5pHDlGzqvEW3tQ=
github.com/breml/errchkjson v0.3.6 h1:VLhVkqSBH96AvXEyclMR37rZslRrY2kcyq+31HCsVrA=
github.com/breml/errchkjson v0.3.6/go.mod h1:jhSDoFheAF2RSDOlCfhHO9KqhZgAYLyvHe7bRCX8f/U=
+github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s=
github.com/butuzov/ireturn v0.3.0 h1:hTjMqWw3y5JC3kpnC5vXmFJAWI/m31jaCYQqzkS6PL0=
github.com/butuzov/ireturn v0.3.0/go.mod h1:A09nIiwiqzN/IoVo9ogpa0Hzi9fex1kd9PSD6edP5ZA=
github.com/butuzov/mirror v1.2.0 h1:9YVK1qIjNspaqWutSv8gsge2e/Xpq1eqEkslEUHy5cs=
github.com/butuzov/mirror v1.2.0/go.mod h1:DqZZDtzm42wIAIyHXeN8W/qb1EPlb9Qn/if9icBOpdQ=
+github.com/caddyserver/certmagic v0.21.4 h1:e7VobB8rffHv8ZZpSiZtEwnLDHUwLVYLWzWSa1FfKI0=
+github.com/caddyserver/certmagic v0.21.4/go.mod h1:swUXjQ1T9ZtMv95qj7/InJvWLXURU85r+CfG0T+ZbDE=
+github.com/caddyserver/zerossl v0.1.3 h1:onS+pxp3M8HnHpN5MMbOMyNjmTheJyWRaZYwn+YTAyA=
+github.com/caddyserver/zerossl v0.1.3/go.mod h1:CxA0acn7oEGO6//4rtrRjYgEoa4MFw/XofZnrYwGqG4=
github.com/catenacyber/perfsprint v0.7.1 h1:PGW5G/Kxn+YrN04cRAZKC+ZuvlVwolYMrIyyTJ/rMmc=
github.com/catenacyber/perfsprint v0.7.1/go.mod h1:/wclWYompEyjUD2FuIIDVKNkqz7IgBIWXIH3V0Zol50=
github.com/ccojocar/zxcvbn-go v1.0.2 h1:na/czXU8RrhXO4EZme6eQJLR4PzcGsahsBOAwU6I3Vg=
@@ -83,6 +99,8 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM=
github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw=
+github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d h1:t5Wuyh53qYyg9eqn4BbnlIT+vmhyww0TatL+zT3uWgI=
+github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs=
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
@@ -111,6 +129,7 @@ github.com/dnephin/pflag v1.0.7 h1:oxONGlWxhmUct0YzKTgrpQv9AUA1wtPBn7zuSjJqptk=
github.com/dnephin/pflag v1.0.7/go.mod h1:uxE91IoWURlOiTUIA8Mq5ZZkAv3dPUfZNaT80Zm7OQE=
github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
+github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
github.com/elastic/gosigar v0.14.3 h1:xwkKwPia+hSfg9GqrCUKYdId102m9qTJIIr7egmK/uo=
@@ -131,20 +150,25 @@ github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4
github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=
github.com/firefart/nonamedreturns v1.0.5 h1:tM+Me2ZaXs8tfdDw3X6DOX++wMCOqzYUho6tUTYIdRA=
github.com/firefart/nonamedreturns v1.0.5/go.mod h1:gHJjDqhGM4WyPt639SOZs+G89Ko7QKH5R5BhnO6xJhw=
+github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
github.com/flynn/noise v1.1.0 h1:KjPQoQCEFdZDiP03phOvGi11+SVVhBG2wOWAorLsstg=
github.com/flynn/noise v1.1.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag=
github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk=
github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY=
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
+github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo=
github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA=
+github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/ghostiam/protogetter v0.3.6 h1:R7qEWaSgFCsy20yYHNIJsU9ZOb8TziSRRxuAOTVKeOk=
github.com/ghostiam/protogetter v0.3.6/go.mod h1:7lpeDnEJ1ZjL/YtyoN99ljO4z0pd3H0d18/t2dPBxHw=
+github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
github.com/go-critic/go-critic v0.11.4 h1:O7kGOCx0NDIni4czrkRIXTnit0mkyKOCePh3My6OyEU=
github.com/go-critic/go-critic v0.11.4/go.mod h1:2QAdo4iuLik5S9YG0rT4wcZ8QxwHYkrr6/2MWAiv/vc=
+github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
@@ -184,14 +208,18 @@ github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E=
github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeHCoD0=
+github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
@@ -216,6 +244,7 @@ github.com/golangci/revgrep v0.5.3 h1:3tL7c1XBMtWHHqVpS5ChmiAAoe4PF/d5+ULzV9sLAz
github.com/golangci/revgrep v0.5.3/go.mod h1:U4R/s9dlXZsg8uJmaR1GrloUr14D7qDl8gi2iPXJH8k=
github.com/golangci/unconvert v0.0.0-20240309020433-c5143eacb3ed h1:IURFTjxeTfNFP0hTEi1YKjB/ub8zkpaOqFFMApi2EAs=
github.com/golangci/unconvert v0.0.0-20240309020433-c5143eacb3ed/go.mod h1:XLXN8bNw4CGRPaqgl3bv/lhz7bsGPh4/xSaMTbo2vkQ=
+github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
@@ -230,15 +259,22 @@ github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ=
+github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8=
github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo=
+github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
+github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof v0.0.0-20241017200806-017d972448fc h1:NGyrhhFhwvRAZg02jnYVg3GBQy0qGBKmFQJwaPmpmxs=
github.com/google/pprof v0.0.0-20241017200806-017d972448fc/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY=
+github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c h1:7lF+Vz0LqiRidnzC1Oq86fpX1q/iEv2KJdrCtttYjT4=
github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
@@ -258,6 +294,8 @@ github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW
github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M=
github.com/gostaticanalysis/testutil v0.4.0 h1:nhdCmubdmDF6VEatUNjgUZBJKWRqugoISdUv3PPQgHY=
github.com/gostaticanalysis/testutil v0.4.0/go.mod h1:bLIoPefWXrRi/ssLFWX1dx7Repi5x3CuviD3dgAZaBU=
+github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
+github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw=
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
@@ -320,6 +358,8 @@ github.com/ipld/go-codec-dagpb v1.6.0 h1:9nYazfyu9B1p3NAgfVdpRco3Fs2nFC72DqVsMj6
github.com/ipld/go-codec-dagpb v1.6.0/go.mod h1:ANzFhfP2uMJxRBr8CE+WQWs5UsNa0pYtmKZ+agnUw9s=
github.com/ipld/go-ipld-prime v0.21.0 h1:n4JmcpOlPDIxBcY037SVfpd1G+Sj1nKZah0m6QH9C2E=
github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOanyMctpPjsvxQ=
+github.com/ipshipyard/p2p-forge v0.0.0-20241028231853-f599f4803109 h1:Od9XhliY3EzRDCd/H6fMQ225+DSaS+CT0daHjEwbZTM=
+github.com/ipshipyard/p2p-forge v0.0.0-20241028231853-f599f4803109/go.mod h1:taPeh3PDSO8Ual0/N2tIOAUXPV8gZoPF3uPXoUyiq14=
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA=
@@ -331,6 +371,7 @@ github.com/jbenet/go-temp-err-catcher v0.1.0 h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABo
github.com/jbenet/go-temp-err-catcher v0.1.0/go.mod h1:0kJRvmDZXNMIiJirNPEYfhpPwbGVtZVWC34vc5WLsDk=
github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o=
github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4=
+github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU=
github.com/jgautheron/goconst v1.7.1 h1:VpdAG7Ca7yvvJk5n8dMwQhfEZJh95kl/Hl9S1OI5Jkk=
github.com/jgautheron/goconst v1.7.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4=
github.com/jingyugao/rowserrcheck v1.1.1 h1:zibz55j/MJtLsjP1OF4bSdgXxwL1b+Vn7Tjzq7gFzUs=
@@ -339,6 +380,8 @@ github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af h1:KA9B
github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0=
github.com/jjti/go-spancheck v0.6.2 h1:iYtoxqPMzHUPp7St+5yA8+cONdyXD3ug6KK15n7Pklk=
github.com/jjti/go-spancheck v0.6.2/go.mod h1:+X7lvIrR5ZdUTkxFYqzJ0abr8Sb5LOo80uOhWNqIrYA=
+github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
+github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
github.com/julz/importas v0.1.0 h1:F78HnrsjY3cR7j0etXy5+TU1Zuy7Xt08X/1aJnH5xXY=
@@ -358,9 +401,11 @@ github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZY
github.com/koron/go-ssdp v0.0.4 h1:1IDwrghSKYM7yLf7XCzbByg2sJ/JcNOZRXS2jczTwz0=
github.com/koron/go-ssdp v0.0.4/go.mod h1:oDXq+E5IL5q0U8uSBcoAXzTzInwy5lEgC91HoKtbmZk=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
@@ -378,6 +423,8 @@ github.com/ldez/tagliatelle v0.5.0 h1:epgfuYt9v0CG3fms0pEgIMNPuFf/LpPIfjk4kyqSio
github.com/ldez/tagliatelle v0.5.0/go.mod h1:rj1HmWiL1MiKQuOONhd09iySTEkUuE/8+5jtPYz9xa4=
github.com/leonklingele/grouper v1.1.2 h1:o1ARBDLOmmasUaNDesWqWCIFH3u7hoFlM84YrjT3mIY=
github.com/leonklingele/grouper v1.1.2/go.mod h1:6D0M/HVkhs2yRKRFZUoGjeDy7EZTfFBE9gl4kjmIGkA=
+github.com/libdns/libdns v0.2.2 h1:O6ws7bAfRPaBsgAYt8MDe2HcNBGC29hkZ9MX2eUSX3s=
+github.com/libdns/libdns v0.2.2/go.mod h1:4Bj9+5CQiNMVGf87wjX4CY3HQJypUHRuLvlsfsZqLWQ=
github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8=
github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg=
github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38yPW7c=
@@ -410,10 +457,12 @@ github.com/libp2p/go-yamux/v4 v4.0.1 h1:FfDR4S1wj6Bw2Pqbc8Uz7pCxeRBPbwsBbEdfwiCy
github.com/libp2p/go-yamux/v4 v4.0.1/go.mod h1:NWjl8ZTLOGlozrXSOZ/HlfG++39iKNnM5wwmtQP1YB4=
github.com/lufeee/execinquery v1.2.1 h1:hf0Ems4SHcUGBxpGN7Jz78z1ppVkP/837ZlETPCEtOM=
github.com/lufeee/execinquery v1.2.1/go.mod h1:EC7DrEKView09ocscGHC+apXMIaorh4xqSxS/dy8SbM=
+github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI=
github.com/macabu/inamedparam v0.1.3 h1:2tk/phHkMlEL/1GNe/Yf6kkR/hkcUdAEY3L0hjYV1Mk=
github.com/macabu/inamedparam v0.1.3/go.mod h1:93FLICAIk/quk7eaPPQvbzihUdn/QkGDwIZEoLtpH6I=
github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
+github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/maratori/testableexamples v1.0.0 h1:dU5alXRrD8WKSjOUnmJZuzdxWOEQ57+7s93SLMxb2vI=
github.com/maratori/testableexamples v1.0.0/go.mod h1:4rhjL1n20TUTT4vdh3RDqSizKLyXp7K2u6HgraZCGzE=
github.com/maratori/testpackage v1.1.1 h1:S58XVV5AD7HADMmD0fNnziNHqKvSdDuEKdPD1rNTU04=
@@ -437,28 +486,38 @@ github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZ
github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk=
github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y=
+github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/mgechev/revive v1.3.9 h1:18Y3R4a2USSBF+QZKFQwVkBROUda7uoBlkEuBD+YD1A=
github.com/mgechev/revive v1.3.9/go.mod h1:+uxEIr5UH0TjXWHTno3xh4u7eg6jDpXKzQccA9UGhHU=
+github.com/mholt/acmez/v2 v2.0.3 h1:CgDBlEwg3QBp6s45tPQmFIBrkRIkBT4rW4orMM6p4sw=
+github.com/mholt/acmez/v2 v2.0.3/go.mod h1:pQ1ysaDeGrIMvJ9dfJMk5kJNkn7L2sb3UhyrX6Q91cw=
+github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4=
github.com/miekg/dns v1.1.62 h1:cN8OuEF1/x5Rq6Np+h1epln8OiyPWV+lROx9LxcGgIQ=
github.com/miekg/dns v1.1.62/go.mod h1:mvDlcItzm+br7MToIKqkglaGhlFMHJ9DTNNWONWXbNQ=
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc=
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b/go.mod h1:lxPUiZwKoFL8DUUmalo2yJJUCxbPKtm8OKfqr2/FTNU=
github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc h1:PTfri+PuQmWDqERdnNMiD9ZejrlswWrCpBEZgWOiTrc=
github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc/go.mod h1:cGKTAVKx4SxOuR/czcZ/E2RSJ3sfHs8FpHhQ5CWMf9s=
+github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ=
+github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM=
github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM=
github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8=
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/moricho/tparallel v0.3.2 h1:odr8aZVFA3NZrNybggMkYO3rgPRcqjeQUlBBFVxKHTI=
github.com/moricho/tparallel v0.3.2/go.mod h1:OQ+K3b4Ln3l2TZveGCywybl68glfLEwFGqvnjok8b+U=
+github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o=
github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aGkbLYxPE=
github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI=
github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0=
github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4=
+github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo=
github.com/multiformats/go-multiaddr v0.13.0 h1:BCBzs61E3AGHcYYTv8dqRH43ZfyrqM8RXVPT8t13tLQ=
github.com/multiformats/go-multiaddr v0.13.0/go.mod h1:sBXrNzucqkFJhvKOiwwLyqamGa/P5EIXNPLovyhQCII=
github.com/multiformats/go-multiaddr-dns v0.4.0 h1:P76EJ3qzBXpUXZ3twdCDx/kvagMsNo0LMFXpyms/zgU=
@@ -469,6 +528,7 @@ github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivnc
github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk=
github.com/multiformats/go-multicodec v0.9.0 h1:pb/dlPnzee/Sxv/j4PmkDRxCOi3hXTz3IbPKOXWJkmg=
github.com/multiformats/go-multicodec v0.9.0/go.mod h1:L3QTQvMIaVBkXOXXtVmYE+LI16i14xuaojr/H7Ai54k=
+github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew=
github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U=
github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM=
github.com/multiformats/go-multistream v0.5.0 h1:5htLSLl7lvJk3xx3qT/8Zm9J4K8vEOf/QGkvOGQAyiE=
@@ -479,6 +539,8 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
github.com/nakabonne/nestif v0.3.1 h1:wm28nZjhQY5HyYPx+weN3Q65k6ilSBxDb8v5S81B81U=
github.com/nakabonne/nestif v0.3.1/go.mod h1:9EtoZochLn5iUprVDmDjqGKPofoUEBL8U4Ngq6aY7OE=
+github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo=
+github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM=
github.com/nishanths/exhaustive v0.12.0 h1:vIY9sALmw6T/yxiASewa4TQcFsVYZQQRUQJhKRf3Swg=
github.com/nishanths/exhaustive v0.12.0/go.mod h1:mEZ95wPIZW+x8kC4TgC+9YCUgiST7ecevsVDTgc2obs=
github.com/nishanths/predeclared v0.2.2 h1:V2EPdZPliZymNAn79T8RkNApBjMmVKh5XRpLm/w98Vk=
@@ -493,6 +555,7 @@ github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k=
github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY=
github.com/opencontainers/runtime-spec v1.2.0 h1:z97+pHb3uELt/yiAWD691HNHQIF07bE7dzrbT927iTk=
github.com/opencontainers/runtime-spec v1.2.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
+github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8=
github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw=
github.com/otiai10/copy v1.14.0 h1:dCI/t1iTdYGtkvCuBG2BgR6KZa83PTclw4U5n2wAllU=
github.com/otiai10/copy v1.14.0/go.mod h1:ECfuL02W+/FkTWZWgQqXPWZgW9oeKCSQ5qVfSc4qc4w=
@@ -506,6 +569,7 @@ github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6
github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
github.com/pion/datachannel v1.5.9 h1:LpIWAOYPyDrXtU+BW7X0Yt/vGtYxtXQ8ql7dFfYUVZA=
github.com/pion/datachannel v1.5.9/go.mod h1:kDUuk4CU4Uxp82NH4LQZbISULkX/HtzKa4P7ldf9izE=
+github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s=
github.com/pion/dtls/v2 v2.2.12 h1:KP7H5/c1EiVAAKUmXyCzPiQe5+bCJrpOeKg/L05dunk=
github.com/pion/dtls/v2 v2.2.12/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE=
github.com/pion/ice/v2 v2.3.36 h1:SopeXiVbbcooUg2EIR8sq4b13RQ8gzrkkldOVg+bBsc=
@@ -518,8 +582,10 @@ github.com/pion/mdns v0.0.12 h1:CiMYlY+O0azojWDmxdNr7ADGrnZ+V6Ilfner+6mSVK8=
github.com/pion/mdns v0.0.12/go.mod h1:VExJjv8to/6Wqm1FXK+Ii/Z9tsVk/F5sD/N70cnYFbk=
github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA=
github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8=
+github.com/pion/rtcp v1.2.12/go.mod h1:sn6qjxvnwyAkkPzPULIbVqSKI5Dv54Rv7VG0kNxh9L4=
github.com/pion/rtcp v1.2.14 h1:KCkGV3vJ+4DAJmvP0vaQShsb0xkRfWkO540Gy102KyE=
github.com/pion/rtcp v1.2.14/go.mod h1:sn6qjxvnwyAkkPzPULIbVqSKI5Dv54Rv7VG0kNxh9L4=
+github.com/pion/rtp v1.8.3/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU=
github.com/pion/rtp v1.8.9 h1:E2HX740TZKaqdcPmf4pw6ZZuG8u5RlMMt+l3dxeu6Wk=
github.com/pion/rtp v1.8.9/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU=
github.com/pion/sctp v1.8.33 h1:dSE4wX6uTJBcNm8+YlMg7lw1wqyKHggsP5uKbdj+NZw=
@@ -530,8 +596,15 @@ github.com/pion/srtp/v2 v2.0.20 h1:HNNny4s+OUmG280ETrCdgFndp4ufx3/uy85EawYEhTk=
github.com/pion/srtp/v2 v2.0.20/go.mod h1:0KJQjA99A6/a0DOVTu1PhDSw0CXF2jTkqOoMg3ODqdA=
github.com/pion/stun v0.6.1 h1:8lp6YejULeHBF8NmV8e2787BogQhduZugh5PdhDyyN4=
github.com/pion/stun v0.6.1/go.mod h1:/hO7APkX4hZKu/D0f2lHzNyvdkTGtIy3NDmLR7kSz/8=
+github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1Aq29pGcU5g=
+github.com/pion/transport/v2 v2.2.3/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0=
+github.com/pion/transport/v2 v2.2.4/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0=
github.com/pion/transport/v2 v2.2.10 h1:ucLBLE8nuxiHfvkFKnkDQRYWYfp8ejf4YBOPfaQpw6Q=
github.com/pion/transport/v2 v2.2.10/go.mod h1:sq1kSLWs+cHW9E+2fJP95QudkzbK7wscs8yYgQToO5E=
+github.com/pion/transport/v3 v3.0.1/go.mod h1:UY7kiITrlMv7/IKgd5eTUcaahZx5oUN3l9SzK5f5xE0=
+github.com/pion/transport/v3 v3.0.7 h1:iRbMH05BzSNwhILHoBoAPxoB9xQgOaJk+591KC9P1o0=
+github.com/pion/transport/v3 v3.0.7/go.mod h1:YleKiTZ4vqNxVwh77Z0zytYi7rXHl7j6uPLGhhz9rwo=
+github.com/pion/turn/v2 v2.1.3/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY=
github.com/pion/turn/v2 v2.1.6 h1:Xr2niVsiPTB0FPtt+yAWKFUkU1eotQbGgpTIld4x1Gc=
github.com/pion/turn/v2 v2.1.6/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY=
github.com/pion/webrtc/v3 v3.3.4 h1:v2heQVnXTSqNRXcaFQVOhIOYkLMxOu1iJG8uy1djvkk=
@@ -548,13 +621,17 @@ github.com/polyfloyd/go-errorlint v1.6.0 h1:tftWV9DE7txiFzPpztTAwyoRLKNj9gpVm2cg
github.com/polyfloyd/go-errorlint v1.6.0/go.mod h1:HR7u8wuP1kb1NeN1zqTd1ZMlqUKPPHF+Id4vIPvDqVw=
github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g=
github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U=
+github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y=
github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
+github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
+github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
github.com/prometheus/common v0.60.0 h1:+V9PAREWNvJMAuJ1x1BaWl9dewMW4YrHZQbx0sJNllA=
github.com/prometheus/common v0.60.0/go.mod h1:h0LYf1R1deLSKtD4Vdg8gy4RuOvENW2J/h19V5NADQw=
+github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
github.com/quasilyte/go-ruleguard v0.4.2 h1:htXcXDK6/rO12kiTHKfHuqR4kr3Y4M0J0rOL6CH/BYs=
@@ -581,6 +658,7 @@ github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUc
github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
+github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
@@ -604,11 +682,32 @@ github.com/sashamelentyev/usestdlibvars v1.27.0 h1:t/3jZpSXtRPRf2xr0m63i32Zrusyu
github.com/sashamelentyev/usestdlibvars v1.27.0/go.mod h1:9nl0jgOfHKWNFS43Ojw0i7aRoS4j6EBye3YBhmAIRF8=
github.com/securego/gosec/v2 v2.20.1-0.20240820084340-81cda2f91fbe h1:exdneYmXwZ4+VaIWv9mQ47uIHkTQSN50DYdCjXJ1cdQ=
github.com/securego/gosec/v2 v2.20.1-0.20240820084340-81cda2f91fbe/go.mod h1:iyeMMRw8QEmueUSZ2VqmkQMiDyDcobfPnG00CV/NWdE=
+github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c h1:W65qqJCIOVP4jpqPQ0YvHYKwcMEMVWIzWC5iNQQfBTU=
github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs=
+github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY=
+github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM=
+github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0=
github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk=
github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ=
+github.com/shurcooL/gofontwoff v0.0.0-20180329035133-29b52fc0a18d/go.mod h1:05UtEgK5zq39gLST6uB0cf3NEHjETfB4Fgr3Gx5R9Vw=
+github.com/shurcooL/gopherjslib v0.0.0-20160914041154-feb6d3990c2c/go.mod h1:8d3azKNyqcHP1GaQE/c6dDgjkgSx2BZ4IoEi4F1reUI=
+github.com/shurcooL/highlight_diff v0.0.0-20170515013008-09bb4053de1b/go.mod h1:ZpfEhSmds4ytuByIcDnOLkTHGUI6KNqRNPDLHDk+mUU=
+github.com/shurcooL/highlight_go v0.0.0-20181028180052-98c3abbbae20/go.mod h1:UDKB5a1T23gOMUJrI+uSuH0VRDStOiUVSjBTRDVBVag=
+github.com/shurcooL/home v0.0.0-20181020052607-80b7ffcb30f9/go.mod h1:+rgNQw2P9ARFAs37qieuu7ohDNQ3gds9msbT2yn85sg=
+github.com/shurcooL/htmlg v0.0.0-20170918183704-d01228ac9e50/go.mod h1:zPn1wHpTIePGnXSHpsVPWEktKXHr6+SS6x/IKRb7cpw=
+github.com/shurcooL/httperror v0.0.0-20170206035902-86b7830d14cc/go.mod h1:aYMfkZ6DWSJPJ6c4Wwz3QtW22G7mf/PEgaB9k/ik5+Y=
+github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg=
+github.com/shurcooL/httpgzip v0.0.0-20180522190206-b1c53ac65af9/go.mod h1:919LwcH0M7/W4fcZ0/jy0qGght1GIhqyS/EgWGH2j5Q=
+github.com/shurcooL/issues v0.0.0-20181008053335-6292fdc1e191/go.mod h1:e2qWDig5bLteJ4fwvDAc2NHzqFEthkqn7aOZAOpj+PQ=
+github.com/shurcooL/issuesapp v0.0.0-20180602232740-048589ce2241/go.mod h1:NPpHK2TI7iSaM0buivtFUc9offApnI0Alt/K8hcHy0I=
+github.com/shurcooL/notifications v0.0.0-20181007000457-627ab5aea122/go.mod h1:b5uSkrEVM1jQUspwbixRBhaIjIzL2xazXp6kntxYle0=
+github.com/shurcooL/octicon v0.0.0-20181028054416-fa4f57f9efb2/go.mod h1:eWdoE5JD4R5UVWDucdOPg1g2fqQRq78IQa9zlOV1vpQ=
+github.com/shurcooL/reactions v0.0.0-20181006231557-f2e0b4ca5b82/go.mod h1:TCR1lToEk4d2s07G3XGfz2QrgHXg4RJBvjrOozvoWfk=
+github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
+github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4=
+github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/sivchari/containedctx v1.0.3 h1:x+etemjbsh2fB5ewm5FeLNi5bUjK0V8n0RB+Wwfd0XE=
@@ -621,10 +720,12 @@ github.com/smartystreets/goconvey v1.7.2 h1:9RBaZCeXEQ3UselpuwUQHltGVXvdwm6cv1hg
github.com/smartystreets/goconvey v1.7.2/go.mod h1:Vw0tHAZW6lzCRk3xgdin6fKYcG+G3Pg9vgXWeJpQFMM=
github.com/sonatard/noctx v0.0.2 h1:L7Dz4De2zDQhW8S0t+KUjY0MAQJd6SgVwhzNIc4ok00=
github.com/sonatard/noctx v0.0.2/go.mod h1:kzFz+CzWSjQ2OzIm46uJZoXuBpa2+0y3T36U18dWqIo=
+github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE=
github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=
github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=
github.com/sourcegraph/go-diff v0.7.0 h1:9uLlrd5T46OXs5qpp8L/MTltk0zikUGi0sNNyCpA8G0=
github.com/sourcegraph/go-diff v0.7.0/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs=
+github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA=
github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=
github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8=
@@ -646,6 +747,7 @@ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSS
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
@@ -653,11 +755,13 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
+github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA=
github.com/tdakkota/asciicheck v0.2.0 h1:o8jvnUANo0qXtnslk2d3nMKTFNlOnJjRrNcj0j9qkHM=
github.com/tdakkota/asciicheck v0.2.0/go.mod h1:Qb7Y9EgjCLJGup51gDHFzbI08/gbGhL/UVhYIPWG2rg=
github.com/tenntenn/modver v1.0.1 h1:2klLppGhDgzJrScMpkj9Ujy3rXPUspSjAcev9tSEBgA=
@@ -683,6 +787,8 @@ github.com/urfave/cli v1.22.16 h1:MH0k6uJxdwdeWQTwhSO42Pwr4YLrNLwBtg1MRgTqPdQ=
github.com/urfave/cli v1.22.16/go.mod h1:EeJR6BKodywf4zciqrdw6hpCPk68JO9z5LazXZMn5Po=
github.com/uudashr/gocognit v1.1.3 h1:l+a111VcDbKfynh+airAy/DJQKaXh2m9vkoysMPSZyM=
github.com/uudashr/gocognit v1.1.3/go.mod h1:aKH8/e8xbTRBwjbCkwZ8qt4l2EpKXl31KMHgSS+lZ2U=
+github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU=
+github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM=
github.com/warpfork/go-testmark v0.12.1 h1:rMgCpJfwy1sJ50x0M0NgyphxYYPMOODIJHhsXyEHU0s=
github.com/warpfork/go-testmark v0.12.1/go.mod h1:kHwy7wfvGSPh1rQJYKayD4AbtNaeyZdcGi9tNJTaa5Y=
github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0 h1:GDDkbFiaK8jsSDJfjId/PEGEShv6ugrt4kYsC5UIDaQ=
@@ -691,6 +797,7 @@ github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc h1:BCPnHtcboa
github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc/go.mod h1:r45hJU7yEoA81k6MWNhpMj/kms0n14dkzkxYHoB96UM=
github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 h1:EKhdznlJHPMoKr0XTrX+IlJs1LH3lyx2nfr1dOlZ79k=
github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc=
+github.com/wlynxg/anet v0.0.3/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA=
github.com/wlynxg/anet v0.0.5 h1:J3VJGi1gvo0JwZ/P1/Yc/8p63SoW98B5dHkYDmpgvvU=
github.com/wlynxg/anet v0.0.5/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA=
github.com/xen0n/gosmopolitan v1.2.2 h1:/p2KTnMzwRexIW8GlKawsTWOxn7UHA+jCMF/V8HHtvU=
@@ -708,6 +815,12 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
+github.com/zeebo/assert v1.1.0 h1:hU1L1vLTHsnO8x8c9KAR5GmM5QscxHg5RNU5z5qbUWY=
+github.com/zeebo/assert v1.1.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0=
+github.com/zeebo/blake3 v0.2.4 h1:KYQPkhpRtcqh0ssGYcKLG1JYvddkEA8QwCM/yBqhaZI=
+github.com/zeebo/blake3 v0.2.4/go.mod h1:7eeQ6d2iXWRGF6npfaxl2CU+xy2Fjo2gxeyZGCRUjcE=
+github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo=
+github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4=
gitlab.com/bosi/decorder v0.4.2 h1:qbQaV3zgwnBZ4zPMhGLW4KZe7A7NwxEhJx39R3shffo=
gitlab.com/bosi/decorder v0.4.2/go.mod h1:muuhHoaJkA9QLcYHq4Mj8FJUwDZ+EirSHRiaTcTf6T8=
go-simpler.org/assert v0.9.0 h1:PfpmcSvL7yAnWyChSjOz6Sp6m9j5lyK8Ok9pEL31YkQ=
@@ -716,6 +829,7 @@ go-simpler.org/musttag v0.12.2 h1:J7lRc2ysXOq7eM8rwaTYnNrHd5JwjppzB6mScysB2Cs=
go-simpler.org/musttag v0.12.2/go.mod h1:uN1DVIasMTQKk6XSik7yrJoEysGtR2GRqvWnI9S7TYM=
go-simpler.org/sloglint v0.7.2 h1:Wc9Em/Zeuu7JYpl+oKoYOsQSy2X560aVueCW/m6IijY=
go-simpler.org/sloglint v0.7.2/go.mod h1:US+9C80ppl7VsThQclkM7BkCHQAzuz8kHLsW3ppuluo=
+go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA=
go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo=
@@ -742,14 +856,24 @@ go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN8
go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI=
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
+go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE=
+golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw=
+golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw=
+golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio=
+golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
+golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw=
@@ -761,6 +885,7 @@ golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl
golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
golang.org/x/exp/typeparams v0.0.0-20240613232115-7f521ea00fb8 h1:+ZJmEdDFzH5H0CnzOrwgbH3elHctfTecW9X0k2tkn5M=
golang.org/x/exp/typeparams v0.0.0-20240613232115-7f521ea00fb8/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
+golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
@@ -786,8 +911,13 @@ golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0=
golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
@@ -802,17 +932,26 @@ golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
+golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA=
+golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
+golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4=
golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -826,9 +965,13 @@ golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -849,11 +992,15 @@ golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo=
@@ -865,15 +1012,19 @@ golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
+golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o=
+golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU=
golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
+golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY=
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58=
golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24=
golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
@@ -883,11 +1034,18 @@ golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
+golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM=
golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
+golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U=
+golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
+golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
@@ -928,11 +1086,23 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gonum.org/v1/gonum v0.15.0 h1:2lYxjRbTYyxkJxlhC+LvJIx3SsANPdRybu1tGj9/OrQ=
gonum.org/v1/gonum v0.15.0/go.mod h1:xzZVBJBtS+Mz4q0Yl2LJTk+OxOg4jiXZ7qBoM0uISGo=
+google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
+google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
+google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg=
+google.golang.org/genproto v0.0.0-20190306203927-b5d61aea6440/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
+google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
+google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio=
+google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
@@ -951,10 +1121,13 @@ google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFyt
google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
+gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
+gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
@@ -967,7 +1140,10 @@ gotest.tools/gotestsum v1.12.0 h1:CmwtaGDkHxrZm4Ib0Vob89MTfpc3GrEFMJKovliPwGk=
gotest.tools/gotestsum v1.12.0/go.mod h1:fAvqkSptospfSbQw26CTYzNwnsE/ztqLeyhP0h67ARY=
gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU=
gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU=
+grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o=
+honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.5.1 h1:4bH5o3b5ZULQ4UrBmP+63W9r7qIkqJClEA9ko5YKx+I=
honnef.co/go/tools v0.5.1/go.mod h1:e9irvo83WDG9/irijV44wr3tbhcFeRnfpVlRqVwpzMs=
@@ -977,3 +1153,5 @@ mvdan.cc/gofumpt v0.7.0 h1:bg91ttqXmi9y2xawvkuMXyvAA/1ZGJqYAEGjXuP0JXU=
mvdan.cc/gofumpt v0.7.0/go.mod h1:txVFJy/Sc/mvaycET54pV8SW8gWxTlUuGHVEcncmNUo=
mvdan.cc/unparam v0.0.0-20240528143540-8a5130ca722f h1:lMpcwN6GxNbWtbpI1+xzFLSW8XzX0u72NttUGVFjO3U=
mvdan.cc/unparam v0.0.0-20240528143540-8a5130ca722f/go.mod h1:RSLa7mKKCNeTTMHBw5Hsy2rfJmd6O2ivt9Dw9ZqCQpQ=
+sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck=
+sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0=
From 8c41c4d16210b225644fad446e19be73007dfb66 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 30 Oct 2024 17:28:06 +0100
Subject: [PATCH 033/499] chore(deps): bump codecov/codecov-action from 4.4.0
to 4.6.0 (#10541)
Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 4.4.0 to 4.6.0.
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codecov/codecov-action/compare/6d798873df2b1b8e5846dba6fb86631229fbcb17...b9fd7d16f6d7d1b5d2bec1a2887e65ceed900238)
---
updated-dependencies:
- dependency-name: codecov/codecov-action
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
-See [`AutoTLS`](https://github.com/ipfs/kubo/blob/master/docs/config.md#autotls) configuration for details how to enable it. We appreciate you testing and providing an early feedback in [kubo#10560](https://github.com/ipfs/kubo/issues/10560).
+This release introduces an experimental feature that significantly improves how browsers ([Helia](https://helia.io/), [Service Worker](https://inbrowser.link)) can connect to Kubo node.
+
+Opt-in configuration allows a publicly dialable Kubo nodes (public IP, port forwarding, or NAT with uPnP) to obtain CA-signed TLS certificates for [libp2p Secure WebSocket (WSS)](https://github.com/libp2p/specs/blob/master/websockets/README.md) connections automatically.
+
+> [!TIP]
+> To enable this feature, set `AutoTLS.Enabled` to `true` and add a listener for `/tls/sni/*.libp2p.direct/ws` on a separate TCP port:
+> ```diff
+> {
+> + "AutoTLS": { "Enabled": true },
+> "Addresses": {
+> "Swarm": {
+> "/ip4/0.0.0.0/tcp/4001",
+> + "/ip4/0.0.0.0/tcp/4002/tls/sni/*.libp2p.direct/ws",
+> "/ip6/::/tcp/4001",
+> + "/ip6/::/tcp/4002/tls/sni/*.libp2p.direct/ws",
+> ```
+> After restarting your node for the first time you may need to wait 5-15 minutes to pass all checks and for the changes to take effect.
+> We are working on sharing the same TCP port with other transports ([go-libp2p#2984](https://github.com/libp2p/go-libp2p/pull/2984)).
+
+See [`AutoTLS` configuration](https://github.com/ipfs/kubo/blob/master/docs/config.md#autotls) for more details how to enable it and what to expect.
+
+This is an early preview, we appreciate you testing and filling bug reports or feedback in the tracking issue at [kubo#10560](https://github.com/ipfs/kubo/issues/10560).
#### ๐ฆ๏ธ Dependency updates
- update `ipfs-webui` to [v4.4.0](https://github.com/ipfs/ipfs-webui/releases/tag/v4.4.0)
-- update `boxo` to [v0.24.1](https://github.com/ipfs/boxo/releases/tag/v0.24.1) + [v0.24.2](https://github.com/ipfs/boxo/releases/tag/v0.24.2) + [v0.24.3](https://github.com/ipfs/boxo/releases/tag/v0.24.3)
+- update `boxo` to [v0.24.1](https://github.com/ipfs/boxo/releases/tag/v0.24.1) + [v0.24.2](https://github.com/ipfs/boxo/releases/tag/v0.24.2) + [v0.24.3](https://github.com/ipfs/boxo/releases/tag/v0.24.3)
- This includes a number of fixes and bitswap improvements, and support for filtering from [IPIP-484](https://specs.ipfs.tech/ipips/ipip-0484/) in delegated HTTP routing and IPNI queries.
- update `go-libp2p` to [v0.37.0](https://github.com/libp2p/go-libp2p/releases/tag/v0.37.0)
- This update required removal of `Swarm.RelayService.MaxReservationsPerPeer` configuration option from Kubo. If you had it set, remove it from your configuration file.
diff --git a/version.go b/version.go
index 1332ef48c..800a47169 100644
--- a/version.go
+++ b/version.go
@@ -11,7 +11,7 @@ import (
var CurrentCommit string
// CurrentVersionNumber is the current application's version literal.
-const CurrentVersionNumber = "0.32.0-rc1"
+const CurrentVersionNumber = "0.32.0-rc2"
const ApiVersion = "/kubo/" + CurrentVersionNumber + "/" //nolint
From e80e821cf8a020dc46173bf69d460c10ad2bf266 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Full Changelog
+
+- github.com/ipfs/kubo:
+ - chore: 0.32.0
+ - fix: go-libp2p-kad-dht v0.28.0 (#10578) ([ipfs/kubo#10578](https://github.com/ipfs/kubo/pull/10578))
+ - chore: 0.32.0-rc2
+ - feat: ipfs-webui v4.4.0 (#10574) ([ipfs/kubo#10574](https://github.com/ipfs/kubo/pull/10574))
+ - chore: label implicit loggers
+ - chore: boxo v0.24.3 and p2p-forge v0.0.2 (#10572) ([ipfs/kubo#10572](https://github.com/ipfs/kubo/pull/10572))
+ - chore: stop using go-homedir (#10568) ([ipfs/kubo#10568](https://github.com/ipfs/kubo/pull/10568))
+ - fix(autotls): store certificates at the location from the repo path (#10566) ([ipfs/kubo#10566](https://github.com/ipfs/kubo/pull/10566))
+ - chore: 0.32.0-rc1
+ - docs(autotls): add note about separate port use (#10562) ([ipfs/kubo#10562](https://github.com/ipfs/kubo/pull/10562))
+ - feat(AutoTLS): opt-in WSS certs from p2p-forge at libp2p.direct (#10521) ([ipfs/kubo#10521](https://github.com/ipfs/kubo/pull/10521))
+ - chore: upgrade to boxo v0.24.2 (#10559) ([ipfs/kubo#10559](https://github.com/ipfs/kubo/pull/10559))
+ - refactor: update to go-libp2p v0.37.0 (#10554) ([ipfs/kubo#10554](https://github.com/ipfs/kubo/pull/10554))
+ - docs(config): explain what multiaddr is
+ - chore: update dependencies (#10548) ([ipfs/kubo#10548](https://github.com/ipfs/kubo/pull/10548))
+ - chore: update test dependencies (#10555) ([ipfs/kubo#10555](https://github.com/ipfs/kubo/pull/10555))
+ - chore(ci): adjust verbosity
+ - chore(ci): verbose build of test/bin deps
+ - chore(ci): build docker images for staging branch
+ - Create Changelog: v0.32 ([ipfs/kubo#10546](https://github.com/ipfs/kubo/pull/10546))
+ - Merge release v0.31.0 ([ipfs/kubo#10545](https://github.com/ipfs/kubo/pull/10545))
+ - chore: update RELEASE_CHECKLIST.md (#10544) ([ipfs/kubo#10544](https://github.com/ipfs/kubo/pull/10544))
+ - feat: ipfs-webui v4.3.3 (#10543) ([ipfs/kubo#10543](https://github.com/ipfs/kubo/pull/10543))
+ - chore: update RELEASE_CHECKLIST.md (#10542) ([ipfs/kubo#10542](https://github.com/ipfs/kubo/pull/10542))
+ - Add full changelog to release changelog
+ - fix: go 1.23(.2) (#10540) ([ipfs/kubo#10540](https://github.com/ipfs/kubo/pull/10540))
+ - chore: bump version to 0.32.0-dev
+- github.com/ipfs/boxo (v0.24.0 -> v0.24.3):
+ - Release v0.24.3 ([ipfs/boxo#713](https://github.com/ipfs/boxo/pull/713))
+ - Merge branch 'main' into release
+ - Release v0.24.2 ([ipfs/boxo#707](https://github.com/ipfs/boxo/pull/707))
+ - Release v0.24.1 ([ipfs/boxo#706](https://github.com/ipfs/boxo/pull/706))
+- github.com/ipfs/go-ipfs-cmds (v0.13.0 -> v0.14.0):
+ - chore: release v0.14.0 (#269) ([ipfs/go-ipfs-cmds#269](https://github.com/ipfs/go-ipfs-cmds/pull/269))
+- github.com/ipfs/go-ipfs-redirects-file (v0.1.1 -> v0.1.2):
+ - chore: v0.1.2 (#29) ([ipfs/go-ipfs-redirects-file#29](https://github.com/ipfs/go-ipfs-redirects-file/pull/29))
+ - docs(readme): refer specs and ipip
+ - chore: update dependencies (#28) ([ipfs/go-ipfs-redirects-file#28](https://github.com/ipfs/go-ipfs-redirects-file/pull/28))
+- github.com/ipfs/go-metrics-prometheus (v0.0.2 -> v0.0.3):
+ - chore: release v0.0.3 (#24) ([ipfs/go-metrics-prometheus#24](https://github.com/ipfs/go-metrics-prometheus/pull/24))
+ - chore: update deps and update go-log to v2 (#23) ([ipfs/go-metrics-prometheus#23](https://github.com/ipfs/go-metrics-prometheus/pull/23))
+ - sync: update CI config files (#9) ([ipfs/go-metrics-prometheus#9](https://github.com/ipfs/go-metrics-prometheus/pull/9))
+- github.com/ipfs/go-unixfsnode (v1.9.1 -> v1.9.2):
+ - New release version ([ipfs/go-unixfsnode#78](https://github.com/ipfs/go-unixfsnode/pull/78))
+ - chore: update dependencies
+- github.com/libp2p/go-flow-metrics (v0.1.0 -> v0.2.0):
+ - chore: release v0.2.0 (#33) ([libp2p/go-flow-metrics#33](https://github.com/libp2p/go-flow-metrics/pull/33))
+ - chore: cleanup readme (#31) ([libp2p/go-flow-metrics#31](https://github.com/libp2p/go-flow-metrics/pull/31))
+ - ci: uci/update-go ([libp2p/go-flow-metrics#27](https://github.com/libp2p/go-flow-metrics/pull/27))
+ - fix(ewma): reduce the chances of fake bandwidth spikes (#8) ([libp2p/go-flow-metrics#8](https://github.com/libp2p/go-flow-metrics/pull/8))
+ - chore: switch to typed atomics (#24) ([libp2p/go-flow-metrics#24](https://github.com/libp2p/go-flow-metrics/pull/24))
+ - test: use mock clocks for all tests (#25) ([libp2p/go-flow-metrics#25](https://github.com/libp2p/go-flow-metrics/pull/25))
+ - ci: uci/copy-templates ([libp2p/go-flow-metrics#21](https://github.com/libp2p/go-flow-metrics/pull/21))
+- github.com/libp2p/go-libp2p (v0.36.5 -> v0.37.0):
+ - Release v0.37.0 (#3013) ([libp2p/go-libp2p#3013](https://github.com/libp2p/go-libp2p/pull/3013))
+ - feat: Add WithFxOption (#2956) ([libp2p/go-libp2p#2956](https://github.com/libp2p/go-libp2p/pull/2956))
+ - chore: update imports to use slices package (#3007) ([libp2p/go-libp2p#3007](https://github.com/libp2p/go-libp2p/pull/3007))
+ - Change latency metrics buckets (#3012) ([libp2p/go-libp2p#3012](https://github.com/libp2p/go-libp2p/pull/3012))
+ - chore: bump deps in preparation for v0.37.0 (#3011) ([libp2p/go-libp2p#3011](https://github.com/libp2p/go-libp2p/pull/3011))
+ - autonat: fix interaction with autorelay (#2967) ([libp2p/go-libp2p#2967](https://github.com/libp2p/go-libp2p/pull/2967))
+ - swarm: add a peer dial latency metric (#2959) ([libp2p/go-libp2p#2959](https://github.com/libp2p/go-libp2p/pull/2959))
+ - peerstore: limit number of non connected peers in addrbook (#2971) ([libp2p/go-libp2p#2971](https://github.com/libp2p/go-libp2p/pull/2971))
+ - fix: swarm: refactor address resolution (#2990) ([libp2p/go-libp2p#2990](https://github.com/libp2p/go-libp2p/pull/2990))
+ - Add backoff for updating local IP addresses on error (#2999) ([libp2p/go-libp2p#2999](https://github.com/libp2p/go-libp2p/pull/2999))
+ - libp2phttp: HTTP Peer ID Authentication (#2854) ([libp2p/go-libp2p#2854](https://github.com/libp2p/go-libp2p/pull/2854))
+ - relay: make only 1 reservation per peer (#2974) ([libp2p/go-libp2p#2974](https://github.com/libp2p/go-libp2p/pull/2974))
+ - autonatv2: recover from panics (#2992) ([libp2p/go-libp2p#2992](https://github.com/libp2p/go-libp2p/pull/2992))
+ - basichost: ensure no duplicates in Addrs output (#2980) ([libp2p/go-libp2p#2980](https://github.com/libp2p/go-libp2p/pull/2980))
+ - fix(websocket): re-enable websocket transport test (#2987) ([libp2p/go-libp2p#2987](https://github.com/libp2p/go-libp2p/pull/2987))
+ - feat(websocket): switch the underlying http server logger to use ipfs/go-log (#2985) ([libp2p/go-libp2p#2985](https://github.com/libp2p/go-libp2p/pull/2985))
+ - peerstore: better GC in membacked peerstore (#2960) ([libp2p/go-libp2p#2960](https://github.com/libp2p/go-libp2p/pull/2960))
+ - connmgr: reduce log level for untagging untracked peers ([libp2p/go-libp2p#2961](https://github.com/libp2p/go-libp2p/pull/2961))
+ - fix: use quic.Version instead of the deprecated quic.VersionNumber (#2955) ([libp2p/go-libp2p#2955](https://github.com/libp2p/go-libp2p/pull/2955))
+ - tcp: fix metrics for multiple calls to Close (#2953) ([libp2p/go-libp2p#2953](https://github.com/libp2p/go-libp2p/pull/2953))
+ - chore: remove Roadmap file (#2954) ([libp2p/go-libp2p#2954](https://github.com/libp2p/go-libp2p/pull/2954))
+ - chore: add a funding JSON file to apply for Optimism rPGF round 5 (#2940) ([libp2p/go-libp2p#2940](https://github.com/libp2p/go-libp2p/pull/2940))
+ - Fix: WebSocket: Clone TLS config before creating a new listener
+ - fix: enable dctur when interface address is public (#2931) ([libp2p/go-libp2p#2931](https://github.com/libp2p/go-libp2p/pull/2931))
+ - fix: QUIC/Webtransport Transports now will prefer their owned listeners for dialing out (#2936) ([libp2p/go-libp2p#2936](https://github.com/libp2p/go-libp2p/pull/2936))
+ - ci: uci/update-go (#2937) ([libp2p/go-libp2p#2937](https://github.com/libp2p/go-libp2p/pull/2937))
+ - fix: slice append value (#2938) ([libp2p/go-libp2p#2938](https://github.com/libp2p/go-libp2p/pull/2938))
+ - webrtc: wait for listener context before dropping connection (#2932) ([libp2p/go-libp2p#2932](https://github.com/libp2p/go-libp2p/pull/2932))
+ - ci: use go1.23, drop go1.21 (#2933) ([libp2p/go-libp2p#2933](https://github.com/libp2p/go-libp2p/pull/2933))
+ - Fail on any test timeout (#2929) ([libp2p/go-libp2p#2929](https://github.com/libp2p/go-libp2p/pull/2929))
+ - test: Try to fix test timeout (#2930) ([libp2p/go-libp2p#2930](https://github.com/libp2p/go-libp2p/pull/2930))
+ - ci: Out of the tarpit (#2923) ([libp2p/go-libp2p#2923](https://github.com/libp2p/go-libp2p/pull/2923))
+ - Make BlackHoleState type public (#2917) ([libp2p/go-libp2p#2917](https://github.com/libp2p/go-libp2p/pull/2917))
+ - Fix proto import paths (#2920) ([libp2p/go-libp2p#2920](https://github.com/libp2p/go-libp2p/pull/2920))
+- github.com/libp2p/go-libp2p-kad-dht (v0.26.1 -> v0.28.0):
+ - chore: release v0.28.0 (#998) ([libp2p/go-libp2p-kad-dht#998](https://github.com/libp2p/go-libp2p-kad-dht/pull/998))
+ - fix: set context timeout for `queryPeer` (#996) ([libp2p/go-libp2p-kad-dht#996](https://github.com/libp2p/go-libp2p-kad-dht/pull/996))
+ - refactor: document and expose Amino DHT defaults (#990) ([libp2p/go-libp2p-kad-dht#990](https://github.com/libp2p/go-libp2p-kad-dht/pull/990))
+ - Use timeout context for NewStream call ([libp2p/go-libp2p-kad-dht#994](https://github.com/libp2p/go-libp2p-kad-dht/pull/994))
+ - release v0.27.0 ([libp2p/go-libp2p-kad-dht#992](https://github.com/libp2p/go-libp2p-kad-dht/pull/992))
+ - Add new DHT option to provide custom pb.MessageSender ([libp2p/go-libp2p-kad-dht#991](https://github.com/libp2p/go-libp2p-kad-dht/pull/991))
+ - fix: replace deprecated Boxo function ([libp2p/go-libp2p-kad-dht#987](https://github.com/libp2p/go-libp2p-kad-dht/pull/987))
+ - fix(query): reverting changes on TestRTEvictionOnFailedQuery ([libp2p/go-libp2p-kad-dht#984](https://github.com/libp2p/go-libp2p-kad-dht/pull/984))
+- github.com/libp2p/go-libp2p-pubsub (v0.11.0 -> v0.12.0):
+ - chore: upgrade go-libp2p (#575) ([libp2p/go-libp2p-pubsub#575](https://github.com/libp2p/go-libp2p-pubsub/pull/575))
+ - GossipSub v1.2: IDONTWANT control message and priority queue. (#553) ([libp2p/go-libp2p-pubsub#553](https://github.com/libp2p/go-libp2p-pubsub/pull/553))
+ - Re-enable disabled gossipsub test (#566) ([libp2p/go-libp2p-pubsub#566](https://github.com/libp2p/go-libp2p-pubsub/pull/566))
+ - chore: staticcheck
+ - chore: update rand usage
+ - chore: go fmt
+ - chore: add or force update version.json
+ - added missing Close call on the AddrBook member of GossipSubRouter (#568) ([libp2p/go-libp2p-pubsub#568](https://github.com/libp2p/go-libp2p-pubsub/pull/568))
+ - test: test notify protocols updated (#567) ([libp2p/go-libp2p-pubsub#567](https://github.com/libp2p/go-libp2p-pubsub/pull/567))
+ - Switch to the new peer notify mechanism (#564) ([libp2p/go-libp2p-pubsub#564](https://github.com/libp2p/go-libp2p-pubsub/pull/564))
+ - test: use the regular libp2p host (#565) ([libp2p/go-libp2p-pubsub#565](https://github.com/libp2p/go-libp2p-pubsub/pull/565))
+ - Missing flood protection check for number of message IDs when handling `Ihave` messages (#560) ([libp2p/go-libp2p-pubsub#560](https://github.com/libp2p/go-libp2p-pubsub/pull/560))
+
+using `./kuboreleaser release --version vX.Y.Z(-rcN) tag` or ...
- This is a dangerous operation! Go and Docker publishing are difficult to reverse! Have the release reviewer verify all the commands marked with โ ๏ธ!
- - [ ] โ ๏ธ  tag the HEAD commit using `git tag -s vX.Y.Z(-RCN) -m 'Prerelease X.Y.Z(-RCN)'`
+ - [ ] โ ๏ธ  tag the HEAD commit using `git tag -s vX.Y.Z(-rcN) -m 'Prerelease X.Y.Z(-rcN)'`
- [ ] โ ๏ธ  tag the HEAD commit of the `release` branch using `git tag -s vX.Y.Z -m 'Release X.Y.Z'`
- - [ ] โ ๏ธ verify the tag is signed and tied to the correct commit using `git show vX.Y.Z(-RCN)`
- - [ ] โ ๏ธ push the tag to GitHub using `git push origin vX.Y.Z(-RCN)`
+ - [ ] โ ๏ธ verify the tag is signed and tied to the correct commit using `git show vX.Y.Z(-rcN)`
+ - [ ] โ ๏ธ push the tag to GitHub using `git push origin vX.Y.Z(-rcN)`
- do **NOT** use `git push --tags` because it pushes all your local tags
using `./kuboreleaser release --version vX.Y.Z(-rcN) publish-to-distributions` or ...
- [ ] check out [ipfs/distributions](https://github.com/ipfs/distributions)
- [ ] create new branch: run `git checkout -b release-kubo-X.Y.Z(-rcN)`
- - [ ] run `./dist.sh add-version kubo vX.Y.Z(-RCN)` to add the new version to the `versions` file
+ - [ ] run `./dist.sh add-version kubo vX.Y.Z(-rcN)` to add the new version to the `versions` file
- [usage](https://github.com/ipfs/distributions#usage)
- [ ] create and merge the PR which updates `dists/kubo/versions` and `dists/go-ipfs/versions` ( and `dists/kubo/current` and `dists/go-ipfs/current`)
- [example](https://github.com/ipfs/distributions/pull/760)
@@ -101,7 +101,7 @@ This section covers tasks to be done during each release.
- [ ] create a new release on [GitHub](https://docs.github.com/en/repositories/releasing-projects-on-github/managing-releases-in-a-repository#creating-a-release)
- [RC example](https://github.com/ipfs/kubo/releases/tag/v0.17.0-rc1)
- [FINAL example](https://github.com/ipfs/kubo/releases/tag/v0.17.0)
- - [ ] use the `vX.Y.Z(-RCN)` tag
+ - [ ] use the `vX.Y.Z(-rcN)` tag
- [ ] link to the release issue
- [ ]  link to the changelog in the description
- [ ]  check the `This is a pre-release` checkbox
@@ -109,7 +109,7 @@ This section covers tasks to be done during each release.
- [ ]  do **NOT** check the `This is a pre-release` checkbox
- [ ] run the [sync-release-assets](https://github.com/ipfs/kubo/actions/workflows/sync-release-assets.yml) workflow
- [ ] wait for the [sync-release-assets](https://github.com/ipfs/kubo/actions/workflows/sync-release-assets.yml) workflow run to finish
- - [ ] verify the release assets are present in the [GitHub release](https://github.com/ipfs/kubo/releases/tag/vX.Y.Z(-RCN))
+ - [ ] verify the release assets are present in the [GitHub release](https://github.com/ipfs/kubo/releases/tag/vX.Y.Z(-rcN))
using `./kuboreleaser release --version vX.Y.Z(-rcN) test-ipfs-companion` or ...
- [ ] run the [e2e](https://github.com/ipfs/ipfs-companion/actions/workflows/e2e.yml)
- - use `vX.Y.Z(-RCN)` as the Kubo image version
+ - use `vX.Y.Z(-rcN)` as the Kubo image version
- [ ] wait for the [e2e](https://github.com/ipfs/ipfs-companion/actions/workflows/e2e.yml) workflow run to finish
using `./kuboreleaser release --version vX.Y.Z(-rcN) update-ipfs-desktop` or ...
From 83b06f14d2c2322b5eaaebb22ea8717d4c87852d Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Tue, 26 Nov 2024 12:34:06 +0100
Subject: [PATCH 067/499] Update to boxo with refactored providerQueryManager.
(#10595)
---
core/commands/bitswap.go | 21 +------
core/core.go | 4 +-
core/coreapi/pin.go | 2 +-
core/coreapi/unixfs.go | 2 +-
core/node/bitswap.go | 63 ++++++++++++++++---
core/node/groups.go | 5 +-
docs/changelogs/v0.32.md | 2 +-
docs/changelogs/v0.33.md | 2 +
docs/examples/kubo-as-a-library/go.mod | 2 +-
docs/examples/kubo-as-a-library/go.sum | 4 +-
go.mod | 2 +-
go.sum | 4 +-
.../delegated_routing_v1_http_proxy_test.go | 6 +-
.../delegated_routing_v1_http_server_test.go | 4 ++
test/cli/provider_test.go | 3 +
test/cli/routing_dht_test.go | 5 +-
test/dependencies/go.mod | 2 +-
test/dependencies/go.sum | 4 +-
test/sharness/t0220-bitswap.sh | 3 -
19 files changed, 93 insertions(+), 47 deletions(-)
diff --git a/core/commands/bitswap.go b/core/commands/bitswap.go
index 07f91fb0f..7f7ab9636 100644
--- a/core/commands/bitswap.go
+++ b/core/commands/bitswap.go
@@ -5,7 +5,6 @@ import (
"io"
cmdenv "github.com/ipfs/kubo/core/commands/cmdenv"
- e "github.com/ipfs/kubo/core/commands/e"
humanize "github.com/dustin/go-humanize"
bitswap "github.com/ipfs/boxo/bitswap"
@@ -53,10 +52,7 @@ Print out all blocks currently on the bitswap wantlist for the local peer.`,
return ErrNotOnline
}
- bs, ok := nd.Exchange.(*bitswap.Bitswap)
- if !ok {
- return e.TypeErr(bs, nd.Exchange)
- }
+ bs := nd.Bitswap
pstr, found := req.Options[peerOptionName].(string)
if found {
@@ -112,12 +108,7 @@ var bitswapStatCmd = &cmds.Command{
return cmds.Errorf(cmds.ErrClient, "unable to run offline: %s", ErrNotOnline)
}
- bs, ok := nd.Exchange.(*bitswap.Bitswap)
- if !ok {
- return e.TypeErr(bs, nd.Exchange)
- }
-
- st, err := bs.Stat()
+ st, err := nd.Bitswap.Stat()
if err != nil {
return err
}
@@ -134,7 +125,6 @@ var bitswapStatCmd = &cmds.Command{
human, _ := req.Options[bitswapHumanOptionName].(bool)
fmt.Fprintln(w, "bitswap status")
- fmt.Fprintf(w, "\tprovides buffer: %d / %d\n", s.ProvideBufLen, bitswap.HasBlockBufferSize)
fmt.Fprintf(w, "\tblocks received: %d\n", s.BlocksReceived)
fmt.Fprintf(w, "\tblocks sent: %d\n", s.BlocksSent)
if human {
@@ -190,17 +180,12 @@ prints the ledger associated with a given peer.
return ErrNotOnline
}
- bs, ok := nd.Exchange.(*bitswap.Bitswap)
- if !ok {
- return e.TypeErr(bs, nd.Exchange)
- }
-
partner, err := peer.Decode(req.Arguments[0])
if err != nil {
return err
}
- return cmds.EmitOnce(res, bs.LedgerForPeer(partner))
+ return cmds.EmitOnce(res, nd.Bitswap.LedgerForPeer(partner))
},
Encoders: cmds.EncoderMap{
cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, out *server.Receipt) error {
diff --git a/core/core.go b/core/core.go
index 0c9333e06..54c987527 100644
--- a/core/core.go
+++ b/core/core.go
@@ -19,6 +19,7 @@ import (
pin "github.com/ipfs/boxo/pinning/pinner"
"github.com/ipfs/go-datastore"
+ bitswap "github.com/ipfs/boxo/bitswap"
bserv "github.com/ipfs/boxo/blockservice"
bstore "github.com/ipfs/boxo/blockstore"
exchange "github.com/ipfs/boxo/exchange"
@@ -102,7 +103,8 @@ type IpfsNode struct {
UnixFSPathResolver pathresolver.Resolver `name:"unixFSPathResolver"` // The UnixFS path resolver
OfflineIPLDPathResolver pathresolver.Resolver `name:"offlineIpldPathResolver"` // The IPLD path resolver that uses only locally available blocks
OfflineUnixFSPathResolver pathresolver.Resolver `name:"offlineUnixFSPathResolver"` // The UnixFS path resolver that uses only locally available blocks
- Exchange exchange.Interface // the block exchange + strategy (bitswap)
+ Exchange exchange.Interface // the block exchange + strategy
+ Bitswap *bitswap.Bitswap `optional:"true"` // The Bitswap instance
Namesys namesys.NameSystem // the name system, resolves paths to hashes
Provider provider.System // the value provider system
IpnsRepub *ipnsrp.Republisher `optional:"true"`
diff --git a/core/coreapi/pin.go b/core/coreapi/pin.go
index 22b3aa25c..64c65b651 100644
--- a/core/coreapi/pin.go
+++ b/core/coreapi/pin.go
@@ -44,7 +44,7 @@ func (api *PinAPI) Add(ctx context.Context, p path.Path, opts ...caopts.PinAddOp
return fmt.Errorf("pin: %s", err)
}
- if err := api.provider.Provide(dagNode.Cid()); err != nil {
+ if err := api.provider.Provide(ctx, dagNode.Cid(), true); err != nil {
return err
}
diff --git a/core/coreapi/unixfs.go b/core/coreapi/unixfs.go
index e175488f3..dbeeefda4 100644
--- a/core/coreapi/unixfs.go
+++ b/core/coreapi/unixfs.go
@@ -173,7 +173,7 @@ func (api *UnixfsAPI) Add(ctx context.Context, files files.Node, opts ...options
}
if !settings.OnlyHash {
- if err := api.provider.Provide(nd.Cid()); err != nil {
+ if err := api.provider.Provide(ctx, nd.Cid(), true); err != nil {
return path.ImmutablePath{}, err
}
}
diff --git a/core/node/bitswap.go b/core/node/bitswap.go
index 4132d5a01..d379a5866 100644
--- a/core/node/bitswap.go
+++ b/core/node/bitswap.go
@@ -5,9 +5,12 @@ import (
"time"
"github.com/ipfs/boxo/bitswap"
+ "github.com/ipfs/boxo/bitswap/client"
"github.com/ipfs/boxo/bitswap/network"
blockstore "github.com/ipfs/boxo/blockstore"
exchange "github.com/ipfs/boxo/exchange"
+ "github.com/ipfs/boxo/exchange/providing"
+ provider "github.com/ipfs/boxo/provider"
"github.com/ipfs/kubo/config"
irouting "github.com/ipfs/kubo/routing"
"github.com/libp2p/go-libp2p/core/host"
@@ -34,7 +37,7 @@ type bitswapOptionsOut struct {
// BitswapOptions creates configuration options for Bitswap from the config file
// and whether to provide data.
-func BitswapOptions(cfg *config.Config, provide bool) interface{} {
+func BitswapOptions(cfg *config.Config) interface{} {
return func() bitswapOptionsOut {
var internalBsCfg config.InternalBitswap
if cfg.Internal.Bitswap != nil {
@@ -42,7 +45,6 @@ func BitswapOptions(cfg *config.Config, provide bool) interface{} {
}
opts := []bitswap.Option{
- bitswap.ProvideEnabled(provide),
bitswap.ProviderSearchDelay(internalBsCfg.ProviderSearchDelay.WithDefault(DefaultProviderSearchDelay)), // See https://github.com/ipfs/go-ipfs/issues/8807 for rationale
bitswap.EngineBlockstoreWorkerCount(int(internalBsCfg.EngineBlockstoreWorkerCount.WithDefault(DefaultEngineBlockstoreWorkerCount))),
bitswap.TaskWorkerCount(int(internalBsCfg.TaskWorkerCount.WithDefault(DefaultTaskWorkerCount))),
@@ -55,7 +57,7 @@ func BitswapOptions(cfg *config.Config, provide bool) interface{} {
}
}
-type onlineExchangeIn struct {
+type bitswapIn struct {
fx.In
Mctx helpers.MetricsCtx
@@ -65,19 +67,62 @@ type onlineExchangeIn struct {
BitswapOpts []bitswap.Option `group:"bitswap-options"`
}
-// OnlineExchange creates new LibP2P backed block exchange (BitSwap).
+// Bitswap creates the BitSwap server/client instance.
// Additional options to bitswap.New can be provided via the "bitswap-options"
// group.
-func OnlineExchange() interface{} {
- return func(in onlineExchangeIn, lc fx.Lifecycle) exchange.Interface {
- bitswapNetwork := network.NewFromIpfsHost(in.Host, in.Rt)
+func Bitswap(provide bool) interface{} {
+ return func(in bitswapIn, lc fx.Lifecycle) *bitswap.Bitswap {
+ bitswapNetwork := network.NewFromIpfsHost(in.Host)
+
+ var provider client.ProviderFinder
+ if provide {
+ provider = in.Rt
+ }
+ bs := bitswap.New(helpers.LifecycleCtx(in.Mctx, lc), bitswapNetwork, provider, in.Bs, in.BitswapOpts...)
- exch := bitswap.New(helpers.LifecycleCtx(in.Mctx, lc), bitswapNetwork, in.Bs, in.BitswapOpts...)
lc.Append(fx.Hook{
OnStop: func(ctx context.Context) error {
- return exch.Close()
+ return bs.Close()
},
})
+ return bs
+ }
+}
+
+// OnlineExchange creates new LibP2P backed block exchange.
+func OnlineExchange() interface{} {
+ return func(in *bitswap.Bitswap, lc fx.Lifecycle) exchange.Interface {
+ lc.Append(fx.Hook{
+ OnStop: func(ctx context.Context) error {
+ return in.Close()
+ },
+ })
+ return in
+ }
+}
+
+type providingExchangeIn struct {
+ fx.In
+
+ BaseExch exchange.Interface
+ Provider provider.System
+}
+
+// ProvidingExchange creates a providing.Exchange with the existing exchange
+// and the provider.System.
+// We cannot do this in OnlineExchange because it causes cycles so this is for
+// a decorator.
+func ProvidingExchange(provide bool) interface{} {
+ return func(in providingExchangeIn, lc fx.Lifecycle) exchange.Interface {
+ exch := in.BaseExch
+ if provide {
+ exch = providing.New(in.BaseExch, in.Provider)
+ lc.Append(fx.Hook{
+ OnStop: func(ctx context.Context) error {
+ return exch.Close()
+ },
+ })
+ }
return exch
}
}
diff --git a/core/node/groups.go b/core/node/groups.go
index c74d0be8a..519cbb47d 100644
--- a/core/node/groups.go
+++ b/core/node/groups.go
@@ -293,8 +293,11 @@ func Online(bcfg *BuildCfg, cfg *config.Config, userResourceOverrides rcmgr.Part
shouldBitswapProvide := !cfg.Experimental.StrategicProviding
return fx.Options(
- fx.Provide(BitswapOptions(cfg, shouldBitswapProvide)),
+ fx.Provide(BitswapOptions(cfg)),
+ fx.Provide(Bitswap(shouldBitswapProvide)),
fx.Provide(OnlineExchange()),
+ // Replace our Exchange with a Providing exchange!
+ fx.Decorate(ProvidingExchange(shouldBitswapProvide)),
fx.Provide(DNSResolver),
fx.Provide(Namesys(ipnsCacheSize, cfg.Ipns.MaxCacheTTL.WithDefault(config.DefaultIpnsMaxCacheTTL))),
fx.Provide(Peering),
diff --git a/docs/changelogs/v0.32.md b/docs/changelogs/v0.32.md
index 790390978..f00cca611 100644
--- a/docs/changelogs/v0.32.md
+++ b/docs/changelogs/v0.32.md
@@ -1,6 +1,6 @@
# Kubo changelog v0.32
-- [v0.32.0](#v0310)
+- [v0.32.0](#v0320)
## v0.32.0
diff --git a/docs/changelogs/v0.33.md b/docs/changelogs/v0.33.md
index 711092a2c..df5f9158e 100644
--- a/docs/changelogs/v0.33.md
+++ b/docs/changelogs/v0.33.md
@@ -16,6 +16,8 @@
#### ๐ฆ๏ธ Dependency updates
+- update `boxo` to [v0.24.TODO](https://github.com/ipfs/boxo/releases/tag/v0.24.TODO)
+
### ๐ Changelog
### ๐จโ๐ฉโ๐งโ๐ฆ Contributors
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index d3b7aee83..e39688877 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -7,7 +7,7 @@ go 1.23
replace github.com/ipfs/kubo => ./../../..
require (
- github.com/ipfs/boxo v0.24.4-0.20241119153247-5929aca3037f
+ github.com/ipfs/boxo v0.24.4-0.20241125210908-37756ce2eeb1
github.com/ipfs/kubo v0.0.0-00010101000000-000000000000
github.com/libp2p/go-libp2p v0.37.0
github.com/multiformats/go-multiaddr v0.13.0
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index f4da6f07a..f601c797d 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -298,8 +298,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.13.2-0.20231027223058-cde3b5ba964c h1:7Uy
github.com/ipfs-shipyard/nopfs/ipfs v0.13.2-0.20231027223058-cde3b5ba964c/go.mod h1:6EekK/jo+TynwSE/ZOiOJd4eEvRXoavEC3vquKtv4yI=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.24.4-0.20241119153247-5929aca3037f h1:3qgBUQ6BYfEAPaoSYoH90PKwVT1/iFLX7fDGGkvXZ8Y=
-github.com/ipfs/boxo v0.24.4-0.20241119153247-5929aca3037f/go.mod h1:Kxk43F+avGAsJSwhJW4isNYrpGwXHRJCvJ19Pt+MQc4=
+github.com/ipfs/boxo v0.24.4-0.20241125210908-37756ce2eeb1 h1:Ox1qTlON8qG46rUL7dDEwnIt7W9MhaidtvR/97RywWw=
+github.com/ipfs/boxo v0.24.4-0.20241125210908-37756ce2eeb1/go.mod h1:Kxk43F+avGAsJSwhJW4isNYrpGwXHRJCvJ19Pt+MQc4=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-bitswap v0.11.0 h1:j1WVvhDX1yhG32NTC9xfxnqycqYIlhzEzLXG/cU1HyQ=
diff --git a/go.mod b/go.mod
index 5de417a99..5ea2e63da 100644
--- a/go.mod
+++ b/go.mod
@@ -22,7 +22,7 @@ require (
github.com/hashicorp/go-version v1.7.0
github.com/ipfs-shipyard/nopfs v0.0.12
github.com/ipfs-shipyard/nopfs/ipfs v0.13.2-0.20231027223058-cde3b5ba964c
- github.com/ipfs/boxo v0.24.4-0.20241119153247-5929aca3037f
+ github.com/ipfs/boxo v0.24.4-0.20241125210908-37756ce2eeb1
github.com/ipfs/go-block-format v0.2.0
github.com/ipfs/go-cid v0.4.1
github.com/ipfs/go-cidutil v0.1.0
diff --git a/go.sum b/go.sum
index abf6d83d9..f27573fd4 100644
--- a/go.sum
+++ b/go.sum
@@ -362,8 +362,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.13.2-0.20231027223058-cde3b5ba964c h1:7Uy
github.com/ipfs-shipyard/nopfs/ipfs v0.13.2-0.20231027223058-cde3b5ba964c/go.mod h1:6EekK/jo+TynwSE/ZOiOJd4eEvRXoavEC3vquKtv4yI=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.24.4-0.20241119153247-5929aca3037f h1:3qgBUQ6BYfEAPaoSYoH90PKwVT1/iFLX7fDGGkvXZ8Y=
-github.com/ipfs/boxo v0.24.4-0.20241119153247-5929aca3037f/go.mod h1:Kxk43F+avGAsJSwhJW4isNYrpGwXHRJCvJ19Pt+MQc4=
+github.com/ipfs/boxo v0.24.4-0.20241125210908-37756ce2eeb1 h1:Ox1qTlON8qG46rUL7dDEwnIt7W9MhaidtvR/97RywWw=
+github.com/ipfs/boxo v0.24.4-0.20241125210908-37756ce2eeb1/go.mod h1:Kxk43F+avGAsJSwhJW4isNYrpGwXHRJCvJ19Pt+MQc4=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-bitswap v0.11.0 h1:j1WVvhDX1yhG32NTC9xfxnqycqYIlhzEzLXG/cU1HyQ=
diff --git a/test/cli/delegated_routing_v1_http_proxy_test.go b/test/cli/delegated_routing_v1_http_proxy_test.go
index 1d80ae50a..79fd726a4 100644
--- a/test/cli/delegated_routing_v1_http_proxy_test.go
+++ b/test/cli/delegated_routing_v1_http_proxy_test.go
@@ -60,8 +60,10 @@ func TestRoutingV1Proxy(t *testing.T) {
nodes := setupNodes(t)
cidStr := nodes[0].IPFSAddStr(testutils.RandomStr(1000))
-
- res := nodes[1].IPFS("routing", "findprovs", cidStr)
+ // Reprovide as initialProviderDelay still ongoing
+ res := nodes[0].IPFS("bitswap", "reprovide")
+ require.NoError(t, res.Err)
+ res = nodes[1].IPFS("routing", "findprovs", cidStr)
assert.Equal(t, nodes[0].PeerID().String(), res.Stdout.Trimmed())
})
diff --git a/test/cli/delegated_routing_v1_http_server_test.go b/test/cli/delegated_routing_v1_http_server_test.go
index f2bd98cb7..916b91882 100644
--- a/test/cli/delegated_routing_v1_http_server_test.go
+++ b/test/cli/delegated_routing_v1_http_server_test.go
@@ -14,6 +14,7 @@ import (
"github.com/ipfs/kubo/test/cli/harness"
"github.com/libp2p/go-libp2p/core/peer"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestRoutingV1Server(t *testing.T) {
@@ -38,6 +39,9 @@ func TestRoutingV1Server(t *testing.T) {
text := "hello world " + uuid.New().String()
cidStr := nodes[2].IPFSAddStr(text)
_ = nodes[3].IPFSAddStr(text)
+ // Reprovide as initialProviderDelay still ongoing
+ res := nodes[3].IPFS("bitswap", "reprovide")
+ require.NoError(t, res.Err)
cid, err := cid.Decode(cidStr)
assert.NoError(t, err)
diff --git a/test/cli/provider_test.go b/test/cli/provider_test.go
index 5ecf8f3ca..546ac3fd7 100644
--- a/test/cli/provider_test.go
+++ b/test/cli/provider_test.go
@@ -42,6 +42,9 @@ func TestProvider(t *testing.T) {
defer nodes.StopDaemons()
cid := nodes[0].IPFSAddStr(time.Now().String())
+ // Reprovide as initialProviderDelay still ongoing
+ res := nodes[0].IPFS("bitswap", "reprovide")
+ require.NoError(t, res.Err)
expectProviders(t, cid, nodes[0].PeerID().String(), nodes[1:]...)
})
diff --git a/test/cli/routing_dht_test.go b/test/cli/routing_dht_test.go
index fb0d39195..d149e93a2 100644
--- a/test/cli/routing_dht_test.go
+++ b/test/cli/routing_dht_test.go
@@ -84,7 +84,10 @@ func testRoutingDHT(t *testing.T, enablePubsub bool) {
t.Run("ipfs routing findprovs", func(t *testing.T) {
t.Parallel()
hash := nodes[3].IPFSAddStr("some stuff")
- res := nodes[4].IPFS("routing", "findprovs", hash)
+ // Reprovide as initialProviderDelay still ongoing
+ res := nodes[3].IPFS("bitswap", "reprovide")
+ require.NoError(t, res.Err)
+ res = nodes[4].IPFS("routing", "findprovs", hash)
assert.Equal(t, nodes[3].PeerID().String(), res.Stdout.Trimmed())
})
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index 73840e0d0..3c2c9c787 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -119,7 +119,7 @@ require (
github.com/huin/goupnp v1.3.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/ipfs/bbloom v0.0.4 // indirect
- github.com/ipfs/boxo v0.24.4-0.20241119153247-5929aca3037f // indirect
+ github.com/ipfs/boxo v0.24.4-0.20241125210908-37756ce2eeb1 // indirect
github.com/ipfs/go-block-format v0.2.0 // indirect
github.com/ipfs/go-cid v0.4.1 // indirect
github.com/ipfs/go-datastore v0.6.0 // indirect
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index 84672271d..f980982a4 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -318,8 +318,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.24.4-0.20241119153247-5929aca3037f h1:3qgBUQ6BYfEAPaoSYoH90PKwVT1/iFLX7fDGGkvXZ8Y=
-github.com/ipfs/boxo v0.24.4-0.20241119153247-5929aca3037f/go.mod h1:Kxk43F+avGAsJSwhJW4isNYrpGwXHRJCvJ19Pt+MQc4=
+github.com/ipfs/boxo v0.24.4-0.20241125210908-37756ce2eeb1 h1:Ox1qTlON8qG46rUL7dDEwnIt7W9MhaidtvR/97RywWw=
+github.com/ipfs/boxo v0.24.4-0.20241125210908-37756ce2eeb1/go.mod h1:Kxk43F+avGAsJSwhJW4isNYrpGwXHRJCvJ19Pt+MQc4=
github.com/ipfs/go-block-format v0.2.0 h1:ZqrkxBA2ICbDRbK8KJs/u0O3dlp6gmAuuXUJNiW1Ycs=
github.com/ipfs/go-block-format v0.2.0/go.mod h1:+jpL11nFx5A/SPpsoBn6Bzkra/zaArfSmsknbPMYgzM=
github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s=
diff --git a/test/sharness/t0220-bitswap.sh b/test/sharness/t0220-bitswap.sh
index 3575f0d33..412437651 100755
--- a/test/sharness/t0220-bitswap.sh
+++ b/test/sharness/t0220-bitswap.sh
@@ -18,7 +18,6 @@ test_expect_success "'ipfs bitswap stat' succeeds" '
test_expect_success "'ipfs bitswap stat' output looks good" '
cat <
Date: Tue, 26 Nov 2024 19:19:07 +0100
Subject: [PATCH 068/499] tests/cli: fix flapping tests (#10600)
The issue is that for dht providing to work correctly, at least two nodes must
have dht routing.
Before, dht providing in the test always failed, but the test succeeded when
the tested-CID was the one that the failure happened with (the first in the
list for ProvideMany).
---
test/cli/delegated_routing_v1_http_proxy_test.go | 15 +++++++++++++--
1 file changed, 13 insertions(+), 2 deletions(-)
diff --git a/test/cli/delegated_routing_v1_http_proxy_test.go b/test/cli/delegated_routing_v1_http_proxy_test.go
index 79fd726a4..ef3bc4fe2 100644
--- a/test/cli/delegated_routing_v1_http_proxy_test.go
+++ b/test/cli/delegated_routing_v1_http_proxy_test.go
@@ -15,9 +15,11 @@ func TestRoutingV1Proxy(t *testing.T) {
t.Parallel()
setupNodes := func(t *testing.T) harness.Nodes {
- nodes := harness.NewT(t).NewNodes(2).Init()
+ nodes := harness.NewT(t).NewNodes(3).Init()
- // Node 0 uses DHT and exposes the Routing API.
+ // Node 0 uses DHT and exposes the Routing API. For the DHT
+ // to actually work there will need to be another DHT-enabled
+ // node.
nodes[0].UpdateConfig(func(cfg *config.Config) {
cfg.Gateway.ExposeRoutingAPI = config.True
cfg.Discovery.MDNS.Enabled = false
@@ -49,6 +51,15 @@ func TestRoutingV1Proxy(t *testing.T) {
})
nodes[1].StartDaemon()
+ // This is the second DHT node. Only used so that the DHT is
+ // operative.
+ nodes[2].UpdateConfig(func(cfg *config.Config) {
+ cfg.Gateway.ExposeRoutingAPI = config.True
+ cfg.Discovery.MDNS.Enabled = false
+ cfg.Routing.Type = config.NewOptionalString("dht")
+ })
+ nodes[2].StartDaemon()
+
// Connect them.
nodes.Connect()
From 466f72f518bd9853035d973718ac7bddb8df0281 Mon Sep 17 00:00:00 2001
From: Hector Sanjuan
Date: Tue, 26 Nov 2024 19:19:48 +0100
Subject: [PATCH 069/499] docs: typos (#10602)
---
docs/config.md | 8 ++++----
docs/datastores.md | 2 +-
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/docs/config.md b/docs/config.md
index a745fec01..08a1cceed 100644
--- a/docs/config.md
+++ b/docs/config.md
@@ -496,15 +496,15 @@ Enables AutoTLS feature to get DNS+TLS for [libp2p Secure WebSocket](https://git
If `.../tls/sni/*.libp2p.direct/ws` [multiaddr] is present in [`Addresses.Swarm`](#addressesswarm)
with SNI segment ending with [`AutoTLS.DomainSuffix`](#autotlsdomainsuffix),
-Kubo will obtain and set up a trusted PKI TLS certificate for it, making it diallable from web browser's [Secure Contexts](https://w3c.github.io/webappsec-secure-contexts/).
+Kubo will obtain and set up a trusted PKI TLS certificate for it, making it dialable from web browser's [Secure Contexts](https://w3c.github.io/webappsec-secure-contexts/).
> [!IMPORTANT]
> Caveats:
-> - Requires your Kubo node to be publicly diallable.
+> - Requires your Kubo node to be publicly dialable.
> - If you want to test this with a node that is behind a NAT and uses manual port forwarding or UPnP (`Swarm.DisableNatPortMap=false`),
> add catch-all `/ip4/0.0.0.0/tcp/4002/tls/sni/*.libp2p.direct/ws` and `/ip6/::/tcp/4002/tls/sni/*.libp2p.direct/ws` to [`Addresses.Swarm`](#addressesswarm)
> and **wait 5-15 minutes** for libp2p node to set up and learn about own public addresses via [AutoNAT](#autonat).
-> - If your node is fresh and just started, the [p2p-forge] client may produce and log ERRORs during this time, but once a publicly diallable addresses are set up, a subsequent retry should be successful.
+> - If your node is fresh and just started, the [p2p-forge] client may produce and log ERRORs during this time, but once a publicly dialable addresses are set up, a subsequent retry should be successful.
> - Listeners defined in [`Addresses.Swarm`](#addressesswarm) with `/tls/sni` must use a separate port from other TCP listeners, e.g. `4002` instead of the default `4001`.
> - A separate port (`/tcp/4002`) has to be used instead of `/tcp/4001` because we wait for TCP port sharing ([go-libp2p#2984](https://github.com/libp2p/go-libp2p/issues/2684)) to be implemented.
> - If you use manual port forwarding, make sure incoming connections to this additional port are allowed the same way `4001` ones already are.
@@ -536,7 +536,7 @@ Do not change this unless you self-host [p2p-forge] under own domain.
> [!IMPORTANT]
> The default endpoint performs [libp2p Peer ID Authentication over HTTP](https://github.com/libp2p/specs/blob/master/http/peer-id-auth.md)
> (proving ownership of PeerID), probes if your Kubo node can correctly answer to a [libp2p Identify](https://github.com/libp2p/specs/tree/master/identify) query.
-> This ensures only a correctly configured, publicly diallable Kubo can initiate [ACME DNS-01 challenge](https://letsencrypt.org/docs/challenge-types/#dns-01-challenge) for `peerid.libp2p.direct`.
+> This ensures only a correctly configured, publicly dialable Kubo can initiate [ACME DNS-01 challenge](https://letsencrypt.org/docs/challenge-types/#dns-01-challenge) for `peerid.libp2p.direct`.
Default: `https://registration.libp2p.direct` (public good run by [Interplanetary Shipyard](https://ipshipyard.com))
diff --git a/docs/datastores.md b/docs/datastores.md
index 03a400cb6..321f59bfc 100644
--- a/docs/datastores.md
+++ b/docs/datastores.md
@@ -57,7 +57,7 @@ The following options are available for tuning pebble.
If they are not configured (or assigned their zero-valued), then default values are used.
* `bytesPerSync`: int, Sync sstables periodically in order to smooth out writes to disk. (default: 512KB)
-* `bisableWAL`: true|false, Disable the write-ahead log (WAL) at expense of prohibiting crash recovery. (default: false)
+* `disableWAL`: true|false, Disable the write-ahead log (WAL) at expense of prohibiting crash recovery. (default: false)
* `cacheSize`: Size of pebble's shared block cache. (default: 8MB)
* `l0CompactionThreshold`: int, Count of L0 files necessary to trigger an L0 compaction.
* `l0StopWritesThreshold`: int, Limit on L0 read-amplification, computed as the number of L0 sublevels.
From 23ef1d70e775a4e6bff09e834133a3c4efec19d6 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Wed, 27 Nov 2024 19:35:15 +0100
Subject: [PATCH 072/499] tests(cli/harness): use unused Verbose flag to pipe
daemon outputs (#10601)
Obtain actual daemon output on the screen while
debugging tests.
Might be useful in the future even though it needs to
manually set verbose somewhere.
---
test/cli/harness/run.go | 28 ++++++++++++++++++++++++----
1 file changed, 24 insertions(+), 4 deletions(-)
diff --git a/test/cli/harness/run.go b/test/cli/harness/run.go
index 8ca85eb63..077af6ca5 100644
--- a/test/cli/harness/run.go
+++ b/test/cli/harness/run.go
@@ -3,6 +3,7 @@ package harness
import (
"fmt"
"io"
+ "os"
"os/exec"
"strings"
)
@@ -60,8 +61,27 @@ func environToMap(environ []string) map[string]string {
func (r *Runner) Run(req RunRequest) *RunResult {
cmd := exec.Command(req.Path, req.Args...)
- stdout := &Buffer{}
- stderr := &Buffer{}
+ var stdout io.Writer
+ var stderr io.Writer
+ outbuf := &Buffer{}
+ errbuf := &Buffer{}
+
+ if r.Verbose {
+ or, ow := io.Pipe()
+ errr, errw := io.Pipe()
+ stdout = io.MultiWriter(outbuf, ow)
+ stderr = io.MultiWriter(errbuf, errw)
+ go func() {
+ _, _ = io.Copy(os.Stdout, or)
+ }()
+ go func() {
+ _, _ = io.Copy(os.Stderr, errr)
+ }()
+ } else {
+ stdout = outbuf
+ stderr = errbuf
+ }
+
cmd.Stdout = stdout
cmd.Stderr = stderr
cmd.Dir = r.Dir
@@ -83,8 +103,8 @@ func (r *Runner) Run(req RunRequest) *RunResult {
err := req.RunFunc(cmd)
result := RunResult{
- Stdout: stdout,
- Stderr: stderr,
+ Stdout: outbuf,
+ Stderr: errbuf,
Cmd: cmd,
Err: err,
}
From 9433105a85d3acdbc12cd26d593f62b618b55767 Mon Sep 17 00:00:00 2001
From: Hector Sanjuan
Date: Wed, 27 Nov 2024 19:40:16 +0100
Subject: [PATCH 073/499] docs(changelog/v0.33): bitswap reprovide changes
(#10604)
---
docs/changelogs/v0.33.md | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/docs/changelogs/v0.33.md b/docs/changelogs/v0.33.md
index e73182174..1230fca37 100644
--- a/docs/changelogs/v0.33.md
+++ b/docs/changelogs/v0.33.md
@@ -14,6 +14,10 @@
### ๐ฆ Highlights
+#### Bitswap improvements from Boxo
+
+This release includes some refactorings and improvements affecting Bitswap which should improve reliability. One of the changes affects blocks providing. Previously, the bitswap layer took care itself of announcing new blocks -added or received- with the configured provider (i.e. DHT). This bypassed the "Reprovider", that is, the system that manages precisely "providing" the blocks stored by Kubo. The Reprovider knows how to take advantage of the [AcceleratedDHTClient](https://github.com/ipfs/kubo/blob/master/docs/config.md#routingaccelerateddhtclient), is able to handle priorities, logs statistics and is able to resume on daemon reboot where it left off. From now on, Bitswap will not be doing any providing on-the-side and all announcements are managed by the reprovider. In some cases, when the reproviding queue is full with other elements, this may cause additional delays, but more likely this will result in improved block-providing behaviour overall.
+
#### ๐ฆ๏ธ Dependency updates
- update `boxo` to [v0.24.TODO](https://github.com/ipfs/boxo/releases/tag/v0.24.TODO)
From fa769f7544896969ae58b811804e265f8b1e02f8 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 27 Nov 2024 19:41:55 +0100
Subject: [PATCH 074/499] chore(deps): bump codecov/codecov-action from 4.6.0
to 5.0.7 (#10597)
Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 4.6.0 to 5.0.7.
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codecov/codecov-action/compare/b9fd7d16f6d7d1b5d2bec1a2887e65ceed900238...015f24e6818733317a2da2edd6290ab26238649a)
---
updated-dependencies:
- dependency-name: codecov/codecov-action
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot]
Date: Tue, 3 Dec 2024 21:49:18 +0100
Subject: [PATCH 079/499] fix(cmds/add): disallow --wrap with --to-files
(#10612)
Close #10611
Co-authored-by: Marcin Rataj
Date: Fri, 13 Dec 2024 11:28:57 +0100
Subject: [PATCH 083/499] deps: update nopfs
---
go.mod | 4 ++--
go.sum | 8 ++++----
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/go.mod b/go.mod
index f9cefd504..662c67377 100644
--- a/go.mod
+++ b/go.mod
@@ -20,8 +20,8 @@ require (
github.com/google/uuid v1.6.0
github.com/hashicorp/go-multierror v1.1.1
github.com/hashicorp/go-version v1.7.0
- github.com/ipfs-shipyard/nopfs v0.0.12
- github.com/ipfs-shipyard/nopfs/ipfs v0.13.2-0.20231027223058-cde3b5ba964c
+ github.com/ipfs-shipyard/nopfs v0.0.13
+ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0
github.com/ipfs/boxo v0.25.0
github.com/ipfs/go-block-format v0.2.0
github.com/ipfs/go-cid v0.4.1
diff --git a/go.sum b/go.sum
index 35772a11e..e0f3332f7 100644
--- a/go.sum
+++ b/go.sum
@@ -360,10 +360,10 @@ github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFck
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
-github.com/ipfs-shipyard/nopfs v0.0.12 h1:mvwaoefDF5VI9jyvgWCmaoTJIJFAfrbyQV5fJz35hlk=
-github.com/ipfs-shipyard/nopfs v0.0.12/go.mod h1:mQyd0BElYI2gB/kq/Oue97obP4B3os4eBmgfPZ+hnrE=
-github.com/ipfs-shipyard/nopfs/ipfs v0.13.2-0.20231027223058-cde3b5ba964c h1:7UynTbtdlt+w08ggb1UGLGaGjp1mMaZhoTZSctpn5Ak=
-github.com/ipfs-shipyard/nopfs/ipfs v0.13.2-0.20231027223058-cde3b5ba964c/go.mod h1:6EekK/jo+TynwSE/ZOiOJd4eEvRXoavEC3vquKtv4yI=
+github.com/ipfs-shipyard/nopfs v0.0.13 h1:eXyI5x0+Y/dgjHl3RgSrVqg+1YwwybhEuRgo3BjNazM=
+github.com/ipfs-shipyard/nopfs v0.0.13/go.mod h1:mQyd0BElYI2gB/kq/Oue97obP4B3os4eBmgfPZ+hnrE=
+github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcdHUd7SDsUOY=
+github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
github.com/ipfs/boxo v0.25.0 h1:FNZaKVirUDafGz3Y9sccztynAUazs9GfSapLk/5c7is=
From b42eb5a8f91a4556212681a9ead990eab5c73bd0 Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Fri, 13 Dec 2024 02:12:55 -1000
Subject: [PATCH 084/499] Update deps (#10624)
---
docs/examples/kubo-as-a-library/go.mod | 22 ++++++------
docs/examples/kubo-as-a-library/go.sum | 43 +++++++++++------------
go.mod | 24 ++++++-------
go.sum | 47 +++++++++++++-------------
test/dependencies/go.mod | 24 ++++++-------
test/dependencies/go.sum | 47 +++++++++++++-------------
6 files changed, 105 insertions(+), 102 deletions(-)
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index 1bd9a534a..29de5a284 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -10,7 +10,7 @@ require (
github.com/ipfs/boxo v0.25.0
github.com/ipfs/kubo v0.0.0-00010101000000-000000000000
github.com/libp2p/go-libp2p v0.37.2
- github.com/multiformats/go-multiaddr v0.13.0
+ github.com/multiformats/go-multiaddr v0.14.0
)
require (
@@ -193,7 +193,7 @@ require (
github.com/rogpeppe/go-internal v1.13.1 // indirect
github.com/samber/lo v1.47.0 // indirect
github.com/spaolacci/murmur3 v1.1.0 // indirect
- github.com/stretchr/testify v1.9.0 // indirect
+ github.com/stretchr/testify v1.10.0 // indirect
github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect
github.com/ucarion/urlpath v0.0.0-20200424170820-7ccc79b76bbb // indirect
github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc // indirect
@@ -223,20 +223,20 @@ require (
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.27.0 // indirect
go4.org v0.0.0-20230225012048-214862532bf5 // indirect
- golang.org/x/crypto v0.28.0 // indirect
- golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c // indirect
- golang.org/x/mod v0.21.0 // indirect
- golang.org/x/net v0.30.0 // indirect
- golang.org/x/sync v0.8.0 // indirect
- golang.org/x/sys v0.26.0 // indirect
- golang.org/x/text v0.19.0 // indirect
- golang.org/x/tools v0.26.0 // indirect
+ golang.org/x/crypto v0.31.0 // indirect
+ golang.org/x/exp v0.0.0-20241210194714-1829a127f884 // indirect
+ golang.org/x/mod v0.22.0 // indirect
+ golang.org/x/net v0.32.0 // indirect
+ golang.org/x/sync v0.10.0 // indirect
+ golang.org/x/sys v0.28.0 // indirect
+ golang.org/x/text v0.21.0 // indirect
+ golang.org/x/tools v0.28.0 // indirect
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
gonum.org/v1/gonum v0.15.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20241007155032-5fefd90f89a9 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 // indirect
google.golang.org/grpc v1.67.1 // indirect
- google.golang.org/protobuf v1.35.1 // indirect
+ google.golang.org/protobuf v1.35.2 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
lukechampine.com/blake3 v1.3.0 // indirect
)
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index ccb32f751..4e4526653 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -556,8 +556,8 @@ github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a
github.com/multiformats/go-multiaddr v0.1.0/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44=
github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo=
github.com/multiformats/go-multiaddr v0.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4=
-github.com/multiformats/go-multiaddr v0.13.0 h1:BCBzs61E3AGHcYYTv8dqRH43ZfyrqM8RXVPT8t13tLQ=
-github.com/multiformats/go-multiaddr v0.13.0/go.mod h1:sBXrNzucqkFJhvKOiwwLyqamGa/P5EIXNPLovyhQCII=
+github.com/multiformats/go-multiaddr v0.14.0 h1:bfrHrJhrRuh/NXH5mCnemjpbGjzRw/b+tJFOD41g2tU=
+github.com/multiformats/go-multiaddr v0.14.0/go.mod h1:6EkVAxtznq2yC3QT5CM1UTAwG0GTP3EWAIcjHuzQ+r4=
github.com/multiformats/go-multiaddr-dns v0.3.0/go.mod h1:mNzQ4eTGDg0ll1N9jKPOUogZPoJ30W8a7zk66FQPpdQ=
github.com/multiformats/go-multiaddr-dns v0.4.1 h1:whi/uCLbDS3mSEUMb1MsoT4uzUeZB0N32yzufqS0i5M=
github.com/multiformats/go-multiaddr-dns v0.4.1/go.mod h1:7hfthtB4E4pQwirrz+J0CcDUfbWzTqEzVyYKKIKpgkc=
@@ -773,8 +773,9 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
-github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
+github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
+github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs=
github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48=
@@ -902,8 +903,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
-golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw=
-golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U=
+golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
+golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -912,8 +913,8 @@ golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE
golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
-golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c h1:7dEasQXItcW1xKJ2+gg5VOiBnqWrJc+rq0DPKyvvdbY=
-golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c/go.mod h1:NQtJDoLvd6faHhE7m4T/1IY708gDefGGjR/iUW8yQQ8=
+golang.org/x/exp v0.0.0-20241210194714-1829a127f884 h1:Y/Mj/94zIQQGHVSv1tTtQBDaQaJe62U9bkDZKKyhPCU=
+golang.org/x/exp v0.0.0-20241210194714-1829a127f884/go.mod h1:qj5a5QZpwLU2NLQudwIN5koi3beDhSAlJwa67PuM98c=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -937,8 +938,8 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
-golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0=
-golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
+golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4=
+golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -976,8 +977,8 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
-golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4=
-golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU=
+golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI=
+golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -996,8 +997,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
-golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
+golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1052,8 +1053,8 @@ golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo=
-golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
+golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
@@ -1073,8 +1074,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
-golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM=
-golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
+golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
+golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -1118,8 +1119,8 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
-golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ=
-golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0=
+golang.org/x/tools v0.28.0 h1:WuB6qZ4RPCQo5aP3WdKZS7i595EdWqWR8vqJTlwTVK8=
+golang.org/x/tools v0.28.0/go.mod h1:dcIOrVd3mfQKTgrDVQHqCPMWy6lnhfhtX3hLXYVLfRw=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -1194,8 +1195,8 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
-google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA=
-google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
+google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io=
+google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
diff --git a/go.mod b/go.mod
index f9cefd504..f730c95bd 100644
--- a/go.mod
+++ b/go.mod
@@ -64,7 +64,7 @@ require (
github.com/libp2p/go-libp2p-routing-helpers v0.7.4
github.com/libp2p/go-libp2p-testing v0.12.0
github.com/libp2p/go-socket-activation v0.1.0
- github.com/multiformats/go-multiaddr v0.13.0
+ github.com/multiformats/go-multiaddr v0.14.0
github.com/multiformats/go-multiaddr-dns v0.4.1
github.com/multiformats/go-multibase v0.2.0
github.com/multiformats/go-multicodec v0.9.0
@@ -72,7 +72,7 @@ require (
github.com/opentracing/opentracing-go v1.2.0
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58
github.com/prometheus/client_golang v1.20.5
- github.com/stretchr/testify v1.9.0
+ github.com/stretchr/testify v1.10.0
github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d
github.com/tidwall/gjson v1.16.0
github.com/tidwall/sjson v1.2.5
@@ -88,12 +88,12 @@ require (
go.uber.org/fx v1.23.0
go.uber.org/multierr v1.11.0
go.uber.org/zap v1.27.0
- golang.org/x/crypto v0.28.0
- golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c
- golang.org/x/mod v0.21.0
- golang.org/x/sync v0.8.0
- golang.org/x/sys v0.26.0
- google.golang.org/protobuf v1.35.1
+ golang.org/x/crypto v0.31.0
+ golang.org/x/exp v0.0.0-20241210194714-1829a127f884
+ golang.org/x/mod v0.22.0
+ golang.org/x/sync v0.10.0
+ golang.org/x/sys v0.28.0
+ google.golang.org/protobuf v1.35.2
)
require (
@@ -260,11 +260,11 @@ require (
go.uber.org/atomic v1.11.0 // indirect
go.uber.org/mock v0.5.0 // indirect
go4.org v0.0.0-20230225012048-214862532bf5 // indirect
- golang.org/x/net v0.30.0 // indirect
+ golang.org/x/net v0.32.0 // indirect
golang.org/x/oauth2 v0.23.0 // indirect
- golang.org/x/term v0.25.0 // indirect
- golang.org/x/text v0.19.0 // indirect
- golang.org/x/tools v0.26.0 // indirect
+ golang.org/x/term v0.27.0 // indirect
+ golang.org/x/text v0.21.0 // indirect
+ golang.org/x/tools v0.28.0 // indirect
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
gonum.org/v1/gonum v0.15.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20241007155032-5fefd90f89a9 // indirect
diff --git a/go.sum b/go.sum
index 35772a11e..872054ebd 100644
--- a/go.sum
+++ b/go.sum
@@ -656,8 +656,8 @@ github.com/multiformats/go-multiaddr v0.1.0/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lg
github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo=
github.com/multiformats/go-multiaddr v0.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4=
github.com/multiformats/go-multiaddr v0.4.0/go.mod h1:YcpyLH8ZPudLxQlemYBPhSm0/oCXAT8Z4mzFpyoPyRc=
-github.com/multiformats/go-multiaddr v0.13.0 h1:BCBzs61E3AGHcYYTv8dqRH43ZfyrqM8RXVPT8t13tLQ=
-github.com/multiformats/go-multiaddr v0.13.0/go.mod h1:sBXrNzucqkFJhvKOiwwLyqamGa/P5EIXNPLovyhQCII=
+github.com/multiformats/go-multiaddr v0.14.0 h1:bfrHrJhrRuh/NXH5mCnemjpbGjzRw/b+tJFOD41g2tU=
+github.com/multiformats/go-multiaddr v0.14.0/go.mod h1:6EkVAxtznq2yC3QT5CM1UTAwG0GTP3EWAIcjHuzQ+r4=
github.com/multiformats/go-multiaddr-dns v0.3.0/go.mod h1:mNzQ4eTGDg0ll1N9jKPOUogZPoJ30W8a7zk66FQPpdQ=
github.com/multiformats/go-multiaddr-dns v0.4.1 h1:whi/uCLbDS3mSEUMb1MsoT4uzUeZB0N32yzufqS0i5M=
github.com/multiformats/go-multiaddr-dns v0.4.1/go.mod h1:7hfthtB4E4pQwirrz+J0CcDUfbWzTqEzVyYKKIKpgkc=
@@ -908,8 +908,9 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
-github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
+github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
+github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/stvp/go-udp-testing v0.0.0-20201019212854-469649b16807/go.mod h1:7jxmlfBCDBXRzr0eAQJ48XC1hBu1np4CS5+cHEYfwpc=
github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs=
@@ -1066,8 +1067,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
-golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw=
-golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U=
+golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
+golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -1078,8 +1079,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
-golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c h1:7dEasQXItcW1xKJ2+gg5VOiBnqWrJc+rq0DPKyvvdbY=
-golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c/go.mod h1:NQtJDoLvd6faHhE7m4T/1IY708gDefGGjR/iUW8yQQ8=
+golang.org/x/exp v0.0.0-20241210194714-1829a127f884 h1:Y/Mj/94zIQQGHVSv1tTtQBDaQaJe62U9bkDZKKyhPCU=
+golang.org/x/exp v0.0.0-20241210194714-1829a127f884/go.mod h1:qj5a5QZpwLU2NLQudwIN5koi3beDhSAlJwa67PuM98c=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -1104,8 +1105,8 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
-golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0=
-golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
+golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4=
+golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -1158,8 +1159,8 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
-golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4=
-golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU=
+golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI=
+golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -1186,8 +1187,8 @@ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
-golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
+golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1263,8 +1264,8 @@ golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo=
-golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
+golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
@@ -1273,8 +1274,8 @@ golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU=
golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY=
-golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24=
-golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M=
+golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q=
+golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -1286,8 +1287,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
-golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM=
-golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
+golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
+golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -1348,8 +1349,8 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
-golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ=
-golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0=
+golang.org/x/tools v0.28.0 h1:WuB6qZ4RPCQo5aP3WdKZS7i595EdWqWR8vqJTlwTVK8=
+golang.org/x/tools v0.28.0/go.mod h1:dcIOrVd3mfQKTgrDVQHqCPMWy6lnhfhtX3hLXYVLfRw=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -1455,8 +1456,8 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
-google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA=
-google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
+google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io=
+google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index 565e94fb8..419623304 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -14,7 +14,7 @@ require (
github.com/ipfs/iptb-plugins v0.5.1
github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c
github.com/jbenet/go-random-files v0.0.0-20190219210431-31b3f20ebded
- github.com/multiformats/go-multiaddr v0.13.0
+ github.com/multiformats/go-multiaddr v0.14.0
github.com/multiformats/go-multihash v0.2.3
gotest.tools/gotestsum v1.12.0
)
@@ -260,7 +260,7 @@ require (
github.com/ssgreg/nlreturn/v2 v2.2.1 // indirect
github.com/stbenjam/no-sprintf-host-port v0.1.1 // indirect
github.com/stretchr/objx v0.5.2 // indirect
- github.com/stretchr/testify v1.9.0 // indirect
+ github.com/stretchr/testify v1.10.0 // indirect
github.com/subosito/gotenv v1.6.0 // indirect
github.com/tdakkota/asciicheck v0.2.0 // indirect
github.com/tetafro/godot v1.4.16 // indirect
@@ -293,18 +293,18 @@ require (
go.uber.org/mock v0.5.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.27.0 // indirect
- golang.org/x/crypto v0.28.0 // indirect
- golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c // indirect
+ golang.org/x/crypto v0.31.0 // indirect
+ golang.org/x/exp v0.0.0-20241210194714-1829a127f884 // indirect
golang.org/x/exp/typeparams v0.0.0-20240613232115-7f521ea00fb8 // indirect
- golang.org/x/mod v0.21.0 // indirect
- golang.org/x/net v0.30.0 // indirect
- golang.org/x/sync v0.8.0 // indirect
- golang.org/x/sys v0.26.0 // indirect
- golang.org/x/term v0.25.0 // indirect
- golang.org/x/text v0.19.0 // indirect
- golang.org/x/tools v0.26.0 // indirect
+ golang.org/x/mod v0.22.0 // indirect
+ golang.org/x/net v0.32.0 // indirect
+ golang.org/x/sync v0.10.0 // indirect
+ golang.org/x/sys v0.28.0 // indirect
+ golang.org/x/term v0.27.0 // indirect
+ golang.org/x/text v0.21.0 // indirect
+ golang.org/x/tools v0.28.0 // indirect
gonum.org/v1/gonum v0.15.0 // indirect
- google.golang.org/protobuf v1.35.1 // indirect
+ google.golang.org/protobuf v1.35.2 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index c436e7acf..4a70a2745 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -522,8 +522,8 @@ github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYg
github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0=
github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4=
github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo=
-github.com/multiformats/go-multiaddr v0.13.0 h1:BCBzs61E3AGHcYYTv8dqRH43ZfyrqM8RXVPT8t13tLQ=
-github.com/multiformats/go-multiaddr v0.13.0/go.mod h1:sBXrNzucqkFJhvKOiwwLyqamGa/P5EIXNPLovyhQCII=
+github.com/multiformats/go-multiaddr v0.14.0 h1:bfrHrJhrRuh/NXH5mCnemjpbGjzRw/b+tJFOD41g2tU=
+github.com/multiformats/go-multiaddr v0.14.0/go.mod h1:6EkVAxtznq2yC3QT5CM1UTAwG0GTP3EWAIcjHuzQ+r4=
github.com/multiformats/go-multiaddr-dns v0.4.1 h1:whi/uCLbDS3mSEUMb1MsoT4uzUeZB0N32yzufqS0i5M=
github.com/multiformats/go-multiaddr-dns v0.4.1/go.mod h1:7hfthtB4E4pQwirrz+J0CcDUfbWzTqEzVyYKKIKpgkc=
github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E=
@@ -761,8 +761,9 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
-github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
+github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
+github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA=
@@ -880,11 +881,11 @@ golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
-golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw=
-golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U=
+golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
+golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c h1:7dEasQXItcW1xKJ2+gg5VOiBnqWrJc+rq0DPKyvvdbY=
-golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c/go.mod h1:NQtJDoLvd6faHhE7m4T/1IY708gDefGGjR/iUW8yQQ8=
+golang.org/x/exp v0.0.0-20241210194714-1829a127f884 h1:Y/Mj/94zIQQGHVSv1tTtQBDaQaJe62U9bkDZKKyhPCU=
+golang.org/x/exp v0.0.0-20241210194714-1829a127f884/go.mod h1:qj5a5QZpwLU2NLQudwIN5koi3beDhSAlJwa67PuM98c=
golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
golang.org/x/exp/typeparams v0.0.0-20240613232115-7f521ea00fb8 h1:+ZJmEdDFzH5H0CnzOrwgbH3elHctfTecW9X0k2tkn5M=
@@ -911,8 +912,8 @@ golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
-golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0=
-golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
+golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4=
+golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -945,8 +946,8 @@ golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
-golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4=
-golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU=
+golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI=
+golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -966,8 +967,8 @@ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
-golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
-golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
+golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1007,8 +1008,8 @@ golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo=
-golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
+golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
@@ -1025,8 +1026,8 @@ golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY=
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58=
-golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24=
-golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M=
+golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q=
+golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
@@ -1041,8 +1042,8 @@ golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
-golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM=
-golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
+golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
+golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U=
@@ -1082,8 +1083,8 @@ golang.org/x/tools v0.11.0/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8
golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg=
golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc=
-golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ=
-golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0=
+golang.org/x/tools v0.28.0 h1:WuB6qZ4RPCQo5aP3WdKZS7i595EdWqWR8vqJTlwTVK8=
+golang.org/x/tools v0.28.0/go.mod h1:dcIOrVd3mfQKTgrDVQHqCPMWy6lnhfhtX3hLXYVLfRw=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -1121,8 +1122,8 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
-google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA=
-google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
+google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io=
+google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
From 09d57899467299cce119eb7ea2ba30336a129e0d Mon Sep 17 00:00:00 2001
From: gammazero <11790789+gammazero@users.noreply.github.com>
Date: Fri, 13 Dec 2024 02:16:38 -1000
Subject: [PATCH 085/499] mod tidy examples
---
docs/examples/kubo-as-a-library/go.mod | 4 ++--
docs/examples/kubo-as-a-library/go.sum | 8 ++++----
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index 1bd9a534a..04e6bc31a 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -74,8 +74,8 @@ require (
github.com/hashicorp/golang-lru v1.0.2 // indirect
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
github.com/huin/goupnp v1.3.0 // indirect
- github.com/ipfs-shipyard/nopfs v0.0.12 // indirect
- github.com/ipfs-shipyard/nopfs/ipfs v0.13.2-0.20231027223058-cde3b5ba964c // indirect
+ github.com/ipfs-shipyard/nopfs v0.0.13 // indirect
+ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 // indirect
github.com/ipfs/bbloom v0.0.4 // indirect
github.com/ipfs/go-bitfield v1.1.0 // indirect
github.com/ipfs/go-block-format v0.2.0 // indirect
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index ccb32f751..13abfe543 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -296,10 +296,10 @@ github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFck
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
-github.com/ipfs-shipyard/nopfs v0.0.12 h1:mvwaoefDF5VI9jyvgWCmaoTJIJFAfrbyQV5fJz35hlk=
-github.com/ipfs-shipyard/nopfs v0.0.12/go.mod h1:mQyd0BElYI2gB/kq/Oue97obP4B3os4eBmgfPZ+hnrE=
-github.com/ipfs-shipyard/nopfs/ipfs v0.13.2-0.20231027223058-cde3b5ba964c h1:7UynTbtdlt+w08ggb1UGLGaGjp1mMaZhoTZSctpn5Ak=
-github.com/ipfs-shipyard/nopfs/ipfs v0.13.2-0.20231027223058-cde3b5ba964c/go.mod h1:6EekK/jo+TynwSE/ZOiOJd4eEvRXoavEC3vquKtv4yI=
+github.com/ipfs-shipyard/nopfs v0.0.13 h1:eXyI5x0+Y/dgjHl3RgSrVqg+1YwwybhEuRgo3BjNazM=
+github.com/ipfs-shipyard/nopfs v0.0.13/go.mod h1:mQyd0BElYI2gB/kq/Oue97obP4B3os4eBmgfPZ+hnrE=
+github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcdHUd7SDsUOY=
+github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
github.com/ipfs/boxo v0.25.0 h1:FNZaKVirUDafGz3Y9sccztynAUazs9GfSapLk/5c7is=
From 898f024f3c94bcb370998b3a7039fa7057de3e32 Mon Sep 17 00:00:00 2001
From: Hector Sanjuan
Date: Tue, 17 Dec 2024 21:59:12 +0100
Subject: [PATCH 086/499] [skip changelog] pinmfs: mitigate slow mfs writes
when it triggers (#10623)
* pinmfs: mitigate slow mfs writes when it triggers
This mitigates slow mfs writes when the pinmfs daemon calls mfs.RootNode()
When writing lots of files to MFS, this call triggers a mfs directory cache
sync operations. The cache grows forever and is unbounded. The more files
added to a directory, the longer it takes. In the meantime, writing to mfs is
locked.
The pinmfs, even when no remote pinning services are configured, will trigger
this issue. When RootNode() takes more than 30 seconds, the issue will be triggered
continuously causing a write-deadlock onto MFS.
This commit does not fix the fact that if you write 1M items into an MFS
directory, the first time that the directory is traversed it will still have
to sync those 1M items. It does at least prevent writes from stalling after
about ~6000 items.
* pinmfs: fix test
---
cmd/ipfs/kubo/pinmfs.go | 50 ++++++++++++++++++++++--------------
cmd/ipfs/kubo/pinmfs_test.go | 19 +++++++++++---
2 files changed, 47 insertions(+), 22 deletions(-)
diff --git a/cmd/ipfs/kubo/pinmfs.go b/cmd/ipfs/kubo/pinmfs.go
index ec72e326d..96ab4d861 100644
--- a/cmd/ipfs/kubo/pinmfs.go
+++ b/cmd/ipfs/kubo/pinmfs.go
@@ -90,34 +90,46 @@ func pinMFSOnChange(cctx pinMFSContext, configPollInterval time.Duration, node p
case <-cctx.Context().Done():
return
case <-tmo.C:
- tmo.Reset(configPollInterval)
- }
+ // reread the config, which may have changed in the meantime
+ cfg, err := cctx.GetConfig()
+ if err != nil {
+ mfslog.Errorf("pinning reading config (%v)", err)
+ continue
+ }
+ mfslog.Debugf("pinning loop is awake, %d remote services", len(cfg.Pinning.RemoteServices))
- // reread the config, which may have changed in the meantime
- cfg, err := cctx.GetConfig()
- if err != nil {
- mfslog.Errorf("pinning reading config (%v)", err)
- continue
+ // pin to all remote services in parallel
+ pinAllMFS(cctx.Context(), node, cfg, lastPins)
}
- mfslog.Debugf("pinning loop is awake, %d remote services", len(cfg.Pinning.RemoteServices))
-
- // get the most recent MFS root cid
- rootNode, err := node.RootNode()
- if err != nil {
- mfslog.Errorf("pinning reading MFS root (%v)", err)
- continue
- }
-
- // pin to all remote services in parallel
- pinAllMFS(cctx.Context(), node, cfg, rootNode.Cid(), lastPins)
+ // pinAllMFS may take long. Reset interval only when we are done doing it
+ // so that we are not pinning constantly.
+ tmo.Reset(configPollInterval)
}
}
// pinAllMFS pins on all remote services in parallel to overcome DoS attacks.
-func pinAllMFS(ctx context.Context, node pinMFSNode, cfg *config.Config, rootCid cid.Cid, lastPins map[string]lastPin) {
+func pinAllMFS(ctx context.Context, node pinMFSNode, cfg *config.Config, lastPins map[string]lastPin) {
ch := make(chan lastPin)
var started int
+ // Bail out to mitigate issue below when not needing to do anything.
+ if len(cfg.Pinning.RemoteServices) == 0 {
+ return
+ }
+
+ // get the most recent MFS root cid.
+ // Warning! This can be super expensive.
+ // See https://github.com/ipfs/boxo/pull/751
+ // and https://github.com/ipfs/kubo/issues/8694
+ // Reading an MFS-directory nodes can take minutes due to
+ // ever growing cache being synced to unixfs.
+ rootNode, err := node.RootNode()
+ if err != nil {
+ mfslog.Errorf("pinning reading MFS root (%v)", err)
+ return
+ }
+ rootCid := rootNode.Cid()
+
for svcName, svcConfig := range cfg.Pinning.RemoteServices {
if ctx.Err() != nil {
break
diff --git a/cmd/ipfs/kubo/pinmfs_test.go b/cmd/ipfs/kubo/pinmfs_test.go
index 750be9c98..6b171cd63 100644
--- a/cmd/ipfs/kubo/pinmfs_test.go
+++ b/cmd/ipfs/kubo/pinmfs_test.go
@@ -94,11 +94,24 @@ func TestPinMFSRootNodeError(t *testing.T) {
ctx, cancel := context.WithTimeout(context.Background(), 2*testConfigPollInterval)
defer cancel()
+ // need at least one config to trigger
+ cfg := &config.Config{
+ Pinning: config.Pinning{
+ RemoteServices: map[string]config.RemotePinningService{
+ "A": {
+ Policies: config.RemotePinningServicePolicies{
+ MFS: config.RemotePinningServiceMFSPolicy{
+ Enable: false,
+ },
+ },
+ },
+ },
+ },
+ }
+
cctx := &testPinMFSContext{
ctx: ctx,
- cfg: &config.Config{
- Pinning: config.Pinning{},
- },
+ cfg: cfg,
err: nil,
}
node := &testPinMFSNode{
From 7c498600618a4a0ce336af81c36327fd91eb25ce Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Thu, 19 Dec 2024 11:54:02 -1000
Subject: [PATCH 087/499] Upgrade to Boxo v0.26.0 (#10631)
* Upgrade to Boxo v0.26.0
* Update docs/changelogs/v0.33.md
---
core/coreapi/unixfs.go | 2 +-
docs/changelogs/v0.33.md | 4 +-
docs/examples/kubo-as-a-library/go.mod | 36 ++++++------
docs/examples/kubo-as-a-library/go.sum | 74 ++++++++++++------------
go.mod | 38 +++++++------
go.sum | 78 +++++++++++++-------------
test/dependencies/go.mod | 34 +++++------
test/dependencies/go.sum | 74 ++++++++++++------------
8 files changed, 176 insertions(+), 164 deletions(-)
diff --git a/core/coreapi/unixfs.go b/core/coreapi/unixfs.go
index 6068c9b05..93293beb9 100644
--- a/core/coreapi/unixfs.go
+++ b/core/coreapi/unixfs.go
@@ -85,7 +85,7 @@ func (api *UnixfsAPI) Add(ctx context.Context, files files.Node, opts ...options
if settings.OnlyHash {
// setup a /dev/null pipeline to simulate adding the data
dstore := dssync.MutexWrap(ds.NewNullDatastore())
- bs := bstore.NewBlockstore(dstore, bstore.WriteThrough())
+ bs := bstore.NewBlockstore(dstore, bstore.WriteThrough(true))
addblockstore = bstore.NewGCBlockstore(bs, nil) // gclocker will never be used
exch = nil // exchange will never be used
pinning = nil // pinner will never be used
diff --git a/docs/changelogs/v0.33.md b/docs/changelogs/v0.33.md
index 4dd6ba806..ca2e45563 100644
--- a/docs/changelogs/v0.33.md
+++ b/docs/changelogs/v0.33.md
@@ -33,8 +33,8 @@ Onboarding files and directories with `ipfs add --to-files` now requires non-emp
#### ๐ฆ๏ธ Dependency updates
-- update `boxo` to [v0.25.0](https://github.com/ipfs/boxo/releases/tag/v0.25.0)
-- update `go-libp2p` to [v0.37.1](https://github.com/libp2p/go-libp2p/releases/tag/v0.37.1) + [v0.37.2](https://github.com/libp2p/go-libp2p/releases/tag/v0.37.2)
+- update `boxo` to [v0.26.0](https://github.com/ipfs/boxo/releases/tag/v0.26.0)
+- update `go-libp2p` to [v0.38.1](https://github.com/libp2p/go-libp2p/releases/tag/v0.38.1) (incl. [v0.37.1](https://github.com/libp2p/go-libp2p/releases/tag/v0.37.1) + [v0.37.2](https://github.com/libp2p/go-libp2p/releases/tag/v0.37.2) + [v0.38.0](https://github.com/libp2p/go-libp2p/releases/tag/v0.38.0))
- update `p2p-forge/client` to [v0.1.0](https://github.com/ipshipyard/p2p-forge/releases/tag/v0.1.0)
- update `ipfs-webui` to [v4.4.1](https://github.com/ipfs/ipfs-webui/releases/tag/v4.4.1)
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index a10c07295..d30b32d7f 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -7,9 +7,9 @@ go 1.23
replace github.com/ipfs/kubo => ./../../..
require (
- github.com/ipfs/boxo v0.25.0
+ github.com/ipfs/boxo v0.26.0
github.com/ipfs/kubo v0.0.0-00010101000000-000000000000
- github.com/libp2p/go-libp2p v0.37.2
+ github.com/libp2p/go-libp2p v0.38.1
github.com/multiformats/go-multiaddr v0.14.0
)
@@ -48,6 +48,7 @@ require (
github.com/elastic/gosigar v0.14.3 // indirect
github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5 // indirect
github.com/felixge/httpsnoop v1.0.4 // indirect
+ github.com/filecoin-project/go-clock v0.1.0 // indirect
github.com/flynn/noise v1.1.0 // indirect
github.com/francoispqt/gojay v1.2.13 // indirect
github.com/fsnotify/fsnotify v1.7.0 // indirect
@@ -65,7 +66,7 @@ require (
github.com/golang/protobuf v1.5.4 // indirect
github.com/golang/snappy v0.0.4 // indirect
github.com/google/gopacket v1.1.19 // indirect
- github.com/google/pprof v0.0.0-20241017200806-017d972448fc // indirect
+ github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/gorilla/websocket v1.5.3 // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect
@@ -104,7 +105,7 @@ require (
github.com/ipfs/go-log/v2 v2.5.1 // indirect
github.com/ipfs/go-merkledag v0.11.0 // indirect
github.com/ipfs/go-metrics-interface v0.0.1 // indirect
- github.com/ipfs/go-peertaskqueue v0.8.1 // indirect
+ github.com/ipfs/go-peertaskqueue v0.8.2 // indirect
github.com/ipfs/go-unixfsnode v1.9.2 // indirect
github.com/ipfs/go-verifcid v0.0.3 // indirect
github.com/ipld/go-car v0.6.2 // indirect
@@ -116,7 +117,7 @@ require (
github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect
github.com/jbenet/goprocess v0.1.4 // indirect
github.com/klauspost/compress v1.17.11 // indirect
- github.com/klauspost/cpuid/v2 v2.2.8 // indirect
+ github.com/klauspost/cpuid/v2 v2.2.9 // indirect
github.com/koron/go-ssdp v0.0.4 // indirect
github.com/kr/pretty v0.3.1 // indirect
github.com/kr/text v0.2.0 // indirect
@@ -135,7 +136,7 @@ require (
github.com/libp2p/go-libp2p-xor v0.1.0 // indirect
github.com/libp2p/go-msgio v0.3.0 // indirect
github.com/libp2p/go-nat v0.2.0 // indirect
- github.com/libp2p/go-netroute v0.2.1 // indirect
+ github.com/libp2p/go-netroute v0.2.2 // indirect
github.com/libp2p/go-reuseport v0.4.0 // indirect
github.com/libp2p/go-yamux/v4 v4.0.1 // indirect
github.com/libp2p/zeroconf/v2 v2.2.0 // indirect
@@ -157,34 +158,35 @@ require (
github.com/multiformats/go-multistream v0.6.0 // indirect
github.com/multiformats/go-varint v0.0.7 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
- github.com/onsi/ginkgo/v2 v2.20.2 // indirect
+ github.com/onsi/ginkgo/v2 v2.22.0 // indirect
github.com/opencontainers/runtime-spec v1.2.0 // indirect
github.com/opentracing/opentracing-go v1.2.0 // indirect
github.com/openzipkin/zipkin-go v0.4.3 // indirect
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect
github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 // indirect
- github.com/pion/datachannel v1.5.9 // indirect
+ github.com/pion/datachannel v1.5.10 // indirect
github.com/pion/dtls/v2 v2.2.12 // indirect
- github.com/pion/ice/v2 v2.3.36 // indirect
+ github.com/pion/ice/v2 v2.3.37 // indirect
github.com/pion/interceptor v0.1.37 // indirect
github.com/pion/logging v0.2.2 // indirect
github.com/pion/mdns v0.0.12 // indirect
github.com/pion/randutil v0.1.0 // indirect
- github.com/pion/rtcp v1.2.14 // indirect
- github.com/pion/rtp v1.8.9 // indirect
- github.com/pion/sctp v1.8.33 // indirect
+ github.com/pion/rtcp v1.2.15 // indirect
+ github.com/pion/rtp v1.8.10 // indirect
+ github.com/pion/sctp v1.8.35 // indirect
github.com/pion/sdp/v3 v3.0.9 // indirect
github.com/pion/srtp/v2 v2.0.20 // indirect
github.com/pion/stun v0.6.1 // indirect
github.com/pion/transport/v2 v2.2.10 // indirect
+ github.com/pion/transport/v3 v3.0.7 // indirect
github.com/pion/turn/v2 v2.1.6 // indirect
- github.com/pion/webrtc/v3 v3.3.4 // indirect
+ github.com/pion/webrtc/v3 v3.3.5 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/polydawn/refmt v0.89.0 // indirect
github.com/prometheus/client_golang v1.20.5 // indirect
github.com/prometheus/client_model v0.6.1 // indirect
- github.com/prometheus/common v0.60.0 // indirect
+ github.com/prometheus/common v0.61.0 // indirect
github.com/prometheus/procfs v0.15.1 // indirect
github.com/quic-go/qpack v0.5.1 // indirect
github.com/quic-go/quic-go v0.48.2 // indirect
@@ -224,9 +226,9 @@ require (
go.uber.org/zap v1.27.0 // indirect
go4.org v0.0.0-20230225012048-214862532bf5 // indirect
golang.org/x/crypto v0.31.0 // indirect
- golang.org/x/exp v0.0.0-20241210194714-1829a127f884 // indirect
+ golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67 // indirect
golang.org/x/mod v0.22.0 // indirect
- golang.org/x/net v0.32.0 // indirect
+ golang.org/x/net v0.33.0 // indirect
golang.org/x/sync v0.10.0 // indirect
golang.org/x/sys v0.28.0 // indirect
golang.org/x/text v0.21.0 // indirect
@@ -236,7 +238,7 @@ require (
google.golang.org/genproto/googleapis/api v0.0.0-20241007155032-5fefd90f89a9 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 // indirect
google.golang.org/grpc v1.67.1 // indirect
- google.golang.org/protobuf v1.35.2 // indirect
+ google.golang.org/protobuf v1.36.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
lukechampine.com/blake3 v1.3.0 // indirect
)
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index d5e68de40..4ed77310b 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -149,6 +149,8 @@ github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5 h1:BBso6MBKW
github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5/go.mod h1:JpoxHjuQauoxiFMl1ie8Xc/7TfLuMZ5eOCONd1sUBHg=
github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
+github.com/filecoin-project/go-clock v0.1.0 h1:SFbYIM75M8NnFm1yMHhN9Ahy3W5bEZV9gd6MPfXbKVU=
+github.com/filecoin-project/go-clock v0.1.0/go.mod h1:4uB/O4PvOjlx1VCMdZ9MyDZXRm//gkj1ELEbxfI1AZs=
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
github.com/flynn/noise v1.1.0 h1:KjPQoQCEFdZDiP03phOvGi11+SVVhBG2wOWAorLsstg=
github.com/flynn/noise v1.1.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag=
@@ -253,8 +255,8 @@ github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OI
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20241017200806-017d972448fc h1:NGyrhhFhwvRAZg02jnYVg3GBQy0qGBKmFQJwaPmpmxs=
-github.com/google/pprof v0.0.0-20241017200806-017d972448fc/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
+github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg=
+github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
@@ -302,8 +304,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcd
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.25.0 h1:FNZaKVirUDafGz3Y9sccztynAUazs9GfSapLk/5c7is=
-github.com/ipfs/boxo v0.25.0/go.mod h1:MQVkL3V8RfuIsn+aajCR0MXLl8nRlz+5uGlHMWFVyuE=
+github.com/ipfs/boxo v0.26.0 h1:RRxEon7rJMy8ScVaTLncSZ5/nA6majYhRSbzc80snO8=
+github.com/ipfs/boxo v0.26.0/go.mod h1:iHyc9cjoF7/zoiKVY65d2fBWRhoS2zx4cMk8hKgqrac=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-bitswap v0.11.0 h1:j1WVvhDX1yhG32NTC9xfxnqycqYIlhzEzLXG/cU1HyQ=
@@ -386,8 +388,8 @@ github.com/ipfs/go-merkledag v0.11.0 h1:DgzwK5hprESOzS4O1t/wi6JDpyVQdvm9Bs59N/jq
github.com/ipfs/go-merkledag v0.11.0/go.mod h1:Q4f/1ezvBiJV0YCIXvt51W/9/kqJGH4I1LsA7+djsM4=
github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg=
github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY=
-github.com/ipfs/go-peertaskqueue v0.8.1 h1:YhxAs1+wxb5jk7RvS0LHdyiILpNmRIRnZVztekOF0pg=
-github.com/ipfs/go-peertaskqueue v0.8.1/go.mod h1:Oxxd3eaK279FxeydSPPVGHzbwVeHjatZ2GA8XD+KbPU=
+github.com/ipfs/go-peertaskqueue v0.8.2 h1:PaHFRaVFdxQk1Qo3OKiHPYjmmusQy7gKQUaL8JDszAU=
+github.com/ipfs/go-peertaskqueue v0.8.2/go.mod h1:L6QPvou0346c2qPJNiJa6BvOibxDfaiPlqHInmzg0FA=
github.com/ipfs/go-test v0.0.4 h1:DKT66T6GBB6PsDFLoO56QZPrOmzJkqU1FZH5C9ySkew=
github.com/ipfs/go-test v0.0.4/go.mod h1:qhIM1EluEfElKKM6fnWxGn822/z9knUGM1+I/OAQNKI=
github.com/ipfs/go-unixfsnode v1.9.2 h1:0A12BYs4XOtDPJTMlwmNPlllDfqcc4yie4e919hcUXk=
@@ -434,8 +436,8 @@ github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6
github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc=
github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0=
github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
-github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM=
-github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
+github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=
+github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/koron/go-ssdp v0.0.4 h1:1IDwrghSKYM7yLf7XCzbByg2sJ/JcNOZRXS2jczTwz0=
github.com/koron/go-ssdp v0.0.4/go.mod h1:oDXq+E5IL5q0U8uSBcoAXzTzInwy5lEgC91HoKtbmZk=
@@ -463,8 +465,8 @@ github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZ
github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs=
github.com/libp2p/go-flow-metrics v0.2.0 h1:EIZzjmeOE6c8Dav0sNv35vhZxATIXWZg6j/C08XmmDw=
github.com/libp2p/go-flow-metrics v0.2.0/go.mod h1:st3qqfu8+pMfh+9Mzqb2GTiwrAGjIPszEjZmtksN8Jc=
-github.com/libp2p/go-libp2p v0.37.2 h1:Irh+n9aDPTLt9wJYwtlHu6AhMUipbC1cGoJtOiBqI9c=
-github.com/libp2p/go-libp2p v0.37.2/go.mod h1:M8CRRywYkqC6xKHdZ45hmqVckBj5z4mRLIMLWReypz8=
+github.com/libp2p/go-libp2p v0.38.1 h1:aT1K7IFWi+gZUsQGCzTHBTlKX5QVZQOahng8DnOr6tQ=
+github.com/libp2p/go-libp2p v0.38.1/go.mod h1:QWV4zGL3O9nXKdHirIC59DoRcZ446dfkjbOJ55NEWFo=
github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94=
github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8=
github.com/libp2p/go-libp2p-core v0.2.4/go.mod h1:STh4fdfa5vDYr0/SzYYeqnt+E6KfEV5VxfIrm0bcI0g=
@@ -492,8 +494,8 @@ github.com/libp2p/go-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0
github.com/libp2p/go-msgio v0.3.0/go.mod h1:nyRM819GmVaF9LX3l03RMh10QdOroF++NBbxAb0mmDM=
github.com/libp2p/go-nat v0.2.0 h1:Tyz+bUFAYqGyJ/ppPPymMGbIgNRH+WqC5QrT5fKrrGk=
github.com/libp2p/go-nat v0.2.0/go.mod h1:3MJr+GRpRkyT65EpVPBstXLvOlAPzUVlG6Pwg9ohLJk=
-github.com/libp2p/go-netroute v0.2.1 h1:V8kVrpD8GK0Riv15/7VN6RbUQ3URNZVosw7H2v9tksU=
-github.com/libp2p/go-netroute v0.2.1/go.mod h1:hraioZr0fhBjG0ZRXJJ6Zj2IVEVNx6tDTFQfSmcq7mQ=
+github.com/libp2p/go-netroute v0.2.2 h1:Dejd8cQ47Qx2kRABg6lPwknU7+nBnFRpko45/fFPuZ8=
+github.com/libp2p/go-netroute v0.2.2/go.mod h1:Rntq6jUAH0l9Gg17w5bFGhcC9a+vk4KNXs6s7IljKYE=
github.com/libp2p/go-openssl v0.0.3/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc=
github.com/libp2p/go-openssl v0.0.4/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc=
github.com/libp2p/go-reuseport v0.4.0 h1:nR5KU7hD0WxXCJbmw7r2rhRYruNRl2koHw8fQscQm2s=
@@ -600,15 +602,15 @@ github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vv
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
-github.com/onsi/ginkgo/v2 v2.20.2 h1:7NVCeyIWROIAheY21RLS+3j2bb52W0W82tkberYytp4=
-github.com/onsi/ginkgo/v2 v2.20.2/go.mod h1:K9gyxPIlb+aIvnZ8bd9Ak+YP18w3APlR+5coaZoE2ag=
+github.com/onsi/ginkgo/v2 v2.22.0 h1:Yed107/8DjTr0lKCNt7Dn8yQ6ybuDRQoMGrNFKzMfHg=
+github.com/onsi/ginkgo/v2 v2.22.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo=
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro=
-github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k=
-github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY=
+github.com/onsi/gomega v1.34.2 h1:pNCwDkzrsv7MS9kpaQvVb1aVLahQXyJ/Tv5oAZMI3i8=
+github.com/onsi/gomega v1.34.2/go.mod h1:v1xfxRgk0KIsG+QOdm7p8UosrOzPYRo60fd3B/1Dukc=
github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
github.com/opencontainers/runtime-spec v1.2.0 h1:z97+pHb3uELt/yiAWD691HNHQIF07bE7dzrbT927iTk=
github.com/opencontainers/runtime-spec v1.2.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
@@ -626,13 +628,13 @@ github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 h1:1/WtZae0yGtPq+TI6+
github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9/go.mod h1:x3N5drFsm2uilKKuuYo6LdyD8vZAW55sH/9w+pbo1sw=
github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4=
github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
-github.com/pion/datachannel v1.5.9 h1:LpIWAOYPyDrXtU+BW7X0Yt/vGtYxtXQ8ql7dFfYUVZA=
-github.com/pion/datachannel v1.5.9/go.mod h1:kDUuk4CU4Uxp82NH4LQZbISULkX/HtzKa4P7ldf9izE=
+github.com/pion/datachannel v1.5.10 h1:ly0Q26K1i6ZkGf42W7D4hQYR90pZwzFOjTq5AuCKk4o=
+github.com/pion/datachannel v1.5.10/go.mod h1:p/jJfC9arb29W7WrxyKbepTU20CFgyx5oLo8Rs4Py/M=
github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s=
github.com/pion/dtls/v2 v2.2.12 h1:KP7H5/c1EiVAAKUmXyCzPiQe5+bCJrpOeKg/L05dunk=
github.com/pion/dtls/v2 v2.2.12/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE=
-github.com/pion/ice/v2 v2.3.36 h1:SopeXiVbbcooUg2EIR8sq4b13RQ8gzrkkldOVg+bBsc=
-github.com/pion/ice/v2 v2.3.36/go.mod h1:mBF7lnigdqgtB+YHkaY/Y6s6tsyRyo4u4rPGRuOjUBQ=
+github.com/pion/ice/v2 v2.3.37 h1:ObIdaNDu1rCo7hObhs34YSBcO7fjslJMZV0ux+uZWh0=
+github.com/pion/ice/v2 v2.3.37/go.mod h1:mBF7lnigdqgtB+YHkaY/Y6s6tsyRyo4u4rPGRuOjUBQ=
github.com/pion/interceptor v0.1.37 h1:aRA8Zpab/wE7/c0O3fh1PqY0AJI3fCSEM5lRWJVorwI=
github.com/pion/interceptor v0.1.37/go.mod h1:JzxbJ4umVTlZAf+/utHzNesY8tmRkM2lVmkS82TTj8Y=
github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY=
@@ -642,13 +644,13 @@ github.com/pion/mdns v0.0.12/go.mod h1:VExJjv8to/6Wqm1FXK+Ii/Z9tsVk/F5sD/N70cnYF
github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA=
github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8=
github.com/pion/rtcp v1.2.12/go.mod h1:sn6qjxvnwyAkkPzPULIbVqSKI5Dv54Rv7VG0kNxh9L4=
-github.com/pion/rtcp v1.2.14 h1:KCkGV3vJ+4DAJmvP0vaQShsb0xkRfWkO540Gy102KyE=
-github.com/pion/rtcp v1.2.14/go.mod h1:sn6qjxvnwyAkkPzPULIbVqSKI5Dv54Rv7VG0kNxh9L4=
+github.com/pion/rtcp v1.2.15 h1:LZQi2JbdipLOj4eBjK4wlVoQWfrZbh3Q6eHtWtJBZBo=
+github.com/pion/rtcp v1.2.15/go.mod h1:jlGuAjHMEXwMUHK78RgX0UmEJFV4zUKOFHR7OP+D3D0=
github.com/pion/rtp v1.8.3/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU=
-github.com/pion/rtp v1.8.9 h1:E2HX740TZKaqdcPmf4pw6ZZuG8u5RlMMt+l3dxeu6Wk=
-github.com/pion/rtp v1.8.9/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU=
-github.com/pion/sctp v1.8.33 h1:dSE4wX6uTJBcNm8+YlMg7lw1wqyKHggsP5uKbdj+NZw=
-github.com/pion/sctp v1.8.33/go.mod h1:beTnqSzewI53KWoG3nqB282oDMGrhNxBdb+JZnkCwRM=
+github.com/pion/rtp v1.8.10 h1:puphjdbjPB+L+NFaVuZ5h6bt1g5q4kFIoI+r5q/g0CU=
+github.com/pion/rtp v1.8.10/go.mod h1:8uMBJj32Pa1wwx8Fuv/AsFhn8jsgw+3rUC2PfoBZ8p4=
+github.com/pion/sctp v1.8.35 h1:qwtKvNK1Wc5tHMIYgTDJhfZk7vATGVHhXbUDfHbYwzA=
+github.com/pion/sctp v1.8.35/go.mod h1:EcXP8zCYVTRy3W9xtOF7wJm1L1aXfKRQzaM33SjQlzg=
github.com/pion/sdp/v3 v3.0.9 h1:pX++dCHoHUwq43kuwf3PyJfHlwIj4hXA7Vrifiq0IJY=
github.com/pion/sdp/v3 v3.0.9/go.mod h1:B5xmvENq5IXJimIO4zfp6LAe1fD9N+kFv+V/1lOdz8M=
github.com/pion/srtp/v2 v2.0.20 h1:HNNny4s+OUmG280ETrCdgFndp4ufx3/uy85EawYEhTk=
@@ -666,8 +668,8 @@ github.com/pion/transport/v3 v3.0.7/go.mod h1:YleKiTZ4vqNxVwh77Z0zytYi7rXHl7j6uP
github.com/pion/turn/v2 v2.1.3/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY=
github.com/pion/turn/v2 v2.1.6 h1:Xr2niVsiPTB0FPtt+yAWKFUkU1eotQbGgpTIld4x1Gc=
github.com/pion/turn/v2 v2.1.6/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY=
-github.com/pion/webrtc/v3 v3.3.4 h1:v2heQVnXTSqNRXcaFQVOhIOYkLMxOu1iJG8uy1djvkk=
-github.com/pion/webrtc/v3 v3.3.4/go.mod h1:liNa+E1iwyzyXqNUwvoMRNQ10x8h8FOeJKL8RkIbamE=
+github.com/pion/webrtc/v3 v3.3.5 h1:ZsSzaMz/i9nblPdiAkZoP+E6Kmjw+jnyq3bEmU3EtRg=
+github.com/pion/webrtc/v3 v3.3.5/go.mod h1:liNa+E1iwyzyXqNUwvoMRNQ10x8h8FOeJKL8RkIbamE=
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
@@ -686,8 +688,8 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:
github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
-github.com/prometheus/common v0.60.0 h1:+V9PAREWNvJMAuJ1x1BaWl9dewMW4YrHZQbx0sJNllA=
-github.com/prometheus/common v0.60.0/go.mod h1:h0LYf1R1deLSKtD4Vdg8gy4RuOvENW2J/h19V5NADQw=
+github.com/prometheus/common v0.61.0 h1:3gv/GThfX0cV2lpO7gkTUwZru38mxevy90Bj8YFSRQQ=
+github.com/prometheus/common v0.61.0/go.mod h1:zr29OCN/2BsJRaFwG8QOBr41D6kkchKbpeNH7pAjb/s=
github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
@@ -913,8 +915,8 @@ golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE
golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
-golang.org/x/exp v0.0.0-20241210194714-1829a127f884 h1:Y/Mj/94zIQQGHVSv1tTtQBDaQaJe62U9bkDZKKyhPCU=
-golang.org/x/exp v0.0.0-20241210194714-1829a127f884/go.mod h1:qj5a5QZpwLU2NLQudwIN5koi3beDhSAlJwa67PuM98c=
+golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67 h1:1UoZQm6f0P/ZO0w1Ri+f+ifG/gXhegadRdwBIXEFWDo=
+golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67/go.mod h1:qj5a5QZpwLU2NLQudwIN5koi3beDhSAlJwa67PuM98c=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -977,8 +979,8 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
-golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI=
-golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs=
+golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
+golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -1195,8 +1197,8 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
-google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io=
-google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
+google.golang.org/protobuf v1.36.0 h1:mjIs9gYtt56AzC4ZaffQuh88TZurBGhIJMBZGSxNerQ=
+google.golang.org/protobuf v1.36.0/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
diff --git a/go.mod b/go.mod
index 5a109199c..6f836fd3d 100644
--- a/go.mod
+++ b/go.mod
@@ -22,7 +22,7 @@ require (
github.com/hashicorp/go-version v1.7.0
github.com/ipfs-shipyard/nopfs v0.0.13
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0
- github.com/ipfs/boxo v0.25.0
+ github.com/ipfs/boxo v0.26.0
github.com/ipfs/go-block-format v0.2.0
github.com/ipfs/go-cid v0.4.1
github.com/ipfs/go-cidutil v0.1.0
@@ -54,7 +54,7 @@ require (
github.com/jbenet/goprocess v0.1.4
github.com/julienschmidt/httprouter v1.3.0
github.com/libp2p/go-doh-resolver v0.4.0
- github.com/libp2p/go-libp2p v0.37.2
+ github.com/libp2p/go-libp2p v0.38.1
github.com/libp2p/go-libp2p-http v0.5.0
github.com/libp2p/go-libp2p-kad-dht v0.28.1
github.com/libp2p/go-libp2p-kbucket v0.6.4
@@ -89,11 +89,11 @@ require (
go.uber.org/multierr v1.11.0
go.uber.org/zap v1.27.0
golang.org/x/crypto v0.31.0
- golang.org/x/exp v0.0.0-20241210194714-1829a127f884
+ golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67
golang.org/x/mod v0.22.0
golang.org/x/sync v0.10.0
golang.org/x/sys v0.28.0
- google.golang.org/protobuf v1.35.2
+ google.golang.org/protobuf v1.36.0
)
require (
@@ -122,6 +122,7 @@ require (
github.com/elastic/gosigar v0.14.3 // indirect
github.com/fatih/color v1.15.0 // indirect
github.com/felixge/httpsnoop v1.0.4 // indirect
+ github.com/filecoin-project/go-clock v0.1.0 // indirect
github.com/flynn/noise v1.1.0 // indirect
github.com/francoispqt/gojay v1.2.13 // indirect
github.com/gabriel-vasile/mimetype v1.4.6 // indirect
@@ -141,7 +142,7 @@ require (
github.com/golang/protobuf v1.5.4 // indirect
github.com/golang/snappy v0.0.4 // indirect
github.com/google/gopacket v1.1.19 // indirect
- github.com/google/pprof v0.0.0-20241017200806-017d972448fc // indirect
+ github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad // indirect
github.com/gorilla/mux v1.8.1 // indirect
github.com/gorilla/websocket v1.5.3 // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect
@@ -160,11 +161,11 @@ require (
github.com/ipfs/go-ipfs-redirects-file v0.1.2 // indirect
github.com/ipfs/go-ipfs-util v0.0.3 // indirect
github.com/ipfs/go-merkledag v0.11.0 // indirect
- github.com/ipfs/go-peertaskqueue v0.8.1 // indirect
+ github.com/ipfs/go-peertaskqueue v0.8.2 // indirect
github.com/ipfs/go-verifcid v0.0.3 // indirect
github.com/jackpal/go-nat-pmp v1.0.2 // indirect
github.com/klauspost/compress v1.17.11 // indirect
- github.com/klauspost/cpuid/v2 v2.2.8 // indirect
+ github.com/klauspost/cpuid/v2 v2.2.9 // indirect
github.com/koron/go-ssdp v0.0.4 // indirect
github.com/kr/pretty v0.3.1 // indirect
github.com/kr/text v0.2.0 // indirect
@@ -177,7 +178,7 @@ require (
github.com/libp2p/go-libp2p-xor v0.1.0 // indirect
github.com/libp2p/go-msgio v0.3.0 // indirect
github.com/libp2p/go-nat v0.2.0 // indirect
- github.com/libp2p/go-netroute v0.2.1 // indirect
+ github.com/libp2p/go-netroute v0.2.2 // indirect
github.com/libp2p/go-reuseport v0.4.0 // indirect
github.com/libp2p/go-yamux/v4 v4.0.1 // indirect
github.com/libp2p/zeroconf/v2 v2.2.0 // indirect
@@ -198,31 +199,32 @@ require (
github.com/multiformats/go-multistream v0.6.0 // indirect
github.com/multiformats/go-varint v0.0.7 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
- github.com/onsi/ginkgo/v2 v2.20.2 // indirect
+ github.com/onsi/ginkgo/v2 v2.22.0 // indirect
github.com/opencontainers/runtime-spec v1.2.0 // indirect
github.com/openzipkin/zipkin-go v0.4.3 // indirect
github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 // indirect
- github.com/pion/datachannel v1.5.9 // indirect
+ github.com/pion/datachannel v1.5.10 // indirect
github.com/pion/dtls/v2 v2.2.12 // indirect
- github.com/pion/ice/v2 v2.3.36 // indirect
+ github.com/pion/ice/v2 v2.3.37 // indirect
github.com/pion/interceptor v0.1.37 // indirect
github.com/pion/logging v0.2.2 // indirect
github.com/pion/mdns v0.0.12 // indirect
github.com/pion/randutil v0.1.0 // indirect
- github.com/pion/rtcp v1.2.14 // indirect
- github.com/pion/rtp v1.8.9 // indirect
- github.com/pion/sctp v1.8.33 // indirect
+ github.com/pion/rtcp v1.2.15 // indirect
+ github.com/pion/rtp v1.8.10 // indirect
+ github.com/pion/sctp v1.8.35 // indirect
github.com/pion/sdp/v3 v3.0.9 // indirect
github.com/pion/srtp/v2 v2.0.20 // indirect
github.com/pion/stun v0.6.1 // indirect
github.com/pion/transport/v2 v2.2.10 // indirect
+ github.com/pion/transport/v3 v3.0.7 // indirect
github.com/pion/turn/v2 v2.1.6 // indirect
- github.com/pion/webrtc/v3 v3.3.4 // indirect
+ github.com/pion/webrtc/v3 v3.3.5 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/polydawn/refmt v0.89.0 // indirect
github.com/prometheus/client_model v0.6.1 // indirect
- github.com/prometheus/common v0.60.0 // indirect
+ github.com/prometheus/common v0.61.0 // indirect
github.com/prometheus/procfs v0.15.1 // indirect
github.com/prometheus/statsd_exporter v0.27.1 // indirect
github.com/quic-go/qpack v0.5.1 // indirect
@@ -260,8 +262,8 @@ require (
go.uber.org/atomic v1.11.0 // indirect
go.uber.org/mock v0.5.0 // indirect
go4.org v0.0.0-20230225012048-214862532bf5 // indirect
- golang.org/x/net v0.32.0 // indirect
- golang.org/x/oauth2 v0.23.0 // indirect
+ golang.org/x/net v0.33.0 // indirect
+ golang.org/x/oauth2 v0.24.0 // indirect
golang.org/x/term v0.27.0 // indirect
golang.org/x/text v0.21.0 // indirect
golang.org/x/tools v0.28.0 // indirect
diff --git a/go.sum b/go.sum
index 75b8d4f13..3f1c5d42e 100644
--- a/go.sum
+++ b/go.sum
@@ -183,6 +183,8 @@ github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs=
github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw=
github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
+github.com/filecoin-project/go-clock v0.1.0 h1:SFbYIM75M8NnFm1yMHhN9Ahy3W5bEZV9gd6MPfXbKVU=
+github.com/filecoin-project/go-clock v0.1.0/go.mod h1:4uB/O4PvOjlx1VCMdZ9MyDZXRm//gkj1ELEbxfI1AZs=
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
github.com/flynn/noise v1.1.0 h1:KjPQoQCEFdZDiP03phOvGi11+SVVhBG2wOWAorLsstg=
github.com/flynn/noise v1.1.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag=
@@ -315,8 +317,8 @@ github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hf
github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20241017200806-017d972448fc h1:NGyrhhFhwvRAZg02jnYVg3GBQy0qGBKmFQJwaPmpmxs=
-github.com/google/pprof v0.0.0-20241017200806-017d972448fc/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
+github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg=
+github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
@@ -366,8 +368,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcd
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.25.0 h1:FNZaKVirUDafGz3Y9sccztynAUazs9GfSapLk/5c7is=
-github.com/ipfs/boxo v0.25.0/go.mod h1:MQVkL3V8RfuIsn+aajCR0MXLl8nRlz+5uGlHMWFVyuE=
+github.com/ipfs/boxo v0.26.0 h1:RRxEon7rJMy8ScVaTLncSZ5/nA6majYhRSbzc80snO8=
+github.com/ipfs/boxo v0.26.0/go.mod h1:iHyc9cjoF7/zoiKVY65d2fBWRhoS2zx4cMk8hKgqrac=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-bitswap v0.11.0 h1:j1WVvhDX1yhG32NTC9xfxnqycqYIlhzEzLXG/cU1HyQ=
@@ -454,8 +456,8 @@ github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fG
github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY=
github.com/ipfs/go-metrics-prometheus v0.0.3 h1:MVgBw30nE9eKC598ZQg+LIIbgIcx46NG8KISWLCLkMo=
github.com/ipfs/go-metrics-prometheus v0.0.3/go.mod h1:qjWVLyK+ZJrQuiyTqfgoECgKfd4b4lEtpQemAWomWc8=
-github.com/ipfs/go-peertaskqueue v0.8.1 h1:YhxAs1+wxb5jk7RvS0LHdyiILpNmRIRnZVztekOF0pg=
-github.com/ipfs/go-peertaskqueue v0.8.1/go.mod h1:Oxxd3eaK279FxeydSPPVGHzbwVeHjatZ2GA8XD+KbPU=
+github.com/ipfs/go-peertaskqueue v0.8.2 h1:PaHFRaVFdxQk1Qo3OKiHPYjmmusQy7gKQUaL8JDszAU=
+github.com/ipfs/go-peertaskqueue v0.8.2/go.mod h1:L6QPvou0346c2qPJNiJa6BvOibxDfaiPlqHInmzg0FA=
github.com/ipfs/go-test v0.0.4 h1:DKT66T6GBB6PsDFLoO56QZPrOmzJkqU1FZH5C9ySkew=
github.com/ipfs/go-test v0.0.4/go.mod h1:qhIM1EluEfElKKM6fnWxGn822/z9knUGM1+I/OAQNKI=
github.com/ipfs/go-unixfsnode v1.9.2 h1:0A12BYs4XOtDPJTMlwmNPlllDfqcc4yie4e919hcUXk=
@@ -510,8 +512,8 @@ github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6
github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc=
github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0=
github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
-github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM=
-github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
+github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=
+github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/koron/go-ssdp v0.0.4 h1:1IDwrghSKYM7yLf7XCzbByg2sJ/JcNOZRXS2jczTwz0=
@@ -543,8 +545,8 @@ github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZ
github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs=
github.com/libp2p/go-flow-metrics v0.2.0 h1:EIZzjmeOE6c8Dav0sNv35vhZxATIXWZg6j/C08XmmDw=
github.com/libp2p/go-flow-metrics v0.2.0/go.mod h1:st3qqfu8+pMfh+9Mzqb2GTiwrAGjIPszEjZmtksN8Jc=
-github.com/libp2p/go-libp2p v0.37.2 h1:Irh+n9aDPTLt9wJYwtlHu6AhMUipbC1cGoJtOiBqI9c=
-github.com/libp2p/go-libp2p v0.37.2/go.mod h1:M8CRRywYkqC6xKHdZ45hmqVckBj5z4mRLIMLWReypz8=
+github.com/libp2p/go-libp2p v0.38.1 h1:aT1K7IFWi+gZUsQGCzTHBTlKX5QVZQOahng8DnOr6tQ=
+github.com/libp2p/go-libp2p v0.38.1/go.mod h1:QWV4zGL3O9nXKdHirIC59DoRcZ446dfkjbOJ55NEWFo=
github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94=
github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8=
github.com/libp2p/go-libp2p-core v0.2.4/go.mod h1:STh4fdfa5vDYr0/SzYYeqnt+E6KfEV5VxfIrm0bcI0g=
@@ -576,8 +578,8 @@ github.com/libp2p/go-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0
github.com/libp2p/go-msgio v0.3.0/go.mod h1:nyRM819GmVaF9LX3l03RMh10QdOroF++NBbxAb0mmDM=
github.com/libp2p/go-nat v0.2.0 h1:Tyz+bUFAYqGyJ/ppPPymMGbIgNRH+WqC5QrT5fKrrGk=
github.com/libp2p/go-nat v0.2.0/go.mod h1:3MJr+GRpRkyT65EpVPBstXLvOlAPzUVlG6Pwg9ohLJk=
-github.com/libp2p/go-netroute v0.2.1 h1:V8kVrpD8GK0Riv15/7VN6RbUQ3URNZVosw7H2v9tksU=
-github.com/libp2p/go-netroute v0.2.1/go.mod h1:hraioZr0fhBjG0ZRXJJ6Zj2IVEVNx6tDTFQfSmcq7mQ=
+github.com/libp2p/go-netroute v0.2.2 h1:Dejd8cQ47Qx2kRABg6lPwknU7+nBnFRpko45/fFPuZ8=
+github.com/libp2p/go-netroute v0.2.2/go.mod h1:Rntq6jUAH0l9Gg17w5bFGhcC9a+vk4KNXs6s7IljKYE=
github.com/libp2p/go-openssl v0.0.3/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc=
github.com/libp2p/go-openssl v0.0.4/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc=
github.com/libp2p/go-reuseport v0.4.0 h1:nR5KU7hD0WxXCJbmw7r2rhRYruNRl2koHw8fQscQm2s=
@@ -702,15 +704,15 @@ github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vv
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
-github.com/onsi/ginkgo/v2 v2.20.2 h1:7NVCeyIWROIAheY21RLS+3j2bb52W0W82tkberYytp4=
-github.com/onsi/ginkgo/v2 v2.20.2/go.mod h1:K9gyxPIlb+aIvnZ8bd9Ak+YP18w3APlR+5coaZoE2ag=
+github.com/onsi/ginkgo/v2 v2.22.0 h1:Yed107/8DjTr0lKCNt7Dn8yQ6ybuDRQoMGrNFKzMfHg=
+github.com/onsi/ginkgo/v2 v2.22.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo=
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro=
-github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k=
-github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY=
+github.com/onsi/gomega v1.34.2 h1:pNCwDkzrsv7MS9kpaQvVb1aVLahQXyJ/Tv5oAZMI3i8=
+github.com/onsi/gomega v1.34.2/go.mod h1:v1xfxRgk0KIsG+QOdm7p8UosrOzPYRo60fd3B/1Dukc=
github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
github.com/opencontainers/runtime-spec v1.2.0 h1:z97+pHb3uELt/yiAWD691HNHQIF07bE7dzrbT927iTk=
github.com/opencontainers/runtime-spec v1.2.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
@@ -728,13 +730,13 @@ github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 h1:1/WtZae0yGtPq+TI6+
github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9/go.mod h1:x3N5drFsm2uilKKuuYo6LdyD8vZAW55sH/9w+pbo1sw=
github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4=
github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
-github.com/pion/datachannel v1.5.9 h1:LpIWAOYPyDrXtU+BW7X0Yt/vGtYxtXQ8ql7dFfYUVZA=
-github.com/pion/datachannel v1.5.9/go.mod h1:kDUuk4CU4Uxp82NH4LQZbISULkX/HtzKa4P7ldf9izE=
+github.com/pion/datachannel v1.5.10 h1:ly0Q26K1i6ZkGf42W7D4hQYR90pZwzFOjTq5AuCKk4o=
+github.com/pion/datachannel v1.5.10/go.mod h1:p/jJfC9arb29W7WrxyKbepTU20CFgyx5oLo8Rs4Py/M=
github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s=
github.com/pion/dtls/v2 v2.2.12 h1:KP7H5/c1EiVAAKUmXyCzPiQe5+bCJrpOeKg/L05dunk=
github.com/pion/dtls/v2 v2.2.12/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE=
-github.com/pion/ice/v2 v2.3.36 h1:SopeXiVbbcooUg2EIR8sq4b13RQ8gzrkkldOVg+bBsc=
-github.com/pion/ice/v2 v2.3.36/go.mod h1:mBF7lnigdqgtB+YHkaY/Y6s6tsyRyo4u4rPGRuOjUBQ=
+github.com/pion/ice/v2 v2.3.37 h1:ObIdaNDu1rCo7hObhs34YSBcO7fjslJMZV0ux+uZWh0=
+github.com/pion/ice/v2 v2.3.37/go.mod h1:mBF7lnigdqgtB+YHkaY/Y6s6tsyRyo4u4rPGRuOjUBQ=
github.com/pion/interceptor v0.1.37 h1:aRA8Zpab/wE7/c0O3fh1PqY0AJI3fCSEM5lRWJVorwI=
github.com/pion/interceptor v0.1.37/go.mod h1:JzxbJ4umVTlZAf+/utHzNesY8tmRkM2lVmkS82TTj8Y=
github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY=
@@ -744,13 +746,13 @@ github.com/pion/mdns v0.0.12/go.mod h1:VExJjv8to/6Wqm1FXK+Ii/Z9tsVk/F5sD/N70cnYF
github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA=
github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8=
github.com/pion/rtcp v1.2.12/go.mod h1:sn6qjxvnwyAkkPzPULIbVqSKI5Dv54Rv7VG0kNxh9L4=
-github.com/pion/rtcp v1.2.14 h1:KCkGV3vJ+4DAJmvP0vaQShsb0xkRfWkO540Gy102KyE=
-github.com/pion/rtcp v1.2.14/go.mod h1:sn6qjxvnwyAkkPzPULIbVqSKI5Dv54Rv7VG0kNxh9L4=
+github.com/pion/rtcp v1.2.15 h1:LZQi2JbdipLOj4eBjK4wlVoQWfrZbh3Q6eHtWtJBZBo=
+github.com/pion/rtcp v1.2.15/go.mod h1:jlGuAjHMEXwMUHK78RgX0UmEJFV4zUKOFHR7OP+D3D0=
github.com/pion/rtp v1.8.3/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU=
-github.com/pion/rtp v1.8.9 h1:E2HX740TZKaqdcPmf4pw6ZZuG8u5RlMMt+l3dxeu6Wk=
-github.com/pion/rtp v1.8.9/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU=
-github.com/pion/sctp v1.8.33 h1:dSE4wX6uTJBcNm8+YlMg7lw1wqyKHggsP5uKbdj+NZw=
-github.com/pion/sctp v1.8.33/go.mod h1:beTnqSzewI53KWoG3nqB282oDMGrhNxBdb+JZnkCwRM=
+github.com/pion/rtp v1.8.10 h1:puphjdbjPB+L+NFaVuZ5h6bt1g5q4kFIoI+r5q/g0CU=
+github.com/pion/rtp v1.8.10/go.mod h1:8uMBJj32Pa1wwx8Fuv/AsFhn8jsgw+3rUC2PfoBZ8p4=
+github.com/pion/sctp v1.8.35 h1:qwtKvNK1Wc5tHMIYgTDJhfZk7vATGVHhXbUDfHbYwzA=
+github.com/pion/sctp v1.8.35/go.mod h1:EcXP8zCYVTRy3W9xtOF7wJm1L1aXfKRQzaM33SjQlzg=
github.com/pion/sdp/v3 v3.0.9 h1:pX++dCHoHUwq43kuwf3PyJfHlwIj4hXA7Vrifiq0IJY=
github.com/pion/sdp/v3 v3.0.9/go.mod h1:B5xmvENq5IXJimIO4zfp6LAe1fD9N+kFv+V/1lOdz8M=
github.com/pion/srtp/v2 v2.0.20 h1:HNNny4s+OUmG280ETrCdgFndp4ufx3/uy85EawYEhTk=
@@ -768,8 +770,8 @@ github.com/pion/transport/v3 v3.0.7/go.mod h1:YleKiTZ4vqNxVwh77Z0zytYi7rXHl7j6uP
github.com/pion/turn/v2 v2.1.3/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY=
github.com/pion/turn/v2 v2.1.6 h1:Xr2niVsiPTB0FPtt+yAWKFUkU1eotQbGgpTIld4x1Gc=
github.com/pion/turn/v2 v2.1.6/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY=
-github.com/pion/webrtc/v3 v3.3.4 h1:v2heQVnXTSqNRXcaFQVOhIOYkLMxOu1iJG8uy1djvkk=
-github.com/pion/webrtc/v3 v3.3.4/go.mod h1:liNa+E1iwyzyXqNUwvoMRNQ10x8h8FOeJKL8RkIbamE=
+github.com/pion/webrtc/v3 v3.3.5 h1:ZsSzaMz/i9nblPdiAkZoP+E6Kmjw+jnyq3bEmU3EtRg=
+github.com/pion/webrtc/v3 v3.3.5/go.mod h1:liNa+E1iwyzyXqNUwvoMRNQ10x8h8FOeJKL8RkIbamE=
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
@@ -804,8 +806,8 @@ github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9
github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
github.com/prometheus/common v0.35.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=
github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=
-github.com/prometheus/common v0.60.0 h1:+V9PAREWNvJMAuJ1x1BaWl9dewMW4YrHZQbx0sJNllA=
-github.com/prometheus/common v0.60.0/go.mod h1:h0LYf1R1deLSKtD4Vdg8gy4RuOvENW2J/h19V5NADQw=
+github.com/prometheus/common v0.61.0 h1:3gv/GThfX0cV2lpO7gkTUwZru38mxevy90Bj8YFSRQQ=
+github.com/prometheus/common v0.61.0/go.mod h1:zr29OCN/2BsJRaFwG8QOBr41D6kkchKbpeNH7pAjb/s=
github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
@@ -1079,8 +1081,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
-golang.org/x/exp v0.0.0-20241210194714-1829a127f884 h1:Y/Mj/94zIQQGHVSv1tTtQBDaQaJe62U9bkDZKKyhPCU=
-golang.org/x/exp v0.0.0-20241210194714-1829a127f884/go.mod h1:qj5a5QZpwLU2NLQudwIN5koi3beDhSAlJwa67PuM98c=
+golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67 h1:1UoZQm6f0P/ZO0w1Ri+f+ifG/gXhegadRdwBIXEFWDo=
+golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67/go.mod h1:qj5a5QZpwLU2NLQudwIN5koi3beDhSAlJwa67PuM98c=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -1159,8 +1161,8 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
-golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI=
-golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs=
+golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
+golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -1170,8 +1172,8 @@ golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4Iltr
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
-golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs=
-golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
+golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE=
+golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -1456,8 +1458,8 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
-google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io=
-google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
+google.golang.org/protobuf v1.36.0 h1:mjIs9gYtt56AzC4ZaffQuh88TZurBGhIJMBZGSxNerQ=
+google.golang.org/protobuf v1.36.0/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index 419623304..1b79ba835 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -102,7 +102,7 @@ require (
github.com/golangci/unconvert v0.0.0-20240309020433-c5143eacb3ed // indirect
github.com/google/go-cmp v0.6.0 // indirect
github.com/google/gopacket v1.1.19 // indirect
- github.com/google/pprof v0.0.0-20241017200806-017d972448fc // indirect
+ github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad // indirect
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/gordonklaus/ineffassign v0.1.0 // indirect
@@ -120,7 +120,7 @@ require (
github.com/huin/goupnp v1.3.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/ipfs/bbloom v0.0.4 // indirect
- github.com/ipfs/boxo v0.25.0 // indirect
+ github.com/ipfs/boxo v0.26.0 // indirect
github.com/ipfs/go-block-format v0.2.0 // indirect
github.com/ipfs/go-cid v0.4.1 // indirect
github.com/ipfs/go-datastore v0.6.0 // indirect
@@ -144,7 +144,7 @@ require (
github.com/kisielk/errcheck v1.7.0 // indirect
github.com/kkHAIKE/contextcheck v1.1.5 // indirect
github.com/klauspost/compress v1.17.11 // indirect
- github.com/klauspost/cpuid/v2 v2.2.8 // indirect
+ github.com/klauspost/cpuid/v2 v2.2.9 // indirect
github.com/koron/go-ssdp v0.0.4 // indirect
github.com/kulti/thelper v0.6.3 // indirect
github.com/kunwardeep/paralleltest v1.0.10 // indirect
@@ -157,7 +157,7 @@ require (
github.com/libp2p/go-buffer-pool v0.1.0 // indirect
github.com/libp2p/go-cidranger v1.1.0 // indirect
github.com/libp2p/go-flow-metrics v0.2.0 // indirect
- github.com/libp2p/go-libp2p v0.37.2 // indirect
+ github.com/libp2p/go-libp2p v0.38.1 // indirect
github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect
github.com/libp2p/go-libp2p-kad-dht v0.28.1 // indirect
github.com/libp2p/go-libp2p-kbucket v0.6.4 // indirect
@@ -165,7 +165,8 @@ require (
github.com/libp2p/go-libp2p-routing-helpers v0.7.4 // indirect
github.com/libp2p/go-msgio v0.3.0 // indirect
github.com/libp2p/go-nat v0.2.0 // indirect
- github.com/libp2p/go-netroute v0.2.1 // indirect
+ github.com/libp2p/go-netroute v0.2.2 // indirect
+ github.com/libp2p/go-reuseport v0.4.0 // indirect
github.com/lufeee/execinquery v1.2.1 // indirect
github.com/macabu/inamedparam v0.1.3 // indirect
github.com/magiconair/properties v1.8.7 // indirect
@@ -198,31 +199,32 @@ require (
github.com/nishanths/predeclared v0.2.2 // indirect
github.com/nunnatsa/ginkgolinter v0.16.2 // indirect
github.com/olekukonko/tablewriter v0.0.5 // indirect
- github.com/onsi/ginkgo/v2 v2.20.2 // indirect
+ github.com/onsi/ginkgo/v2 v2.22.0 // indirect
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
- github.com/pion/datachannel v1.5.9 // indirect
+ github.com/pion/datachannel v1.5.10 // indirect
github.com/pion/dtls/v2 v2.2.12 // indirect
- github.com/pion/ice/v2 v2.3.36 // indirect
+ github.com/pion/ice/v2 v2.3.37 // indirect
github.com/pion/interceptor v0.1.37 // indirect
github.com/pion/logging v0.2.2 // indirect
github.com/pion/mdns v0.0.12 // indirect
github.com/pion/randutil v0.1.0 // indirect
- github.com/pion/rtcp v1.2.14 // indirect
- github.com/pion/rtp v1.8.9 // indirect
- github.com/pion/sctp v1.8.33 // indirect
+ github.com/pion/rtcp v1.2.15 // indirect
+ github.com/pion/rtp v1.8.10 // indirect
+ github.com/pion/sctp v1.8.35 // indirect
github.com/pion/sdp/v3 v3.0.9 // indirect
github.com/pion/srtp/v2 v2.0.20 // indirect
github.com/pion/stun v0.6.1 // indirect
github.com/pion/transport/v2 v2.2.10 // indirect
+ github.com/pion/transport/v3 v3.0.7 // indirect
github.com/pion/turn/v2 v2.1.6 // indirect
- github.com/pion/webrtc/v3 v3.3.4 // indirect
+ github.com/pion/webrtc/v3 v3.3.5 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/polydawn/refmt v0.89.0 // indirect
github.com/polyfloyd/go-errorlint v1.6.0 // indirect
github.com/prometheus/client_golang v1.20.5 // indirect
github.com/prometheus/client_model v0.6.1 // indirect
- github.com/prometheus/common v0.60.0 // indirect
+ github.com/prometheus/common v0.61.0 // indirect
github.com/prometheus/procfs v0.15.1 // indirect
github.com/quasilyte/go-ruleguard v0.4.2 // indirect
github.com/quasilyte/go-ruleguard/dsl v0.3.22 // indirect
@@ -294,17 +296,17 @@ require (
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.27.0 // indirect
golang.org/x/crypto v0.31.0 // indirect
- golang.org/x/exp v0.0.0-20241210194714-1829a127f884 // indirect
+ golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67 // indirect
golang.org/x/exp/typeparams v0.0.0-20240613232115-7f521ea00fb8 // indirect
golang.org/x/mod v0.22.0 // indirect
- golang.org/x/net v0.32.0 // indirect
+ golang.org/x/net v0.33.0 // indirect
golang.org/x/sync v0.10.0 // indirect
golang.org/x/sys v0.28.0 // indirect
golang.org/x/term v0.27.0 // indirect
golang.org/x/text v0.21.0 // indirect
golang.org/x/tools v0.28.0 // indirect
gonum.org/v1/gonum v0.15.0 // indirect
- google.golang.org/protobuf v1.35.2 // indirect
+ google.golang.org/protobuf v1.36.0 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index 4a70a2745..70e822702 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -148,6 +148,8 @@ github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4=
github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI=
github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=
github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=
+github.com/filecoin-project/go-clock v0.1.0 h1:SFbYIM75M8NnFm1yMHhN9Ahy3W5bEZV9gd6MPfXbKVU=
+github.com/filecoin-project/go-clock v0.1.0/go.mod h1:4uB/O4PvOjlx1VCMdZ9MyDZXRm//gkj1ELEbxfI1AZs=
github.com/firefart/nonamedreturns v1.0.5 h1:tM+Me2ZaXs8tfdDw3X6DOX++wMCOqzYUho6tUTYIdRA=
github.com/firefart/nonamedreturns v1.0.5/go.mod h1:gHJjDqhGM4WyPt639SOZs+G89Ko7QKH5R5BhnO6xJhw=
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
@@ -269,8 +271,8 @@ github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF
github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo=
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
-github.com/google/pprof v0.0.0-20241017200806-017d972448fc h1:NGyrhhFhwvRAZg02jnYVg3GBQy0qGBKmFQJwaPmpmxs=
-github.com/google/pprof v0.0.0-20241017200806-017d972448fc/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
+github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg=
+github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
@@ -322,8 +324,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.25.0 h1:FNZaKVirUDafGz3Y9sccztynAUazs9GfSapLk/5c7is=
-github.com/ipfs/boxo v0.25.0/go.mod h1:MQVkL3V8RfuIsn+aajCR0MXLl8nRlz+5uGlHMWFVyuE=
+github.com/ipfs/boxo v0.26.0 h1:RRxEon7rJMy8ScVaTLncSZ5/nA6majYhRSbzc80snO8=
+github.com/ipfs/boxo v0.26.0/go.mod h1:iHyc9cjoF7/zoiKVY65d2fBWRhoS2zx4cMk8hKgqrac=
github.com/ipfs/go-block-format v0.2.0 h1:ZqrkxBA2ICbDRbK8KJs/u0O3dlp6gmAuuXUJNiW1Ycs=
github.com/ipfs/go-block-format v0.2.0/go.mod h1:+jpL11nFx5A/SPpsoBn6Bzkra/zaArfSmsknbPMYgzM=
github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s=
@@ -348,8 +350,8 @@ github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY=
github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI=
github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg=
github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY=
-github.com/ipfs/go-peertaskqueue v0.8.1 h1:YhxAs1+wxb5jk7RvS0LHdyiILpNmRIRnZVztekOF0pg=
-github.com/ipfs/go-peertaskqueue v0.8.1/go.mod h1:Oxxd3eaK279FxeydSPPVGHzbwVeHjatZ2GA8XD+KbPU=
+github.com/ipfs/go-peertaskqueue v0.8.2 h1:PaHFRaVFdxQk1Qo3OKiHPYjmmusQy7gKQUaL8JDszAU=
+github.com/ipfs/go-peertaskqueue v0.8.2/go.mod h1:L6QPvou0346c2qPJNiJa6BvOibxDfaiPlqHInmzg0FA=
github.com/ipfs/go-test v0.0.4 h1:DKT66T6GBB6PsDFLoO56QZPrOmzJkqU1FZH5C9ySkew=
github.com/ipfs/go-test v0.0.4/go.mod h1:qhIM1EluEfElKKM6fnWxGn822/z9knUGM1+I/OAQNKI=
github.com/ipfs/hang-fds v0.1.0 h1:deBiFlWHsVGzJ0ZMaqscEqRM1r2O1rFZ59UiQXb1Xko=
@@ -400,8 +402,8 @@ github.com/kkHAIKE/contextcheck v1.1.5 h1:CdnJh63tcDe53vG+RebdpdXJTc9atMgGqdx8LX
github.com/kkHAIKE/contextcheck v1.1.5/go.mod h1:O930cpht4xb1YQpK+1+AgoM3mFsvxr7uyFptcnWTYUA=
github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc=
github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0=
-github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM=
-github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
+github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=
+github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=
github.com/koron/go-ssdp v0.0.4 h1:1IDwrghSKYM7yLf7XCzbByg2sJ/JcNOZRXS2jczTwz0=
github.com/koron/go-ssdp v0.0.4/go.mod h1:oDXq+E5IL5q0U8uSBcoAXzTzInwy5lEgC91HoKtbmZk=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
@@ -435,8 +437,8 @@ github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38y
github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic=
github.com/libp2p/go-flow-metrics v0.2.0 h1:EIZzjmeOE6c8Dav0sNv35vhZxATIXWZg6j/C08XmmDw=
github.com/libp2p/go-flow-metrics v0.2.0/go.mod h1:st3qqfu8+pMfh+9Mzqb2GTiwrAGjIPszEjZmtksN8Jc=
-github.com/libp2p/go-libp2p v0.37.2 h1:Irh+n9aDPTLt9wJYwtlHu6AhMUipbC1cGoJtOiBqI9c=
-github.com/libp2p/go-libp2p v0.37.2/go.mod h1:M8CRRywYkqC6xKHdZ45hmqVckBj5z4mRLIMLWReypz8=
+github.com/libp2p/go-libp2p v0.38.1 h1:aT1K7IFWi+gZUsQGCzTHBTlKX5QVZQOahng8DnOr6tQ=
+github.com/libp2p/go-libp2p v0.38.1/go.mod h1:QWV4zGL3O9nXKdHirIC59DoRcZ446dfkjbOJ55NEWFo=
github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94=
github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8=
github.com/libp2p/go-libp2p-kad-dht v0.28.1 h1:DVTfzG8Ybn88g9RycIq47evWCRss5f0Wm8iWtpwyHso=
@@ -453,8 +455,8 @@ github.com/libp2p/go-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0
github.com/libp2p/go-msgio v0.3.0/go.mod h1:nyRM819GmVaF9LX3l03RMh10QdOroF++NBbxAb0mmDM=
github.com/libp2p/go-nat v0.2.0 h1:Tyz+bUFAYqGyJ/ppPPymMGbIgNRH+WqC5QrT5fKrrGk=
github.com/libp2p/go-nat v0.2.0/go.mod h1:3MJr+GRpRkyT65EpVPBstXLvOlAPzUVlG6Pwg9ohLJk=
-github.com/libp2p/go-netroute v0.2.1 h1:V8kVrpD8GK0Riv15/7VN6RbUQ3URNZVosw7H2v9tksU=
-github.com/libp2p/go-netroute v0.2.1/go.mod h1:hraioZr0fhBjG0ZRXJJ6Zj2IVEVNx6tDTFQfSmcq7mQ=
+github.com/libp2p/go-netroute v0.2.2 h1:Dejd8cQ47Qx2kRABg6lPwknU7+nBnFRpko45/fFPuZ8=
+github.com/libp2p/go-netroute v0.2.2/go.mod h1:Rntq6jUAH0l9Gg17w5bFGhcC9a+vk4KNXs6s7IljKYE=
github.com/libp2p/go-reuseport v0.4.0 h1:nR5KU7hD0WxXCJbmw7r2rhRYruNRl2koHw8fQscQm2s=
github.com/libp2p/go-reuseport v0.4.0/go.mod h1:ZtI03j/wO5hZVDFo2jKywN6bYKWLOy8Se6DrI2E1cLU=
github.com/libp2p/go-yamux/v4 v4.0.1 h1:FfDR4S1wj6Bw2Pqbc8Uz7pCxeRBPbwsBbEdfwiCypkQ=
@@ -553,10 +555,10 @@ github.com/nunnatsa/ginkgolinter v0.16.2 h1:8iLqHIZvN4fTLDC0Ke9tbSZVcyVHoBs0HIbn
github.com/nunnatsa/ginkgolinter v0.16.2/go.mod h1:4tWRinDN1FeJgU+iJANW/kz7xKN5nYRAOfJDQUS9dOQ=
github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
-github.com/onsi/ginkgo/v2 v2.20.2 h1:7NVCeyIWROIAheY21RLS+3j2bb52W0W82tkberYytp4=
-github.com/onsi/ginkgo/v2 v2.20.2/go.mod h1:K9gyxPIlb+aIvnZ8bd9Ak+YP18w3APlR+5coaZoE2ag=
-github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k=
-github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY=
+github.com/onsi/ginkgo/v2 v2.22.0 h1:Yed107/8DjTr0lKCNt7Dn8yQ6ybuDRQoMGrNFKzMfHg=
+github.com/onsi/ginkgo/v2 v2.22.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo=
+github.com/onsi/gomega v1.34.2 h1:pNCwDkzrsv7MS9kpaQvVb1aVLahQXyJ/Tv5oAZMI3i8=
+github.com/onsi/gomega v1.34.2/go.mod h1:v1xfxRgk0KIsG+QOdm7p8UosrOzPYRo60fd3B/1Dukc=
github.com/opencontainers/runtime-spec v1.2.0 h1:z97+pHb3uELt/yiAWD691HNHQIF07bE7dzrbT927iTk=
github.com/opencontainers/runtime-spec v1.2.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8=
@@ -571,13 +573,13 @@ github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2D
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y=
github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM=
github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
-github.com/pion/datachannel v1.5.9 h1:LpIWAOYPyDrXtU+BW7X0Yt/vGtYxtXQ8ql7dFfYUVZA=
-github.com/pion/datachannel v1.5.9/go.mod h1:kDUuk4CU4Uxp82NH4LQZbISULkX/HtzKa4P7ldf9izE=
+github.com/pion/datachannel v1.5.10 h1:ly0Q26K1i6ZkGf42W7D4hQYR90pZwzFOjTq5AuCKk4o=
+github.com/pion/datachannel v1.5.10/go.mod h1:p/jJfC9arb29W7WrxyKbepTU20CFgyx5oLo8Rs4Py/M=
github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s=
github.com/pion/dtls/v2 v2.2.12 h1:KP7H5/c1EiVAAKUmXyCzPiQe5+bCJrpOeKg/L05dunk=
github.com/pion/dtls/v2 v2.2.12/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE=
-github.com/pion/ice/v2 v2.3.36 h1:SopeXiVbbcooUg2EIR8sq4b13RQ8gzrkkldOVg+bBsc=
-github.com/pion/ice/v2 v2.3.36/go.mod h1:mBF7lnigdqgtB+YHkaY/Y6s6tsyRyo4u4rPGRuOjUBQ=
+github.com/pion/ice/v2 v2.3.37 h1:ObIdaNDu1rCo7hObhs34YSBcO7fjslJMZV0ux+uZWh0=
+github.com/pion/ice/v2 v2.3.37/go.mod h1:mBF7lnigdqgtB+YHkaY/Y6s6tsyRyo4u4rPGRuOjUBQ=
github.com/pion/interceptor v0.1.37 h1:aRA8Zpab/wE7/c0O3fh1PqY0AJI3fCSEM5lRWJVorwI=
github.com/pion/interceptor v0.1.37/go.mod h1:JzxbJ4umVTlZAf+/utHzNesY8tmRkM2lVmkS82TTj8Y=
github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY=
@@ -587,13 +589,13 @@ github.com/pion/mdns v0.0.12/go.mod h1:VExJjv8to/6Wqm1FXK+Ii/Z9tsVk/F5sD/N70cnYF
github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA=
github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8=
github.com/pion/rtcp v1.2.12/go.mod h1:sn6qjxvnwyAkkPzPULIbVqSKI5Dv54Rv7VG0kNxh9L4=
-github.com/pion/rtcp v1.2.14 h1:KCkGV3vJ+4DAJmvP0vaQShsb0xkRfWkO540Gy102KyE=
-github.com/pion/rtcp v1.2.14/go.mod h1:sn6qjxvnwyAkkPzPULIbVqSKI5Dv54Rv7VG0kNxh9L4=
+github.com/pion/rtcp v1.2.15 h1:LZQi2JbdipLOj4eBjK4wlVoQWfrZbh3Q6eHtWtJBZBo=
+github.com/pion/rtcp v1.2.15/go.mod h1:jlGuAjHMEXwMUHK78RgX0UmEJFV4zUKOFHR7OP+D3D0=
github.com/pion/rtp v1.8.3/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU=
-github.com/pion/rtp v1.8.9 h1:E2HX740TZKaqdcPmf4pw6ZZuG8u5RlMMt+l3dxeu6Wk=
-github.com/pion/rtp v1.8.9/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU=
-github.com/pion/sctp v1.8.33 h1:dSE4wX6uTJBcNm8+YlMg7lw1wqyKHggsP5uKbdj+NZw=
-github.com/pion/sctp v1.8.33/go.mod h1:beTnqSzewI53KWoG3nqB282oDMGrhNxBdb+JZnkCwRM=
+github.com/pion/rtp v1.8.10 h1:puphjdbjPB+L+NFaVuZ5h6bt1g5q4kFIoI+r5q/g0CU=
+github.com/pion/rtp v1.8.10/go.mod h1:8uMBJj32Pa1wwx8Fuv/AsFhn8jsgw+3rUC2PfoBZ8p4=
+github.com/pion/sctp v1.8.35 h1:qwtKvNK1Wc5tHMIYgTDJhfZk7vATGVHhXbUDfHbYwzA=
+github.com/pion/sctp v1.8.35/go.mod h1:EcXP8zCYVTRy3W9xtOF7wJm1L1aXfKRQzaM33SjQlzg=
github.com/pion/sdp/v3 v3.0.9 h1:pX++dCHoHUwq43kuwf3PyJfHlwIj4hXA7Vrifiq0IJY=
github.com/pion/sdp/v3 v3.0.9/go.mod h1:B5xmvENq5IXJimIO4zfp6LAe1fD9N+kFv+V/1lOdz8M=
github.com/pion/srtp/v2 v2.0.20 h1:HNNny4s+OUmG280ETrCdgFndp4ufx3/uy85EawYEhTk=
@@ -611,8 +613,8 @@ github.com/pion/transport/v3 v3.0.7/go.mod h1:YleKiTZ4vqNxVwh77Z0zytYi7rXHl7j6uP
github.com/pion/turn/v2 v2.1.3/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY=
github.com/pion/turn/v2 v2.1.6 h1:Xr2niVsiPTB0FPtt+yAWKFUkU1eotQbGgpTIld4x1Gc=
github.com/pion/turn/v2 v2.1.6/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY=
-github.com/pion/webrtc/v3 v3.3.4 h1:v2heQVnXTSqNRXcaFQVOhIOYkLMxOu1iJG8uy1djvkk=
-github.com/pion/webrtc/v3 v3.3.4/go.mod h1:liNa+E1iwyzyXqNUwvoMRNQ10x8h8FOeJKL8RkIbamE=
+github.com/pion/webrtc/v3 v3.3.5 h1:ZsSzaMz/i9nblPdiAkZoP+E6Kmjw+jnyq3bEmU3EtRg=
+github.com/pion/webrtc/v3 v3.3.5/go.mod h1:liNa+E1iwyzyXqNUwvoMRNQ10x8h8FOeJKL8RkIbamE=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
@@ -633,8 +635,8 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:
github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
-github.com/prometheus/common v0.60.0 h1:+V9PAREWNvJMAuJ1x1BaWl9dewMW4YrHZQbx0sJNllA=
-github.com/prometheus/common v0.60.0/go.mod h1:h0LYf1R1deLSKtD4Vdg8gy4RuOvENW2J/h19V5NADQw=
+github.com/prometheus/common v0.61.0 h1:3gv/GThfX0cV2lpO7gkTUwZru38mxevy90Bj8YFSRQQ=
+github.com/prometheus/common v0.61.0/go.mod h1:zr29OCN/2BsJRaFwG8QOBr41D6kkchKbpeNH7pAjb/s=
github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
@@ -884,8 +886,8 @@ golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOM
golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20241210194714-1829a127f884 h1:Y/Mj/94zIQQGHVSv1tTtQBDaQaJe62U9bkDZKKyhPCU=
-golang.org/x/exp v0.0.0-20241210194714-1829a127f884/go.mod h1:qj5a5QZpwLU2NLQudwIN5koi3beDhSAlJwa67PuM98c=
+golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67 h1:1UoZQm6f0P/ZO0w1Ri+f+ifG/gXhegadRdwBIXEFWDo=
+golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67/go.mod h1:qj5a5QZpwLU2NLQudwIN5koi3beDhSAlJwa67PuM98c=
golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
golang.org/x/exp/typeparams v0.0.0-20240613232115-7f521ea00fb8 h1:+ZJmEdDFzH5H0CnzOrwgbH3elHctfTecW9X0k2tkn5M=
@@ -946,8 +948,8 @@ golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
-golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI=
-golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs=
+golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
+golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -1122,8 +1124,8 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
-google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io=
-google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
+google.golang.org/protobuf v1.36.0 h1:mjIs9gYtt56AzC4ZaffQuh88TZurBGhIJMBZGSxNerQ=
+google.golang.org/protobuf v1.36.0/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
From ecb25581c64a79432a48eb65ccf4f8c90e8518ed Mon Sep 17 00:00:00 2001
From: Hector Sanjuan
Date: Thu, 19 Dec 2024 23:07:17 +0100
Subject: [PATCH 088/499] cmd/files: flush parent folders (#10630)
* cmd/files: flush parent folders
This is a mitigation to increased MFS memory usage in the course of many writes operations.
The underlying issue is the unbounded growth of the mfs directory cache in
boxo. In the latest boxo version, this cache can be cleared by calling Flush()
on the folder. In order to trigger that, we call Flush() on the parent folder
of the file/folder where the write-operations are happening.
To flushing the parent folder allows it to grow unbounded. Then, any read
operation to that folder or parents (i.e. stat), will trigger a sync-operation to match
the cache to the underlying unixfs structure (and obtain the correct node-cid).
This sync operation must visit every item in the cache. When the cache has grown too much,
and the underlying unixfs-folder has switched into a HAMT, the operation can take minutes.
Thus, we should clear the cache often and the Flush flag is a good indicator
that we can let it go. Users can always run with --flush=false and flush at
regular intervals during their MFS writes if they want to extract some performance.
Fixes #8694, #10588.
* cmd/files: docs and changelog for --flush changes
---
core/commands/files.go | 82 +++++++++++++++++++++++++++++++---------
docs/changelogs/v0.33.md | 4 ++
2 files changed, 68 insertions(+), 18 deletions(-)
diff --git a/core/commands/files.go b/core/commands/files.go
index 40e4f3d7a..e06833f6f 100644
--- a/core/commands/files.go
+++ b/core/commands/files.go
@@ -59,16 +59,18 @@ Content added with "ipfs add" (which by default also becomes pinned), is not
added to MFS. Any content can be lazily referenced from MFS with the command
"ipfs files cp /ipfs/
Date: Fri, 20 Dec 2024 00:12:05 +0100
Subject: [PATCH 089/499] feat: expose BlockKeyCacheSize and enable
WriteThrough datastore options (#10614)
* feat: expose BlockKeyCacheSize and enable WriteThrough when bloom filter disabled
* import/config: add BatchMaxSize and BatchMaxNodes
* config: make BlockKeyCacheSize an OptionalInteger
* config: add and wire datastore.WriteThrough option
* config: omitempty on BlockKeyCacheSize
* changelog: rewrite entry about new options for the datastore
* config: add docs for BatchMaxNodes and BatchMaxSize
* config: make WriteThrough an optional Flag
* changelog: improve description of new datastore/import options
* refactor: DefaultWriteThrough as bool
* chore: boxo v0.26.0
* docs: config and changelog fixes
---
config/datastore.go | 23 ++++++++--
config/import.go | 11 +++++
core/commands/dag/import.go | 15 ++++++-
core/coreapi/coreapi.go | 14 +++---
core/coreapi/unixfs.go | 13 +++---
core/node/core.go | 21 +++++----
core/node/groups.go | 6 +--
core/node/storage.go | 6 ++-
docs/changelogs/v0.33.md | 20 +++++++++
docs/config.md | 62 ++++++++++++++++++++++++++
docs/examples/kubo-as-a-library/go.mod | 2 +-
docs/examples/kubo-as-a-library/go.sum | 4 +-
go.mod | 2 +-
go.sum | 4 +-
test/dependencies/go.mod | 2 +-
test/dependencies/go.sum | 4 +-
16 files changed, 171 insertions(+), 38 deletions(-)
diff --git a/config/datastore.go b/config/datastore.go
index 1a5994a17..665e03647 100644
--- a/config/datastore.go
+++ b/config/datastore.go
@@ -4,8 +4,21 @@ import (
"encoding/json"
)
-// DefaultDataStoreDirectory is the directory to store all the local IPFS data.
-const DefaultDataStoreDirectory = "datastore"
+const (
+ // DefaultDataStoreDirectory is the directory to store all the local IPFS data.
+ DefaultDataStoreDirectory = "datastore"
+
+ // DefaultBlockKeyCacheSize is the size for the blockstore two-queue
+ // cache which caches block keys and sizes.
+ DefaultBlockKeyCacheSize = 64 << 10
+
+ // DefaultWriteThrough specifies whether to use a "write-through"
+ // Blockstore and Blockservice. This means that they will write
+ // without performing any reads to check if the incoming blocks are
+ // already present in the datastore. Enable for datastores with fast
+ // writes and slower reads.
+ DefaultWriteThrough bool = true
+)
// Datastore tracks the configuration of the datastore.
type Datastore struct {
@@ -21,8 +34,10 @@ type Datastore struct {
Spec map[string]interface{}
- HashOnRead bool
- BloomFilterSize int
+ HashOnRead bool
+ BloomFilterSize int
+ BlockKeyCacheSize OptionalInteger `json:",omitempty"`
+ WriteThrough Flag `json:",omitempty"`
}
// DataStorePath returns the default data store path given a configuration root
diff --git a/config/import.go b/config/import.go
index 10af4edfa..6ea4d060f 100644
--- a/config/import.go
+++ b/config/import.go
@@ -5,6 +5,15 @@ const (
DefaultUnixFSRawLeaves = false
DefaultUnixFSChunker = "size-262144"
DefaultHashFunction = "sha2-256"
+
+ // DefaultBatchMaxNodes controls the maximum number of nodes in a
+ // write-batch. The total size of the batch is limited by
+ // BatchMaxnodes and BatchMaxSize.
+ DefaultBatchMaxNodes = 128
+ // DefaultBatchMaxSize controls the maximum size of a single
+ // write-batch. The total size of the batch is limited by
+ // BatchMaxnodes and BatchMaxSize.
+ DefaultBatchMaxSize = 100 << 20 // 20MiB
)
// Import configures the default options for ingesting data. This affects commands
@@ -14,4 +23,6 @@ type Import struct {
UnixFSRawLeaves Flag
UnixFSChunker OptionalString
HashFunction OptionalString
+ BatchMaxNodes OptionalInteger
+ BatchMaxSize OptionalInteger
}
diff --git a/core/commands/dag/import.go b/core/commands/dag/import.go
index 5e39393c1..e298a2d52 100644
--- a/core/commands/dag/import.go
+++ b/core/commands/dag/import.go
@@ -11,6 +11,7 @@ import (
cmds "github.com/ipfs/go-ipfs-cmds"
ipld "github.com/ipfs/go-ipld-format"
ipldlegacy "github.com/ipfs/go-ipld-legacy"
+ "github.com/ipfs/kubo/config"
"github.com/ipfs/kubo/core/coreiface/options"
gocarv2 "github.com/ipld/go-car/v2"
@@ -24,6 +25,11 @@ func dagImport(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment
return err
}
+ cfg, err := node.Repo.Config()
+ if err != nil {
+ return err
+ }
+
api, err := cmdenv.GetApi(env, req)
if err != nil {
return err
@@ -55,7 +61,14 @@ func dagImport(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment
// this is *not* a transaction
// it is simply a way to relieve pressure on the blockstore
// similar to pinner.Pin/pinner.Flush
- batch := ipld.NewBatch(req.Context, api.Dag())
+ batch := ipld.NewBatch(req.Context, api.Dag(),
+ // Default: 128. Means 128 file descriptors needed in flatfs
+ ipld.MaxNodesBatchOption(int(cfg.Import.BatchMaxNodes.WithDefault(config.DefaultBatchMaxNodes))),
+ // Default 100MiB. When setting block size to 1MiB, we can add
+ // ~100 nodes maximum. With default 256KiB block-size, we will
+ // hit the max nodes limit at 32MiB.p
+ ipld.MaxSizeBatchOption(int(cfg.Import.BatchMaxSize.WithDefault(config.DefaultBatchMaxSize))),
+ )
roots := cid.NewSet()
var blockCount, blockBytesCount uint64
diff --git a/core/coreapi/coreapi.go b/core/coreapi/coreapi.go
index 2cf86e172..6e099e5fd 100644
--- a/core/coreapi/coreapi.go
+++ b/core/coreapi/coreapi.go
@@ -207,12 +207,12 @@ func (api *CoreAPI) WithOptions(opts ...options.ApiOption) (coreiface.CoreAPI, e
return nil
}
- if settings.Offline {
- cfg, err := n.Repo.Config()
- if err != nil {
- return nil, err
- }
+ cfg, err := n.Repo.Config()
+ if err != nil {
+ return nil, err
+ }
+ if settings.Offline {
cs := cfg.Ipns.ResolveCacheSize
if cs == 0 {
cs = node.DefaultIpnsCacheSize
@@ -244,7 +244,9 @@ func (api *CoreAPI) WithOptions(opts ...options.ApiOption) (coreiface.CoreAPI, e
if settings.Offline || !settings.FetchBlocks {
subAPI.exchange = offlinexch.Exchange(subAPI.blockstore)
- subAPI.blocks = bserv.New(subAPI.blockstore, subAPI.exchange)
+ subAPI.blocks = bserv.New(subAPI.blockstore, subAPI.exchange,
+ bserv.WriteThrough(cfg.Datastore.WriteThrough.WithDefault(config.DefaultWriteThrough)),
+ )
subAPI.dag = dag.NewDAGService(subAPI.blocks)
}
diff --git a/core/coreapi/unixfs.go b/core/coreapi/unixfs.go
index 93293beb9..3a74d3046 100644
--- a/core/coreapi/unixfs.go
+++ b/core/coreapi/unixfs.go
@@ -21,6 +21,7 @@ import (
ds "github.com/ipfs/go-datastore"
dssync "github.com/ipfs/go-datastore/sync"
ipld "github.com/ipfs/go-ipld-format"
+ "github.com/ipfs/kubo/config"
coreiface "github.com/ipfs/kubo/core/coreiface"
options "github.com/ipfs/kubo/core/coreiface/options"
"github.com/ipfs/kubo/core/coreunix"
@@ -85,13 +86,15 @@ func (api *UnixfsAPI) Add(ctx context.Context, files files.Node, opts ...options
if settings.OnlyHash {
// setup a /dev/null pipeline to simulate adding the data
dstore := dssync.MutexWrap(ds.NewNullDatastore())
- bs := bstore.NewBlockstore(dstore, bstore.WriteThrough(true))
- addblockstore = bstore.NewGCBlockstore(bs, nil) // gclocker will never be used
- exch = nil // exchange will never be used
- pinning = nil // pinner will never be used
+ bs := bstore.NewBlockstore(dstore, bstore.WriteThrough(true)) // we use NewNullDatastore, so ok to always WriteThrough when OnlyHash
+ addblockstore = bstore.NewGCBlockstore(bs, nil) // gclocker will never be used
+ exch = nil // exchange will never be used
+ pinning = nil // pinner will never be used
}
- bserv := blockservice.New(addblockstore, exch) // hash security 001
+ bserv := blockservice.New(addblockstore, exch,
+ blockservice.WriteThrough(cfg.Datastore.WriteThrough.WithDefault(config.DefaultWriteThrough)),
+ ) // hash security 001
dserv := merkledag.NewDAGService(bserv)
// add a sync call to the DagService
diff --git a/core/node/core.go b/core/node/core.go
index ad259c962..1c372b642 100644
--- a/core/node/core.go
+++ b/core/node/core.go
@@ -24,21 +24,26 @@ import (
dagpb "github.com/ipld/go-codec-dagpb"
"go.uber.org/fx"
+ "github.com/ipfs/kubo/config"
"github.com/ipfs/kubo/core/node/helpers"
"github.com/ipfs/kubo/repo"
)
// BlockService creates new blockservice which provides an interface to fetch content-addressable blocks
-func BlockService(lc fx.Lifecycle, bs blockstore.Blockstore, rem exchange.Interface) blockservice.BlockService {
- bsvc := blockservice.New(bs, rem)
+func BlockService(cfg *config.Config) func(lc fx.Lifecycle, bs blockstore.Blockstore, rem exchange.Interface) blockservice.BlockService {
+ return func(lc fx.Lifecycle, bs blockstore.Blockstore, rem exchange.Interface) blockservice.BlockService {
+ bsvc := blockservice.New(bs, rem,
+ blockservice.WriteThrough(cfg.Datastore.WriteThrough.WithDefault(config.DefaultWriteThrough)),
+ )
- lc.Append(fx.Hook{
- OnStop: func(ctx context.Context) error {
- return bsvc.Close()
- },
- })
+ lc.Append(fx.Hook{
+ OnStop: func(ctx context.Context) error {
+ return bsvc.Close()
+ },
+ })
- return bsvc
+ return bsvc
+ }
}
// Pinning creates new pinner which tells GC which blocks should be kept
diff --git a/core/node/groups.go b/core/node/groups.go
index 594bbe625..caa6cc963 100644
--- a/core/node/groups.go
+++ b/core/node/groups.go
@@ -189,6 +189,7 @@ func LibP2P(bcfg *BuildCfg, cfg *config.Config, userResourceOverrides rcmgr.Part
func Storage(bcfg *BuildCfg, cfg *config.Config) fx.Option {
cacheOpts := blockstore.DefaultCacheOpts()
cacheOpts.HasBloomFilterSize = cfg.Datastore.BloomFilterSize
+ cacheOpts.HasTwoQueueCacheSize = int(cfg.Datastore.BlockKeyCacheSize.WithDefault(config.DefaultBlockKeyCacheSize))
if !bcfg.Permanent {
cacheOpts.HasBloomFilterSize = 0
}
@@ -201,7 +202,7 @@ func Storage(bcfg *BuildCfg, cfg *config.Config) fx.Option {
return fx.Options(
fx.Provide(RepoConfig),
fx.Provide(Datastore),
- fx.Provide(BaseBlockstoreCtor(cacheOpts, cfg.Datastore.HashOnRead)),
+ fx.Provide(BaseBlockstoreCtor(cacheOpts, cfg.Datastore.HashOnRead, cfg.Datastore.WriteThrough.WithDefault(config.DefaultWriteThrough))),
finalBstore,
)
}
@@ -332,7 +333,6 @@ func Offline(cfg *config.Config) fx.Option {
// Core groups basic IPFS services
var Core = fx.Options(
- fx.Provide(BlockService),
fx.Provide(Dag),
fx.Provide(FetcherConfig),
fx.Provide(PathResolverConfig),
@@ -387,7 +387,7 @@ func IPFS(ctx context.Context, bcfg *BuildCfg) fx.Option {
Identity(cfg),
IPNS,
Networked(bcfg, cfg, userResourceOverrides),
-
+ fx.Provide(BlockService(cfg)),
Core,
)
}
diff --git a/core/node/storage.go b/core/node/storage.go
index aedf0ee6a..fd8dfb82e 100644
--- a/core/node/storage.go
+++ b/core/node/storage.go
@@ -27,10 +27,12 @@ func Datastore(repo repo.Repo) datastore.Datastore {
type BaseBlocks blockstore.Blockstore
// BaseBlockstoreCtor creates cached blockstore backed by the provided datastore
-func BaseBlockstoreCtor(cacheOpts blockstore.CacheOpts, hashOnRead bool) func(mctx helpers.MetricsCtx, repo repo.Repo, lc fx.Lifecycle) (bs BaseBlocks, err error) {
+func BaseBlockstoreCtor(cacheOpts blockstore.CacheOpts, hashOnRead bool, writeThrough bool) func(mctx helpers.MetricsCtx, repo repo.Repo, lc fx.Lifecycle) (bs BaseBlocks, err error) {
return func(mctx helpers.MetricsCtx, repo repo.Repo, lc fx.Lifecycle) (bs BaseBlocks, err error) {
// hash security
- bs = blockstore.NewBlockstore(repo.Datastore())
+ bs = blockstore.NewBlockstore(repo.Datastore(),
+ blockstore.WriteThrough(writeThrough),
+ )
bs = &verifbs.VerifBS{Blockstore: bs}
bs, err = blockstore.CachedBlockstore(helpers.LifecycleCtx(mctx, lc), bs, cacheOpts)
if err != nil {
diff --git a/docs/changelogs/v0.33.md b/docs/changelogs/v0.33.md
index 51445b000..07fabe032 100644
--- a/docs/changelogs/v0.33.md
+++ b/docs/changelogs/v0.33.md
@@ -9,6 +9,8 @@
- [Bitswap improvements from Boxo](#bitswap-improvements-from-boxo)
- [Using default `libp2p_rcmgr` metrics](#using-default-libp2p_rcmgr--metrics)
- [`ipfs add --to-files` no longer works with `--wrap`](#ipfs-add---to-files-no-longer-works-with---wrap)
+ - [New options for faster writes: `WriteThrough`, `BlockKeyCacheSize`, `BatchMaxNodes`, `BatchMaxSize`](#new-options-for-faster-writes-writethrough-blockkeycachesize-batchmaxnodes-batchmaxsize)
+ - [MFS stability with large number of writes](#mfs-stability-with-large-number-of-writes)
- [๐ฆ๏ธ Dependency updates](#-dependency-updates)
- [๐ Changelog](#-changelog)
- [๐จโ๐ฉโ๐งโ๐ฆ Contributors](#-contributors)
@@ -31,6 +33,24 @@ If you depended on removed ones, please fill an issue to add them to the upstrea
Onboarding files and directories with `ipfs add --to-files` now requires non-empty names. due to this, The `--to-files` and `--wrap` options are now mutually exclusive ([#10612](https://github.com/ipfs/kubo/issues/10612)).
+#### New options for faster writes: `WriteThrough`, `BlockKeyCacheSize`, `BatchMaxNodes`, `BatchMaxSize`
+
+Now that Kubo supports [`pebble`](https://github.com/ipfs/kubo/blob/master/docs/datastores.md#pebbleds) as a datastore backend, it becomes very useful to expose some additional configuration options for how the blockservice/blockstore/datastore combo behaves.
+
+Usually, LSM-tree based datastore like Pebble or Badger have very fast write performance (blocks are streamed to disk) while incurring in read-amplification penalties (blocks need to be looked up in the index to know where they are on disk), specially noticiable on spinning disks.
+
+Prior to this version, `BlockService` and `Blockstore` implementations performed a `Has(cid)` for every block that was going to be written, skipping the writes altogether if the block was already present in the datastore. The performance impact of this `Has()` call can vary. The `Datastore` implementation itself might include block-caching and things like bloom-filters to speed up lookups and mitigate read-penalties. Our `Blockstore` implementation also supports a bloom-filter (controlled by `BloomFilterSize` and disabled by default), and a two-queue cache for keys and block sizes. If we assume that most of the blocks added to Kubo are new blocks, not already present in the datastore, or that the datastore itself includes mechanisms to optimize writes and avoid writing the same data twice, the calls to `Has()` at both BlockService and Blockstore layers seem superflous to they point they even harm write performance.
+
+For these reasons, from now on, the default is to use a "write-through" mode for the Blockservice and the Blockstore. We have added a new option `Datastore.WriteThrough`, which defaults to `true`. Previous behaviour can be obtained by manually setting it to `false`.
+
+We have also made the size of the two-queue blockstore cache configurable with another option: `Datastore.BlockKeyCacheSize`, which defaults to `65536` (64KiB). Additionally, this caching layer can be disabled altogether by setting it to `0`. In particular, this option controls the size of a blockstore caching layer that records whether the blockstore has certain block and their sizes (but does not cache the contents, so it stays relativey small in general).
+
+Finally, we have added two new options to the `Import` section to control the maximum size of write-batches: `BatchMaxNodes` and `BatchMaxSize`. These are set by default to `128` nodes and `20MiB`. Increasing them will batch more items together when importing data with `ipfs dag import`, which can speed things up. It is importance to find a balance between available memory (used to hold the batch), disk latencies (when writing the batch) and processing power (when preparing the batch, as nodes are sorted and duplicates removed).
+
+As a reminder, details from all the options are explained in the [configuration documentation](https://github.com/ipfs/kubo/blob/master/docs/config.md).
+
+We recommend users trying Pebble as a datastore backend to disable both blockstore bloom-filter and key caching layers and enable write through as a way to evaluate the raw performance of the underlying datastore, which includes its own bloom-filter and caching layers (default cache size is `8MiB` and can be configured in the [options](https://github.com/ipfs/kubo/blob/master/docs/datastores.md#pebbleds).
+
#### MFS stability with large number of writes
We have fixed a number of issues that were triggered by writing or copying many files onto an MFS folder: increased memory usage first, then CPU, disk usage, and eventually a deadlock on write operations. The details of the fixes can be read at [#10630](https://github.com/ipfs/kubo/pull/10630) and [#10623](https://github.com/ipfs/kubo/pull/10623). The result is that writing large amounts of files to an MFS folder should now be possible without major issues. It is possible, as before, to speed up the operations using the `ipfs files --flush=false Full Changelog
+
+- github.com/ipfs/kubo:
+ - test: fix the socat tests after the ubuntu 24.04 upgrade (#10683) ([ipfs/kubo#10683](https://github.com/ipfs/kubo/pull/10683))
+ - chore: 0.33.0-rc3
+ - fix: quic-go v0.49.0 (#10673) ([ipfs/kubo#10673](https://github.com/ipfs/kubo/pull/10673))
+ - Upgrade to Boxo v0.27.2 (#10672) ([ipfs/kubo#10672](https://github.com/ipfs/kubo/pull/10672))
+ - chore: 0.33.0-rc2
+ - Upgrade to Boxo v0.27.1 (#10671) ([ipfs/kubo#10671](https://github.com/ipfs/kubo/pull/10671))
+ - fix(autotls): renewal and AutoTLS.ShortAddrs (#10669) ([ipfs/kubo#10669](https://github.com/ipfs/kubo/pull/10669))
+ - update changelog for boxo and go-libp2p (#10668) ([ipfs/kubo#10668](https://github.com/ipfs/kubo/pull/10668))
+ - Upgrade to Boxo v0.27.0 (#10665) ([ipfs/kubo#10665](https://github.com/ipfs/kubo/pull/10665))
+ - update dependencies (#10664) ([ipfs/kubo#10664](https://github.com/ipfs/kubo/pull/10664))
+ - fix(dns): update default DNSLink resolvers (#10655) ([ipfs/kubo#10655](https://github.com/ipfs/kubo/pull/10655))
+ - chore: p2p-forge v0.2.2 + go-libp2p-kad-dht v0.28.2 (#10663) ([ipfs/kubo#10663](https://github.com/ipfs/kubo/pull/10663))
+ - fix(cli): support HTTPS in ipfs --api (#10659) ([ipfs/kubo#10659](https://github.com/ipfs/kubo/pull/10659))
+ - chore: fix typos and comment formatting (#10653) ([ipfs/kubo#10653](https://github.com/ipfs/kubo/pull/10653))
+ - fix/gateway: escape directory redirect url (#10649) ([ipfs/kubo#10649](https://github.com/ipfs/kubo/pull/10649))
+ - Add example of setting array to config command help
+ - collection of typo fixes (#10647) ([ipfs/kubo#10647](https://github.com/ipfs/kubo/pull/10647))
+ - chore: 0.33.0-rc1
+ - fix: ipfs-webui v4.4.2 (#10635) ([ipfs/kubo#10635](https://github.com/ipfs/kubo/pull/10635))
+ - feat(libp2p): shared TCP listeners and AutoTLS.AutoWSS (#10565) ([ipfs/kubo#10565](https://github.com/ipfs/kubo/pull/10565))
+ - feat(flatfs): default to sync=false (#10632) ([ipfs/kubo#10632](https://github.com/ipfs/kubo/pull/10632))
+ - Minor spelling and wording changes (#10634) ([ipfs/kubo#10634](https://github.com/ipfs/kubo/pull/10634))
+ - docs: clarify Swarm.ResourceMgr.MaxMemory (#10622) ([ipfs/kubo#10622](https://github.com/ipfs/kubo/pull/10622))
+ - feat: expose BlockKeyCacheSize and enable WriteThrough datastore options (#10614) ([ipfs/kubo#10614](https://github.com/ipfs/kubo/pull/10614))
+ - cmd/files: flush parent folders (#10630) ([ipfs/kubo#10630](https://github.com/ipfs/kubo/pull/10630))
+ - Upgrade to Boxo v0.26.0 (#10631) ([ipfs/kubo#10631](https://github.com/ipfs/kubo/pull/10631))
+ - [skip changelog] pinmfs: mitigate slow mfs writes when it triggers (#10623) ([ipfs/kubo#10623](https://github.com/ipfs/kubo/pull/10623))
+ - chore: use errors.New to replace fmt.Errorf with no parameters (#10617) ([ipfs/kubo#10617](https://github.com/ipfs/kubo/pull/10617))
+ - chore: boxo v0.25.0 (#10619) ([ipfs/kubo#10619](https://github.com/ipfs/kubo/pull/10619))
+ - fix(cmds/add): disallow --wrap with --to-files (#10612) ([ipfs/kubo#10612](https://github.com/ipfs/kubo/pull/10612))
+ - refactor(cmds): do not return errors embedded in result type (#10527) ([ipfs/kubo#10527](https://github.com/ipfs/kubo/pull/10527))
+ - fix: ipfs-webui v4.4.1 (#10608) ([ipfs/kubo#10608](https://github.com/ipfs/kubo/pull/10608))
+ - chore: fix broken url in comment (#10606) ([ipfs/kubo#10606](https://github.com/ipfs/kubo/pull/10606))
+ - refactor(rcmgr): use default libp2p rcmgr metrics (#9947) ([ipfs/kubo#9947](https://github.com/ipfs/kubo/pull/9947))
+ - docs(changelog/v0.33): bitswap reprovide changes (#10604) ([ipfs/kubo#10604](https://github.com/ipfs/kubo/pull/10604))
+ - tests(cli/harness): use unused Verbose flag to pipe daemon outputs (#10601) ([ipfs/kubo#10601](https://github.com/ipfs/kubo/pull/10601))
+ - chore: p2p-forge/client v0.1.0 (#10605) ([ipfs/kubo#10605](https://github.com/ipfs/kubo/pull/10605))
+ - fix: go-libp2p v0.37.2 (#10603) ([ipfs/kubo#10603](https://github.com/ipfs/kubo/pull/10603))
+ - docs: typos (#10602) ([ipfs/kubo#10602](https://github.com/ipfs/kubo/pull/10602))
+ - tests/cli: fix flapping tests (#10600) ([ipfs/kubo#10600](https://github.com/ipfs/kubo/pull/10600))
+ - Update to boxo with refactored providerQueryManager. (#10595) ([ipfs/kubo#10595](https://github.com/ipfs/kubo/pull/10595))
+ - fix some typos in docs (#10598) ([ipfs/kubo#10598](https://github.com/ipfs/kubo/pull/10598))
+ - feat(bootstrap): add JS-based va1.bootstrap.libp2p.io (#10575) ([ipfs/kubo#10575](https://github.com/ipfs/kubo/pull/10575))
+ - fix: increase provider sample size (#10589) ([ipfs/kubo#10589](https://github.com/ipfs/kubo/pull/10589))
+ - Typos Update config.md (#10591) ([ipfs/kubo#10591](https://github.com/ipfs/kubo/pull/10591))
+ - refactor: update to boxo without goprocess (#10567) ([ipfs/kubo#10567](https://github.com/ipfs/kubo/pull/10567))
+ - fix: go-libp2p-kad-dht v0.28.1 (#10581) ([ipfs/kubo#10581](https://github.com/ipfs/kubo/pull/10581))
+ - docs: update RELEASE_CHECKLIST.md (#10564) ([ipfs/kubo#10564](https://github.com/ipfs/kubo/pull/10564))
+ - Merge release v0.32.0 ([ipfs/kubo#10579](https://github.com/ipfs/kubo/pull/10579))
+ - fix: go-libp2p-kad-dht v0.28.0 (#10578) ([ipfs/kubo#10578](https://github.com/ipfs/kubo/pull/10578))
+ - feat: ipfs-webui v4.4.0 (#10574) ([ipfs/kubo#10574](https://github.com/ipfs/kubo/pull/10574))
+ - chore: boxo v0.24.3 and p2p-forge v0.0.2 (#10572) ([ipfs/kubo#10572](https://github.com/ipfs/kubo/pull/10572))
+ - chore: stop using go-homedir (#10568) ([ipfs/kubo#10568](https://github.com/ipfs/kubo/pull/10568))
+ - fix(autotls): store certificates at the location from the repo path (#10566) ([ipfs/kubo#10566](https://github.com/ipfs/kubo/pull/10566))
+ - chore: bump master to 0.33.0-dev
+- github.com/ipfs-shipyard/nopfs (v0.0.12 -> v0.0.14):
+ - Fix error when no doublehash db exists (#42) ([ipfs-shipyard/nopfs#42](https://github.com/ipfs-shipyard/nopfs/pull/42))
+ - Improve support for IPNS double-hashed entries (#41) ([ipfs-shipyard/nopfs#41](https://github.com/ipfs-shipyard/nopfs/pull/41))
+- github.com/ipfs-shipyard/nopfs/ipfs (v0.13.2-0.20231027223058-cde3b5ba964c -> v0.25.0):
+ failed to fetch repo
+- github.com/ipfs/boxo (v0.24.3 -> v0.27.2):
+ - Release v0.27.2 ([ipfs/boxo#811](https://github.com/ipfs/boxo/pull/811))
+ - Revert peer exclude cancel ([ipfs/boxo#809](https://github.com/ipfs/boxo/pull/809))
+ - Release v0.27.1 ([ipfs/boxo#807](https://github.com/ipfs/boxo/pull/807))
+ - fix sending cancels when excluding peer ([ipfs/boxo#805](https://github.com/ipfs/boxo/pull/805))
+ - Release v0.27.0 ([ipfs/boxo#802](https://github.com/ipfs/boxo/pull/802))
+ - Remove want-block sent tracking from sessionWantSender (#759) ([ipfs/boxo#759](https://github.com/ipfs/boxo/pull/759))
+ - Upgrade to go-libp2p v0.38.2 (#804) ([ipfs/boxo#804](https://github.com/ipfs/boxo/pull/804))
+ - [skip changelog] Use routing.ContentRouting interface (#803) ([ipfs/boxo#803](https://github.com/ipfs/boxo/pull/803))
+ - fix potential crash in unixfs directory (#798) ([ipfs/boxo#798](https://github.com/ipfs/boxo/pull/798))
+ - prefer slices.SortFunc to sort.Sort (#796) ([ipfs/boxo#796](https://github.com/ipfs/boxo/pull/796))
+ - fix: ipns protobuf namespace conflict (#794) ([ipfs/boxo#794](https://github.com/ipfs/boxo/pull/794))
+ - update release procedure (#773) ([ipfs/boxo#773](https://github.com/ipfs/boxo/pull/773))
+ - reduce default number of routing in-process requests (#793) ([ipfs/boxo#793](https://github.com/ipfs/boxo/pull/793))
+ - Do not return unused values from wantlists (#792) ([ipfs/boxo#792](https://github.com/ipfs/boxo/pull/792))
+ - Create FUNDING.json [skip changelog] (#795) ([ipfs/boxo#795](https://github.com/ipfs/boxo/pull/795))
+ - refactor: using slices.Contains to simplify the code (#791) ([ipfs/boxo#791](https://github.com/ipfs/boxo/pull/791))
+ - do not send cancel message to peer that sent block (#784) ([ipfs/boxo#784](https://github.com/ipfs/boxo/pull/784))
+ - Define a `go_package` for protobuf, rename to a more unique `ipns-record.proto` ([ipfs/boxo#789](https://github.com/ipfs/boxo/pull/789))
+ - bitswap: messagequeue: lock only needed sections (#787) ([ipfs/boxo#787](https://github.com/ipfs/boxo/pull/787))
+ - Update libp2p-kad-dht to v0.28.2 (#786) ([ipfs/boxo#786](https://github.com/ipfs/boxo/pull/786))
+ - feat(gateway): allow localhost http:// DoH resolvers (#645) ([ipfs/boxo#645](https://github.com/ipfs/boxo/pull/645))
+ - fix(gateway): update DoH resolver for .crypto DNSLink (#782) ([ipfs/boxo#782](https://github.com/ipfs/boxo/pull/782))
+ - fix(gateway): update DoH resolver for .eth DNSLink (#781) ([ipfs/boxo#781](https://github.com/ipfs/boxo/pull/781))
+ - chore: pass options to tracer start (#775) ([ipfs/boxo#775](https://github.com/ipfs/boxo/pull/775))
+ - escape redirect urls (#783) ([ipfs/boxo#783](https://github.com/ipfs/boxo/pull/783))
+ - fix/gateway: escape directory redirect url (#779) ([ipfs/boxo#779](https://github.com/ipfs/boxo/pull/779))
+ - fix spelling in comments (#778) ([ipfs/boxo#778](https://github.com/ipfs/boxo/pull/778))
+ - trivial spelling changes in comments (#777) ([ipfs/boxo#777](https://github.com/ipfs/boxo/pull/777))
+ - Release v0.26.0 ([ipfs/boxo#770](https://github.com/ipfs/boxo/pull/770))
+ - Minor spelling and wording changes (#768) ([ipfs/boxo#768](https://github.com/ipfs/boxo/pull/768))
+ - update go-libp2p and go-libp2p-kad-dht ([ipfs/boxo#767](https://github.com/ipfs/boxo/pull/767))
+ - [skip changelog] fix: Drop stream references on Close/Reset ([ipfs/boxo#760](https://github.com/ipfs/boxo/pull/760))
+ - Update go-libp2p to v0.38.0 (#764) ([ipfs/boxo#764](https://github.com/ipfs/boxo/pull/764))
+ - Fix leak due to cid queue never getting cleaned up (#756) ([ipfs/boxo#756](https://github.com/ipfs/boxo/pull/756))
+ - Do not reset the broadcast timer if there are no wants (#758) ([ipfs/boxo#758](https://github.com/ipfs/boxo/pull/758))
+ - Replace mock time implementation (#762) ([ipfs/boxo#762](https://github.com/ipfs/boxo/pull/762))
+ - mfs: clean cache on sync ([ipfs/boxo#751](https://github.com/ipfs/boxo/pull/751))
+ - Remove peer's count of first responses when peer becomes unavailable (#757) ([ipfs/boxo#757](https://github.com/ipfs/boxo/pull/757))
+ - Remove unnecessary CID copying in SessionInterestManager (#761) ([ipfs/boxo#761](https://github.com/ipfs/boxo/pull/761))
+ - [bitswap/peermanager] take read-lock for read-only operation (#755) ([ipfs/boxo#755](https://github.com/ipfs/boxo/pull/755))
+ - bitswap/client/messagequeue: expose dontHaveTimeoutMgr configuration (#750) ([ipfs/boxo#750](https://github.com/ipfs/boxo/pull/750))
+ - improve mfs republisher (#754) ([ipfs/boxo#754](https://github.com/ipfs/boxo/pull/754))
+ - blockstore/blockservice: change option to `WriteThrough(enabled bool)` ([ipfs/boxo#749](https://github.com/ipfs/boxo/pull/749))
+ - Merge release v0.25.0 ([ipfs/boxo#748](https://github.com/ipfs/boxo/pull/748))
+ - Use deque instead of slice for queues (#742) ([ipfs/boxo#742](https://github.com/ipfs/boxo/pull/742))
+ - chore: no lifecycle context to shutdown ProviderQueryManager (#734) ([ipfs/boxo#734](https://github.com/ipfs/boxo/pull/734))
+ - removed Startup function from ProviderQueryManager (#741) ([ipfs/boxo#741](https://github.com/ipfs/boxo/pull/741))
+ - Reenable flaky bitswap tests (#740) ([ipfs/boxo#740](https://github.com/ipfs/boxo/pull/740))
+ - feat(session): do not record erroneous session want sends (#452) ([ipfs/boxo#452](https://github.com/ipfs/boxo/pull/452))
+ - feat(filestore): add mmap reader option (#665) ([ipfs/boxo#665](https://github.com/ipfs/boxo/pull/665))
+ - chore: update to latest go-libp2p (#739) ([ipfs/boxo#739](https://github.com/ipfs/boxo/pull/739))
+ - refactor(remote/pinning): `Ls` to take results channel instead of returning one (#738) ([ipfs/boxo#738](https://github.com/ipfs/boxo/pull/738))
+ - Bitswap default ProviderQueryManager uses explicit options (#737) ([ipfs/boxo#737](https://github.com/ipfs/boxo/pull/737))
+ - chore: minor examples cleanup (#736) ([ipfs/boxo#736](https://github.com/ipfs/boxo/pull/736))
+ - misc comments and spelling (#735) ([ipfs/boxo#735](https://github.com/ipfs/boxo/pull/735))
+ - chore: fix invalid url in docs (#733) ([ipfs/boxo#733](https://github.com/ipfs/boxo/pull/733))
+ - [skip changelog] bitswap/client: fix wiring when passing custom providerFinder ([ipfs/boxo#732](https://github.com/ipfs/boxo/pull/732))
+ - Add debug logging for deduplicated queries (#729) ([ipfs/boxo#729](https://github.com/ipfs/boxo/pull/729))
+ - [skip changelog] staticcheck fixes / remove ununsed variables (#730) ([ipfs/boxo#730](https://github.com/ipfs/boxo/pull/730))
+ - refactor: default to prometheus.DefaultRegisterer (#722) ([ipfs/boxo#722](https://github.com/ipfs/boxo/pull/722))
+ - chore: minor Improvements to providerquerymanager (#728) ([ipfs/boxo#728](https://github.com/ipfs/boxo/pull/728))
+ - dspinner: RecursiveKeys(): do not hang on cancellations (#727) ([ipfs/boxo#727](https://github.com/ipfs/boxo/pull/727))
+ - Tests can signal immediate rebroadcast (#726) ([ipfs/boxo#726](https://github.com/ipfs/boxo/pull/726))
+ - fix(bitswap/client/msgq): prevent duplicate requests (#691) ([ipfs/boxo#691](https://github.com/ipfs/boxo/pull/691))
+ - Bitswap: move providing -> Exchange-layer, providerQueryManager -> routing (#641) ([ipfs/boxo#641](https://github.com/ipfs/boxo/pull/641))
+ - fix(bitswap/client/providerquerymanager): don't end trace span until โฆ (#725) ([ipfs/boxo#725](https://github.com/ipfs/boxo/pull/725))
+ - fix(routing/http/server): adjust bucket sizes for http metrics ([ipfs/boxo#724](https://github.com/ipfs/boxo/pull/724))
+ - fix(bitswap/client/providerquerymanager): use non-timed out context for tracing (#721) ([ipfs/boxo#721](https://github.com/ipfs/boxo/pull/721))
+ - fix(bitswap/server): pass context to server engine to register metrics (#723) ([ipfs/boxo#723](https://github.com/ipfs/boxo/pull/723))
+ - docs: fix url of tracing env vars (#719) ([ipfs/boxo#719](https://github.com/ipfs/boxo/pull/719))
+ - feat(routing/http/server): add routing timeout (#720) ([ipfs/boxo#720](https://github.com/ipfs/boxo/pull/720))
+ - feat(routing/http/server): expose prometheus metrics (#718) ([ipfs/boxo#718](https://github.com/ipfs/boxo/pull/718))
+ - Remove dependency on goprocess ([ipfs/boxo#710](https://github.com/ipfs/boxo/pull/710))
+ - Merge release v0.24.3 ([ipfs/boxo#714](https://github.com/ipfs/boxo/pull/714))
+ - fix(bitswap): log unexpected blocks to debug level (#711) ([ipfs/boxo#711](https://github.com/ipfs/boxo/pull/711))
+ - Release v0.24.2 ([ipfs/boxo#708](https://github.com/ipfs/boxo/pull/708))
+- github.com/ipfs/go-ds-pebble (v0.4.0 -> v0.4.2):
+ - new version (#44) ([ipfs/go-ds-pebble#44](https://github.com/ipfs/go-ds-pebble/pull/44))
+ - new version for pebble minor version update (#42) ([ipfs/go-ds-pebble#42](https://github.com/ipfs/go-ds-pebble/pull/42))
+- github.com/ipfs/go-ipfs-cmds (v0.14.0 -> v0.14.1):
+ - fix(NewClient): support https:// URLs (#277) ([ipfs/go-ipfs-cmds#277](https://github.com/ipfs/go-ipfs-cmds/pull/277))
+- github.com/ipfs/go-peertaskqueue (v0.8.1 -> v0.8.2):
+ - new version ([ipfs/go-peertaskqueue#39](https://github.com/ipfs/go-peertaskqueue/pull/39))
+ - Replace mock time implementation ([ipfs/go-peertaskqueue#37](https://github.com/ipfs/go-peertaskqueue/pull/37))
+ - fix: staticcheck feedback
+- github.com/libp2p/go-doh-resolver (v0.4.0 -> v0.5.0):
+ - chore: release v0.5.0
+ - fix: include url on HTTP error (#29) ([libp2p/go-doh-resolver#29](https://github.com/libp2p/go-doh-resolver/pull/29))
+ - feat: allow localhost http endpoints (#28) ([libp2p/go-doh-resolver#28](https://github.com/libp2p/go-doh-resolver/pull/28))
+ - sync: update CI config files (#20) ([libp2p/go-doh-resolver#20](https://github.com/libp2p/go-doh-resolver/pull/20))
+- github.com/libp2p/go-libp2p (v0.37.0 -> v0.38.2):
+ - Release v0.38.2 (#3147) ([libp2p/go-libp2p#3147](https://github.com/libp2p/go-libp2p/pull/3147))
+ - chore: release v0.38.1
+ - fix(httpauth): Correctly handle concurrent requests on server (#3111) ([libp2p/go-libp2p#3111](https://github.com/libp2p/go-libp2p/pull/3111))
+ - ci: Install specific protoc version when generating protobufs (#3112) ([libp2p/go-libp2p#3112](https://github.com/libp2p/go-libp2p/pull/3112))
+ - fix(autorelay): Move relayFinder peer disconnect cleanup to separate goroutine (#3105) ([libp2p/go-libp2p#3105](https://github.com/libp2p/go-libp2p/pull/3105))
+ - chore: Release v0.38.0 (#3106) ([libp2p/go-libp2p#3106](https://github.com/libp2p/go-libp2p/pull/3106))
+ - peerstore: remove sync.Pool for expiringAddrs (#3093) ([libp2p/go-libp2p#3093](https://github.com/libp2p/go-libp2p/pull/3093))
+ - webtransport: close quic conn on dial error (#3104) ([libp2p/go-libp2p#3104](https://github.com/libp2p/go-libp2p/pull/3104))
+ - peerstore: fix addressbook benchmark timing (#3092) ([libp2p/go-libp2p#3092](https://github.com/libp2p/go-libp2p/pull/3092))
+ - swarm: record conn metrics only once (#3091) ([libp2p/go-libp2p#3091](https://github.com/libp2p/go-libp2p/pull/3091))
+ - fix(sampledconn): Correctly handle slow bytes and closed conns (#3080) ([libp2p/go-libp2p#3080](https://github.com/libp2p/go-libp2p/pull/3080))
+ - peerstore: pass options to addrbook constructor (#3090) ([libp2p/go-libp2p#3090](https://github.com/libp2p/go-libp2p/pull/3090))
+ - fix(swarm): remove stray print stmt (#3086) ([libp2p/go-libp2p#3086](https://github.com/libp2p/go-libp2p/pull/3086))
+ - feat(swarm): delay /webrtc-direct dials by 1 second (#3078) ([libp2p/go-libp2p#3078](https://github.com/libp2p/go-libp2p/pull/3078))
+ - chore: Update dependencies and fix deprecated function in relay example (#3023) ([libp2p/go-libp2p#3023](https://github.com/libp2p/go-libp2p/pull/3023))
+ - chore: fix broken link to record envelope protobuf file (#3070) ([libp2p/go-libp2p#3070](https://github.com/libp2p/go-libp2p/pull/3070))
+ - chore(core): fix function name in interface comment (#3056) ([libp2p/go-libp2p#3056](https://github.com/libp2p/go-libp2p/pull/3056))
+ - basichost: avoid modifying slice returned by AddrsFactory (#3068) ([libp2p/go-libp2p#3068](https://github.com/libp2p/go-libp2p/pull/3068))
+ - fix(swarm): check after we split for empty multiaddr (#3063) ([libp2p/go-libp2p#3063](https://github.com/libp2p/go-libp2p/pull/3063))
+ - feat: allow passing options to memoryAddrBook (#3062) ([libp2p/go-libp2p#3062](https://github.com/libp2p/go-libp2p/pull/3062))
+ - fix(libp2phttp): Return ErrServerClosed on Close (#3050) ([libp2p/go-libp2p#3050](https://github.com/libp2p/go-libp2p/pull/3050))
+ - chore(dashboard/alertmanager): update api version from v1 to v2 (#3054) ([libp2p/go-libp2p#3054](https://github.com/libp2p/go-libp2p/pull/3054))
+ - fix(tcpreuse): handle connection that failed to be sampled (#3036) ([libp2p/go-libp2p#3036](https://github.com/libp2p/go-libp2p/pull/3036))
+ - fix(tcpreuse): remove windows specific code (#3039) ([libp2p/go-libp2p#3039](https://github.com/libp2p/go-libp2p/pull/3039))
+ - refactor(libp2phttp): don't require specific port for the HTTP host example (#3047) ([libp2p/go-libp2p#3047](https://github.com/libp2p/go-libp2p/pull/3047))
+ - refactor(core/routing): split ContentRouting interface (#3048) ([libp2p/go-libp2p#3048](https://github.com/libp2p/go-libp2p/pull/3048))
+ - fix(holepunch/tracer): replace inline peer struct with peerInfo type (#3049) ([libp2p/go-libp2p#3049](https://github.com/libp2p/go-libp2p/pull/3049))
+ - fix: Defer resource usage cleanup until the very end (#3042) ([libp2p/go-libp2p#3042](https://github.com/libp2p/go-libp2p/pull/3042))
+ - fix(eventbus): Idempotent wildcardSub close (#3045) ([libp2p/go-libp2p#3045](https://github.com/libp2p/go-libp2p/pull/3045))
+ - fix: obsaddr: do not record observations over relayed conn (#3043) ([libp2p/go-libp2p#3043](https://github.com/libp2p/go-libp2p/pull/3043))
+ - fix(identify): push should not dial a new connection (#3035) ([libp2p/go-libp2p#3035](https://github.com/libp2p/go-libp2p/pull/3035))
+ - webrtc: handshake more connections in parallel (#3040) ([libp2p/go-libp2p#3040](https://github.com/libp2p/go-libp2p/pull/3040))
+ - eventbus: dont panic on closing Subscription twice (#3034) ([libp2p/go-libp2p#3034](https://github.com/libp2p/go-libp2p/pull/3034))
+ - fix(swarm): incorrect error message format order (#3037) ([libp2p/go-libp2p#3037](https://github.com/libp2p/go-libp2p/pull/3037))
+ - feat: eventbus: log error on slow consumers (#3031) ([libp2p/go-libp2p#3031](https://github.com/libp2p/go-libp2p/pull/3031))
+ - chore: make funding.json uppercase to follow meta convention (#3028) ([libp2p/go-libp2p#3028](https://github.com/libp2p/go-libp2p/pull/3028))
+ - chore: add drips entry to funding.json for Filecoin rPGF round 2
+ - tcp: parameterize metrics collector (#3026) ([libp2p/go-libp2p#3026](https://github.com/libp2p/go-libp2p/pull/3026))
+ - fix: basichost: Use NegotiationTimeout as fallback timeout for NewStream (#3020) ([libp2p/go-libp2p#3020](https://github.com/libp2p/go-libp2p/pull/3020))
+ - feat(tcpreuse): add options for sharing TCP listeners amongst TCP, WS and WSS transports (#2984) ([libp2p/go-libp2p#2984](https://github.com/libp2p/go-libp2p/pull/2984))
+ - pnet: wrap underlying error when reading nonce fails (#2975) ([libp2p/go-libp2p#2975](https://github.com/libp2p/go-libp2p/pull/2975))
+- github.com/libp2p/go-libp2p-kad-dht (v0.28.1 -> v0.28.2):
+ - Release v0.28.2 (#1010) ([libp2p/go-libp2p-kad-dht#1010](https://github.com/libp2p/go-libp2p-kad-dht/pull/1010))
+ - accelerated-dht: cleanup peer from message sender on disconnection (#1009) ([libp2p/go-libp2p-kad-dht#1009](https://github.com/libp2p/go-libp2p-kad-dht/pull/1009))
+ - chore: fix some function names in comment ([libp2p/go-libp2p-kad-dht#1004](https://github.com/libp2p/go-libp2p-kad-dht/pull/1004))
+ - feat: add more attributes to traces ([libp2p/go-libp2p-kad-dht#1002](https://github.com/libp2p/go-libp2p-kad-dht/pull/1002))
+- github.com/libp2p/go-netroute (v0.2.1 -> v0.2.2):
+ - v0.2.2 Includes v4/v6 confusion fix for bsd route parsing
+ - #50, Don't transform v4 routes to their v6 form on bsd ([libp2p/go-netroute#51](https://github.com/libp2p/go-netroute/pull/51))
+ - Using syscall.RtMsg on Linux ([libp2p/go-netroute#43](https://github.com/libp2p/go-netroute/pull/43))
+ - add wasi build constraint for netroute_stub ([libp2p/go-netroute#38](https://github.com/libp2p/go-netroute/pull/38))
+ - Stricter filtering of degenerate routes ([libp2p/go-netroute#33](https://github.com/libp2p/go-netroute/pull/33))
+ - sync: update CI config files (#30) ([libp2p/go-netroute#30](https://github.com/libp2p/go-netroute/pull/30))
+- github.com/multiformats/go-multiaddr (v0.13.0 -> v0.14.0):
+ - Release v0.14.0 ([multiformats/go-multiaddr#258](https://github.com/multiformats/go-multiaddr/pull/258))
+ - feat: memory multiaddrs ([multiformats/go-multiaddr#256](https://github.com/multiformats/go-multiaddr/pull/256))
+ - nit: validate ipcidr ([multiformats/go-multiaddr#247](https://github.com/multiformats/go-multiaddr/pull/247))
+ - check for nil interfaces (#251) ([multiformats/go-multiaddr#251](https://github.com/multiformats/go-multiaddr/pull/251))
+ - Make it safe to roundtrip SplitXXX and Join (#250) ([multiformats/go-multiaddr#250](https://github.com/multiformats/go-multiaddr/pull/250))
+- github.com/multiformats/go-multiaddr-dns (v0.4.0 -> v0.4.1):
+ - Release v0.4.1
+ - fix: If decapsulating is empty, skip it. (#65) ([multiformats/go-multiaddr-dns#65](https://github.com/multiformats/go-multiaddr-dns/pull/65))
+- github.com/multiformats/go-multistream (v0.5.0 -> v0.6.0):
+ - release v0.6.0 ([multiformats/go-multistream#116](https://github.com/multiformats/go-multistream/pull/116))
+ - fix: finish reading handshake on lazyConn close
+ - feat: New error to highlight unrecognized responses
+ - release v0.5.0 (#108) ([multiformats/go-multistream#108](https://github.com/multiformats/go-multistream/pull/108))
+
+using `./kuboreleaser --skip-check-before release --version vX.Y.Z(-rcN) prepare-branch` or ...
+### 1. Prepare release branch
+
+- [ ] Prepare the release branch and update version numbers accordingly
- [ ] create a new branch `release-vX.Y.Z`
- use `master` as base if `Z == 0`
- use `release` as base if `Z > 0`
- - [ ]  update the `CurrentVersionNumber` in [version.go](version.go) in the `master` branch to `vX.Y+1.0-dev`
- - [example](https://github.com/ipfs/kubo/pull/9305)
- - [ ] update the `CurrentVersionNumber` in [version.go](version.go) in the `release-vX.Y` branch to `vX.Y.Z(-rcN)`
- - [example](https://github.com/ipfs/kubo/pull/9394)
- - [ ] create a draft PR from `release-vX.Y` to `release`
- - [example](https://github.com/ipfs/kubo/pull/9306)
- - [ ] Cherry-pick commits from `master` to the `release-vX.Y.Z` using `git cherry-pick -x using `./kuboreleaser release --version vX.Y.Z(-rcN) tag` or ...
- - This is a dangerous operation! Go and Docker publishing are difficult to reverse! Have the release reviewer verify all the commands marked with โ ๏ธ!
- - [ ] โ ๏ธ  tag the HEAD commit using `git tag -s vX.Y.Z(-rcN) -m 'Prerelease X.Y.Z(-rcN)'`
- - [ ] โ ๏ธ  tag the HEAD commit of the `release` branch using `git tag -s vX.Y.Z -m 'Release X.Y.Z'`
- - [ ] โ ๏ธ verify the tag is signed and tied to the correct commit using `git show vX.Y.Z(-rcN)`
- - [ ] โ ๏ธ push the tag to GitHub using `git push origin vX.Y.Z(-rcN)`
- - do **NOT** use `git push --tags` because it pushes all your local tags
- using `./kuboreleaser --skip-check-before --skip-run release --version vX.Y.Z(-rcN) publish-to-dockerhub` or ...
- - [ ] Wait for [Publish docker image](https://github.com/ipfs/kubo/actions/workflows/docker-image.yml) workflow run initiated by the tag push to finish
- - [ ] verify the image is available on [Docker Hub](https://hub.docker.com/r/ipfs/kubo/tags)
- - [ ] Publish the release to [dist.ipfs.tech](https://dist.ipfs.tech) using `./kuboreleaser release --version vX.Y.Z(-rcN) publish-to-distributions` or ...
- - [ ] check out [ipfs/distributions](https://github.com/ipfs/distributions)
- - [ ] create new branch: run `git checkout -b release-kubo-X.Y.Z(-rcN)`
- - [ ] run `./dist.sh add-version kubo vX.Y.Z(-rcN)` to add the new version to the `versions` file
- - [usage](https://github.com/ipfs/distributions#usage)
- - [ ] create and merge the PR which updates `dists/kubo/versions` and `dists/go-ipfs/versions` ( and `dists/kubo/current` and `dists/go-ipfs/current`)
- - [example](https://github.com/ipfs/distributions/pull/760)
- - [ ] wait for the [CI](https://github.com/ipfs/distributions/actions/workflows/main.yml) workflow run initiated by the merge to master to finish
- - [ ] verify the release is available on [dist.ipfs.tech](https://dist.ipfs.tech/#kubo)
- using `./kuboreleaser release --version vX.Y.Z(-rcN) publish-to-npm` (โ ๏ธ you might need to run the command a couple of times because GHA might not be able to see the new distribution straight away due to caching) or ...
- - [ ] run the [Release to npm](https://github.com/ipfs/npm-go-ipfs/actions/workflows/main.yml) workflow
- - [ ] check [Release to npm](https://github.com/ipfs/npm-go-ipfs/actions/workflows/main.yml) workflow run logs to verify it discovered the new release
- - [ ] verify the release is available on [NPM](https://www.npmjs.com/package/kubo?activeTab=versions)
- using `./kuboreleaser release --version vX.Y.Z(-rcN) publish-to-github` or ...
- - [ ] create a new release on [GitHub](https://docs.github.com/en/repositories/releasing-projects-on-github/managing-releases-in-a-repository#creating-a-release)
- - [RC example](https://github.com/ipfs/kubo/releases/tag/v0.17.0-rc1)
- - [FINAL example](https://github.com/ipfs/kubo/releases/tag/v0.17.0)
- - [ ] use the `vX.Y.Z(-rcN)` tag
- - [ ] link to the release issue
- - [ ]  link to the changelog in the description
- - [ ]  check the `This is a pre-release` checkbox
- - [ ]  copy the changelog (without the header) in the description
- - [ ]  do **NOT** check the `This is a pre-release` checkbox
- - [ ] run the [sync-release-assets](https://github.com/ipfs/kubo/actions/workflows/sync-release-assets.yml) workflow
- - [ ] wait for the [sync-release-assets](https://github.com/ipfs/kubo/actions/workflows/sync-release-assets.yml) workflow run to finish
- - [ ] verify the release assets are present in the [GitHub release](https://github.com/ipfs/kubo/releases/tag/vX.Y.Z(-rcN))
- using `./kuboreleaser release --version vX.Y.Z(-rcN) promote` or ...
- - [ ] create an [IPFS Discourse](https://discuss.ipfs.tech) topic
- - [prerelease example](https://discuss.ipfs.tech/t/kubo-v0-16-0-rc1-release-candidate-is-out/15248)
- - [release example](https://discuss.ipfs.tech/t/kubo-v0-16-0-release-is-out/15249)
- - [ ] use `Kubo vX.Y.Z(-rcN) is out!` as the title
- - [ ] use `kubo` and `go-ipfs` as topics
+ - [ ]  Test last release against the current one
+- [ ] Promote the release
+ - [ ] create an [IPFS Discourse](https://discuss.ipfs.tech) topic ([prerelease example](https://discuss.ipfs.tech/t/kubo-v0-16-0-rc1-release-candidate-is-out/15248), [release example](https://discuss.ipfs.tech/t/kubo-v0-16-0-release-is-out/15249))
+ - [ ] use `Kubo vX.Y.Z(-rcN) is out!` as the title and `kubo` and `go-ipfs` as tags
- [ ] repeat the title as a heading (`##`) in the description
- [ ] link to the GitHub Release, binaries on IPNS, docker pull command and release notes in the description
- - [ ] pin the [IPFS Discourse](https://discuss.ipfs.tech) topic globally
- - you can make the topic a banner if there is no banner already
- - verify the [IPFS Discourse](https://discuss.ipfs.tech) topic was copied to:
+ - [ ] pin the [IPFS Discourse](https://discuss.ipfs.tech) topic globally, you can make the topic a banner if there is no banner already
+ - [ ] verify the [IPFS Discourse](https://discuss.ipfs.tech) topic was copied to:
- [ ] [#ipfs-chatter](https://discord.com/channels/669268347736686612/669268347736686615) in IPFS Discord
- [ ] [#ipfs-chatter](https://filecoinproject.slack.com/archives/C018EJ8LWH1) in FIL Slack
- [ ] [#ipfs-chatter:ipfs.io](https://matrix.to/#/#ipfs-chatter:ipfs.io) in Matrix
- - [ ]  Add the link to the [IPFS Discourse](https://discuss.ipfs.tech) topic to the [GitHub Release](https://github.com/ipfs/kubo/releases/tag/vX.Y.Z(-rcN)) description
- - [example](https://github.com/ipfs/kubo/releases/tag/v0.17.0)
- - [ ]  create an issue comment mentioning early testers on the release issue
- - [example](https://github.com/ipfs/kubo/issues/9319#issuecomment-1311002478)
- - [ ]  create an issue comment linking to the release on the release issue
- - [example](https://github.com/ipfs/kubo/issues/9417#issuecomment-1400740975)
- - [ ]   ask the marketing team to tweet about the release in [#shared-pl-marketing-requests](https://filecoinproject.slack.com/archives/C018EJ8LWH1) in FIL Slack
- - [example](https://filecoinproject.slack.com/archives/C018EJ8LWH1/p1664885305374900)
- - [ ]   post the link to the [GitHub Release](https://github.com/ipfs/kubo/releases/tag/vX.Y.Z(-rcN)) to [Reddit](https://reddit.com/r/ipfs)
- - [example](https://www.reddit.com/r/ipfs/comments/9x0q0k/kubo_v0160_release_is_out/)
- using `./kuboreleaser release --version vX.Y.Z(-rcN) test-ipfs-companion` or ...
- - [ ] run the [e2e](https://github.com/ipfs/ipfs-companion/actions/workflows/e2e.yml)
- - use `vX.Y.Z(-rcN)` as the Kubo image version
- - [ ] wait for the [e2e](https://github.com/ipfs/ipfs-companion/actions/workflows/e2e.yml) workflow run to finish
- using `./kuboreleaser release --version vX.Y.Z(-rcN) update-ipfs-desktop` or ...
+ - [ ]  Add the link to the [IPFS Discourse](https://discuss.ipfs.tech) topic to the [GitHub Release](https://github.com/ipfs/kubo/releases/tag/vX.Y.Z(-rcN)) description ([example](https://github.com/ipfs/kubo/releases/tag/v0.17.0))
+ - [ ]  create an issue comment mentioning early testers on the release issue ([example](https://github.com/ipfs/kubo/issues/9319#issuecomment-1311002478))
+ - [ ]  create an issue comment linking to the release on the release issue ([example](https://github.com/ipfs/kubo/issues/9417#issuecomment-1400740975))
+ - [ ]   promote on bsky.app ([example](https://bsky.app/profile/ipshipyard.com/post/3lh2brzrwbs2c))
+ - [ ]   promote on x.com ([example](https://x.com/ipshipyard/status/1885346348808929609))
+ - [ ]   post the link to the [GitHub Release](https://github.com/ipfs/kubo/releases/tag/vX.Y.Z(-rcN)) to [Reddit](https://reddit.com/r/ipfs) ([example](https://www.reddit.com/r/ipfs/comments/9x0q0k/kubo_v0160_release_is_out/))
+- [ ] Manually smoke-test the new version with [IPFS Companion Browser Extension](https://docs.ipfs.tech/install/ipfs-companion/)
+- [ ]  Update Kubo in [ipfs-desktop](https://github.com/ipfs/ipfs-desktop)
- [ ] check out [ipfs/ipfs-desktop](https://github.com/ipfs/ipfs-desktop)
- - [ ] run `npm install`
- - [ ] create a PR which updates `package.json` and `package-lock.json`
- - [ ]  add @SgtPooki as reviewer
+ - [ ] run `npm install `
+ - [ ] create a PR which updates `package.json` and `package-lock.json`
+- [ ]  Update Kubo docs at docs.ipfs.tech:
+ - [ ]  run the [update-on-new-ipfs-tag.yml](https://github.com/ipfs/ipfs-docs/actions/workflows/update-on-new-ipfs-tag.yml) workflow
+ - [ ]  merge the PR created by the [update-on-new-ipfs-tag.yml](https://github.com/ipfs/ipfs-docs/actions/workflows/update-on-new-ipfs-tag.yml) workflow run
using `./kuboreleaser release --version vX.Y.Z(-rcN) update-ipfs-docs` or ...
- - [ ]  run the [update-on-new-ipfs-tag.yml](https://github.com/ipfs/ipfs-docs/actions/workflows/update-on-new-ipfs-tag.yml) workflow
- - [ ]  merge the PR created by the [update-on-new-ipfs-tag.yml](https://github.com/ipfs/ipfs-docs/actions/workflows/update-on-new-ipfs-tag.yml) workflow run
- using `./kuboreleaser release --version vX.Y.Z(-rcN) update-ipfs-blog --date YYYY-MM-DD` or ...
- - [ ]  create a PR which adds a release note for the new Kubo version
- - [example](https://github.com/ipfs/ipfs-blog/pull/529)
- - [ ]  merge the PR
- - [ ]  verify the blog entry was published
- using `./kuboreleaser release --version vX.Y.Z(-rcN) merge-branch` or ...
- - [ ] create a new branch `merge-release-vX.Y.Z` from `release`
- - [ ] create and merge a PR from `merge-release-vX.Y.Z` to `master`
- using `./kuboreleaser release --version vX.Y.Z(-rcN) prepare-next` or ...
- - [ ]   Create the next [changelog](https://github.com/ipfs/kubo/blob/master/docs/changelogs/vX.(Y+1).md)
- - [ ]   Link to the new changelog in the [CHANGELOG.md](CHANGELOG.md) file
- - [ ]   Create the next release issue
- Full Changelog
+Full Changelog v0.33.0
- github.com/ipfs/kubo:
- test: fix the socat tests after the ubuntu 24.04 upgrade (#10683) ([ipfs/kubo#10683](https://github.com/ipfs/kubo/pull/10683))
@@ -239,7 +240,7 @@ When navigating to a subdirectory, served by the Kubo web server, a subdirectory
- Use deque instead of slice for queues (#742) ([ipfs/boxo#742](https://github.com/ipfs/boxo/pull/742))
- chore: no lifecycle context to shutdown ProviderQueryManager (#734) ([ipfs/boxo#734](https://github.com/ipfs/boxo/pull/734))
- removed Startup function from ProviderQueryManager (#741) ([ipfs/boxo#741](https://github.com/ipfs/boxo/pull/741))
- - Reenable flaky bitswap tests (#740) ([ipfs/boxo#740](https://github.com/ipfs/boxo/pull/740))
+ - Re-enable flaky bitswap tests (#740) ([ipfs/boxo#740](https://github.com/ipfs/boxo/pull/740))
- feat(session): do not record erroneous session want sends (#452) ([ipfs/boxo#452](https://github.com/ipfs/boxo/pull/452))
- feat(filestore): add mmap reader option (#665) ([ipfs/boxo#665](https://github.com/ipfs/boxo/pull/665))
- chore: update to latest go-libp2p (#739) ([ipfs/boxo#739](https://github.com/ipfs/boxo/pull/739))
@@ -250,7 +251,7 @@ When navigating to a subdirectory, served by the Kubo web server, a subdirectory
- chore: fix invalid url in docs (#733) ([ipfs/boxo#733](https://github.com/ipfs/boxo/pull/733))
- [skip changelog] bitswap/client: fix wiring when passing custom providerFinder ([ipfs/boxo#732](https://github.com/ipfs/boxo/pull/732))
- Add debug logging for deduplicated queries (#729) ([ipfs/boxo#729](https://github.com/ipfs/boxo/pull/729))
- - [skip changelog] staticcheck fixes / remove ununsed variables (#730) ([ipfs/boxo#730](https://github.com/ipfs/boxo/pull/730))
+ - [skip changelog] staticcheck fixes / remove unused variables (#730) ([ipfs/boxo#730](https://github.com/ipfs/boxo/pull/730))
- refactor: default to prometheus.DefaultRegisterer (#722) ([ipfs/boxo#722](https://github.com/ipfs/boxo/pull/722))
- chore: minor Improvements to providerquerymanager (#728) ([ipfs/boxo#728](https://github.com/ipfs/boxo/pull/728))
- dspinner: RecursiveKeys(): do not hang on cancellations (#727) ([ipfs/boxo#727](https://github.com/ipfs/boxo/pull/727))
@@ -395,3 +396,62 @@ When navigating to a subdirectory, served by the Kubo web server, a subdirectory
| Ryan MacArthur | 1 | +1/-1 | 1 |
| Reymon | 1 | +1/-1 | 1 |
| guillaumemichel | 1 | +1/-0 | 1 |
+
+## v0.33.1
+
+### ๐ฆ Highlights
+
+#### Bitswap improvements from Boxo
+
+This release includes performance and reliability improvements and fixes for minor resource leaks. One of the performance changes [greatly improves the bitswap clients ability to operate under high load](https://github.com/ipfs/boxo/pull/817#pullrequestreview-2587207745), that could previously result in an out of memory condition.
+
+#### Improved IPNS interop
+
+Improved compatibility with third-party IPNS publishers by restoring support for compact binary CIDs in the `Value` field of IPNS Records ([IPNS Specs](https://specs.ipfs.tech/ipns/ipns-record/)). As long the signature is valid, Kubo will now resolve such records (likely created by non-Kubo nodes) and convert raw CIDs into valid `/ipfs/cid` content paths.
+**Note:** This only adds support for resolving externally created recordsโKuboโs IPNS record creation remains unchanged. IPNS records with empty `Value` fields default to zero-length `/ipfs/bafkqaaa` to maintain backward compatibility with code expecting a valid content path.
+
+#### ๐ฆ๏ธ Important dependency updates
+
+- update `boxo` to [v0.27.4](https://github.com/ipfs/boxo/releases/tag/v0.27.4) (incl. [v0.27.3](https://github.com/ipfs/boxo/releases/tag/v0.27.3))
+
+### ๐ Changelog
+
+Full Changelog v0.33.1
+
+- github.com/ipfs/kubo:
+ - chore: v0.33.1
+ - fix: boxo v0.27.4 (#10692) ([ipfs/kubo#10692](https://github.com/ipfs/kubo/pull/10692))
+ - docs: add webrtc-direct fixes to 0.33 release changelog (#10688) ([ipfs/kubo#10688](https://github.com/ipfs/kubo/pull/10688))
+ - fix: config help (#10686) ([ipfs/kubo#10686](https://github.com/ipfs/kubo/pull/10686))
+- github.com/ipfs/boxo (v0.27.2 -> v0.27.4):
+ - Release v0.27.4 ([ipfs/boxo#832](https://github.com/ipfs/boxo/pull/832))
+ - fix(ipns): reading records with raw []byte Value (#830) ([ipfs/boxo#830](https://github.com/ipfs/boxo/pull/830))
+ - fix(bitswap): blockpresencemanager leak (#833) ([ipfs/boxo#833](https://github.com/ipfs/boxo/pull/833))
+ - Always send cancels even if peer has no interest (#829) ([ipfs/boxo#829](https://github.com/ipfs/boxo/pull/829))
+ - tidy changelog ([ipfs/boxo#828](https://github.com/ipfs/boxo/pull/828))
+ - Update changelog (#827) ([ipfs/boxo#827](https://github.com/ipfs/boxo/pull/827))
+ - fix(bitswap): filter interests from received messages (#822) ([ipfs/boxo#822](https://github.com/ipfs/boxo/pull/822))
+ - Reduce unnecessary logging work (#826) ([ipfs/boxo#826](https://github.com/ipfs/boxo/pull/826))
+ - fix: bitswap lock contention under high load (#817) ([ipfs/boxo#817](https://github.com/ipfs/boxo/pull/817))
+ - fix: bitswap simplify cancel (#824) ([ipfs/boxo#824](https://github.com/ipfs/boxo/pull/824))
+ - fix(bitswap): simplify SessionInterestManager (#821) ([ipfs/boxo#821](https://github.com/ipfs/boxo/pull/821))
+ - feat: Better self-service commands for DHT providing (#815) ([ipfs/boxo#815](https://github.com/ipfs/boxo/pull/815))
+ - bitswap/client: fewer wantlist iterations in sendCancels (#819) ([ipfs/boxo#819](https://github.com/ipfs/boxo/pull/819))
+ - style: cleanup code by golangci-lint (#797) ([ipfs/boxo#797](https://github.com/ipfs/boxo/pull/797))
+ - Move long messagequeue comment to doc.go (#814) ([ipfs/boxo#814](https://github.com/ipfs/boxo/pull/814))
+ - Describe how bitswap message queue works ([ipfs/boxo#813](https://github.com/ipfs/boxo/pull/813))
+
+Full Changelog
+
+- github.com/ipfs/kubo:
+ - chore: v0.33.2
+- github.com/libp2p/go-libp2p (v0.38.2 -> v0.38.3):
+ - Release v0.38.3 (#3184) ([libp2p/go-libp2p#3184](https://github.com/libp2p/go-libp2p/pull/3184))
+
+
+
> [!NOTE]
> Public good DNS and [p2p-forge] infrastructure at `libp2p.direct` is run by the team at [Interplanetary Shipyard](https://ipshipyard.com).
>
->
-
[p2p-forge]: https://github.com/ipshipyard/p2p-forge
Default: `{}`
@@ -493,33 +489,22 @@ Type: `object`
### `AutoTLS.Enabled`
-> [!CAUTION]
-> This is an **EXPERIMENTAL** opt-in feature and should not be used in production yet.
-> Feel free to enable it and [report issues](https://github.com/ipfs/kubo/issues/new/choose) if you want to help with testing.
-> Track progress in [kubo#10560](https://github.com/ipfs/kubo/issues/10560).
+Enables the AutoTLS feature to provide DNS and TLS support for [libp2p Secure WebSocket](https://github.com/libp2p/specs/blob/master/websockets/README.md) over a `/tcp` port,
+to allow JS clients running in web browser [Secure Context](https://w3c.github.io/webappsec-secure-contexts/) to connect to Kubo directly.
-Enables AutoTLS feature to get DNS+TLS for [libp2p Secure WebSocket](https://github.com/libp2p/specs/blob/master/websockets/README.md) on `/tcp` port.
+When activated, together with [`AutoTLS.AutoWSS`](#autotlsautowss) (default) or manually including a `/tcp/{port}/tls/sni/*.libp2p.direct/ws` multiaddr in [`Addresses.Swarm`](#addressesswarm)
+(with SNI suffix matching [`AutoTLS.DomainSuffix`](#autotlsdomainsuffix)), Kubo retrieves a trusted PKI TLS certificate for `*.{peerid}.libp2p.direct` and configures the `/ws` listener to use it.
-If `AutoTLS.AutoWSS` is `true`, or `/tcp/../tls/sni/*.libp2p.direct/ws` [multiaddr] is present in [`Addresses.Swarm`](#addressesswarm)
-with SNI segment ending with [`AutoTLS.DomainSuffix`](#autotlsdomainsuffix),
-Kubo will obtain and set up a trusted PKI TLS certificate for `*.peerid.libp2p.direct`, making it dialable from web browser's [Secure Contexts](https://w3c.github.io/webappsec-secure-contexts/).
+**Note:**
-> [!TIP]
-> - Most users don't need custom `/ws` config in `Addresses.Swarm`. Try running this with `AutoTLS.AutoWSS=true`: it will reuse preexisting catch-all `/tcp` ports that were already forwarded/safelisted on your firewall.
-> - Debugging can be enabled by setting environment variable `GOLOG_LOG_LEVEL="error,autotls=debug,p2p-forge/client=debug"`. Less noisy `GOLOG_LOG_LEVEL="error,autotls=info` may be informative enough.
-> - Certificates are stored in `$IPFS_PATH/p2p-forge-certs`. Removing directory and restarting daemon will trigger certificate rotation.
+- This feature requires a publicly reachable node. If behind NAT, manual port forwarding or UPnP (`Swarm.DisableNatPortMap=false`) is required.
+- The first time AutoTLS is used, it may take 5-15 minutes + [`AutoTLS.RegistrationDelay`](#autotlsregistrationdelay) before `/ws` listener is added. Be patient.
+- Avoid manual configuration. [`AutoTLS.AutoWSS=true`](#autotlsautowss) should automatically add `/ws` listener to existing, firewall-forwarded `/tcp` ports.
+- To troubleshoot, use `GOLOG_LOG_LEVEL="error,autotls=debug` for detailed logs, or `GOLOG_LOG_LEVEL="error,autotls=info` for quieter output.
+- Certificates are stored in `$IPFS_PATH/p2p-forge-certs`; deleting this directory and restarting the daemon forces a certificate rotation.
+- For now, the TLS cert applies solely to `/ws` libp2p WebSocket connections, not HTTP [`Gateway`](#gateway), which still need separate reverse proxy TLS setup with a custom domain.
-> [!IMPORTANT]
-> Caveats:
-> - Requires your Kubo node to be publicly dialable.
-> - If you want to test this with a node that is behind a NAT and uses manual TCP port forwarding or UPnP (`Swarm.DisableNatPortMap=false`), use `AutoTLS.AutoWSS=true`, or manually
-> add catch-all `/ip4/0.0.0.0/tcp/4001/tls/sni/*.libp2p.direct/ws` and `/ip6/::/tcp/4001/tls/sni/*.libp2p.direct/ws` to [`Addresses.Swarm`](#addressesswarm)
-> and **wait 5-15 minutes** for libp2p node to set up and learn about own public addresses via [AutoNAT](#autonat).
-> - If your node is fresh and just started, the [p2p-forge] client may produce and log ERRORs during this time, but once a publicly dialable addresses are set up, a subsequent retry should be successful.
-> - The TLS certificate is used only for [libp2p WebSocket](https://github.com/libp2p/specs/blob/master/websockets/README.md) connections.
-> - Right now, this is NOT used for hosting a [Gateway](#gateway) over HTTPS (that use case still requires manual TLS setup on reverse proxy, and your own domain).
-
-Default: `false`
+Default: `true`
Type: `flag`
@@ -527,7 +512,7 @@ Type: `flag`
Optional. Controls if Kubo should add `/tls/sni/*.libp2p.direct/ws` listener to every pre-existing `/tcp` port IFF no explicit `/ws` is defined in [`Addresses.Swarm`](#addressesswarm) already.
-Default: `true` (active only if `AutoTLS.Enabled` is `true` as well)
+Default: `true` (if `AutoTLS.Enabled`)
Type: `flag`
@@ -535,8 +520,7 @@ Type: `flag`
Optional. Controls if final AutoTLS listeners are announced under shorter `/dnsX/A.B.C.D.peerid.libp2p.direct/tcp/4001/tls/ws` addresses instead of fully resolved `/ip4/A.B.C.D/tcp/4001/tls/sni/A-B-C-D.peerid.libp2p.direct/tls/ws`.
-> [!TIP]
-> The main use for AutoTLS is allowing connectivity from Secure Context in a web browser, and DNS lookup needs to happen there anyway, making `/dnsX` a more compact, more interoperable option without obvious downside.
+The main use for AutoTLS is allowing connectivity from Secure Context in a web browser, and DNS lookup needs to happen there anyway, making `/dnsX` a more compact, more interoperable option without obvious downside.
Default: `true`
@@ -574,6 +558,17 @@ Default: `""`
Type: `optionalString`
+### `AutoTLS.RegistrationDelay`
+
+An additional delay applied before sending a request to the `RegistrationEndpoint`.
+
+The default delay is bypassed if the user explicitly set `AutoTLS.Enabled=true` in the JSON configuration file.
+This ensures that ephemeral nodes using the default configuration do not spam the`AutoTLS.CAEndpoint` with unnecessary ACME requests.
+
+Default: `1h` (or `0` if explicit `AutoTLS.Enabled=true`)
+
+Type: `optionalDuration`
+
### `AutoTLS.CAEndpoint`
Optional override of CA ACME API used by [p2p-forge] system.
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index 812248eef..9c6744fea 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -111,7 +111,7 @@ require (
github.com/ipld/go-car/v2 v2.14.2 // indirect
github.com/ipld/go-codec-dagpb v1.6.0 // indirect
github.com/ipld/go-ipld-prime v0.21.0 // indirect
- github.com/ipshipyard/p2p-forge v0.3.0 // indirect
+ github.com/ipshipyard/p2p-forge v0.4.0 // indirect
github.com/jackpal/go-nat-pmp v1.0.2 // indirect
github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect
github.com/jbenet/goprocess v0.1.4 // indirect
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index a379310ac..c3a4acd27 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -405,8 +405,8 @@ github.com/ipld/go-ipld-prime v0.21.0 h1:n4JmcpOlPDIxBcY037SVfpd1G+Sj1nKZah0m6QH
github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOanyMctpPjsvxQ=
github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd h1:gMlw/MhNr2Wtp5RwGdsW23cs+yCuj9k2ON7i9MiJlRo=
github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd/go.mod h1:wZ8hH8UxeryOs4kJEJaiui/s00hDSbE37OKsL47g+Sw=
-github.com/ipshipyard/p2p-forge v0.3.0 h1:mdeFqiq8ljX149OCQvveV0vOlKeIt4PWkJjXVfux/GE=
-github.com/ipshipyard/p2p-forge v0.3.0/go.mod h1:L0TJMzniMEDjX8G+RB201U2woHvASwbsujNVDNVivDo=
+github.com/ipshipyard/p2p-forge v0.4.0 h1:A40PW027nCZn0d/pw5ufMoxnAo9wZwrG+iuz18A8P5I=
+github.com/ipshipyard/p2p-forge v0.4.0/go.mod h1:hVGPP24xrRezP2+z6q8udEW36w89M+jWuWBz9meLggY=
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA=
diff --git a/go.mod b/go.mod
index ffea67eee..948527983 100644
--- a/go.mod
+++ b/go.mod
@@ -49,7 +49,7 @@ require (
github.com/ipld/go-car/v2 v2.14.2
github.com/ipld/go-codec-dagpb v1.6.0
github.com/ipld/go-ipld-prime v0.21.0
- github.com/ipshipyard/p2p-forge v0.3.0
+ github.com/ipshipyard/p2p-forge v0.4.0
github.com/jbenet/go-temp-err-catcher v0.1.0
github.com/jbenet/goprocess v0.1.4
github.com/julienschmidt/httprouter v1.3.0
diff --git a/go.sum b/go.sum
index bf2b54ac8..74604807e 100644
--- a/go.sum
+++ b/go.sum
@@ -473,8 +473,8 @@ github.com/ipld/go-ipld-prime v0.21.0 h1:n4JmcpOlPDIxBcY037SVfpd1G+Sj1nKZah0m6QH
github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOanyMctpPjsvxQ=
github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd h1:gMlw/MhNr2Wtp5RwGdsW23cs+yCuj9k2ON7i9MiJlRo=
github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd/go.mod h1:wZ8hH8UxeryOs4kJEJaiui/s00hDSbE37OKsL47g+Sw=
-github.com/ipshipyard/p2p-forge v0.3.0 h1:mdeFqiq8ljX149OCQvveV0vOlKeIt4PWkJjXVfux/GE=
-github.com/ipshipyard/p2p-forge v0.3.0/go.mod h1:L0TJMzniMEDjX8G+RB201U2woHvASwbsujNVDNVivDo=
+github.com/ipshipyard/p2p-forge v0.4.0 h1:A40PW027nCZn0d/pw5ufMoxnAo9wZwrG+iuz18A8P5I=
+github.com/ipshipyard/p2p-forge v0.4.0/go.mod h1:hVGPP24xrRezP2+z6q8udEW36w89M+jWuWBz9meLggY=
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
github.com/jbenet/go-cienv v0.1.0 h1:Vc/s0QbQtoxX8MwwSLWWh+xNNZvM3Lw7NsTcHrvvhMc=
diff --git a/test/cli/transports_test.go b/test/cli/transports_test.go
index cbef5c57d..ec27e00ba 100644
--- a/test/cli/transports_test.go
+++ b/test/cli/transports_test.go
@@ -94,6 +94,7 @@ func TestTransports(t *testing.T) {
cfg.Swarm.Transports.Network.QUIC = config.True
cfg.Swarm.Transports.Network.WebTransport = config.False
cfg.Swarm.Transports.Network.WebRTCDirect = config.False
+ cfg.Swarm.Transports.Network.Websocket = config.False
})
})
disableRouting(nodes)
@@ -111,6 +112,7 @@ func TestTransports(t *testing.T) {
cfg.Swarm.Transports.Network.QUIC = config.True
cfg.Swarm.Transports.Network.WebTransport = config.True
cfg.Swarm.Transports.Network.WebRTCDirect = config.False
+ cfg.Swarm.Transports.Network.Websocket = config.False
})
})
disableRouting(nodes)
@@ -150,6 +152,7 @@ func TestTransports(t *testing.T) {
cfg.Swarm.Transports.Network.QUIC = config.False
cfg.Swarm.Transports.Network.WebTransport = config.False
cfg.Swarm.Transports.Network.WebRTCDirect = config.True
+ cfg.Swarm.Transports.Network.Websocket = config.False
})
})
disableRouting(nodes)
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index f07d6e578..aec0d66a2 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -130,7 +130,7 @@ require (
github.com/ipfs/kubo v0.31.0 // indirect
github.com/ipld/go-codec-dagpb v1.6.0 // indirect
github.com/ipld/go-ipld-prime v0.21.0 // indirect
- github.com/ipshipyard/p2p-forge v0.3.0 // indirect
+ github.com/ipshipyard/p2p-forge v0.4.0 // indirect
github.com/jackpal/go-nat-pmp v1.0.2 // indirect
github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect
github.com/jbenet/goprocess v0.1.4 // indirect
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index 64f77b63b..b88673550 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -365,8 +365,8 @@ github.com/ipld/go-codec-dagpb v1.6.0 h1:9nYazfyu9B1p3NAgfVdpRco3Fs2nFC72DqVsMj6
github.com/ipld/go-codec-dagpb v1.6.0/go.mod h1:ANzFhfP2uMJxRBr8CE+WQWs5UsNa0pYtmKZ+agnUw9s=
github.com/ipld/go-ipld-prime v0.21.0 h1:n4JmcpOlPDIxBcY037SVfpd1G+Sj1nKZah0m6QH9C2E=
github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOanyMctpPjsvxQ=
-github.com/ipshipyard/p2p-forge v0.3.0 h1:mdeFqiq8ljX149OCQvveV0vOlKeIt4PWkJjXVfux/GE=
-github.com/ipshipyard/p2p-forge v0.3.0/go.mod h1:L0TJMzniMEDjX8G+RB201U2woHvASwbsujNVDNVivDo=
+github.com/ipshipyard/p2p-forge v0.4.0 h1:A40PW027nCZn0d/pw5ufMoxnAo9wZwrG+iuz18A8P5I=
+github.com/ipshipyard/p2p-forge v0.4.0/go.mod h1:hVGPP24xrRezP2+z6q8udEW36w89M+jWuWBz9meLggY=
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA=
From c8cce59ef7412289f604d45ff9b13970186533d7 Mon Sep 17 00:00:00 2001
From: Prithvi Shahi
Date: Fri, 7 Mar 2025 08:42:55 +0100
Subject: [PATCH 182/499] deps: update boxo to main-branch commit
---
docs/examples/kubo-as-a-library/go.mod | 4 ++--
docs/examples/kubo-as-a-library/go.sum | 8 ++++----
go.mod | 4 ++--
go.sum | 8 ++++----
test/dependencies/go.mod | 2 +-
test/dependencies/go.sum | 8 ++++----
6 files changed, 17 insertions(+), 17 deletions(-)
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index 8dffe9c14..8ca4390ed 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -7,7 +7,7 @@ go 1.24
replace github.com/ipfs/kubo => ./../../..
require (
- github.com/ipfs/boxo v0.29.0
+ github.com/ipfs/boxo v0.29.1-0.20250307073615-93ea580a3bb0
github.com/ipfs/kubo v0.0.0-00010101000000-000000000000
github.com/libp2p/go-libp2p v0.41.0
github.com/multiformats/go-multiaddr v0.15.0
@@ -52,7 +52,7 @@ require (
github.com/francoispqt/gojay v1.2.13 // indirect
github.com/fsnotify/fsnotify v1.7.0 // indirect
github.com/gabriel-vasile/mimetype v1.4.6 // indirect
- github.com/gammazero/chanqueue v1.0.0 // indirect
+ github.com/gammazero/chanqueue v1.1.0 // indirect
github.com/gammazero/deque v1.0.0 // indirect
github.com/getsentry/sentry-go v0.27.0 // indirect
github.com/go-jose/go-jose/v4 v4.0.5 // indirect
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index 9a5fa3be1..6207a1d8a 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -166,8 +166,8 @@ github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nos
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
github.com/gabriel-vasile/mimetype v1.4.6 h1:3+PzJTKLkvgjeTbts6msPJt4DixhT4YtFNf1gtGe3zc=
github.com/gabriel-vasile/mimetype v1.4.6/go.mod h1:JX1qVKqZd40hUPpAfiNTe0Sne7hdfKSbOqqmkq8GCXc=
-github.com/gammazero/chanqueue v1.0.0 h1:FER/sMailGFA3DDvFooEkipAMU+3c9Bg3bheloPSz6o=
-github.com/gammazero/chanqueue v1.0.0/go.mod h1:fMwpwEiuUgpab0sH4VHiVcEoji1pSi+EIzeG4TPeKPc=
+github.com/gammazero/chanqueue v1.1.0 h1:yiwtloc1azhgGLFo2gMloJtQvkYD936Ai7tBfa+rYJw=
+github.com/gammazero/chanqueue v1.1.0/go.mod h1:fMwpwEiuUgpab0sH4VHiVcEoji1pSi+EIzeG4TPeKPc=
github.com/gammazero/deque v1.0.0 h1:LTmimT8H7bXkkCy6gZX7zNLtkbz4NdS2z8LZuor3j34=
github.com/gammazero/deque v1.0.0/go.mod h1:iflpYvtGfM3U8S8j+sZEKIak3SAKYpA5/SQewgfXDKo=
github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps=
@@ -298,8 +298,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcd
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.29.0 h1:clzd7PglUcE+Ufq1KucS3aKID7pzGVaSgcdRsW395t4=
-github.com/ipfs/boxo v0.29.0/go.mod h1:c3R52nMlgMsN1tADffYcogKoVRsX1RJE1TMYSpJ4uVs=
+github.com/ipfs/boxo v0.29.1-0.20250307073615-93ea580a3bb0 h1:wkFvXf7SqRiAu5ezj6lsieE2PwDk3nUkFOs9/+5lWdo=
+github.com/ipfs/boxo v0.29.1-0.20250307073615-93ea580a3bb0/go.mod h1:MkDJStXiJS9U99cbAijHdcmwNfVn5DKYBmQCOgjY2NU=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-bitswap v0.11.0 h1:j1WVvhDX1yhG32NTC9xfxnqycqYIlhzEzLXG/cU1HyQ=
diff --git a/go.mod b/go.mod
index 0bcc1869f..0bcfbc99d 100644
--- a/go.mod
+++ b/go.mod
@@ -21,7 +21,7 @@ require (
github.com/hashicorp/go-version v1.7.0
github.com/ipfs-shipyard/nopfs v0.0.14
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0
- github.com/ipfs/boxo v0.29.0
+ github.com/ipfs/boxo v0.29.1-0.20250307073615-93ea580a3bb0
github.com/ipfs/go-block-format v0.2.0
github.com/ipfs/go-cid v0.5.0
github.com/ipfs/go-cidutil v0.1.0
@@ -125,7 +125,7 @@ require (
github.com/flynn/noise v1.1.0 // indirect
github.com/francoispqt/gojay v1.2.13 // indirect
github.com/gabriel-vasile/mimetype v1.4.6 // indirect
- github.com/gammazero/chanqueue v1.0.0 // indirect
+ github.com/gammazero/chanqueue v1.1.0 // indirect
github.com/gammazero/deque v1.0.0 // indirect
github.com/getsentry/sentry-go v0.27.0 // indirect
github.com/go-jose/go-jose/v4 v4.0.5 // indirect
diff --git a/go.sum b/go.sum
index e29d9352f..7e2b6e63a 100644
--- a/go.sum
+++ b/go.sum
@@ -200,8 +200,8 @@ github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nos
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
github.com/gabriel-vasile/mimetype v1.4.6 h1:3+PzJTKLkvgjeTbts6msPJt4DixhT4YtFNf1gtGe3zc=
github.com/gabriel-vasile/mimetype v1.4.6/go.mod h1:JX1qVKqZd40hUPpAfiNTe0Sne7hdfKSbOqqmkq8GCXc=
-github.com/gammazero/chanqueue v1.0.0 h1:FER/sMailGFA3DDvFooEkipAMU+3c9Bg3bheloPSz6o=
-github.com/gammazero/chanqueue v1.0.0/go.mod h1:fMwpwEiuUgpab0sH4VHiVcEoji1pSi+EIzeG4TPeKPc=
+github.com/gammazero/chanqueue v1.1.0 h1:yiwtloc1azhgGLFo2gMloJtQvkYD936Ai7tBfa+rYJw=
+github.com/gammazero/chanqueue v1.1.0/go.mod h1:fMwpwEiuUgpab0sH4VHiVcEoji1pSi+EIzeG4TPeKPc=
github.com/gammazero/deque v1.0.0 h1:LTmimT8H7bXkkCy6gZX7zNLtkbz4NdS2z8LZuor3j34=
github.com/gammazero/deque v1.0.0/go.mod h1:iflpYvtGfM3U8S8j+sZEKIak3SAKYpA5/SQewgfXDKo=
github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps=
@@ -362,8 +362,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcd
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.29.0 h1:clzd7PglUcE+Ufq1KucS3aKID7pzGVaSgcdRsW395t4=
-github.com/ipfs/boxo v0.29.0/go.mod h1:c3R52nMlgMsN1tADffYcogKoVRsX1RJE1TMYSpJ4uVs=
+github.com/ipfs/boxo v0.29.1-0.20250307073615-93ea580a3bb0 h1:wkFvXf7SqRiAu5ezj6lsieE2PwDk3nUkFOs9/+5lWdo=
+github.com/ipfs/boxo v0.29.1-0.20250307073615-93ea580a3bb0/go.mod h1:MkDJStXiJS9U99cbAijHdcmwNfVn5DKYBmQCOgjY2NU=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-bitswap v0.11.0 h1:j1WVvhDX1yhG32NTC9xfxnqycqYIlhzEzLXG/cU1HyQ=
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index 6fca5043c..6fb22bf3d 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -116,7 +116,7 @@ require (
github.com/huin/goupnp v1.3.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/ipfs/bbloom v0.0.4 // indirect
- github.com/ipfs/boxo v0.29.0 // indirect
+ github.com/ipfs/boxo v0.29.1-0.20250307073615-93ea580a3bb0 // indirect
github.com/ipfs/go-block-format v0.2.0 // indirect
github.com/ipfs/go-cid v0.5.0 // indirect
github.com/ipfs/go-datastore v0.8.2 // indirect
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index 5ec6fbf57..1fa188603 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -156,8 +156,8 @@ github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nos
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo=
github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA=
-github.com/gammazero/chanqueue v1.0.0 h1:FER/sMailGFA3DDvFooEkipAMU+3c9Bg3bheloPSz6o=
-github.com/gammazero/chanqueue v1.0.0/go.mod h1:fMwpwEiuUgpab0sH4VHiVcEoji1pSi+EIzeG4TPeKPc=
+github.com/gammazero/chanqueue v1.1.0 h1:yiwtloc1azhgGLFo2gMloJtQvkYD936Ai7tBfa+rYJw=
+github.com/gammazero/chanqueue v1.1.0/go.mod h1:fMwpwEiuUgpab0sH4VHiVcEoji1pSi+EIzeG4TPeKPc=
github.com/gammazero/deque v1.0.0 h1:LTmimT8H7bXkkCy6gZX7zNLtkbz4NdS2z8LZuor3j34=
github.com/gammazero/deque v1.0.0/go.mod h1:iflpYvtGfM3U8S8j+sZEKIak3SAKYpA5/SQewgfXDKo=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
@@ -294,8 +294,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.29.0 h1:clzd7PglUcE+Ufq1KucS3aKID7pzGVaSgcdRsW395t4=
-github.com/ipfs/boxo v0.29.0/go.mod h1:c3R52nMlgMsN1tADffYcogKoVRsX1RJE1TMYSpJ4uVs=
+github.com/ipfs/boxo v0.29.1-0.20250307073615-93ea580a3bb0 h1:wkFvXf7SqRiAu5ezj6lsieE2PwDk3nUkFOs9/+5lWdo=
+github.com/ipfs/boxo v0.29.1-0.20250307073615-93ea580a3bb0/go.mod h1:MkDJStXiJS9U99cbAijHdcmwNfVn5DKYBmQCOgjY2NU=
github.com/ipfs/go-block-format v0.2.0 h1:ZqrkxBA2ICbDRbK8KJs/u0O3dlp6gmAuuXUJNiW1Ycs=
github.com/ipfs/go-block-format v0.2.0/go.mod h1:+jpL11nFx5A/SPpsoBn6Bzkra/zaArfSmsknbPMYgzM=
github.com/ipfs/go-cid v0.5.0 h1:goEKKhaGm0ul11IHA7I6p1GmKz8kEYniqFopaB5Otwg=
From ba22102a640b3f41804319981d83908c96a96275 Mon Sep 17 00:00:00 2001
From: Hector Sanjuan
Date: Thu, 6 Mar 2025 15:19:19 +0100
Subject: [PATCH 183/499] provider: buffer pin providers.
Fixes #10596.
The reproviding process can take long. Currently, each CID to be provided is
obtained by making a query to the pinner and reading one by one as the CIDs
get provided.
While this query is ongoing, the pinner holds a Read mutex on the pinset.
If a pin-add-request arrives, a goroutine will start waiting for a Write mutex
on the pinset. From that point, no new Read mutexes can be taken until the writer
can proceed and finishes.
However, no one can proceed because the read mutex is still held while the
reproviding is ongoing.
The fix is mostly in Boxo, where we add a "buffered" provider which reads the
cids onto memory so that they can be provided at its own pace without making
everyone wait.
The consequence is we will need more RAM memory. Rule of thumb is 1GiB extra per 20M cids to be reprovided.
---
core/node/provider.go | 13 ++++++++++---
docs/changelogs/v0.34.md | 5 +++++
2 files changed, 15 insertions(+), 3 deletions(-)
diff --git a/core/node/provider.go b/core/node/provider.go
index d6ab26b0c..78f0761cc 100644
--- a/core/node/provider.go
+++ b/core/node/provider.go
@@ -167,16 +167,23 @@ func newProvidingStrategy(onlyPinned, onlyRoots bool) interface{} {
IPLDFetcher fetcher.Factory `name:"ipldFetcher"`
}
return func(in input) provider.KeyChanFunc {
+ // Pinner-related CIDs will be buffered in memory to avoid
+ // deadlocking the pinner when the providing process is slow.
+
if onlyRoots {
- return provider.NewPinnedProvider(true, in.Pinner, in.IPLDFetcher)
+ return provider.NewBufferedProvider(
+ provider.NewPinnedProvider(true, in.Pinner, in.IPLDFetcher),
+ )
}
if onlyPinned {
- return provider.NewPinnedProvider(false, in.Pinner, in.IPLDFetcher)
+ return provider.NewBufferedProvider(
+ provider.NewPinnedProvider(false, in.Pinner, in.IPLDFetcher),
+ )
}
return provider.NewPrioritizedProvider(
- provider.NewPinnedProvider(true, in.Pinner, in.IPLDFetcher),
+ provider.NewBufferedProvider(provider.NewPinnedProvider(true, in.Pinner, in.IPLDFetcher)),
provider.NewBlockstoreProvider(in.Blockstore),
)
}
diff --git a/docs/changelogs/v0.34.md b/docs/changelogs/v0.34.md
index b11ec3699..918774525 100644
--- a/docs/changelogs/v0.34.md
+++ b/docs/changelogs/v0.34.md
@@ -14,6 +14,7 @@
- [Badger datastore update](#badger-datastore-update)
- [Datastore Implementation Updates](#datastore-implementation-updates)
- [One Multi-error Package](#one-multi-error-package)
+ - [Fix hanging pinset operations during reprovides](#fix-hanging-pinset-operations-during-reprovides)
- [๐ฆ๏ธ Important dependency updates](#-important-dependency-updates)
- [๐จโ๐ฉโ๐งโ๐ฆ Contributors](#-contributors)
@@ -74,6 +75,10 @@ The go-ds-xxx datastore implementations have been updated to support the updated
Kubo previously depended on multiple multi-error packages, `github.com/hashicorp/go-multierror` and `go.uber.org/multierr`. These have nearly identical functionality so there was no need to use both. Therefore, `go.uber.org/multierr` was selected as the package to depend on. Any future code needing multi-error functionality should use `go.uber.org/multierr` to avoid introducing unneeded dependencies.
+#### Fix hanging pinset operations during reprovides
+
+The reprovide process can be quite slow. In default settings, the reprovide process will start reading CIDs that belong to the pinset. During this operation, starvation can occurr for other operations that need pinset access (see https://github.com/ipfs/kubo/issue/10596). We have now switch to buffering pinset-related cids that are going to be reprovided in memory, so that we can free pinset mutexes as soon as possible so that pinset-writes and subsequent read operations can proceed. The downside is larger pinsets will need some extra memory, with an estimation of ~1GiB of RAM memory-use per 20 million items to be reprovided.
+
#### ๐ฆ๏ธ Important dependency updates
- update `go-libp2p` to [v0.41.0](https://github.com/libp2p/go-libp2p/releases/tag/v0.41.0) (incl. [v0.40.0](https://github.com/libp2p/go-libp2p/releases/tag/v0.40.0))
From 9de938479cca7c223bf87cba17b54ce59245e207 Mon Sep 17 00:00:00 2001
From: Guillaume Michel
-
+
-
Date: Fri, 7 Mar 2025 08:42:55 +0100
Subject: [PATCH 189/499] deps: update boxo to main-branch commit
(cherry picked from commit 6f2196f6552e4c5c800bd95141396b48d582a224)
---
docs/examples/kubo-as-a-library/go.mod | 4 ++--
docs/examples/kubo-as-a-library/go.sum | 8 ++++----
go.mod | 4 ++--
go.sum | 8 ++++----
test/dependencies/go.mod | 2 +-
test/dependencies/go.sum | 8 ++++----
6 files changed, 17 insertions(+), 17 deletions(-)
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index 8dffe9c14..8ca4390ed 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -7,7 +7,7 @@ go 1.24
replace github.com/ipfs/kubo => ./../../..
require (
- github.com/ipfs/boxo v0.29.0
+ github.com/ipfs/boxo v0.29.1-0.20250307073615-93ea580a3bb0
github.com/ipfs/kubo v0.0.0-00010101000000-000000000000
github.com/libp2p/go-libp2p v0.41.0
github.com/multiformats/go-multiaddr v0.15.0
@@ -52,7 +52,7 @@ require (
github.com/francoispqt/gojay v1.2.13 // indirect
github.com/fsnotify/fsnotify v1.7.0 // indirect
github.com/gabriel-vasile/mimetype v1.4.6 // indirect
- github.com/gammazero/chanqueue v1.0.0 // indirect
+ github.com/gammazero/chanqueue v1.1.0 // indirect
github.com/gammazero/deque v1.0.0 // indirect
github.com/getsentry/sentry-go v0.27.0 // indirect
github.com/go-jose/go-jose/v4 v4.0.5 // indirect
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index 9a5fa3be1..6207a1d8a 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -166,8 +166,8 @@ github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nos
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
github.com/gabriel-vasile/mimetype v1.4.6 h1:3+PzJTKLkvgjeTbts6msPJt4DixhT4YtFNf1gtGe3zc=
github.com/gabriel-vasile/mimetype v1.4.6/go.mod h1:JX1qVKqZd40hUPpAfiNTe0Sne7hdfKSbOqqmkq8GCXc=
-github.com/gammazero/chanqueue v1.0.0 h1:FER/sMailGFA3DDvFooEkipAMU+3c9Bg3bheloPSz6o=
-github.com/gammazero/chanqueue v1.0.0/go.mod h1:fMwpwEiuUgpab0sH4VHiVcEoji1pSi+EIzeG4TPeKPc=
+github.com/gammazero/chanqueue v1.1.0 h1:yiwtloc1azhgGLFo2gMloJtQvkYD936Ai7tBfa+rYJw=
+github.com/gammazero/chanqueue v1.1.0/go.mod h1:fMwpwEiuUgpab0sH4VHiVcEoji1pSi+EIzeG4TPeKPc=
github.com/gammazero/deque v1.0.0 h1:LTmimT8H7bXkkCy6gZX7zNLtkbz4NdS2z8LZuor3j34=
github.com/gammazero/deque v1.0.0/go.mod h1:iflpYvtGfM3U8S8j+sZEKIak3SAKYpA5/SQewgfXDKo=
github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps=
@@ -298,8 +298,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcd
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.29.0 h1:clzd7PglUcE+Ufq1KucS3aKID7pzGVaSgcdRsW395t4=
-github.com/ipfs/boxo v0.29.0/go.mod h1:c3R52nMlgMsN1tADffYcogKoVRsX1RJE1TMYSpJ4uVs=
+github.com/ipfs/boxo v0.29.1-0.20250307073615-93ea580a3bb0 h1:wkFvXf7SqRiAu5ezj6lsieE2PwDk3nUkFOs9/+5lWdo=
+github.com/ipfs/boxo v0.29.1-0.20250307073615-93ea580a3bb0/go.mod h1:MkDJStXiJS9U99cbAijHdcmwNfVn5DKYBmQCOgjY2NU=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-bitswap v0.11.0 h1:j1WVvhDX1yhG32NTC9xfxnqycqYIlhzEzLXG/cU1HyQ=
diff --git a/go.mod b/go.mod
index 0bcc1869f..0bcfbc99d 100644
--- a/go.mod
+++ b/go.mod
@@ -21,7 +21,7 @@ require (
github.com/hashicorp/go-version v1.7.0
github.com/ipfs-shipyard/nopfs v0.0.14
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0
- github.com/ipfs/boxo v0.29.0
+ github.com/ipfs/boxo v0.29.1-0.20250307073615-93ea580a3bb0
github.com/ipfs/go-block-format v0.2.0
github.com/ipfs/go-cid v0.5.0
github.com/ipfs/go-cidutil v0.1.0
@@ -125,7 +125,7 @@ require (
github.com/flynn/noise v1.1.0 // indirect
github.com/francoispqt/gojay v1.2.13 // indirect
github.com/gabriel-vasile/mimetype v1.4.6 // indirect
- github.com/gammazero/chanqueue v1.0.0 // indirect
+ github.com/gammazero/chanqueue v1.1.0 // indirect
github.com/gammazero/deque v1.0.0 // indirect
github.com/getsentry/sentry-go v0.27.0 // indirect
github.com/go-jose/go-jose/v4 v4.0.5 // indirect
diff --git a/go.sum b/go.sum
index e29d9352f..7e2b6e63a 100644
--- a/go.sum
+++ b/go.sum
@@ -200,8 +200,8 @@ github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nos
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
github.com/gabriel-vasile/mimetype v1.4.6 h1:3+PzJTKLkvgjeTbts6msPJt4DixhT4YtFNf1gtGe3zc=
github.com/gabriel-vasile/mimetype v1.4.6/go.mod h1:JX1qVKqZd40hUPpAfiNTe0Sne7hdfKSbOqqmkq8GCXc=
-github.com/gammazero/chanqueue v1.0.0 h1:FER/sMailGFA3DDvFooEkipAMU+3c9Bg3bheloPSz6o=
-github.com/gammazero/chanqueue v1.0.0/go.mod h1:fMwpwEiuUgpab0sH4VHiVcEoji1pSi+EIzeG4TPeKPc=
+github.com/gammazero/chanqueue v1.1.0 h1:yiwtloc1azhgGLFo2gMloJtQvkYD936Ai7tBfa+rYJw=
+github.com/gammazero/chanqueue v1.1.0/go.mod h1:fMwpwEiuUgpab0sH4VHiVcEoji1pSi+EIzeG4TPeKPc=
github.com/gammazero/deque v1.0.0 h1:LTmimT8H7bXkkCy6gZX7zNLtkbz4NdS2z8LZuor3j34=
github.com/gammazero/deque v1.0.0/go.mod h1:iflpYvtGfM3U8S8j+sZEKIak3SAKYpA5/SQewgfXDKo=
github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps=
@@ -362,8 +362,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcd
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.29.0 h1:clzd7PglUcE+Ufq1KucS3aKID7pzGVaSgcdRsW395t4=
-github.com/ipfs/boxo v0.29.0/go.mod h1:c3R52nMlgMsN1tADffYcogKoVRsX1RJE1TMYSpJ4uVs=
+github.com/ipfs/boxo v0.29.1-0.20250307073615-93ea580a3bb0 h1:wkFvXf7SqRiAu5ezj6lsieE2PwDk3nUkFOs9/+5lWdo=
+github.com/ipfs/boxo v0.29.1-0.20250307073615-93ea580a3bb0/go.mod h1:MkDJStXiJS9U99cbAijHdcmwNfVn5DKYBmQCOgjY2NU=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-bitswap v0.11.0 h1:j1WVvhDX1yhG32NTC9xfxnqycqYIlhzEzLXG/cU1HyQ=
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index 6fca5043c..6fb22bf3d 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -116,7 +116,7 @@ require (
github.com/huin/goupnp v1.3.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/ipfs/bbloom v0.0.4 // indirect
- github.com/ipfs/boxo v0.29.0 // indirect
+ github.com/ipfs/boxo v0.29.1-0.20250307073615-93ea580a3bb0 // indirect
github.com/ipfs/go-block-format v0.2.0 // indirect
github.com/ipfs/go-cid v0.5.0 // indirect
github.com/ipfs/go-datastore v0.8.2 // indirect
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index 5ec6fbf57..1fa188603 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -156,8 +156,8 @@ github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nos
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo=
github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA=
-github.com/gammazero/chanqueue v1.0.0 h1:FER/sMailGFA3DDvFooEkipAMU+3c9Bg3bheloPSz6o=
-github.com/gammazero/chanqueue v1.0.0/go.mod h1:fMwpwEiuUgpab0sH4VHiVcEoji1pSi+EIzeG4TPeKPc=
+github.com/gammazero/chanqueue v1.1.0 h1:yiwtloc1azhgGLFo2gMloJtQvkYD936Ai7tBfa+rYJw=
+github.com/gammazero/chanqueue v1.1.0/go.mod h1:fMwpwEiuUgpab0sH4VHiVcEoji1pSi+EIzeG4TPeKPc=
github.com/gammazero/deque v1.0.0 h1:LTmimT8H7bXkkCy6gZX7zNLtkbz4NdS2z8LZuor3j34=
github.com/gammazero/deque v1.0.0/go.mod h1:iflpYvtGfM3U8S8j+sZEKIak3SAKYpA5/SQewgfXDKo=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
@@ -294,8 +294,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.29.0 h1:clzd7PglUcE+Ufq1KucS3aKID7pzGVaSgcdRsW395t4=
-github.com/ipfs/boxo v0.29.0/go.mod h1:c3R52nMlgMsN1tADffYcogKoVRsX1RJE1TMYSpJ4uVs=
+github.com/ipfs/boxo v0.29.1-0.20250307073615-93ea580a3bb0 h1:wkFvXf7SqRiAu5ezj6lsieE2PwDk3nUkFOs9/+5lWdo=
+github.com/ipfs/boxo v0.29.1-0.20250307073615-93ea580a3bb0/go.mod h1:MkDJStXiJS9U99cbAijHdcmwNfVn5DKYBmQCOgjY2NU=
github.com/ipfs/go-block-format v0.2.0 h1:ZqrkxBA2ICbDRbK8KJs/u0O3dlp6gmAuuXUJNiW1Ycs=
github.com/ipfs/go-block-format v0.2.0/go.mod h1:+jpL11nFx5A/SPpsoBn6Bzkra/zaArfSmsknbPMYgzM=
github.com/ipfs/go-cid v0.5.0 h1:goEKKhaGm0ul11IHA7I6p1GmKz8kEYniqFopaB5Otwg=
From c953abb431ccc29db74d45168da6e451a13a254f Mon Sep 17 00:00:00 2001
From: Hector Sanjuan
Date: Thu, 6 Mar 2025 15:19:19 +0100
Subject: [PATCH 190/499] provider: buffer pin providers.
Fixes #10596.
The reproviding process can take long. Currently, each CID to be provided is
obtained by making a query to the pinner and reading one by one as the CIDs
get provided.
While this query is ongoing, the pinner holds a Read mutex on the pinset.
If a pin-add-request arrives, a goroutine will start waiting for a Write mutex
on the pinset. From that point, no new Read mutexes can be taken until the writer
can proceed and finishes.
However, no one can proceed because the read mutex is still held while the
reproviding is ongoing.
The fix is mostly in Boxo, where we add a "buffered" provider which reads the
cids onto memory so that they can be provided at its own pace without making
everyone wait.
The consequence is we will need more RAM memory. Rule of thumb is 1GiB extra per 20M cids to be reprovided.
(cherry picked from commit ba22102a640b3f41804319981d83908c96a96275)
---
core/node/provider.go | 13 ++++++++++---
docs/changelogs/v0.34.md | 5 +++++
2 files changed, 15 insertions(+), 3 deletions(-)
diff --git a/core/node/provider.go b/core/node/provider.go
index d6ab26b0c..78f0761cc 100644
--- a/core/node/provider.go
+++ b/core/node/provider.go
@@ -167,16 +167,23 @@ func newProvidingStrategy(onlyPinned, onlyRoots bool) interface{} {
IPLDFetcher fetcher.Factory `name:"ipldFetcher"`
}
return func(in input) provider.KeyChanFunc {
+ // Pinner-related CIDs will be buffered in memory to avoid
+ // deadlocking the pinner when the providing process is slow.
+
if onlyRoots {
- return provider.NewPinnedProvider(true, in.Pinner, in.IPLDFetcher)
+ return provider.NewBufferedProvider(
+ provider.NewPinnedProvider(true, in.Pinner, in.IPLDFetcher),
+ )
}
if onlyPinned {
- return provider.NewPinnedProvider(false, in.Pinner, in.IPLDFetcher)
+ return provider.NewBufferedProvider(
+ provider.NewPinnedProvider(false, in.Pinner, in.IPLDFetcher),
+ )
}
return provider.NewPrioritizedProvider(
- provider.NewPinnedProvider(true, in.Pinner, in.IPLDFetcher),
+ provider.NewBufferedProvider(provider.NewPinnedProvider(true, in.Pinner, in.IPLDFetcher)),
provider.NewBlockstoreProvider(in.Blockstore),
)
}
diff --git a/docs/changelogs/v0.34.md b/docs/changelogs/v0.34.md
index b11ec3699..918774525 100644
--- a/docs/changelogs/v0.34.md
+++ b/docs/changelogs/v0.34.md
@@ -14,6 +14,7 @@
- [Badger datastore update](#badger-datastore-update)
- [Datastore Implementation Updates](#datastore-implementation-updates)
- [One Multi-error Package](#one-multi-error-package)
+ - [Fix hanging pinset operations during reprovides](#fix-hanging-pinset-operations-during-reprovides)
- [๐ฆ๏ธ Important dependency updates](#-important-dependency-updates)
- [๐จโ๐ฉโ๐งโ๐ฆ Contributors](#-contributors)
@@ -74,6 +75,10 @@ The go-ds-xxx datastore implementations have been updated to support the updated
Kubo previously depended on multiple multi-error packages, `github.com/hashicorp/go-multierror` and `go.uber.org/multierr`. These have nearly identical functionality so there was no need to use both. Therefore, `go.uber.org/multierr` was selected as the package to depend on. Any future code needing multi-error functionality should use `go.uber.org/multierr` to avoid introducing unneeded dependencies.
+#### Fix hanging pinset operations during reprovides
+
+The reprovide process can be quite slow. In default settings, the reprovide process will start reading CIDs that belong to the pinset. During this operation, starvation can occurr for other operations that need pinset access (see https://github.com/ipfs/kubo/issue/10596). We have now switch to buffering pinset-related cids that are going to be reprovided in memory, so that we can free pinset mutexes as soon as possible so that pinset-writes and subsequent read operations can proceed. The downside is larger pinsets will need some extra memory, with an estimation of ~1GiB of RAM memory-use per 20 million items to be reprovided.
+
#### ๐ฆ๏ธ Important dependency updates
- update `go-libp2p` to [v0.41.0](https://github.com/libp2p/go-libp2p/releases/tag/v0.41.0) (incl. [v0.40.0](https://github.com/libp2p/go-libp2p/releases/tag/v0.40.0))
From 8af7f131e72a50b5522a1444919a1c23eecbf14f Mon Sep 17 00:00:00 2001
From: Guillaume Michel
Date: Fri, 7 Mar 2025 16:37:44 +0100
Subject: [PATCH 191/499] Update docs/changelogs/v0.34.md
(cherry picked from commit 9de938479cca7c223bf87cba17b54ce59245e207)
---
docs/changelogs/v0.34.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/changelogs/v0.34.md b/docs/changelogs/v0.34.md
index 918774525..8c1c5753e 100644
--- a/docs/changelogs/v0.34.md
+++ b/docs/changelogs/v0.34.md
@@ -77,7 +77,7 @@ Kubo previously depended on multiple multi-error packages, `github.com/hashicorp
#### Fix hanging pinset operations during reprovides
-The reprovide process can be quite slow. In default settings, the reprovide process will start reading CIDs that belong to the pinset. During this operation, starvation can occurr for other operations that need pinset access (see https://github.com/ipfs/kubo/issue/10596). We have now switch to buffering pinset-related cids that are going to be reprovided in memory, so that we can free pinset mutexes as soon as possible so that pinset-writes and subsequent read operations can proceed. The downside is larger pinsets will need some extra memory, with an estimation of ~1GiB of RAM memory-use per 20 million items to be reprovided.
+The reprovide process can be quite slow. In default settings, the reprovide process will start reading CIDs that belong to the pinset. During this operation, starvation can occur for other operations that need pinset access (see https://github.com/ipfs/kubo/issue/10596). We have now switch to buffering pinset-related cids that are going to be reprovided in memory, so that we can free pinset mutexes as soon as possible so that pinset-writes and subsequent read operations can proceed. The downside is larger pinsets will need some extra memory, with an estimation of ~1GiB of RAM memory-use per 20 million items to be reprovided.
#### ๐ฆ๏ธ Important dependency updates
From e89d86b82407ff92c87cbb570f3a26045180310d Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Tue, 11 Mar 2025 14:04:16 -0700
Subject: [PATCH 192/499] Nonfunctional (#10753)
* fix typos
* fix func name in docstring
* use t.TempDir instead of os.MkdirTemp
* fix typo
* unique option names
(cherry picked from commit 095cc0d731e3addfc2b7505763dee7a67ba895ab)
---
config/bootstrap_peers.go | 2 +-
core/commands/cid.go | 6 +++---
core/commands/cid_test.go | 4 ++--
repo/fsrepo/migrations/setup_test.go | 14 ++++++--------
test/cli/files_test.go | 2 +-
5 files changed, 13 insertions(+), 15 deletions(-)
diff --git a/config/bootstrap_peers.go b/config/bootstrap_peers.go
index 91f8ea1af..55fe66a98 100644
--- a/config/bootstrap_peers.go
+++ b/config/bootstrap_peers.go
@@ -47,7 +47,7 @@ func (c *Config) SetBootstrapPeers(bps []peer.AddrInfo) {
c.Bootstrap = BootstrapPeerStrings(bps)
}
-// ParseBootstrapPeer parses a bootstrap list into a list of AddrInfos.
+// ParseBootstrapPeers parses a bootstrap list into a list of AddrInfos.
func ParseBootstrapPeers(addrs []string) ([]peer.AddrInfo, error) {
maddrs := make([]ma.Multiaddr, len(addrs))
for i, addr := range addrs {
diff --git a/core/commands/cid.go b/core/commands/cid.go
index a3f3a5490..26596f011 100644
--- a/core/commands/cid.go
+++ b/core/commands/cid.go
@@ -34,7 +34,7 @@ var CidCmd = &cmds.Command{
const (
cidFormatOptionName = "f"
- cidVerisonOptionName = "v"
+ cidToVersionOptionName = "v"
cidCodecOptionName = "mc"
cidMultibaseOptionName = "b"
)
@@ -53,13 +53,13 @@ The optional format string is a printf style format string:
},
Options: []cmds.Option{
cmds.StringOption(cidFormatOptionName, "Printf style format string.").WithDefault("%s"),
- cmds.StringOption(cidVerisonOptionName, "CID version to convert to."),
+ cmds.StringOption(cidToVersionOptionName, "CID version to convert to."),
cmds.StringOption(cidCodecOptionName, "CID multicodec to convert to."),
cmds.StringOption(cidMultibaseOptionName, "Multibase to display CID in."),
},
Run: func(req *cmds.Request, resp cmds.ResponseEmitter, env cmds.Environment) error {
fmtStr, _ := req.Options[cidFormatOptionName].(string)
- verStr, _ := req.Options[cidVerisonOptionName].(string)
+ verStr, _ := req.Options[cidToVersionOptionName].(string)
codecStr, _ := req.Options[cidCodecOptionName].(string)
baseStr, _ := req.Options[cidMultibaseOptionName].(string)
diff --git a/core/commands/cid_test.go b/core/commands/cid_test.go
index 106296282..d159521d2 100644
--- a/core/commands/cid_test.go
+++ b/core/commands/cid_test.go
@@ -40,7 +40,7 @@ func TestCidFmtCmd(t *testing.T) {
// Mock request
req := &cmds.Request{
Options: map[string]interface{}{
- cidVerisonOptionName: "0",
+ cidToVersionOptionName: "0",
cidMultibaseOptionName: e.MultibaseName,
cidFormatOptionName: "%s",
},
@@ -91,7 +91,7 @@ func TestCidFmtCmd(t *testing.T) {
// Mock request
req := &cmds.Request{
Options: map[string]interface{}{
- cidVerisonOptionName: e.Ver,
+ cidToVersionOptionName: e.Ver,
cidMultibaseOptionName: e.MultibaseName,
cidFormatOptionName: "%s",
},
diff --git a/repo/fsrepo/migrations/setup_test.go b/repo/fsrepo/migrations/setup_test.go
index 2e306fda1..9761edb94 100644
--- a/repo/fsrepo/migrations/setup_test.go
+++ b/repo/fsrepo/migrations/setup_test.go
@@ -32,9 +32,10 @@ var (
)
func TestMain(m *testing.M) {
+ t := &testing.T{}
+
// Setup test data
- testDataDir := makeTestData()
- defer os.RemoveAll(testDataDir)
+ testDataDir := makeTestData(t)
testCar := makeTestCar(testDataDir)
defer os.RemoveAll(testCar)
@@ -47,18 +48,15 @@ func TestMain(m *testing.M) {
os.Exit(m.Run())
}
-func makeTestData() string {
- tempDir, err := os.MkdirTemp("", "kubo-migrations-test-*")
- if err != nil {
- panic(err)
- }
+func makeTestData(t testing.TB) string {
+ tempDir := t.TempDir()
versions := []string{"v1.0.0", "v1.1.0", "v1.1.2", "v2.0.0-rc1", "2.0.0", "v2.0.1"}
packages := []string{"kubo", "go-ipfs", "fs-repo-migrations", "fs-repo-1-to-2", "fs-repo-2-to-3", "fs-repo-9-to-10", "fs-repo-10-to-11"}
// Generate fake data
for _, name := range packages {
- err = os.MkdirAll(filepath.Join(tempDir, name), 0777)
+ err := os.MkdirAll(filepath.Join(tempDir, name), 0777)
if err != nil {
panic(err)
}
diff --git a/test/cli/files_test.go b/test/cli/files_test.go
index 109c7ab9b..275261897 100644
--- a/test/cli/files_test.go
+++ b/test/cli/files_test.go
@@ -65,7 +65,7 @@ func TestFilesCp(t *testing.T) {
// we manually changed codec from raw to dag-pb to test "bad dag-pb" scenario
cid := "bafybeic7pdbte5heh6u54vszezob3el6exadoiw4wc4ne7ny2x7kvajzkm"
- // should fail because node cant be read as a valid dag-pb
+ // should fail because node cannot be read as a valid dag-pb
cpResNoForce := node.RunIPFS("files", "cp", fmt.Sprintf("/ipfs/%s", cid), "/invalid-proto")
assert.NotEqual(t, 0, cpResNoForce.ExitErr.ExitCode())
assert.Contains(t, cpResNoForce.Stderr.String(), "Error")
From 441c0f590f308e6077a362e3d49b0a08fb505f9a Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Thu, 13 Mar 2025 16:44:01 -0700
Subject: [PATCH 193/499] Upgrade to Boxo v0.29.1 (#10755)
* Upgrade to Boxo v0.29.1
(cherry picked from commit 183dc7d40afb2326b11e052c8b90aab847592d5b)
---
docs/changelogs/v0.34.md | 2 +-
docs/examples/kubo-as-a-library/go.mod | 2 +-
docs/examples/kubo-as-a-library/go.sum | 4 ++--
go.mod | 2 +-
go.sum | 4 ++--
test/dependencies/go.mod | 2 +-
test/dependencies/go.sum | 4 ++--
7 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/docs/changelogs/v0.34.md b/docs/changelogs/v0.34.md
index 8c1c5753e..3e3ba289b 100644
--- a/docs/changelogs/v0.34.md
+++ b/docs/changelogs/v0.34.md
@@ -83,7 +83,7 @@ The reprovide process can be quite slow. In default settings, the reprovide proc
- update `go-libp2p` to [v0.41.0](https://github.com/libp2p/go-libp2p/releases/tag/v0.41.0) (incl. [v0.40.0](https://github.com/libp2p/go-libp2p/releases/tag/v0.40.0))
- update `go-libp2p-kad-dht` to [v0.30.2](https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.30.2) (incl. [v0.29.0](https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.29.0), [v0.29.1](https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.29.1), [v0.29.2](https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.29.2), [v0.30.0](https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.30.0), [v0.30.1](https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.30.1))
-- update `boxo` to [v0.29.0](https://github.com/ipfs/boxo/releases/tag/v0.29.0) (incl. [v0.28.0](https://github.com/ipfs/boxo/releases/tag/v0.28.0)
+- update `boxo` to [v0.29.1](https://github.com/ipfs/boxo/releases/tag/v0.29.1) (incl. [v0.28.0](https://github.com/ipfs/boxo/releases/tag/v0.28.0) [v0.29.0](https://github.com/ipfs/boxo/releases/tag/v0.29.0))
- update `ipfs-webui` to [v4.5.0](https://github.com/ipfs/ipfs-webui/releases/tag/v4.5.0)
- update `p2p-forge/client` to [v0.4.0](https://github.com/ipshipyard/p2p-forge/releases/tag/v0.4.0)
- update `go-datastore` to [v0.8.2](https://github.com/ipfs/go-datastore/releases/tag/v0.8.2) (incl. [v0.7.0](https://github.com/ipfs/go-datastore/releases/tag/v0.7.0), [v0.8.0](https://github.com/ipfs/go-datastore/releases/tag/v0.8.0))
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index 8ca4390ed..bd1adb4b2 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -7,7 +7,7 @@ go 1.24
replace github.com/ipfs/kubo => ./../../..
require (
- github.com/ipfs/boxo v0.29.1-0.20250307073615-93ea580a3bb0
+ github.com/ipfs/boxo v0.29.1
github.com/ipfs/kubo v0.0.0-00010101000000-000000000000
github.com/libp2p/go-libp2p v0.41.0
github.com/multiformats/go-multiaddr v0.15.0
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index 6207a1d8a..7a384b22e 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -298,8 +298,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcd
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.29.1-0.20250307073615-93ea580a3bb0 h1:wkFvXf7SqRiAu5ezj6lsieE2PwDk3nUkFOs9/+5lWdo=
-github.com/ipfs/boxo v0.29.1-0.20250307073615-93ea580a3bb0/go.mod h1:MkDJStXiJS9U99cbAijHdcmwNfVn5DKYBmQCOgjY2NU=
+github.com/ipfs/boxo v0.29.1 h1:z61ZT4YDfTHLjXTsu/+3wvJ8aJlExthDSOCpx6Nh8xc=
+github.com/ipfs/boxo v0.29.1/go.mod h1:MkDJStXiJS9U99cbAijHdcmwNfVn5DKYBmQCOgjY2NU=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-bitswap v0.11.0 h1:j1WVvhDX1yhG32NTC9xfxnqycqYIlhzEzLXG/cU1HyQ=
diff --git a/go.mod b/go.mod
index 0bcfbc99d..f655462f2 100644
--- a/go.mod
+++ b/go.mod
@@ -21,7 +21,7 @@ require (
github.com/hashicorp/go-version v1.7.0
github.com/ipfs-shipyard/nopfs v0.0.14
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0
- github.com/ipfs/boxo v0.29.1-0.20250307073615-93ea580a3bb0
+ github.com/ipfs/boxo v0.29.1
github.com/ipfs/go-block-format v0.2.0
github.com/ipfs/go-cid v0.5.0
github.com/ipfs/go-cidutil v0.1.0
diff --git a/go.sum b/go.sum
index 7e2b6e63a..467408d75 100644
--- a/go.sum
+++ b/go.sum
@@ -362,8 +362,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcd
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.29.1-0.20250307073615-93ea580a3bb0 h1:wkFvXf7SqRiAu5ezj6lsieE2PwDk3nUkFOs9/+5lWdo=
-github.com/ipfs/boxo v0.29.1-0.20250307073615-93ea580a3bb0/go.mod h1:MkDJStXiJS9U99cbAijHdcmwNfVn5DKYBmQCOgjY2NU=
+github.com/ipfs/boxo v0.29.1 h1:z61ZT4YDfTHLjXTsu/+3wvJ8aJlExthDSOCpx6Nh8xc=
+github.com/ipfs/boxo v0.29.1/go.mod h1:MkDJStXiJS9U99cbAijHdcmwNfVn5DKYBmQCOgjY2NU=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-bitswap v0.11.0 h1:j1WVvhDX1yhG32NTC9xfxnqycqYIlhzEzLXG/cU1HyQ=
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index 6fb22bf3d..33f37ce86 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -116,7 +116,7 @@ require (
github.com/huin/goupnp v1.3.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/ipfs/bbloom v0.0.4 // indirect
- github.com/ipfs/boxo v0.29.1-0.20250307073615-93ea580a3bb0 // indirect
+ github.com/ipfs/boxo v0.29.1 // indirect
github.com/ipfs/go-block-format v0.2.0 // indirect
github.com/ipfs/go-cid v0.5.0 // indirect
github.com/ipfs/go-datastore v0.8.2 // indirect
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index 1fa188603..0aaa785be 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -294,8 +294,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.29.1-0.20250307073615-93ea580a3bb0 h1:wkFvXf7SqRiAu5ezj6lsieE2PwDk3nUkFOs9/+5lWdo=
-github.com/ipfs/boxo v0.29.1-0.20250307073615-93ea580a3bb0/go.mod h1:MkDJStXiJS9U99cbAijHdcmwNfVn5DKYBmQCOgjY2NU=
+github.com/ipfs/boxo v0.29.1 h1:z61ZT4YDfTHLjXTsu/+3wvJ8aJlExthDSOCpx6Nh8xc=
+github.com/ipfs/boxo v0.29.1/go.mod h1:MkDJStXiJS9U99cbAijHdcmwNfVn5DKYBmQCOgjY2NU=
github.com/ipfs/go-block-format v0.2.0 h1:ZqrkxBA2ICbDRbK8KJs/u0O3dlp6gmAuuXUJNiW1Ycs=
github.com/ipfs/go-block-format v0.2.0/go.mod h1:+jpL11nFx5A/SPpsoBn6Bzkra/zaArfSmsknbPMYgzM=
github.com/ipfs/go-cid v0.5.0 h1:goEKKhaGm0ul11IHA7I6p1GmKz8kEYniqFopaB5Otwg=
From f994d94025a3cfa8c1045fbcb11cda01a7fa341a Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Fri, 14 Mar 2025 17:55:35 +0100
Subject: [PATCH 194/499] docs(readme): update min. requirements + cleanup
(#10750)
* docs(readme): update min. requirements + cleanup
Adding note about extra memory requirement due to
https://github.com/ipfs/kubo/commit/ba22102a640b3f41804319981d83908c96a96275
* docs(config): memory cost of buffered provider
Co-authored-by: Daniel Norman <1992255+2color@users.noreply.github.com>
(cherry picked from commit 96f3007b55169d5b178b4e0563ec2dda6e29d3f5)
---
README.md | 34 ++++++++++++++++------------------
docs/config.md | 7 ++++++-
2 files changed, 22 insertions(+), 19 deletions(-)
diff --git a/README.md b/README.md
index 4970cd9af..2e6766877 100644
--- a/README.md
+++ b/README.md
@@ -12,19 +12,19 @@
-
+
-
## What is Kubo?
-Kubo was the first IPFS implementation and is the most widely used one today. Implementing the *Interplanetary Filesystem* - the Web3 standard for content-addressing, interoperable with HTTP. Thus powered by IPLD's data models and the libp2p for network communication. Kubo is written in Go.
+Kubo was the first IPFS implementation and is the most widely used one today. Implementing the *Interplanetary Filesystem* - the standard for content-addressing on the Web, interoperable with HTTP. Thus powered by future-proof data models and the libp2p for network communication. Kubo is written in Go.
Featureset
- Runs an IPFS-Node as a network service that is part of LAN and WAN DHT
+- Native support for UnixFS (most popular way to represent files and directories on IPFS)
- [HTTP Gateway](https://specs.ipfs.tech/http-gateways/) (`/ipfs` and `/ipns`) functionality for trusted and [trustless](https://docs.ipfs.tech/reference/http/gateway/#trustless-verifiable-retrieval) content retrieval
- [HTTP Routing V1](https://specs.ipfs.tech/routing/http-routing-v1/) (`/routing/v1`) client and server implementation for [delegated routing](./docs/delegated-routing.md) lookups
- [HTTP Kubo RPC API](https://docs.ipfs.tech/reference/kubo/rpc/) (`/api/v0`) to access and control the daemon
@@ -64,12 +64,11 @@ Before opening an issue, consider using one of the following locations to ensure
- [Next milestones](#next-milestones)
- [Table of Contents](#table-of-contents)
- [Security Issues](#security-issues)
-- [Minimal System Requirements](#minimal-system-requirements)
- [Install](#install)
+ - [Minimal System Requirements](#minimal-system-requirements)
- [Docker](#docker)
- [Official prebuilt binaries](#official-prebuilt-binaries)
- [Updating](#updating)
- - [Using ipfs-update](#using-ipfs-update)
- [Downloading builds using IPFS](#downloading-builds-using-ipfs)
- [Unofficial Linux packages](#unofficial-linux-packages)
- [ArchLinux](#arch-linux)
@@ -112,17 +111,22 @@ Before opening an issue, consider using one of the following locations to ensure
Please follow [`SECURITY.md`](SECURITY.md).
-### Minimal System Requirements
-
-IPFS can run on most Linux, macOS, and Windows systems. We recommend running it on a machine with at least 6 GB of RAM and 2 CPU cores (ideally more, Kubo is highly parallel).
-
-> [!CAUTION]
-> On systems with less memory, it may not be completely stable, and you run on your own risk.
-
## Install
The canonical download instructions for IPFS are over at: https://docs.ipfs.tech/install/. It is **highly recommended** you follow those instructions if you are not interested in working on IPFS development.
+For production use, Release Docker images (below) are recommended.
+
+### Minimal System Requirements
+
+Kubo runs on most Linux, macOS, and Windows systems. For optimal performance, we recommend at least 6 GB of RAM and 2 CPU cores (more is ideal, as Kubo is highly parallel).
+
+> [!IMPORTANT]
+> Larger pinsets require additional memory, with an estimated ~1 GiB of RAM per 20 million items for reproviding to the Amino DHT.
+
+> [!CAUTION]
+> Systems with less than the recommended memory may experience instability, frequent OOM errors or restarts, and missing data announcement (reprovider window), which can make data fully or partially inaccessible to other peers. Running Kubo on underprovisioned hardware is at your own risk.
+
### Docker
Official images are published at https://hub.docker.com/r/ipfs/kubo/: [](https://hub.docker.com/r/ipfs/kubo/)
@@ -170,12 +174,6 @@ If you are unable to access [dist.ipfs.tech](https://dist.ipfs.tech#kubo), you c
#### Updating
-##### Using ipfs-update
-
-IPFS has an updating tool that can be accessed through `ipfs update`. The tool is
-not installed alongside IPFS in order to keep that logic independent of the main
-codebase. To install `ipfs-update` tool, [download it here](https://dist.ipfs.tech/#ipfs-update).
-
##### Downloading builds using IPFS
List the available versions of Kubo (go-ipfs) implementation:
diff --git a/docs/config.md b/docs/config.md
index 5b7aa6140..206d1f719 100644
--- a/docs/config.md
+++ b/docs/config.md
@@ -1597,7 +1597,12 @@ Tells reprovider what should be announced. Valid strategies are:
providers for the missing block in the middle of a file, unless the peer
happens to already be connected to a provider and ask for child CID over
bitswap.
-- `"flat"` - same as `all`, announce all CIDs of stored blocks, but without prioritizing anything
+- `"flat"` - same as `all`, announce all CIDs of stored blocks, but without prioritizing anything.
+
+> [!IMPORTANT]
+> Reproviding larger pinsets using the `all`, `pinned`, or `roots` strategies requires additional memory, with an estimated ~1 GiB of RAM per 20 million items for reproviding to the Amino DHT.
+> This is due to the use of a buffered provider, which avoids holding a lock on the entire pinset during the reprovide cycle.
+> The `flat` strategy can be used to lower memory requirements, but only recommended if memory utilization is too high, prioritization of pins is not necessary, and it is acceptable to announce every block cached in the local repository.
Default: `"all"`
From ca4b6121efe36eb3d1fd7e01ee4cd2b671bbfdd4 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Fri, 14 Mar 2025 18:08:19 +0100
Subject: [PATCH 195/499] feat: ipfs-webui v4.6 (#10756)
https://github.com/ipfs/ipfs-webui/releases/tag/v4.6.0
(cherry picked from commit b2efaa992f979f4053eee8decbb6d918da3fa247)
---
core/corehttp/webui.go | 3 ++-
docs/changelogs/v0.34.md | 7 ++++++-
2 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/core/corehttp/webui.go b/core/corehttp/webui.go
index 89315a24e..32d76a49d 100644
--- a/core/corehttp/webui.go
+++ b/core/corehttp/webui.go
@@ -1,11 +1,12 @@
package corehttp
// WebUI version confirmed to work with this Kubo version
-const WebUIPath = "/ipfs/bafybeiata4qg7xjtwgor6r5dw63jjxyouenyromrrb4lrewxrlvav7gzgi" // v4.5.0
+const WebUIPath = "/ipfs/bafybeibpaa5kqrj4gkemiswbwndjqiryl65cks64ypwtyerxixu56gnvvm" // v4.6.0
// WebUIPaths is a list of all past webUI paths.
var WebUIPaths = []string{
WebUIPath,
+ "/ipfs/bafybeiata4qg7xjtwgor6r5dw63jjxyouenyromrrb4lrewxrlvav7gzgi", // v4.5.0
"/ipfs/bafybeigp3zm7cqoiciqk5anlheenqjsgovp7j7zq6hah4nu6iugdgb4nby", // v4.4.2
"/ipfs/bafybeiatztgdllxnp5p6zu7bdwhjmozsmd7jprff4bdjqjljxtylitvss4", // v4.4.1
"/ipfs/bafybeibgic2ex3fvzkinhy6k6aqyv3zy2o7bkbsmrzvzka24xetv7eeadm",
diff --git a/docs/changelogs/v0.34.md b/docs/changelogs/v0.34.md
index 3e3ba289b..1d99f69eb 100644
--- a/docs/changelogs/v0.34.md
+++ b/docs/changelogs/v0.34.md
@@ -7,6 +7,7 @@
- [Overview](#overview)
- [๐ฆ Highlights](#-highlights)
- [AutoTLS now enabled by default for nodes with 1 hour uptime](#autotls-now-enabled-by-default-for-nodes-with-1-hour-uptime)
+ - [New WebUI features](#new-webui-features)
- [RPC and CLI command changes](#rpc-and-cli-command-changes)
- [Bitswap improvements from Boxo](#bitswap-improvements-from-boxo)
- [`IPFS_LOG_LEVEL` deprecated](#ipfs_log_level-deprecated)
@@ -44,6 +45,10 @@ To troubleshoot, use `GOLOG_LOG_LEVEL="error,autotls=info`.
For more details, check out the [`AutoTLS` configuration documentation](https://github.com/ipfs/kubo/blob/master/docs/config.md#autotls) or dive deeper with [AutoTLS libp2p blog post](https://blog.libp2p.io/autotls/).
+#### New WebUI features
+
+The WebUI, accessible at http://127.0.0.1:5001/webui/, now includes support for CAR file import and QR code sharing directly from the Files view. Additionally, the Peers screen has been updated with the latest [`ipfs-geoip`](https://www.npmjs.com/package/ipfs-geoip) dataset.
+
#### RPC and CLI command changes
- `ipfs config` is now validating json fields ([#10679](https://github.com/ipfs/kubo/pull/10679)).
@@ -84,7 +89,7 @@ The reprovide process can be quite slow. In default settings, the reprovide proc
- update `go-libp2p` to [v0.41.0](https://github.com/libp2p/go-libp2p/releases/tag/v0.41.0) (incl. [v0.40.0](https://github.com/libp2p/go-libp2p/releases/tag/v0.40.0))
- update `go-libp2p-kad-dht` to [v0.30.2](https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.30.2) (incl. [v0.29.0](https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.29.0), [v0.29.1](https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.29.1), [v0.29.2](https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.29.2), [v0.30.0](https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.30.0), [v0.30.1](https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.30.1))
- update `boxo` to [v0.29.1](https://github.com/ipfs/boxo/releases/tag/v0.29.1) (incl. [v0.28.0](https://github.com/ipfs/boxo/releases/tag/v0.28.0) [v0.29.0](https://github.com/ipfs/boxo/releases/tag/v0.29.0))
-- update `ipfs-webui` to [v4.5.0](https://github.com/ipfs/ipfs-webui/releases/tag/v4.5.0)
+- update `ipfs-webui` to [v4.6.0](https://github.com/ipfs/ipfs-webui/releases/tag/v4.6.0) (incl. [v4.5.0](https://github.com/ipfs/ipfs-webui/releases/tag/v4.5.0))
- update `p2p-forge/client` to [v0.4.0](https://github.com/ipshipyard/p2p-forge/releases/tag/v0.4.0)
- update `go-datastore` to [v0.8.2](https://github.com/ipfs/go-datastore/releases/tag/v0.8.2) (incl. [v0.7.0](https://github.com/ipfs/go-datastore/releases/tag/v0.7.0), [v0.8.0](https://github.com/ipfs/go-datastore/releases/tag/v0.8.0))
From 180f6224e341f3e8932d49c9368ef564e64fc411 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Fri, 14 Mar 2025 19:57:34 +0100
Subject: [PATCH 196/499] docs: ipns ttl change
---
docs/changelogs/v0.34.md | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/docs/changelogs/v0.34.md b/docs/changelogs/v0.34.md
index 1d99f69eb..cc3dbfa8d 100644
--- a/docs/changelogs/v0.34.md
+++ b/docs/changelogs/v0.34.md
@@ -10,6 +10,7 @@
- [New WebUI features](#new-webui-features)
- [RPC and CLI command changes](#rpc-and-cli-command-changes)
- [Bitswap improvements from Boxo](#bitswap-improvements-from-boxo)
+ - [IPNS publishing TTL change](#ipns-publishing-ttl-change)
- [`IPFS_LOG_LEVEL` deprecated](#ipfs_log_level-deprecated)
- [Pebble datastore format update](#pebble-datastore-format-update)
- [Badger datastore update](#badger-datastore-update)
@@ -60,6 +61,15 @@ The WebUI, accessible at http://127.0.0.1:5001/webui/, now includes support for
This release includes performance and reliability improvements and fixes for minor resource leaks. One of the performance changes [greatly improves the bitswap clients ability to operate under high load](https://github.com/ipfs/boxo/pull/817#pullrequestreview-2587207745), that could previously result in an out of memory condition.
+#### IPNS publishing TTL change
+
+Many complaints about IPNS being slow are tied to the default `--ttl` in `ipfs name publish`, which was set to 1 hour. To address this, weโve lowered the default [IPNS Record TTL](https://specs.ipfs.tech/ipns/ipns-record/#ttl-uint64) during publishing to 5 minutes, matching similar TTL defaults in DNS. This update is now part of `boxo/ipfs` (GO, [boxo#859](https://github.com/ipfs/boxo/pull/859)) and `@helia/ipns` (JS, [helia#749](https://github.com/ipfs/helia/pull/749)).
+
+> [!TIP]
+> IPNS TTL recommendations when even faster update propagation is desired:
+> - **As a Publisher:** Lower the `--ttl` (e.g., `ipfs name publish --ttl=1m`) to further reduce caching delays. If using DNSLink, ensure the DNS TXT record TTL matches the IPNS record TTL.
+> - **As a Gateway Operator:** Override publisher TTLs for faster updates using configurations like [`Ipns.MaxCacheTTL`](https://github.com/ipfs/kubo/blob/master/docs/config.md#ipnsmaxcachettl) in Kubo or [`RAINBOW_IPNS_MAX_CACHE_TTL`](https://github.com/ipfs/rainbow/blob/main/docs/environment-variables.md#rainbow_ipns_max_cache_ttl) in [Rainbow](https://github.com/ipfs/rainbow/).
+
#### `IPFS_LOG_LEVEL` deprecated
The variable has been deprecated. Please use [`GOLOG_LOG_LEVEL`](https://github.com/ipfs/kubo/blob/master/docs/environment-variables.md#golog_log_level) instead for configuring logging levels.
From 0fcc9904824eb38b2213c1fab389e2fa7a8165d5 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Fri, 14 Mar 2025 20:33:28 +0100
Subject: [PATCH 197/499] docs: mention Reprovider.Strategy config
---
docs/changelogs/v0.34.md | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/docs/changelogs/v0.34.md b/docs/changelogs/v0.34.md
index cc3dbfa8d..002529f5a 100644
--- a/docs/changelogs/v0.34.md
+++ b/docs/changelogs/v0.34.md
@@ -92,7 +92,11 @@ Kubo previously depended on multiple multi-error packages, `github.com/hashicorp
#### Fix hanging pinset operations during reprovides
-The reprovide process can be quite slow. In default settings, the reprovide process will start reading CIDs that belong to the pinset. During this operation, starvation can occur for other operations that need pinset access (see https://github.com/ipfs/kubo/issue/10596). We have now switch to buffering pinset-related cids that are going to be reprovided in memory, so that we can free pinset mutexes as soon as possible so that pinset-writes and subsequent read operations can proceed. The downside is larger pinsets will need some extra memory, with an estimation of ~1GiB of RAM memory-use per 20 million items to be reprovided.
+The reprovide process can be quite slow. In default settings, the reprovide process will start reading CIDs that belong to the pinset. During this operation, starvation can occur for other operations that need pinset access (see https://github.com/ipfs/kubo/issues/10596).
+
+We have now switch to buffering pinset-related cids that are going to be reprovided in memory, so that we can free pinset mutexes as soon as possible so that pinset-writes and subsequent read operations can proceed. The downside is larger pinsets will need some extra memory, with an estimation of ~1GiB of RAM memory-use per 20 million items to be reprovided.
+
+Use [`Reprovider.Strategy`](https://github.com/ipfs/kubo/blob/master/docs/config.md#reproviderstrategy) to balance announcement prioritization, speed, and memory utilization.
#### ๐ฆ๏ธ Important dependency updates
From 3d875968b59e59002cc05e926c54a412b387b2ae Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Fri, 14 Mar 2025 20:06:44 +0100
Subject: [PATCH 198/499] chore: v0.34.0-rc2
---
version.go | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/version.go b/version.go
index c4558655a..10481aac7 100644
--- a/version.go
+++ b/version.go
@@ -11,7 +11,7 @@ import (
var CurrentCommit string
// CurrentVersionNumber is the current application's version literal.
-const CurrentVersionNumber = "0.34.0-rc1"
+const CurrentVersionNumber = "0.34.0-rc2"
const ApiVersion = "/kubo/" + CurrentVersionNumber + "/" //nolint
From 38f255e3c42bb8bbe1987667b3cd0c551438b1ea Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Thu, 20 Mar 2025 18:58:23 +0100
Subject: [PATCH 199/499] chore: v0.34.0
---
docs/changelogs/v0.34.md | 330 +++++++++++++++++++++++++++++++++++++++
version.go | 2 +-
2 files changed, 331 insertions(+), 1 deletion(-)
diff --git a/docs/changelogs/v0.34.md b/docs/changelogs/v0.34.md
index 002529f5a..c89f41675 100644
--- a/docs/changelogs/v0.34.md
+++ b/docs/changelogs/v0.34.md
@@ -18,6 +18,7 @@
- [One Multi-error Package](#one-multi-error-package)
- [Fix hanging pinset operations during reprovides](#fix-hanging-pinset-operations-during-reprovides)
- [๐ฆ๏ธ Important dependency updates](#-important-dependency-updates)
+- [๐ Changelog](#-changelog)
- [๐จโ๐ฉโ๐งโ๐ฆ Contributors](#-contributors)
### Overview
@@ -107,4 +108,333 @@ Use [`Reprovider.Strategy`](https://github.com/ipfs/kubo/blob/master/docs/config
- update `p2p-forge/client` to [v0.4.0](https://github.com/ipshipyard/p2p-forge/releases/tag/v0.4.0)
- update `go-datastore` to [v0.8.2](https://github.com/ipfs/go-datastore/releases/tag/v0.8.2) (incl. [v0.7.0](https://github.com/ipfs/go-datastore/releases/tag/v0.7.0), [v0.8.0](https://github.com/ipfs/go-datastore/releases/tag/v0.8.0))
+### ๐ Changelog
+
+Full Changelog
+
+- github.com/ipfs/kubo:
+ - chore: v0.34.0
+ - chore: v0.34.0-rc2
+ - docs: mention Reprovider.Strategy config
+ - docs: ipns ttl change
+ - feat: ipfs-webui v4.6 (#10756) ([ipfs/kubo#10756](https://github.com/ipfs/kubo/pull/10756))
+ - docs(readme): update min. requirements + cleanup (#10750) ([ipfs/kubo#10750](https://github.com/ipfs/kubo/pull/10750))
+ - Upgrade to Boxo v0.29.1 (#10755) ([ipfs/kubo#10755](https://github.com/ipfs/kubo/pull/10755))
+ - Nonfunctional (#10753) ([ipfs/kubo#10753](https://github.com/ipfs/kubo/pull/10753))
+ - Update docs/changelogs/v0.34.md
+ - provider: buffer pin providers.
+ - chore: 0.34.0-rc1
+ - fix(mfs): basic UnixFS sanity checks in `files cp` (#10701) ([ipfs/kubo#10701](https://github.com/ipfs/kubo/pull/10701))
+ - Upgrade to Boxo v0.29.0 (#10742) ([ipfs/kubo#10742](https://github.com/ipfs/kubo/pull/10742))
+ - use go-datastore without go-process (#10736) ([ipfs/kubo#10736](https://github.com/ipfs/kubo/pull/10736))
+ - docs(config): add security considerations for rpc (#10739) ([ipfs/kubo#10739](https://github.com/ipfs/kubo/pull/10739))
+ - chore: update go-libp2p to v0.41.0 (#10733) ([ipfs/kubo#10733](https://github.com/ipfs/kubo/pull/10733))
+ - feat: ipfs-webui v4.5.0 (#10735) ([ipfs/kubo#10735](https://github.com/ipfs/kubo/pull/10735))
+ - Create FUNDING.json (#10734) ([ipfs/kubo#10734](https://github.com/ipfs/kubo/pull/10734))
+ - feat(AutoTLS): enabled by default with 1h RegistrationDelay (#10724) ([ipfs/kubo#10724](https://github.com/ipfs/kubo/pull/10724))
+ - Upgrade to Boxo v0.28.0 (#10725) ([ipfs/kubo#10725](https://github.com/ipfs/kubo/pull/10725))
+ - Upgrade to go1.24 (#10726) ([ipfs/kubo#10726](https://github.com/ipfs/kubo/pull/10726))
+ - Replace go-random with random-data from go-test package (#10731) ([ipfs/kubo#10731](https://github.com/ipfs/kubo/pull/10731))
+ - Update to new go-test (#10729) ([ipfs/kubo#10729](https://github.com/ipfs/kubo/pull/10729))
+ - Update go-test and use new random-files generator (#10728) ([ipfs/kubo#10728](https://github.com/ipfs/kubo/pull/10728))
+ - docs(readme): update docker section (#10716) ([ipfs/kubo#10716](https://github.com/ipfs/kubo/pull/10716))
+ - Update go-ds-badger to v0.3.1 (#10722) ([ipfs/kubo#10722](https://github.com/ipfs/kubo/pull/10722))
+ - Update pebble db to latest format by default (#10720) ([ipfs/kubo#10720](https://github.com/ipfs/kubo/pull/10720))
+ - fix: switch away from IPFS_LOG_LEVEL (#10694) ([ipfs/kubo#10694](https://github.com/ipfs/kubo/pull/10694))
+ - Merge release v0.33.2 ([ipfs/kubo#10713](https://github.com/ipfs/kubo/pull/10713))
+ - Remove unused TimeParts struct (#10708) ([ipfs/kubo#10708](https://github.com/ipfs/kubo/pull/10708))
+ - fix(rpc): restore and reprecate `bitswap reprovide` (#10699) ([ipfs/kubo#10699](https://github.com/ipfs/kubo/pull/10699))
+ - docs(release): update RELEASE_CHECKLIST.md after v0.33.1 (#10697) ([ipfs/kubo#10697](https://github.com/ipfs/kubo/pull/10697))
+ - docs: update min requirements (#10687) ([ipfs/kubo#10687](https://github.com/ipfs/kubo/pull/10687))
+ - Merge release v0.33.1 ([ipfs/kubo#10698](https://github.com/ipfs/kubo/pull/10698))
+ - fix: boxo v0.27.4 (#10692) ([ipfs/kubo#10692](https://github.com/ipfs/kubo/pull/10692))
+ - fix: Issue #9364 JSON config validation (#10679) ([ipfs/kubo#10679](https://github.com/ipfs/kubo/pull/10679))
+ - docs: RELEASE_CHECKLIST.md update for 0.33 (#10674) ([ipfs/kubo#10674](https://github.com/ipfs/kubo/pull/10674))
+ - feat: Better self-service commands for DHT providing (#10677) ([ipfs/kubo#10677](https://github.com/ipfs/kubo/pull/10677))
+ - docs: add webrtc-direct fixes to 0.33 release changelog (#10688) ([ipfs/kubo#10688](https://github.com/ipfs/kubo/pull/10688))
+ - fix: config help (#10686) ([ipfs/kubo#10686](https://github.com/ipfs/kubo/pull/10686))
+ - feat: Add CI for Spell Checking (#10637) ([ipfs/kubo#10637](https://github.com/ipfs/kubo/pull/10637))
+ - Merge release v0.33.0 ([ipfs/kubo#10684](https://github.com/ipfs/kubo/pull/10684))
+ - test: fix the socat tests after the ubuntu 24.04 upgrade (#10683) ([ipfs/kubo#10683](https://github.com/ipfs/kubo/pull/10683))
+ - fix: quic-go v0.49.0 (#10673) ([ipfs/kubo#10673](https://github.com/ipfs/kubo/pull/10673))
+ - Upgrade to Boxo v0.27.2 (#10672) ([ipfs/kubo#10672](https://github.com/ipfs/kubo/pull/10672))
+ - Upgrade to Boxo v0.27.1 (#10671) ([ipfs/kubo#10671](https://github.com/ipfs/kubo/pull/10671))
+ - fix(autotls): renewal and AutoTLS.ShortAddrs (#10669) ([ipfs/kubo#10669](https://github.com/ipfs/kubo/pull/10669))
+ - update changelog for boxo and go-libp2p (#10668) ([ipfs/kubo#10668](https://github.com/ipfs/kubo/pull/10668))
+ - Upgrade to Boxo v0.27.0 (#10665) ([ipfs/kubo#10665](https://github.com/ipfs/kubo/pull/10665))
+ - update dependencies (#10664) ([ipfs/kubo#10664](https://github.com/ipfs/kubo/pull/10664))
+ - docs(readme): add unofficial Fedora COPR (#10660) ([ipfs/kubo#10660](https://github.com/ipfs/kubo/pull/10660))
+ - fix(dns): update default DNSLink resolvers (#10655) ([ipfs/kubo#10655](https://github.com/ipfs/kubo/pull/10655))
+ - chore: p2p-forge v0.2.2 + go-libp2p-kad-dht v0.28.2 (#10663) ([ipfs/kubo#10663](https://github.com/ipfs/kubo/pull/10663))
+ - fix(cli): support HTTPS in ipfs --api (#10659) ([ipfs/kubo#10659](https://github.com/ipfs/kubo/pull/10659))
+ - chore: fix typos and comment formatting (#10653) ([ipfs/kubo#10653](https://github.com/ipfs/kubo/pull/10653))
+ - fix/gateway: escape directory redirect url (#10649) ([ipfs/kubo#10649](https://github.com/ipfs/kubo/pull/10649))
+ - Add example of setting array to config command help ([ipfs/kubo#10650](https://github.com/ipfs/kubo/pull/10650))
+ - collection of typo fixes (#10647) ([ipfs/kubo#10647](https://github.com/ipfs/kubo/pull/10647))
+ - chore: bump master to 0.34.0-dev
+- github.com/ipfs/boxo (v0.27.4 -> v0.29.1):
+ - Release v0.29.1 ([ipfs/boxo#885](https://github.com/ipfs/boxo/pull/885))
+ - fix(provider): call reprovider throughput callback only if reprovide is enabled (#871) ([ipfs/boxo#871](https://github.com/ipfs/boxo/pull/871))
+ - bitswap/httpnet: do not follow redirects (#878) ([ipfs/boxo#878](https://github.com/ipfs/boxo/pull/878))
+ - Refactor(hostname): Skip DNSLink for local IP addresses to avoid DNS queries (#880) ([ipfs/boxo#880](https://github.com/ipfs/boxo/pull/880))
+ - Nonfunctional (#882) ([ipfs/boxo#882](https://github.com/ipfs/boxo/pull/882))
+ - fix(bitswap/client): dont set nil for DontHaveTimeoutConfig (#872) ([ipfs/boxo#872](https://github.com/ipfs/boxo/pull/872))
+ - provider: add a buffered KeyChanFunc. ([ipfs/boxo#870](https://github.com/ipfs/boxo/pull/870))
+ - Release v0.29.0 (#869) ([ipfs/boxo#869](https://github.com/ipfs/boxo/pull/869))
+ - Do not use multiple multi-error packages, pick one (#867) ([ipfs/boxo#867](https://github.com/ipfs/boxo/pull/867))
+ - feat(bitswap/client): MinTimeout for DontHaveTimeoutConfig (#865) ([ipfs/boxo#865](https://github.com/ipfs/boxo/pull/865))
+ - use go-datastore without go-process (#858) ([ipfs/boxo#858](https://github.com/ipfs/boxo/pull/858))
+ - minimize peermanager lock scope (#860) ([ipfs/boxo#860](https://github.com/ipfs/boxo/pull/860))
+ - chore(ipns): lower `DefaultRecordTTL` to 5m (#859) ([ipfs/boxo#859](https://github.com/ipfs/boxo/pull/859))
+ - httpnet: bitswap network for HTTP block retrieval over trustless gateway endpoints. ([ipfs/boxo#747](https://github.com/ipfs/boxo/pull/747))
+ - chore: Update FUNDING.json for Optimism RPF (#857) ([ipfs/boxo#857](https://github.com/ipfs/boxo/pull/857))
+ - Release v0.28.0 (#854) ([ipfs/boxo#854](https://github.com/ipfs/boxo/pull/854))
+ - Update deps (#852) ([ipfs/boxo#852](https://github.com/ipfs/boxo/pull/852))
+ - fix: gateway/blocks-backend: GetBlock should not perform IPLD decoding (#845) ([ipfs/boxo#845](https://github.com/ipfs/boxo/pull/845))
+ - Protobuf pkg name (#850) ([ipfs/boxo#850](https://github.com/ipfs/boxo/pull/850))
+ - Fix intermittent test failure (#849) ([ipfs/boxo#849](https://github.com/ipfs/boxo/pull/849))
+ - move `ipld/merkledag` from gogo protobuf (#841) ([ipfs/boxo#841](https://github.com/ipfs/boxo/pull/841))
+ - move `ipld/unixfs` from gogo protobuf (#840) ([ipfs/boxo#840](https://github.com/ipfs/boxo/pull/840))
+ - Start moving from gogo protobuf (#839) ([ipfs/boxo#839](https://github.com/ipfs/boxo/pull/839))
+ - ci: uci/update-go (#848) ([ipfs/boxo#848](https://github.com/ipfs/boxo/pull/848))
+ - expose DontHaveTimeoutConfig (#846) ([ipfs/boxo#846](https://github.com/ipfs/boxo/pull/846))
+ - Upgrade go-libp2p to v0.39.1 (#843) ([ipfs/boxo#843](https://github.com/ipfs/boxo/pull/843))
+ - feat: Prevent multiple instances of "ipfs routing reprovide" running together. (#834) ([ipfs/boxo#834](https://github.com/ipfs/boxo/pull/834))
+ - Upgrade to go-libp2p v0.39.0 (#837) ([ipfs/boxo#837](https://github.com/ipfs/boxo/pull/837))
+ - bitswap/client/internal/messagequeue: run tests in parallel (#835) ([ipfs/boxo#835](https://github.com/ipfs/boxo/pull/835))
+- github.com/ipfs/go-cid (v0.4.1 -> v0.5.0):
+ - v0.5.0 bump (#172) ([ipfs/go-cid#172](https://github.com/ipfs/go-cid/pull/172))
+ - move _rsrch/cidiface into an internal package
+- github.com/ipfs/go-datastore (v0.6.0 -> v0.8.2):
+ - bump version (#231) ([ipfs/go-datastore#231](https://github.com/ipfs/go-datastore/pull/231))
+ - Results.Close should return error (#230) ([ipfs/go-datastore#230](https://github.com/ipfs/go-datastore/pull/230))
+ - new version (#229) ([ipfs/go-datastore#229](https://github.com/ipfs/go-datastore/pull/229))
+ - Update fuzz module dependencies (#228) ([ipfs/go-datastore#228](https://github.com/ipfs/go-datastore/pull/228))
+ - new version (#225) ([ipfs/go-datastore#225](https://github.com/ipfs/go-datastore/pull/225))
+ - No goprocess (#223) ([ipfs/go-datastore#223](https://github.com/ipfs/go-datastore/pull/223))
+ - Release version 0.7.0 (#213) ([ipfs/go-datastore#213](https://github.com/ipfs/go-datastore/pull/213))
+ - query result ordering does not create additional goroutine (#221) ([ipfs/go-datastore#221](https://github.com/ipfs/go-datastore/pull/221))
+ - Remove unneeded dependencies (#220) ([ipfs/go-datastore#220](https://github.com/ipfs/go-datastore/pull/220))
+ - Add traced datastore (#209) ([ipfs/go-datastore#209](https://github.com/ipfs/go-datastore/pull/209))
+ - Add root namespace method to Key (#208) ([ipfs/go-datastore#208](https://github.com/ipfs/go-datastore/pull/208))
+ - ci: uci/copy-templates (#207) ([ipfs/go-datastore#207](https://github.com/ipfs/go-datastore/pull/207))
+ - test: fix fuzz commands
+ - fix fuzz tests by adding the missing context.Context argument (#198) ([ipfs/go-datastore#198](https://github.com/ipfs/go-datastore/pull/198))
+ - sync: update CI config files (#195) ([ipfs/go-datastore#195](https://github.com/ipfs/go-datastore/pull/195))
+- github.com/ipfs/go-ds-badger (v0.3.0 -> v0.3.4):
+ - new version (#137) ([ipfs/go-ds-badger#137](https://github.com/ipfs/go-ds-badger/pull/137))
+ - new version (#135) ([ipfs/go-ds-badger#135](https://github.com/ipfs/go-ds-badger/pull/135))
+ - new version (#132) ([ipfs/go-ds-badger#132](https://github.com/ipfs/go-ds-badger/pull/132))
+ - Update to use go-datastore without go-process (#131) ([ipfs/go-ds-badger#131](https://github.com/ipfs/go-ds-badger/pull/131))
+ - new version ([ipfs/go-ds-badger#128](https://github.com/ipfs/go-ds-badger/pull/128))
+ - Update dependencies and minimum go version ([ipfs/go-ds-badger#127](https://github.com/ipfs/go-ds-badger/pull/127))
+ - ci: uci/update-go ([ipfs/go-ds-badger#123](https://github.com/ipfs/go-ds-badger/pull/123))
+ - ci: uci/copy-templates ([ipfs/go-ds-badger#122](https://github.com/ipfs/go-ds-badger/pull/122))
+ - chore: check PersistentDatastore conformance at build time (#120) ([ipfs/go-ds-badger#120](https://github.com/ipfs/go-ds-badger/pull/120))
+- github.com/ipfs/go-ds-flatfs (v0.5.1 -> v0.5.5):
+ - bump version (#130) ([ipfs/go-ds-flatfs#130](https://github.com/ipfs/go-ds-flatfs/pull/130))
+ - new version (#128) ([ipfs/go-ds-flatfs#128](https://github.com/ipfs/go-ds-flatfs/pull/128))
+ - new version (#126) ([ipfs/go-ds-flatfs#126](https://github.com/ipfs/go-ds-flatfs/pull/126))
+ - Fix race condition due to concurrent use of rand source (#125) ([ipfs/go-ds-flatfs#125](https://github.com/ipfs/go-ds-flatfs/pull/125))
+ - new version ([ipfs/go-ds-flatfs#124](https://github.com/ipfs/go-ds-flatfs/pull/124))
+ - Use go-datastore without go-process ([ipfs/go-ds-flatfs#123](https://github.com/ipfs/go-ds-flatfs/pull/123))
+ - ci: uci/update-go (#122) ([ipfs/go-ds-flatfs#122](https://github.com/ipfs/go-ds-flatfs/pull/122))
+ - fix: actually use the size hint in util_windows.go
+ - perf: do not use virtual call when passing os.Rename as rename
+ - chore(logging): update go-log v2 (#117) ([ipfs/go-ds-flatfs#117](https://github.com/ipfs/go-ds-flatfs/pull/117))
+ - ci: uci/copy-templates ([ipfs/go-ds-flatfs#116](https://github.com/ipfs/go-ds-flatfs/pull/116))
+ - sync: update CI config files ([ipfs/go-ds-flatfs#111](https://github.com/ipfs/go-ds-flatfs/pull/111))
+ - possibly fix a bug in renameAndUpdateDiskUsage
+ - add documentation and comment
+ - perf: avoid syncing directories when they already existed (#107) ([ipfs/go-ds-flatfs#107](https://github.com/ipfs/go-ds-flatfs/pull/107))
+ - test: faster TestNoCluster by batching the 3200 Puts ([ipfs/go-ds-flatfs#108](https://github.com/ipfs/go-ds-flatfs/pull/108))
+ - query: also teard down on ctx done (#106) ([ipfs/go-ds-flatfs#106](https://github.com/ipfs/go-ds-flatfs/pull/106))
+- github.com/ipfs/go-ds-leveldb (v0.5.0 -> v0.5.2):
+ - new version (#75) ([ipfs/go-ds-leveldb#75](https://github.com/ipfs/go-ds-leveldb/pull/75))
+ - Results close needs to return error (#74) ([ipfs/go-ds-leveldb#74](https://github.com/ipfs/go-ds-leveldb/pull/74))
+ - new version ([ipfs/go-ds-leveldb#73](https://github.com/ipfs/go-ds-leveldb/pull/73))
+ - use go-datastore without go-process ([ipfs/go-ds-leveldb#72](https://github.com/ipfs/go-ds-leveldb/pull/72))
+ - sync: update CI config files (#62) ([ipfs/go-ds-leveldb#62](https://github.com/ipfs/go-ds-leveldb/pull/62))
+ - chore: add PersistentDatastore and Batching interface checks
+- github.com/ipfs/go-ds-measure (v0.2.0 -> v0.2.2):
+ - new version ([ipfs/go-ds-measure#54](https://github.com/ipfs/go-ds-measure/pull/54))
+ - new version ([ipfs/go-ds-measure#52](https://github.com/ipfs/go-ds-measure/pull/52))
+- github.com/ipfs/go-ds-pebble (v0.4.2 -> v0.4.4):
+ - new version (#51) ([ipfs/go-ds-pebble#51](https://github.com/ipfs/go-ds-pebble/pull/51))
+ - new version (#48) ([ipfs/go-ds-pebble#48](https://github.com/ipfs/go-ds-pebble/pull/48))
+ - Use go-datastore without go-process (#47) ([ipfs/go-ds-pebble#47](https://github.com/ipfs/go-ds-pebble/pull/47))
+- github.com/ipfs/go-metrics-interface (v0.0.1 -> v0.3.0):
+ - CounterVec: even more ergonomic ([ipfs/go-metrics-interface#22](https://github.com/ipfs/go-metrics-interface/pull/22))
+ - Improve CounterVec abstraction ([ipfs/go-metrics-interface#21](https://github.com/ipfs/go-metrics-interface/pull/21))
+ - v0.1.0 ([ipfs/go-metrics-interface#20](https://github.com/ipfs/go-metrics-interface/pull/20))
+ - Feat: Add CounterVec type. ([ipfs/go-metrics-interface#19](https://github.com/ipfs/go-metrics-interface/pull/19))
+ - sync: update CI config files (#10) ([ipfs/go-metrics-interface#10](https://github.com/ipfs/go-metrics-interface/pull/10))
+ - sync: update CI config files (#8) ([ipfs/go-metrics-interface#8](https://github.com/ipfs/go-metrics-interface/pull/8))
+ - use a struct as a key for the context ([ipfs/go-metrics-interface#4](https://github.com/ipfs/go-metrics-interface/pull/4))
+- github.com/ipfs/go-metrics-prometheus (v0.0.3 -> v0.1.0):
+ - Implement the CounterVec type. ([ipfs/go-metrics-prometheus#26](https://github.com/ipfs/go-metrics-prometheus/pull/26))
+- github.com/ipfs/go-test (v0.0.4 -> v0.2.1):
+ - new version (#20) ([ipfs/go-test#20](https://github.com/ipfs/go-test/pull/20))
+ - No newline at end of random raw data (#19) ([ipfs/go-test#19](https://github.com/ipfs/go-test/pull/19))
+ - new-version (#18) ([ipfs/go-test#18](https://github.com/ipfs/go-test/pull/18))
+ - new version (#15) ([ipfs/go-test#15](https://github.com/ipfs/go-test/pull/15))
+ - refactor: Make go-multiaddr v0.15 forward compatible change (#16) ([ipfs/go-test#16](https://github.com/ipfs/go-test/pull/16))
+ - Move cli apps (#17) ([ipfs/go-test#17](https://github.com/ipfs/go-test/pull/17))
+ - Update help text (#14) ([ipfs/go-test#14](https://github.com/ipfs/go-test/pull/14))
+ - Add package to generate random filesystem hierarchies for testing (#13) ([ipfs/go-test#13](https://github.com/ipfs/go-test/pull/13))
+- github.com/ipfs/go-unixfsnode (v1.9.2 -> v1.10.0):
+ - new version ([ipfs/go-unixfsnode#81](https://github.com/ipfs/go-unixfsnode/pull/81))
+ - upgrade to boxo v0.27.4 ([ipfs/go-unixfsnode#80](https://github.com/ipfs/go-unixfsnode/pull/80))
+- github.com/libp2p/go-libp2p (v0.38.3 -> v0.41.0):
+ - Release v0.41.0 (#3210) ([libp2p/go-libp2p#3210](https://github.com/libp2p/go-libp2p/pull/3210))
+ - fix(libp2phttp): Fix relative to absolute multiaddr URI logic (#3208) ([libp2p/go-libp2p#3208](https://github.com/libp2p/go-libp2p/pull/3208))
+ - fix(dcutr): Fix end to end tests and add legacy behavior flag (default=true) (#3044) ([libp2p/go-libp2p#3044](https://github.com/libp2p/go-libp2p/pull/3044))
+ - feat(libp2phttp): More ergonomic auth (#3188) ([libp2p/go-libp2p#3188](https://github.com/libp2p/go-libp2p/pull/3188))
+ - chore(identify): move log to debug level (#3206) ([libp2p/go-libp2p#3206](https://github.com/libp2p/go-libp2p/pull/3206))
+ - chore: Update go-multiaddr to v0.15 (#3145) ([libp2p/go-libp2p#3145](https://github.com/libp2p/go-libp2p/pull/3145))
+ - chore: update quic-go to v0.50.0 (#3204) ([libp2p/go-libp2p#3204](https://github.com/libp2p/go-libp2p/pull/3204))
+ - chore: move go-nat to internal package
+ - basichost: add certhashes to addrs in place (#3200) ([libp2p/go-libp2p#3200](https://github.com/libp2p/go-libp2p/pull/3200))
+ - autorelay: send addresses on eventbus; dont wrap address factory (#3071) ([libp2p/go-libp2p#3071](https://github.com/libp2p/go-libp2p/pull/3071))
+ - chore: update ci for go1.24 (#3195) ([libp2p/go-libp2p#3195](https://github.com/libp2p/go-libp2p/pull/3195))
+ - Release v0.40.0 (#3192) ([libp2p/go-libp2p#3192](https://github.com/libp2p/go-libp2p/pull/3192))
+ - chore: bump deps for v0.40.0 (#3191) ([libp2p/go-libp2p#3191](https://github.com/libp2p/go-libp2p/pull/3191))
+ - autonatv2: allow multiple concurrent requests per peer (#3187) ([libp2p/go-libp2p#3187](https://github.com/libp2p/go-libp2p/pull/3187))
+ - feat: add AutoTLS example (#3103) ([libp2p/go-libp2p#3103](https://github.com/libp2p/go-libp2p/pull/3103))
+ - feat(swarm): logging waitForDirectConn return error (#3183) ([libp2p/go-libp2p#3183](https://github.com/libp2p/go-libp2p/pull/3183))
+ - tcpreuse: fix Scope() for *tls.Conn (#3181) ([libp2p/go-libp2p#3181](https://github.com/libp2p/go-libp2p/pull/3181))
+ - test(p2p/protocol/identify): fix user agent assertion in Go 1.24 (#3177) ([libp2p/go-libp2p#3177](https://github.com/libp2p/go-libp2p/pull/3177))
+ - swarm: remove unnecessary error log (#3128) ([libp2p/go-libp2p#3128](https://github.com/libp2p/go-libp2p/pull/3128))
+ - Implement error codes spec (#2927) ([libp2p/go-libp2p#2927](https://github.com/libp2p/go-libp2p/pull/2927))
+ - chore: update pion/ice to v4 (#3175) ([libp2p/go-libp2p#3175](https://github.com/libp2p/go-libp2p/pull/3175))
+ - chore: release v0.39.0 (#3174) ([libp2p/go-libp2p#3174](https://github.com/libp2p/go-libp2p/pull/3174))
+ - feat(holepunch): add logging when DirectConnect execution fails (#3146) ([libp2p/go-libp2p#3146](https://github.com/libp2p/go-libp2p/pull/3146))
+ - feat: Implement Custom TCP Dialers (#3166) ([libp2p/go-libp2p#3166](https://github.com/libp2p/go-libp2p/pull/3166))
+ - Update quic-go to v0.49.0 (#3153) ([libp2p/go-libp2p#3153](https://github.com/libp2p/go-libp2p/pull/3153))
+ - feat(transport/websocket): support SOCKS proxy with ws(s) (#3137) ([libp2p/go-libp2p#3137](https://github.com/libp2p/go-libp2p/pull/3137))
+ - tcpreuse: fix rcmgr accounting when tcp metrics are enabled (#3142) ([libp2p/go-libp2p#3142](https://github.com/libp2p/go-libp2p/pull/3142))
+ - fix(net/nat): data race problem of `extAddr` (#3140) ([libp2p/go-libp2p#3140](https://github.com/libp2p/go-libp2p/pull/3140))
+ - test: fix failing test (#3141) ([libp2p/go-libp2p#3141](https://github.com/libp2p/go-libp2p/pull/3141))
+ - quicreuse: make it possible to use an application-constructed quic.Transport (#3122) ([libp2p/go-libp2p#3122](https://github.com/libp2p/go-libp2p/pull/3122))
+ - nat: ignore mapping if external port is 0 (#3094) ([libp2p/go-libp2p#3094](https://github.com/libp2p/go-libp2p/pull/3094))
+ - tcpreuse: error on using tcpreuse with pnet (#3129) ([libp2p/go-libp2p#3129](https://github.com/libp2p/go-libp2p/pull/3129))
+ - chore: Update contribution guidelines (#3134) ([libp2p/go-libp2p#3134](https://github.com/libp2p/go-libp2p/pull/3134))
+ - tcp: fix metrics test build directive (#3052) ([libp2p/go-libp2p#3052](https://github.com/libp2p/go-libp2p/pull/3052))
+ - webrtc: upgrade pion/webrtc to v4 (#3098) ([libp2p/go-libp2p#3098](https://github.com/libp2p/go-libp2p/pull/3098))
+ - webtransport: fix docstring comment for getCurrentBucketStartTime
+ - chore: release v0.38.1 (#3114) ([libp2p/go-libp2p#3114](https://github.com/libp2p/go-libp2p/pull/3114))
+- github.com/libp2p/go-libp2p-kad-dht (v0.28.2 -> v0.30.2):
+ - new version (#1059) ([libp2p/go-libp2p-kad-dht#1059](https://github.com/libp2p/go-libp2p-kad-dht/pull/1059))
+ - do not use multiple multi-error packages, pick one (#1058) ([libp2p/go-libp2p-kad-dht#1058](https://github.com/libp2p/go-libp2p-kad-dht/pull/1058))
+ - update version (#1057) ([libp2p/go-libp2p-kad-dht#1057](https://github.com/libp2p/go-libp2p-kad-dht/pull/1057))
+ - chore: release v0.30.0 (#1054) ([libp2p/go-libp2p-kad-dht#1054](https://github.com/libp2p/go-libp2p-kad-dht/pull/1054))
+ - fix: crawler polluting peerstore (#1053) ([libp2p/go-libp2p-kad-dht#1053](https://github.com/libp2p/go-libp2p-kad-dht/pull/1053))
+ - new version (#1052) ([libp2p/go-libp2p-kad-dht#1052](https://github.com/libp2p/go-libp2p-kad-dht/pull/1052))
+ - use go-datastore without go-process (#1051) ([libp2p/go-libp2p-kad-dht#1051](https://github.com/libp2p/go-libp2p-kad-dht/pull/1051))
+ - feat: use OTEL for metrics (removes opencensus) (#1045) ([libp2p/go-libp2p-kad-dht#1045](https://github.com/libp2p/go-libp2p-kad-dht/pull/1045))
+ - release v0.29.1 (#1042) ([libp2p/go-libp2p-kad-dht#1042](https://github.com/libp2p/go-libp2p-kad-dht/pull/1042))
+ - fix: flaky TestInvalidServer (#1049) ([libp2p/go-libp2p-kad-dht#1049](https://github.com/libp2p/go-libp2p-kad-dht/pull/1049))
+ - chore: update deps (#1048) ([libp2p/go-libp2p-kad-dht#1048](https://github.com/libp2p/go-libp2p-kad-dht/pull/1048))
+ - fix addrsSoFar comparison (#1046) ([libp2p/go-libp2p-kad-dht#1046](https://github.com/libp2p/go-libp2p-kad-dht/pull/1046))
+ - fix: flaky TestInvalidServer (#1043) ([libp2p/go-libp2p-kad-dht#1043](https://github.com/libp2p/go-libp2p-kad-dht/pull/1043))
+ - add verbose to TestFindProviderAsync (dual) (#1040) ([libp2p/go-libp2p-kad-dht#1040](https://github.com/libp2p/go-libp2p-kad-dht/pull/1040))
+ - test: cover dns addresses in TestAddrFilter (#1041) ([libp2p/go-libp2p-kad-dht#1041](https://github.com/libp2p/go-libp2p-kad-dht/pull/1041))
+ - fix: flaky TestSearchValue (dual) (#1038) ([libp2p/go-libp2p-kad-dht#1038](https://github.com/libp2p/go-libp2p-kad-dht/pull/1038))
+ - fix: flaky TestClientModeConnect (#1037) ([libp2p/go-libp2p-kad-dht#1037](https://github.com/libp2p/go-libp2p-kad-dht/pull/1037))
+ - fix: flaky TestFindPeerQueryMinimal (#1036) ([libp2p/go-libp2p-kad-dht#1036](https://github.com/libp2p/go-libp2p-kad-dht/pull/1036))
+ - fix: flaky TestInvalidServer (#1032) ([libp2p/go-libp2p-kad-dht#1032](https://github.com/libp2p/go-libp2p-kad-dht/pull/1032))
+ - fix: flaky TestFindPeerWithQueryFilter (#1034) ([libp2p/go-libp2p-kad-dht#1034](https://github.com/libp2p/go-libp2p-kad-dht/pull/1034))
+ - fix: Flaky TestInvalidServer (#1029) ([libp2p/go-libp2p-kad-dht#1029](https://github.com/libp2p/go-libp2p-kad-dht/pull/1029))
+ - fix: flaky TestClientModeConnect (#1028) ([libp2p/go-libp2p-kad-dht#1028](https://github.com/libp2p/go-libp2p-kad-dht/pull/1028))
+ - fix: increase timeout in TestProvidesMany (#1027) ([libp2p/go-libp2p-kad-dht#1027](https://github.com/libp2p/go-libp2p-kad-dht/pull/1027))
+ - fix(tests): cleanup of skipped tests (#1025) ([libp2p/go-libp2p-kad-dht#1025](https://github.com/libp2p/go-libp2p-kad-dht/pull/1025))
+ - fix: don't skip TestProvidesExpire (#1024) ([libp2p/go-libp2p-kad-dht#1024](https://github.com/libp2p/go-libp2p-kad-dht/pull/1024))
+ - fixing flaky TestFindPeerQueryMinimal (#1020) ([libp2p/go-libp2p-kad-dht#1020](https://github.com/libp2p/go-libp2p-kad-dht/pull/1020))
+ - fix flaky TestSkipRefreshOnGapCpls (#1021) ([libp2p/go-libp2p-kad-dht#1021](https://github.com/libp2p/go-libp2p-kad-dht/pull/1021))
+ - fix: don't skip TestContextShutDown (#1022) ([libp2p/go-libp2p-kad-dht#1022](https://github.com/libp2p/go-libp2p-kad-dht/pull/1022))
+ - comments formatting and typos (#1019) ([libp2p/go-libp2p-kad-dht#1019](https://github.com/libp2p/go-libp2p-kad-dht/pull/1019))
+ - log peers rejected for diversity (#759) ([libp2p/go-libp2p-kad-dht#759](https://github.com/libp2p/go-libp2p-kad-dht/pull/759))
+ - docs: update fullrt docs (#768) ([libp2p/go-libp2p-kad-dht#768](https://github.com/libp2p/go-libp2p-kad-dht/pull/768))
+ - query cleanup (#1017) ([libp2p/go-libp2p-kad-dht#1017](https://github.com/libp2p/go-libp2p-kad-dht/pull/1017))
+ - better variable names (#787) ([libp2p/go-libp2p-kad-dht#787](https://github.com/libp2p/go-libp2p-kad-dht/pull/787))
+ - release v0.29.0 (#1014) ([libp2p/go-libp2p-kad-dht#1014](https://github.com/libp2p/go-libp2p-kad-dht/pull/1014))
+ - Move from gogo protobuf (#975) ([libp2p/go-libp2p-kad-dht#975](https://github.com/libp2p/go-libp2p-kad-dht/pull/975))
+ - fix: don't copy message to OnRequestHook ([libp2p/go-libp2p-kad-dht#1012](https://github.com/libp2p/go-libp2p-kad-dht/pull/1012))
+ - chore: remove boxo/util deps ([libp2p/go-libp2p-kad-dht#1013](https://github.com/libp2p/go-libp2p-kad-dht/pull/1013))
+ - feat: add request callback config option ([libp2p/go-libp2p-kad-dht#1011](https://github.com/libp2p/go-libp2p-kad-dht/pull/1011))
+- github.com/libp2p/go-libp2p-kbucket (v0.6.4 -> v0.6.5):
+ - upgrading deps (#137) ([libp2p/go-libp2p-kbucket#137](https://github.com/libp2p/go-libp2p-kbucket/pull/137))
+- github.com/libp2p/go-libp2p-pubsub (v0.12.0 -> v0.13.0):
+ - Release v0.13.0 (#593) ([libp2p/go-libp2p-pubsub#593](https://github.com/libp2p/go-libp2p-pubsub/pull/593))
+ - Allow cancelling IWANT using IDONTWANT (#591) ([libp2p/go-libp2p-pubsub#591](https://github.com/libp2p/go-libp2p-pubsub/pull/591))
+ - Improve IDONTWANT Flood Protection (#590) ([libp2p/go-libp2p-pubsub#590](https://github.com/libp2p/go-libp2p-pubsub/pull/590))
+ - Fix the Router's Ability to Prune the Mesh Periodically (#589) ([libp2p/go-libp2p-pubsub#589](https://github.com/libp2p/go-libp2p-pubsub/pull/589))
+ - Add Function to Enable Application Layer to Send Direct Control Messages (#562) ([libp2p/go-libp2p-pubsub#562](https://github.com/libp2p/go-libp2p-pubsub/pull/562))
+ - Do not format expensive debug messages in non-debug levels in doDropRPC (#580) ([libp2p/go-libp2p-pubsub#580](https://github.com/libp2p/go-libp2p-pubsub/pull/580))
+- github.com/libp2p/go-libp2p-record (v0.2.0 -> v0.3.1):
+ - fix: missing protobuf package (#64) ([libp2p/go-libp2p-record#64](https://github.com/libp2p/go-libp2p-record/pull/64))
+ - release: v0.3.0 (#63) ([libp2p/go-libp2p-record#63](https://github.com/libp2p/go-libp2p-record/pull/63))
+ - fix: protobuf namespace conflicts (#62) ([libp2p/go-libp2p-record#62](https://github.com/libp2p/go-libp2p-record/pull/62))
+ - Remove gogo protobuf (#60) ([libp2p/go-libp2p-record#60](https://github.com/libp2p/go-libp2p-record/pull/60))
+- github.com/libp2p/go-libp2p-routing-helpers (v0.7.4 -> v0.7.5):
+ - new version ([libp2p/go-libp2p-routing-helpers#90](https://github.com/libp2p/go-libp2p-routing-helpers/pull/90))
+ - Consolidate multi-error packages by choosing one ([libp2p/go-libp2p-routing-helpers#88](https://github.com/libp2p/go-libp2p-routing-helpers/pull/88))
+ - update dependencies ([libp2p/go-libp2p-routing-helpers#89](https://github.com/libp2p/go-libp2p-routing-helpers/pull/89))
+- github.com/multiformats/go-multiaddr (v0.14.0 -> v0.15.0):
+ - chore: release v0.15.0 (#266) ([multiformats/go-multiaddr#266](https://github.com/multiformats/go-multiaddr/pull/266))
+ - refactor: Backwards compatible Encapsulate/Decapsulate/Join/NewComponent (#272) ([multiformats/go-multiaddr#272](https://github.com/multiformats/go-multiaddr/pull/272))
+ - refactor: keep same api as v0.14.0 for SplitFirst/SplitLast (#271) ([multiformats/go-multiaddr#271](https://github.com/multiformats/go-multiaddr/pull/271))
+ - refactor: Follows up on #261 (#264) ([multiformats/go-multiaddr#264](https://github.com/multiformats/go-multiaddr/pull/264))
+ - refactor!: make the API harder to misuse (#261) ([multiformats/go-multiaddr#261](https://github.com/multiformats/go-multiaddr/pull/261))
+
+
+
### ๐จโ๐ฉโ๐งโ๐ฆ Contributors
+
+| Contributor | Commits | Lines ยฑ | Files Changed |
+|-------------|---------|---------|---------------|
+| Hector Sanjuan | 100 | +4777/-1495 | 200 |
+| Marco Munizaga | 22 | +3482/-1632 | 122 |
+| Andrew Gillis | 69 | +1628/-1509 | 191 |
+| sukun | 13 | +1240/-288 | 67 |
+| Simon Menke | 7 | +766/-97 | 16 |
+| Guillaume Michel | 33 | +438/-383 | 62 |
+| Marcin Rataj | 24 | +494/-266 | 47 |
+| Sergey Gorbunov | 4 | +384/-103 | 20 |
+| AvyChanna | 1 | +294/-193 | 9 |
+| gammazero | 22 | +208/-217 | 28 |
+| Dennis Trautwein | 3 | +425/-0 | 8 |
+| web3-bot | 18 | +193/-184 | 46 |
+| Steven Allen | 8 | +204/-82 | 13 |
+| Marten Seemann | 5 | +215/-63 | 11 |
+| Daniel Norman | 2 | +225/-0 | 6 |
+| Abhinav Prakash | 1 | +190/-2 | 4 |
+| guillaumemichel | 3 | +93/-56 | 15 |
+| youyyytrok | 1 | +84/-63 | 29 |
+| Nishant Das | 2 | +111/-1 | 4 |
+| Pop Chunhapanya | 1 | +109/-0 | 2 |
+| Michael Murรฉ | 7 | +78/-29 | 15 |
+| Jorropo | 4 | +53/-20 | 7 |
+| Ryan Skidmore | 1 | +62/-0 | 2 |
+| GITSRC | 1 | +44/-0 | 3 |
+| Russell Dempsey | 1 | +22/-17 | 10 |
+| Adin Schmahmann | 2 | +29/-8 | 3 |
+| Gabriel Cruz | 1 | +13/-13 | 1 |
+| Wlynxg | 3 | +12/-9 | 3 |
+| Khaled Yakdan | 1 | +11/-10 | 1 |
+| Yahya Hassanzadeh, Ph.D. | 1 | +17/-0 | 1 |
+| Can ZHANG | 2 | +15/-2 | 3 |
+| Pavel Zbitskiy | 1 | +13/-1 | 2 |
+| Yuttakhan B. | 1 | +6/-6 | 6 |
+| Hlib Kanunnikov | 2 | +9/-2 | 4 |
+| Petar Maymounkov | 1 | +7/-2 | 1 |
+| Prithvi Shahi | 2 | +8/-0 | 2 |
+| Piotr Galar | 1 | +4/-4 | 2 |
+| Michael Vorburger | 1 | +6/-0 | 1 |
+| Gus Eggert | 2 | +6/-0 | 2 |
+| Raรบl Kripalani | 1 | +4/-0 | 1 |
+| linchizhen | 1 | +1/-1 | 1 |
+| achingbrain | 1 | +1/-1 | 1 |
+| Rod Vagg | 1 | +1/-1 | 1 |
+| Ian Davis | 1 | +1/-1 | 1 |
+| Fabio Bozzo | 1 | +1/-1 | 1 |
diff --git a/version.go b/version.go
index 10481aac7..bf8edfa35 100644
--- a/version.go
+++ b/version.go
@@ -11,7 +11,7 @@ import (
var CurrentCommit string
// CurrentVersionNumber is the current application's version literal.
-const CurrentVersionNumber = "0.34.0-rc2"
+const CurrentVersionNumber = "0.34.0"
const ApiVersion = "/kubo/" + CurrentVersionNumber + "/" //nolint
From a9eb546cc4f13a8f81ccfc5191c1bcb47d38f7ce Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Thu, 20 Mar 2025 23:05:57 +0100
Subject: [PATCH 200/499] chore: start changelog for v0.35
---
CHANGELOG.md | 1 +
docs/changelogs/v0.34.md | 4 ++++
docs/changelogs/v0.35.md | 25 +++++++++++++++++++++++++
3 files changed, 30 insertions(+)
create mode 100644 docs/changelogs/v0.35.md
diff --git a/CHANGELOG.md b/CHANGELOG.md
index bf92b1e6a..1513562ff 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,6 @@
# Kubo Changelogs
+- [v0.35](docs/changelogs/v0.35.md)
- [v0.34](docs/changelogs/v0.34.md)
- [v0.33](docs/changelogs/v0.33.md)
- [v0.32](docs/changelogs/v0.32.md)
diff --git a/docs/changelogs/v0.34.md b/docs/changelogs/v0.34.md
index c89f41675..3f1cd27a5 100644
--- a/docs/changelogs/v0.34.md
+++ b/docs/changelogs/v0.34.md
@@ -1,5 +1,9 @@
# Kubo changelog v0.34
+
+
+This release was brought to you by the [Shipyard](http://ipshipyard.com/) team.
+
- [v0.34.0](#v0340)
## v0.34.0
diff --git a/docs/changelogs/v0.35.md b/docs/changelogs/v0.35.md
new file mode 100644
index 000000000..7b261ed55
--- /dev/null
+++ b/docs/changelogs/v0.35.md
@@ -0,0 +1,25 @@
+# Kubo changelog v0.35
+
+
+
+This release was brought to you by the [Shipyard](http://ipshipyard.com/) team.
+
+- [v0.35.0](#v0340)
+
+## v0.35.0
+
+- [Overview](#overview)
+- [๐ฆ Highlights](#-highlights)
+ - [๐ฆ๏ธ Important dependency updates](#-important-dependency-updates)
+- [๐ Changelog](#-changelog)
+- [๐จโ๐ฉโ๐งโ๐ฆ Contributors](#-contributors)
+
+### Overview
+
+### ๐ฆ Highlights
+
+#### ๐ฆ๏ธ Important dependency updates
+
+### ๐ Changelog
+
+### ๐จโ๐ฉโ๐งโ๐ฆ Contributors
From ca2090e760f8e3b93194643b206db2885197a9df Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Mon, 24 Mar 2025 01:41:42 +0100
Subject: [PATCH 201/499] fix: quic-go v0.50.1
https://github.com/quic-go/quic-go/releases/tag/v0.50.1
---
docs/examples/kubo-as-a-library/go.mod | 2 +-
docs/examples/kubo-as-a-library/go.sum | 4 ++--
go.mod | 2 +-
go.sum | 4 ++--
test/dependencies/go.mod | 2 +-
test/dependencies/go.sum | 4 ++--
6 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index bd1adb4b2..6e725599b 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -186,7 +186,7 @@ require (
github.com/prometheus/common v0.62.0 // indirect
github.com/prometheus/procfs v0.15.1 // indirect
github.com/quic-go/qpack v0.5.1 // indirect
- github.com/quic-go/quic-go v0.50.0 // indirect
+ github.com/quic-go/quic-go v0.50.1 // indirect
github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 // indirect
github.com/raulk/go-watchdog v1.3.0 // indirect
github.com/rogpeppe/go-internal v1.13.1 // indirect
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index 7a384b22e..dc0bdb1c3 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -680,8 +680,8 @@ github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0leargg
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI=
github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg=
-github.com/quic-go/quic-go v0.50.0 h1:3H/ld1pa3CYhkcc20TPIyG1bNsdhn9qZBGN3b9/UyUo=
-github.com/quic-go/quic-go v0.50.0/go.mod h1:Vim6OmUvlYdwBhXP9ZVrtGmCMWa3wEqhq3NgYrI8b4E=
+github.com/quic-go/quic-go v0.50.1 h1:unsgjFIUqW8a2oopkY7YNONpV1gYND6Nt9hnt1PN94Q=
+github.com/quic-go/quic-go v0.50.1/go.mod h1:Vim6OmUvlYdwBhXP9ZVrtGmCMWa3wEqhq3NgYrI8b4E=
github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 h1:4WFk6u3sOT6pLa1kQ50ZVdm8BQFgJNA117cepZxtLIg=
github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66/go.mod h1:Vp72IJajgeOL6ddqrAhmp7IM9zbTcgkQxD/YdxrVwMw=
github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk=
diff --git a/go.mod b/go.mod
index f655462f2..46bf50014 100644
--- a/go.mod
+++ b/go.mod
@@ -227,7 +227,7 @@ require (
github.com/prometheus/procfs v0.15.1 // indirect
github.com/prometheus/statsd_exporter v0.27.1 // indirect
github.com/quic-go/qpack v0.5.1 // indirect
- github.com/quic-go/quic-go v0.50.0 // indirect
+ github.com/quic-go/quic-go v0.50.1 // indirect
github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 // indirect
github.com/raulk/go-watchdog v1.3.0 // indirect
github.com/rivo/uniseg v0.4.4 // indirect
diff --git a/go.sum b/go.sum
index 467408d75..9030407a6 100644
--- a/go.sum
+++ b/go.sum
@@ -810,8 +810,8 @@ github.com/prometheus/statsd_exporter v0.27.1 h1:tcRJOmwlA83HPfWzosAgr2+zEN5XDFv
github.com/prometheus/statsd_exporter v0.27.1/go.mod h1:vA6ryDfsN7py/3JApEst6nLTJboq66XsNcJGNmC88NQ=
github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI=
github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg=
-github.com/quic-go/quic-go v0.50.0 h1:3H/ld1pa3CYhkcc20TPIyG1bNsdhn9qZBGN3b9/UyUo=
-github.com/quic-go/quic-go v0.50.0/go.mod h1:Vim6OmUvlYdwBhXP9ZVrtGmCMWa3wEqhq3NgYrI8b4E=
+github.com/quic-go/quic-go v0.50.1 h1:unsgjFIUqW8a2oopkY7YNONpV1gYND6Nt9hnt1PN94Q=
+github.com/quic-go/quic-go v0.50.1/go.mod h1:Vim6OmUvlYdwBhXP9ZVrtGmCMWa3wEqhq3NgYrI8b4E=
github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 h1:4WFk6u3sOT6pLa1kQ50ZVdm8BQFgJNA117cepZxtLIg=
github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66/go.mod h1:Vp72IJajgeOL6ddqrAhmp7IM9zbTcgkQxD/YdxrVwMw=
github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk=
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index 33f37ce86..c08fb5a17 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -230,7 +230,7 @@ require (
github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 // indirect
github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 // indirect
github.com/quic-go/qpack v0.5.1 // indirect
- github.com/quic-go/quic-go v0.50.0 // indirect
+ github.com/quic-go/quic-go v0.50.1 // indirect
github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 // indirect
github.com/rivo/uniseg v0.4.7 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index 0aaa785be..0a7dc71c9 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -617,8 +617,8 @@ github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 h1:M8mH9eK4OUR4l
github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ=
github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI=
github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg=
-github.com/quic-go/quic-go v0.50.0 h1:3H/ld1pa3CYhkcc20TPIyG1bNsdhn9qZBGN3b9/UyUo=
-github.com/quic-go/quic-go v0.50.0/go.mod h1:Vim6OmUvlYdwBhXP9ZVrtGmCMWa3wEqhq3NgYrI8b4E=
+github.com/quic-go/quic-go v0.50.1 h1:unsgjFIUqW8a2oopkY7YNONpV1gYND6Nt9hnt1PN94Q=
+github.com/quic-go/quic-go v0.50.1/go.mod h1:Vim6OmUvlYdwBhXP9ZVrtGmCMWa3wEqhq3NgYrI8b4E=
github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 h1:4WFk6u3sOT6pLa1kQ50ZVdm8BQFgJNA117cepZxtLIg=
github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66/go.mod h1:Vp72IJajgeOL6ddqrAhmp7IM9zbTcgkQxD/YdxrVwMw=
github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk=
From 8bf2aac931c56e69fc24700334f4c5e33f87dfb8 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Mon, 24 Mar 2025 01:45:08 +0100
Subject: [PATCH 202/499] chore: 0.34.1
---
docs/changelogs/v0.34.md | 15 +++++++++++++++
version.go | 2 +-
2 files changed, 16 insertions(+), 1 deletion(-)
diff --git a/docs/changelogs/v0.34.md b/docs/changelogs/v0.34.md
index c89f41675..333051401 100644
--- a/docs/changelogs/v0.34.md
+++ b/docs/changelogs/v0.34.md
@@ -1,6 +1,7 @@
# Kubo changelog v0.34
- [v0.34.0](#v0340)
+- [v0.34.1](#v0341)
## v0.34.0
@@ -438,3 +439,17 @@ Use [`Reprovider.Strategy`](https://github.com/ipfs/kubo/blob/master/docs/config
| Rod Vagg | 1 | +1/-1 | 1 |
| Ian Davis | 1 | +1/-1 | 1 |
| Fabio Bozzo | 1 | +1/-1 | 1 |
+
+## v0.34.1
+
+- [Overview](#overview)
+- [๐ฆ Highlights](#-highlights)
+ - [๐ฆ๏ธ Important dependency updates](#-important-dependency-updates)
+
+### Overview
+
+### ๐ฆ Highlights
+
+#### ๐ฆ๏ธ Important dependency updates
+
+- update `quic-go` to [v0.50.1](https://github.com/quic-go/quic-go/releases/tag/v0.50.1)
diff --git a/version.go b/version.go
index bf8edfa35..eafff69f3 100644
--- a/version.go
+++ b/version.go
@@ -11,7 +11,7 @@ import (
var CurrentCommit string
// CurrentVersionNumber is the current application's version literal.
-const CurrentVersionNumber = "0.34.0"
+const CurrentVersionNumber = "0.34.1"
const ApiVersion = "/kubo/" + CurrentVersionNumber + "/" //nolint
From ecca2eba8e8350f6003a5e0001eaea4de5e543a9 Mon Sep 17 00:00:00 2001
From: Hector Sanjuan
Date: Mon, 24 Mar 2025 15:16:46 +0100
Subject: [PATCH 203/499] Support WithIgnoreProviders() in provider query
manager
Adds `Routing.IgnoreProviders`.
This requires initializing a custom providerQueryManager and using it instead
of the default created internally in Bitswap. Since the default is created
with some internal default configuration options (MaxProviders), this hardcodes it.
---
config/init.go | 7 ++++---
config/routing.go | 4 ++++
core/node/bitswap.go | 21 ++++++++++++++++++---
docs/config.md | 14 ++++++++++++++
4 files changed, 40 insertions(+), 6 deletions(-)
diff --git a/config/init.go b/config/init.go
index f5217f413..a0351bd8b 100644
--- a/config/init.go
+++ b/config/init.go
@@ -48,9 +48,10 @@ func InitWithIdentity(identity Identity) (*Config, error) {
},
Routing: Routing{
- Type: nil,
- Methods: nil,
- Routers: nil,
+ Type: nil,
+ Methods: nil,
+ Routers: nil,
+ IgnoreProviders: []peer.ID{},
},
// setup the node mount points.
diff --git a/config/routing.go b/config/routing.go
index 52d8b7296..a6f899a1c 100644
--- a/config/routing.go
+++ b/config/routing.go
@@ -6,6 +6,8 @@ import (
"os"
"runtime"
"strings"
+
+ peer "github.com/libp2p/go-libp2p/core/peer"
)
const (
@@ -41,6 +43,8 @@ type Routing struct {
LoopbackAddressesOnLanDHT Flag `json:",omitempty"`
+ IgnoreProviders []peer.ID
+
Routers Routers
Methods Methods
diff --git a/core/node/bitswap.go b/core/node/bitswap.go
index a310709bd..4bcc97066 100644
--- a/core/node/bitswap.go
+++ b/core/node/bitswap.go
@@ -5,11 +5,13 @@ import (
"time"
"github.com/ipfs/boxo/bitswap"
+ "github.com/ipfs/boxo/bitswap/client"
bsnet "github.com/ipfs/boxo/bitswap/network/bsnet"
blockstore "github.com/ipfs/boxo/blockstore"
exchange "github.com/ipfs/boxo/exchange"
"github.com/ipfs/boxo/exchange/providing"
provider "github.com/ipfs/boxo/provider"
+ rpqm "github.com/ipfs/boxo/routing/providerquerymanager"
"github.com/ipfs/kubo/config"
irouting "github.com/ipfs/kubo/routing"
"github.com/libp2p/go-libp2p/core/host"
@@ -61,6 +63,7 @@ type bitswapIn struct {
fx.In
Mctx helpers.MetricsCtx
+ Cfg *config.Config
Host host.Host
Rt irouting.ProvideManyRouter
Bs blockstore.GCBlockstore
@@ -71,12 +74,24 @@ type bitswapIn struct {
// Additional options to bitswap.New can be provided via the "bitswap-options"
// group.
func Bitswap(provide bool) interface{} {
- return func(in bitswapIn, lc fx.Lifecycle) *bitswap.Bitswap {
+ return func(in bitswapIn, lc fx.Lifecycle) (*bitswap.Bitswap, error) {
bitswapNetwork := bsnet.NewFromIpfsHost(in.Host)
var provider routing.ContentDiscovery
if provide {
- provider = in.Rt
+ // We need to hardcode the default because it is an
+ // internal setting in boxo.
+ pqm, err := rpqm.New(bitswapNetwork,
+ in.Rt,
+ rpqm.WithMaxProviders(10),
+ rpqm.WithIgnoreProviders(in.Cfg.Routing.IgnoreProviders...),
+ )
+ if err != nil {
+ return nil, err
+ }
+ in.BitswapOpts = append(in.BitswapOpts, bitswap.WithClientOption(client.WithDefaultProviderQueryManager(false)))
+ provider = pqm
+
}
bs := bitswap.New(helpers.LifecycleCtx(in.Mctx, lc), bitswapNetwork, provider, in.Bs, in.BitswapOpts...)
@@ -85,7 +100,7 @@ func Bitswap(provide bool) interface{} {
return bs.Close()
},
})
- return bs
+ return bs, nil
}
}
diff --git a/docs/config.md b/docs/config.md
index 206d1f719..6056510b8 100644
--- a/docs/config.md
+++ b/docs/config.md
@@ -119,6 +119,7 @@ config file at runtime.
- [`Routing.Type`](#routingtype)
- [`Routing.AcceleratedDHTClient`](#routingaccelerateddhtclient)
- [`Routing.LoopbackAddressesOnLanDHT`](#routingloopbackaddressesonlandht)
+ - [`Routing.IgnoreProviders`](#routingignoreproviders)
- [`Routing.Routers`](#routingrouters)
- [`Routing.Routers: Type`](#routingrouters-type)
- [`Routing.Routers: Parameters`](#routingrouters-parameters)
@@ -1718,6 +1719,19 @@ Default: `false`
Type: `bool` (missing means `false`)
+### `Routing.IgnoreProviders`
+
+An array of peerIDs. Any provider record associated to one of these peer IDs is ignored.
+
+Apart from ignoring specific providers for reasons like misbehaviour etc. this
+setting is useful to ignore providers as a way to indicate preference, when the same provider
+is found under different peerIDs (i.e. one for HTTP and one for Bitswap retrieval).
+
+Default: `[]`
+
+Type: `array[peerID]`
+
+
### `Routing.Routers`
**EXPERIMENTAL: `Routing.Routers` configuration may change in future release**
From d28dae2b9fb9a5bdf599dd37b3386419290b3927 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Tue, 25 Mar 2025 13:52:14 +0100
Subject: [PATCH 204/499] fix: go-libp2p v0.41.1
https://github.com/libp2p/go-libp2p/releases/tag/v0.41.1
---
docs/changelogs/v0.34.md | 2 ++
docs/examples/kubo-as-a-library/go.mod | 8 ++++----
docs/examples/kubo-as-a-library/go.sum | 16 ++++++++--------
go.mod | 8 ++++----
go.sum | 16 ++++++++--------
test/dependencies/go.mod | 8 ++++----
test/dependencies/go.sum | 16 ++++++++--------
7 files changed, 38 insertions(+), 36 deletions(-)
diff --git a/docs/changelogs/v0.34.md b/docs/changelogs/v0.34.md
index 333051401..670c6244b 100644
--- a/docs/changelogs/v0.34.md
+++ b/docs/changelogs/v0.34.md
@@ -452,4 +452,6 @@ Use [`Reprovider.Strategy`](https://github.com/ipfs/kubo/blob/master/docs/config
#### ๐ฆ๏ธ Important dependency updates
+- update `go-libp2p` to [v0.41.1](https://github.com/libp2p/go-libp2p/releases/tag/v0.41.1)
+ - high impact fix from [go-libp2p#3221](https://github.com/libp2p/go-libp2p/pull/3221) improves [hole punching](https://github.com/libp2p/specs/blob/master/relay/DCUtR.md) success rate
- update `quic-go` to [v0.50.1](https://github.com/quic-go/quic-go/releases/tag/v0.50.1)
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index 6e725599b..38b3e64e9 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -9,7 +9,7 @@ replace github.com/ipfs/kubo => ./../../..
require (
github.com/ipfs/boxo v0.29.1
github.com/ipfs/kubo v0.0.0-00010101000000-000000000000
- github.com/libp2p/go-libp2p v0.41.0
+ github.com/libp2p/go-libp2p v0.41.1
github.com/multiformats/go-multiaddr v0.15.0
)
@@ -163,14 +163,14 @@ require (
github.com/pion/datachannel v1.5.10 // indirect
github.com/pion/dtls/v2 v2.2.12 // indirect
github.com/pion/dtls/v3 v3.0.4 // indirect
- github.com/pion/ice/v4 v4.0.6 // indirect
+ github.com/pion/ice/v4 v4.0.8 // indirect
github.com/pion/interceptor v0.1.37 // indirect
github.com/pion/logging v0.2.3 // indirect
github.com/pion/mdns/v2 v2.0.7 // indirect
github.com/pion/randutil v0.1.0 // indirect
github.com/pion/rtcp v1.2.15 // indirect
github.com/pion/rtp v1.8.11 // indirect
- github.com/pion/sctp v1.8.36 // indirect
+ github.com/pion/sctp v1.8.37 // indirect
github.com/pion/sdp/v3 v3.0.10 // indirect
github.com/pion/srtp/v3 v3.0.4 // indirect
github.com/pion/stun v0.6.1 // indirect
@@ -181,7 +181,7 @@ require (
github.com/pion/webrtc/v4 v4.0.10 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/polydawn/refmt v0.89.0 // indirect
- github.com/prometheus/client_golang v1.21.0 // indirect
+ github.com/prometheus/client_golang v1.21.1 // indirect
github.com/prometheus/client_model v0.6.1 // indirect
github.com/prometheus/common v0.62.0 // indirect
github.com/prometheus/procfs v0.15.1 // indirect
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index dc0bdb1c3..f8fc2a885 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -455,8 +455,8 @@ github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZ
github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs=
github.com/libp2p/go-flow-metrics v0.2.0 h1:EIZzjmeOE6c8Dav0sNv35vhZxATIXWZg6j/C08XmmDw=
github.com/libp2p/go-flow-metrics v0.2.0/go.mod h1:st3qqfu8+pMfh+9Mzqb2GTiwrAGjIPszEjZmtksN8Jc=
-github.com/libp2p/go-libp2p v0.41.0 h1:JRaD39dqf/tBBGapJ0T38N73vOaDCsWgcx3mE6HgXWk=
-github.com/libp2p/go-libp2p v0.41.0/go.mod h1:Be8QYqC4JW6Xq8buukNeoZJjyT1XUDcGoIooCHm1ye4=
+github.com/libp2p/go-libp2p v0.41.1 h1:8ecNQVT5ev/jqALTvisSJeVNvXYJyK4NhQx1nNRXQZE=
+github.com/libp2p/go-libp2p v0.41.1/go.mod h1:DcGTovJzQl/I7HMrby5ZRjeD0kQkGiy+9w6aEkSZpRI=
github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94=
github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8=
github.com/libp2p/go-libp2p-core v0.2.4/go.mod h1:STh4fdfa5vDYr0/SzYYeqnt+E6KfEV5VxfIrm0bcI0g=
@@ -620,8 +620,8 @@ github.com/pion/dtls/v2 v2.2.12 h1:KP7H5/c1EiVAAKUmXyCzPiQe5+bCJrpOeKg/L05dunk=
github.com/pion/dtls/v2 v2.2.12/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE=
github.com/pion/dtls/v3 v3.0.4 h1:44CZekewMzfrn9pmGrj5BNnTMDCFwr+6sLH+cCuLM7U=
github.com/pion/dtls/v3 v3.0.4/go.mod h1:R373CsjxWqNPf6MEkfdy3aSe9niZvL/JaKlGeFphtMg=
-github.com/pion/ice/v4 v4.0.6 h1:jmM9HwI9lfetQV/39uD0nY4y++XZNPhvzIPCb8EwxUM=
-github.com/pion/ice/v4 v4.0.6/go.mod h1:y3M18aPhIxLlcO/4dn9X8LzLLSma84cx6emMSu14FGw=
+github.com/pion/ice/v4 v4.0.8 h1:ajNx0idNG+S+v9Phu4LSn2cs8JEfTsA1/tEjkkAVpFY=
+github.com/pion/ice/v4 v4.0.8/go.mod h1:y3M18aPhIxLlcO/4dn9X8LzLLSma84cx6emMSu14FGw=
github.com/pion/interceptor v0.1.37 h1:aRA8Zpab/wE7/c0O3fh1PqY0AJI3fCSEM5lRWJVorwI=
github.com/pion/interceptor v0.1.37/go.mod h1:JzxbJ4umVTlZAf+/utHzNesY8tmRkM2lVmkS82TTj8Y=
github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms=
@@ -635,8 +635,8 @@ github.com/pion/rtcp v1.2.15 h1:LZQi2JbdipLOj4eBjK4wlVoQWfrZbh3Q6eHtWtJBZBo=
github.com/pion/rtcp v1.2.15/go.mod h1:jlGuAjHMEXwMUHK78RgX0UmEJFV4zUKOFHR7OP+D3D0=
github.com/pion/rtp v1.8.11 h1:17xjnY5WO5hgO6SD3/NTIUPvSFw/PbLsIJyz1r1yNIk=
github.com/pion/rtp v1.8.11/go.mod h1:8uMBJj32Pa1wwx8Fuv/AsFhn8jsgw+3rUC2PfoBZ8p4=
-github.com/pion/sctp v1.8.36 h1:owNudmnz1xmhfYje5L/FCav3V9wpPRePHle3Zi+P+M0=
-github.com/pion/sctp v1.8.36/go.mod h1:cNiLdchXra8fHQwmIoqw0MbLLMs+f7uQ+dGMG2gWebE=
+github.com/pion/sctp v1.8.37 h1:ZDmGPtRPX9mKCiVXtMbTWybFw3z/hVKAZgU81wcOrqs=
+github.com/pion/sctp v1.8.37/go.mod h1:cNiLdchXra8fHQwmIoqw0MbLLMs+f7uQ+dGMG2gWebE=
github.com/pion/sdp/v3 v3.0.10 h1:6MChLE/1xYB+CjumMw+gZ9ufp2DPApuVSnDT8t5MIgA=
github.com/pion/sdp/v3 v3.0.10/go.mod h1:88GMahN5xnScv1hIMTqLdu/cOcUkj6a9ytbncwMCq2E=
github.com/pion/srtp/v3 v3.0.4 h1:2Z6vDVxzrX3UHEgrUyIGM4rRouoC7v+NiF1IHtp9B5M=
@@ -666,8 +666,8 @@ github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e/go.mod h1:uIp+gprXx
github.com/polydawn/refmt v0.89.0 h1:ADJTApkvkeBZsN0tBTx8QjpD9JkmxbKp0cxfr9qszm4=
github.com/polydawn/refmt v0.89.0/go.mod h1:/zvteZs/GwLtCgZ4BL6CBsk9IKIlexP43ObX9AxTqTw=
github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
-github.com/prometheus/client_golang v1.21.0 h1:DIsaGmiaBkSangBgMtWdNfxbMNdku5IK6iNhrEqWvdA=
-github.com/prometheus/client_golang v1.21.0/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg=
+github.com/prometheus/client_golang v1.21.1 h1:DOvXXTqVzvkIewV/CDPFdejpMCGeMcbGCQ8YOmu+Ibk=
+github.com/prometheus/client_golang v1.21.1/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
diff --git a/go.mod b/go.mod
index 46bf50014..1abbe7812 100644
--- a/go.mod
+++ b/go.mod
@@ -53,7 +53,7 @@ require (
github.com/jbenet/goprocess v0.1.4
github.com/julienschmidt/httprouter v1.3.0
github.com/libp2p/go-doh-resolver v0.5.0
- github.com/libp2p/go-libp2p v0.41.0
+ github.com/libp2p/go-libp2p v0.41.1
github.com/libp2p/go-libp2p-http v0.5.0
github.com/libp2p/go-libp2p-kad-dht v0.30.2
github.com/libp2p/go-libp2p-kbucket v0.6.5
@@ -70,7 +70,7 @@ require (
github.com/multiformats/go-multihash v0.2.3
github.com/opentracing/opentracing-go v1.2.0
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58
- github.com/prometheus/client_golang v1.21.0
+ github.com/prometheus/client_golang v1.21.1
github.com/stretchr/testify v1.10.0
github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d
github.com/tidwall/gjson v1.16.0
@@ -203,14 +203,14 @@ require (
github.com/pion/datachannel v1.5.10 // indirect
github.com/pion/dtls/v2 v2.2.12 // indirect
github.com/pion/dtls/v3 v3.0.4 // indirect
- github.com/pion/ice/v4 v4.0.6 // indirect
+ github.com/pion/ice/v4 v4.0.8 // indirect
github.com/pion/interceptor v0.1.37 // indirect
github.com/pion/logging v0.2.3 // indirect
github.com/pion/mdns/v2 v2.0.7 // indirect
github.com/pion/randutil v0.1.0 // indirect
github.com/pion/rtcp v1.2.15 // indirect
github.com/pion/rtp v1.8.11 // indirect
- github.com/pion/sctp v1.8.36 // indirect
+ github.com/pion/sctp v1.8.37 // indirect
github.com/pion/sdp/v3 v3.0.10 // indirect
github.com/pion/srtp/v3 v3.0.4 // indirect
github.com/pion/stun v0.6.1 // indirect
diff --git a/go.sum b/go.sum
index 9030407a6..91d34dbbd 100644
--- a/go.sum
+++ b/go.sum
@@ -537,8 +537,8 @@ github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZ
github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs=
github.com/libp2p/go-flow-metrics v0.2.0 h1:EIZzjmeOE6c8Dav0sNv35vhZxATIXWZg6j/C08XmmDw=
github.com/libp2p/go-flow-metrics v0.2.0/go.mod h1:st3qqfu8+pMfh+9Mzqb2GTiwrAGjIPszEjZmtksN8Jc=
-github.com/libp2p/go-libp2p v0.41.0 h1:JRaD39dqf/tBBGapJ0T38N73vOaDCsWgcx3mE6HgXWk=
-github.com/libp2p/go-libp2p v0.41.0/go.mod h1:Be8QYqC4JW6Xq8buukNeoZJjyT1XUDcGoIooCHm1ye4=
+github.com/libp2p/go-libp2p v0.41.1 h1:8ecNQVT5ev/jqALTvisSJeVNvXYJyK4NhQx1nNRXQZE=
+github.com/libp2p/go-libp2p v0.41.1/go.mod h1:DcGTovJzQl/I7HMrby5ZRjeD0kQkGiy+9w6aEkSZpRI=
github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94=
github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8=
github.com/libp2p/go-libp2p-core v0.2.4/go.mod h1:STh4fdfa5vDYr0/SzYYeqnt+E6KfEV5VxfIrm0bcI0g=
@@ -725,8 +725,8 @@ github.com/pion/dtls/v2 v2.2.12 h1:KP7H5/c1EiVAAKUmXyCzPiQe5+bCJrpOeKg/L05dunk=
github.com/pion/dtls/v2 v2.2.12/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE=
github.com/pion/dtls/v3 v3.0.4 h1:44CZekewMzfrn9pmGrj5BNnTMDCFwr+6sLH+cCuLM7U=
github.com/pion/dtls/v3 v3.0.4/go.mod h1:R373CsjxWqNPf6MEkfdy3aSe9niZvL/JaKlGeFphtMg=
-github.com/pion/ice/v4 v4.0.6 h1:jmM9HwI9lfetQV/39uD0nY4y++XZNPhvzIPCb8EwxUM=
-github.com/pion/ice/v4 v4.0.6/go.mod h1:y3M18aPhIxLlcO/4dn9X8LzLLSma84cx6emMSu14FGw=
+github.com/pion/ice/v4 v4.0.8 h1:ajNx0idNG+S+v9Phu4LSn2cs8JEfTsA1/tEjkkAVpFY=
+github.com/pion/ice/v4 v4.0.8/go.mod h1:y3M18aPhIxLlcO/4dn9X8LzLLSma84cx6emMSu14FGw=
github.com/pion/interceptor v0.1.37 h1:aRA8Zpab/wE7/c0O3fh1PqY0AJI3fCSEM5lRWJVorwI=
github.com/pion/interceptor v0.1.37/go.mod h1:JzxbJ4umVTlZAf+/utHzNesY8tmRkM2lVmkS82TTj8Y=
github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms=
@@ -740,8 +740,8 @@ github.com/pion/rtcp v1.2.15 h1:LZQi2JbdipLOj4eBjK4wlVoQWfrZbh3Q6eHtWtJBZBo=
github.com/pion/rtcp v1.2.15/go.mod h1:jlGuAjHMEXwMUHK78RgX0UmEJFV4zUKOFHR7OP+D3D0=
github.com/pion/rtp v1.8.11 h1:17xjnY5WO5hgO6SD3/NTIUPvSFw/PbLsIJyz1r1yNIk=
github.com/pion/rtp v1.8.11/go.mod h1:8uMBJj32Pa1wwx8Fuv/AsFhn8jsgw+3rUC2PfoBZ8p4=
-github.com/pion/sctp v1.8.36 h1:owNudmnz1xmhfYje5L/FCav3V9wpPRePHle3Zi+P+M0=
-github.com/pion/sctp v1.8.36/go.mod h1:cNiLdchXra8fHQwmIoqw0MbLLMs+f7uQ+dGMG2gWebE=
+github.com/pion/sctp v1.8.37 h1:ZDmGPtRPX9mKCiVXtMbTWybFw3z/hVKAZgU81wcOrqs=
+github.com/pion/sctp v1.8.37/go.mod h1:cNiLdchXra8fHQwmIoqw0MbLLMs+f7uQ+dGMG2gWebE=
github.com/pion/sdp/v3 v3.0.10 h1:6MChLE/1xYB+CjumMw+gZ9ufp2DPApuVSnDT8t5MIgA=
github.com/pion/sdp/v3 v3.0.10/go.mod h1:88GMahN5xnScv1hIMTqLdu/cOcUkj6a9ytbncwMCq2E=
github.com/pion/srtp/v3 v3.0.4 h1:2Z6vDVxzrX3UHEgrUyIGM4rRouoC7v+NiF1IHtp9B5M=
@@ -779,8 +779,8 @@ github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqr
github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
github.com/prometheus/client_golang v1.13.0/go.mod h1:vTeo+zgvILHsnnj/39Ou/1fPN5nJFOEMgftOUOmlvYQ=
-github.com/prometheus/client_golang v1.21.0 h1:DIsaGmiaBkSangBgMtWdNfxbMNdku5IK6iNhrEqWvdA=
-github.com/prometheus/client_golang v1.21.0/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg=
+github.com/prometheus/client_golang v1.21.1 h1:DOvXXTqVzvkIewV/CDPFdejpMCGeMcbGCQ8YOmu+Ibk=
+github.com/prometheus/client_golang v1.21.1/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index c08fb5a17..3f6a1e39b 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -153,7 +153,7 @@ require (
github.com/libp2p/go-buffer-pool v0.1.0 // indirect
github.com/libp2p/go-cidranger v1.1.0 // indirect
github.com/libp2p/go-flow-metrics v0.2.0 // indirect
- github.com/libp2p/go-libp2p v0.41.0 // indirect
+ github.com/libp2p/go-libp2p v0.41.1 // indirect
github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect
github.com/libp2p/go-libp2p-kad-dht v0.30.2 // indirect
github.com/libp2p/go-libp2p-kbucket v0.6.5 // indirect
@@ -201,14 +201,14 @@ require (
github.com/pion/datachannel v1.5.10 // indirect
github.com/pion/dtls/v2 v2.2.12 // indirect
github.com/pion/dtls/v3 v3.0.4 // indirect
- github.com/pion/ice/v4 v4.0.6 // indirect
+ github.com/pion/ice/v4 v4.0.8 // indirect
github.com/pion/interceptor v0.1.37 // indirect
github.com/pion/logging v0.2.3 // indirect
github.com/pion/mdns/v2 v2.0.7 // indirect
github.com/pion/randutil v0.1.0 // indirect
github.com/pion/rtcp v1.2.15 // indirect
github.com/pion/rtp v1.8.11 // indirect
- github.com/pion/sctp v1.8.36 // indirect
+ github.com/pion/sctp v1.8.37 // indirect
github.com/pion/sdp/v3 v3.0.10 // indirect
github.com/pion/srtp/v3 v3.0.4 // indirect
github.com/pion/stun v0.6.1 // indirect
@@ -220,7 +220,7 @@ require (
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/polydawn/refmt v0.89.0 // indirect
github.com/polyfloyd/go-errorlint v1.6.0 // indirect
- github.com/prometheus/client_golang v1.21.0 // indirect
+ github.com/prometheus/client_golang v1.21.1 // indirect
github.com/prometheus/client_model v0.6.1 // indirect
github.com/prometheus/common v0.62.0 // indirect
github.com/prometheus/procfs v0.15.1 // indirect
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index 0a7dc71c9..757ab2b7c 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -403,8 +403,8 @@ github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38y
github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic=
github.com/libp2p/go-flow-metrics v0.2.0 h1:EIZzjmeOE6c8Dav0sNv35vhZxATIXWZg6j/C08XmmDw=
github.com/libp2p/go-flow-metrics v0.2.0/go.mod h1:st3qqfu8+pMfh+9Mzqb2GTiwrAGjIPszEjZmtksN8Jc=
-github.com/libp2p/go-libp2p v0.41.0 h1:JRaD39dqf/tBBGapJ0T38N73vOaDCsWgcx3mE6HgXWk=
-github.com/libp2p/go-libp2p v0.41.0/go.mod h1:Be8QYqC4JW6Xq8buukNeoZJjyT1XUDcGoIooCHm1ye4=
+github.com/libp2p/go-libp2p v0.41.1 h1:8ecNQVT5ev/jqALTvisSJeVNvXYJyK4NhQx1nNRXQZE=
+github.com/libp2p/go-libp2p v0.41.1/go.mod h1:DcGTovJzQl/I7HMrby5ZRjeD0kQkGiy+9w6aEkSZpRI=
github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94=
github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8=
github.com/libp2p/go-libp2p-kad-dht v0.30.2 h1:K0LJPdXynQ+u3rx6uFlrfNy0i11LE6SOCDzwAAaahys=
@@ -546,8 +546,8 @@ github.com/pion/dtls/v2 v2.2.12 h1:KP7H5/c1EiVAAKUmXyCzPiQe5+bCJrpOeKg/L05dunk=
github.com/pion/dtls/v2 v2.2.12/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE=
github.com/pion/dtls/v3 v3.0.4 h1:44CZekewMzfrn9pmGrj5BNnTMDCFwr+6sLH+cCuLM7U=
github.com/pion/dtls/v3 v3.0.4/go.mod h1:R373CsjxWqNPf6MEkfdy3aSe9niZvL/JaKlGeFphtMg=
-github.com/pion/ice/v4 v4.0.6 h1:jmM9HwI9lfetQV/39uD0nY4y++XZNPhvzIPCb8EwxUM=
-github.com/pion/ice/v4 v4.0.6/go.mod h1:y3M18aPhIxLlcO/4dn9X8LzLLSma84cx6emMSu14FGw=
+github.com/pion/ice/v4 v4.0.8 h1:ajNx0idNG+S+v9Phu4LSn2cs8JEfTsA1/tEjkkAVpFY=
+github.com/pion/ice/v4 v4.0.8/go.mod h1:y3M18aPhIxLlcO/4dn9X8LzLLSma84cx6emMSu14FGw=
github.com/pion/interceptor v0.1.37 h1:aRA8Zpab/wE7/c0O3fh1PqY0AJI3fCSEM5lRWJVorwI=
github.com/pion/interceptor v0.1.37/go.mod h1:JzxbJ4umVTlZAf+/utHzNesY8tmRkM2lVmkS82TTj8Y=
github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms=
@@ -561,8 +561,8 @@ github.com/pion/rtcp v1.2.15 h1:LZQi2JbdipLOj4eBjK4wlVoQWfrZbh3Q6eHtWtJBZBo=
github.com/pion/rtcp v1.2.15/go.mod h1:jlGuAjHMEXwMUHK78RgX0UmEJFV4zUKOFHR7OP+D3D0=
github.com/pion/rtp v1.8.11 h1:17xjnY5WO5hgO6SD3/NTIUPvSFw/PbLsIJyz1r1yNIk=
github.com/pion/rtp v1.8.11/go.mod h1:8uMBJj32Pa1wwx8Fuv/AsFhn8jsgw+3rUC2PfoBZ8p4=
-github.com/pion/sctp v1.8.36 h1:owNudmnz1xmhfYje5L/FCav3V9wpPRePHle3Zi+P+M0=
-github.com/pion/sctp v1.8.36/go.mod h1:cNiLdchXra8fHQwmIoqw0MbLLMs+f7uQ+dGMG2gWebE=
+github.com/pion/sctp v1.8.37 h1:ZDmGPtRPX9mKCiVXtMbTWybFw3z/hVKAZgU81wcOrqs=
+github.com/pion/sctp v1.8.37/go.mod h1:cNiLdchXra8fHQwmIoqw0MbLLMs+f7uQ+dGMG2gWebE=
github.com/pion/sdp/v3 v3.0.10 h1:6MChLE/1xYB+CjumMw+gZ9ufp2DPApuVSnDT8t5MIgA=
github.com/pion/sdp/v3 v3.0.10/go.mod h1:88GMahN5xnScv1hIMTqLdu/cOcUkj6a9ytbncwMCq2E=
github.com/pion/srtp/v3 v3.0.4 h1:2Z6vDVxzrX3UHEgrUyIGM4rRouoC7v+NiF1IHtp9B5M=
@@ -594,8 +594,8 @@ github.com/polyfloyd/go-errorlint v1.6.0/go.mod h1:HR7u8wuP1kb1NeN1zqTd1ZMlqUKPP
github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g=
github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U=
github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
-github.com/prometheus/client_golang v1.21.0 h1:DIsaGmiaBkSangBgMtWdNfxbMNdku5IK6iNhrEqWvdA=
-github.com/prometheus/client_golang v1.21.0/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg=
+github.com/prometheus/client_golang v1.21.1 h1:DOvXXTqVzvkIewV/CDPFdejpMCGeMcbGCQ8YOmu+Ibk=
+github.com/prometheus/client_golang v1.21.1/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
From 1d9e3d6c4f10bb5937785cd9828e7beda3b8e2ae Mon Sep 17 00:00:00 2001
From: Guillaume Michel
Date: Tue, 25 Mar 2025 15:48:10 +0000
Subject: [PATCH 205/499] fix: reprovides warning (#10761)
---
core/node/provider.go | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/core/node/provider.go b/core/node/provider.go
index 78f0761cc..51b12862b 100644
--- a/core/node/provider.go
+++ b/core/node/provider.go
@@ -26,7 +26,7 @@ func ProviderSys(reprovideInterval time.Duration, acceleratedDHTClient bool) fx.
provider.ReproviderInterval(reprovideInterval),
provider.KeyProvider(keyProvider),
}
- if !acceleratedDHTClient {
+ if !acceleratedDHTClient && reprovideInterval > 0 {
// The estimation kinda suck if you are running with accelerated DHT client,
// given this message is just trying to push people to use the acceleratedDHTClient
// let's not report on through if it's in use
@@ -68,7 +68,7 @@ func ProviderSys(reprovideInterval time.Duration, acceleratedDHTClient bool) fx.
๐๐๐ YOU MAY BE FALLING BEHIND DHT REPROVIDES! ๐๐๐
โ ๏ธ Your system might be struggling to keep up with DHT reprovides!
-This means your content could partially or completely inaccessible on the network.
+This means your content could be partially or completely inaccessible on the network.
We observed that you recently provided %d keys at an average rate of %v per key.
๐ An attempt to estimate your blockstore size timed out after 5 minutes,
@@ -97,7 +97,7 @@ https://github.com/ipfs/kubo/blob/master/docs/config.md#routingaccelerateddhtcli
๐๐๐ YOU ARE FALLING BEHIND DHT REPROVIDES! ๐๐๐
โ ๏ธ Your system is struggling to keep up with DHT reprovides!
-This means your content could partially or completely inaccessible on the network.
+This means your content could be partially or completely inaccessible on the network.
We observed that you recently provided %d keys at an average rate of %v per key.
๐พ Your total CID count is ~%d which would total at %v reprovide process.
From 112eb61f66f07e96c16405940c532a1a6c0f6f7c Mon Sep 17 00:00:00 2001
From: Hector Sanjuan
Date: Tue, 1 Apr 2025 09:53:28 +0200
Subject: [PATCH 206/499] changelog: add mention to IgnoreProviders
---
docs/changelogs/v0.35.md | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/docs/changelogs/v0.35.md b/docs/changelogs/v0.35.md
index 7b261ed55..d1432a1f4 100644
--- a/docs/changelogs/v0.35.md
+++ b/docs/changelogs/v0.35.md
@@ -18,6 +18,13 @@ This release was brought to you by the [Shipyard](http://ipshipyard.com/) team.
### ๐ฆ Highlights
+##### `Routing.IgnoreProviders`
+
+This new option allows ignoring specific peer IDs when returned by the content
+routing system as providers of content. See the
+[documentation](https://github.com/ipfs/kubo/blob/master/docs/config.md#routingignoreproviders)
+for for information.
+
#### ๐ฆ๏ธ Important dependency updates
### ๐ Changelog
From ef7cc60a5bec1dc6498eeee5eb5dc6071f5e4341 Mon Sep 17 00:00:00 2001
From: Michael Vorburger
Date: Tue, 1 Apr 2025 16:26:38 +0200
Subject: [PATCH 207/499] docs: Fix typo in v0.34 changelog (#10771)
---
docs/changelogs/v0.34.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/changelogs/v0.34.md b/docs/changelogs/v0.34.md
index 22fc5b24a..2b4761de1 100644
--- a/docs/changelogs/v0.34.md
+++ b/docs/changelogs/v0.34.md
@@ -148,7 +148,7 @@ Use [`Reprovider.Strategy`](https://github.com/ipfs/kubo/blob/master/docs/config
- fix: switch away from IPFS_LOG_LEVEL (#10694) ([ipfs/kubo#10694](https://github.com/ipfs/kubo/pull/10694))
- Merge release v0.33.2 ([ipfs/kubo#10713](https://github.com/ipfs/kubo/pull/10713))
- Remove unused TimeParts struct (#10708) ([ipfs/kubo#10708](https://github.com/ipfs/kubo/pull/10708))
- - fix(rpc): restore and reprecate `bitswap reprovide` (#10699) ([ipfs/kubo#10699](https://github.com/ipfs/kubo/pull/10699))
+ - fix(rpc): restore and deprecate `bitswap reprovide` (#10699) ([ipfs/kubo#10699](https://github.com/ipfs/kubo/pull/10699))
- docs(release): update RELEASE_CHECKLIST.md after v0.33.1 (#10697) ([ipfs/kubo#10697](https://github.com/ipfs/kubo/pull/10697))
- docs: update min requirements (#10687) ([ipfs/kubo#10687](https://github.com/ipfs/kubo/pull/10687))
- Merge release v0.33.1 ([ipfs/kubo#10698](https://github.com/ipfs/kubo/pull/10698))
From fd50eb0fc385ec35cc2269646182920849b3c9b5 Mon Sep 17 00:00:00 2001
From: Michael Vorburger
Date: Tue, 1 Apr 2025 16:28:12 +0200
Subject: [PATCH 208/499] fix: Add IPFS & IPNS path details to error (re.
#10762) (#10770)
---
fuse/node/mount_unix.go | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/fuse/node/mount_unix.go b/fuse/node/mount_unix.go
index 63763996b..a5a2a3716 100644
--- a/fuse/node/mount_unix.go
+++ b/fuse/node/mount_unix.go
@@ -89,11 +89,11 @@ func doMount(node *core.IpfsNode, fsdir, nsdir string) error {
wg.Wait()
if err1 != nil {
- log.Errorf("error mounting: %s", err1)
+ log.Errorf("error mounting IPFS %s: %s", fsdir, err1)
}
if err2 != nil {
- log.Errorf("error mounting: %s", err2)
+ log.Errorf("error mounting IPNS %s for IPFS %s: %s", nsdir, fsdir, err2)
}
if err1 != nil || err2 != nil {
From d7f026606814754d116dfc218426ddec4ff58075 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Fri, 4 Apr 2025 01:07:40 +0200
Subject: [PATCH 209/499] docs: known issues with file/urlstores (#10768)
Co-authored-by: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
---
docs/experimental-features.md | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/docs/experimental-features.md b/docs/experimental-features.md
index 84a9adfc3..3fccdad19 100644
--- a/docs/experimental-features.md
+++ b/docs/experimental-features.md
@@ -87,6 +87,10 @@ filestore instead of copying the files into your local IPFS repo.
- [ ] Needs more people to use and report on how well it works.
- [ ] Need to address error states and failure conditions
+ - [ ] cleanup of broken filesystem references (if file is deleted)
+ - [ ] tests that confirm ability to override preexisting filesystem links (allowing user to fix broken link)
+ - [ ] support for a a single block having more than one sources in filesystem (blocks can be shared by unrelated files, and not be broken when some files are unpinned / gc'd)
+ - [ ] [other known issues](https://github.com/ipfs/kubo/issues/7161)
- [ ] Need to write docs on usage, advantages, disadvantages
- [ ] Need to merge utility commands to aid in maintenance and repair of filestore
@@ -122,6 +126,9 @@ And then add a file at a specific URL using `ipfs urlstore add `
### Road to being a real feature
- [ ] Needs more people to use and report on how well it works.
- [ ] Need to address error states and failure conditions
+ - [ ] cleanup of broken URL+range references (if URL starts returning 404 or error)
+ - [ ] tests that confirm ability to override preexisting URL+range links (allowing user to fix broken link)
+ - [ ] support for a a single block having more than one URL+range (blocks can be shared by unrelated URLs)
- [ ] Need to write docs on usage, advantages, disadvantages
- [ ] Need to implement caching
- [ ] Need to add metrics to monitor performance
From 19b591da9fc0601744d0f0879e4f237992a738c2 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Tue, 8 Apr 2025 15:17:34 +0200
Subject: [PATCH 210/499] chore: update url
---
test/sharness/t0165-keystore-data/README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/test/sharness/t0165-keystore-data/README.md b/test/sharness/t0165-keystore-data/README.md
index 4c0a68b51..298b7708e 100644
--- a/test/sharness/t0165-keystore-data/README.md
+++ b/test/sharness/t0165-keystore-data/README.md
@@ -8,7 +8,7 @@ openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 > openssl_rsa.pem
```
secp key used in the 'restrict import key' test.
-From: https://www.openssl.org/docs/man1.1.1/man1/openssl-genpkey.html
+From: https://docs.openssl.org/1.1.1/man1/genpkey/
```bash
openssl genpkey -genparam -algorithm EC -out ecp.pem \
-pkeyopt ec_paramgen_curve:secp384r1 \
From 996bcf30a687a1334379d5df9d4dc2579970a70f Mon Sep 17 00:00:00 2001
From: Hector Sanjuan
Date: Wed, 9 Apr 2025 18:28:29 +0200
Subject: [PATCH 211/499] feat: partial DAG provides with
Reprovider.Strategy=mfs|pinned+mfs (#10754)
Co-authored-by: Marcin Rataj
---
core/node/core.go | 1 +
core/node/provider.go | 96 ++++++++++++-------
docs/changelogs/v0.35.md | 11 +++
docs/config.md | 13 ++-
docs/examples/kubo-as-a-library/go.mod | 2 +-
docs/examples/kubo-as-a-library/go.sum | 4 +-
go.mod | 2 +-
go.sum | 4 +-
test/dependencies/go.mod | 2 +-
test/dependencies/go.sum | 4 +-
.../t0119-prometheus-data/prometheus_metrics | 1 +
11 files changed, 95 insertions(+), 45 deletions(-)
diff --git a/core/node/core.go b/core/node/core.go
index 1c372b642..cb3439939 100644
--- a/core/node/core.go
+++ b/core/node/core.go
@@ -115,6 +115,7 @@ func FetcherConfig(bs blockservice.BlockService) FetchersOut {
// path resolution should not fetch new blocks via exchange.
offlineBs := blockservice.New(bs.Blockstore(), offline.Exchange(bs.Blockstore()))
offlineIpldFetcher := bsfetcher.NewFetcherConfig(offlineBs)
+ offlineIpldFetcher.SkipNotFound = true // carries onto the UnixFSFetcher below
offlineIpldFetcher.PrototypeChooser = dagpb.AddSupportToChooser(bsfetcher.DefaultPrototypeChooser)
offlineUnixFSFetcher := offlineIpldFetcher.WithReifier(unixfsnode.Reify)
diff --git a/core/node/provider.go b/core/node/provider.go
index 51b12862b..4638aad4d 100644
--- a/core/node/provider.go
+++ b/core/node/provider.go
@@ -7,8 +7,10 @@ import (
"github.com/ipfs/boxo/blockstore"
"github.com/ipfs/boxo/fetcher"
+ "github.com/ipfs/boxo/mfs"
pin "github.com/ipfs/boxo/pinning/pinner"
provider "github.com/ipfs/boxo/provider"
+ "github.com/ipfs/go-cid"
"github.com/ipfs/kubo/repo"
irouting "github.com/ipfs/kubo/routing"
"go.uber.org/fx"
@@ -136,14 +138,8 @@ func OnlineProviders(useStrategicProviding bool, reprovideStrategy string, repro
var keyProvider fx.Option
switch reprovideStrategy {
- case "all", "":
- keyProvider = fx.Provide(newProvidingStrategy(false, false))
- case "roots":
- keyProvider = fx.Provide(newProvidingStrategy(true, true))
- case "pinned":
- keyProvider = fx.Provide(newProvidingStrategy(true, false))
- case "flat":
- keyProvider = fx.Provide(provider.NewBlockstoreProvider)
+ case "all", "", "roots", "pinned", "mfs", "pinned+mfs", "flat":
+ keyProvider = fx.Provide(newProvidingStrategy(reprovideStrategy))
default:
return fx.Error(fmt.Errorf("unknown reprovider strategy %q", reprovideStrategy))
}
@@ -159,32 +155,68 @@ func OfflineProviders() fx.Option {
return fx.Provide(provider.NewNoopProvider)
}
-func newProvidingStrategy(onlyPinned, onlyRoots bool) interface{} {
- type input struct {
- fx.In
- Pinner pin.Pinner
- Blockstore blockstore.Blockstore
- IPLDFetcher fetcher.Factory `name:"ipldFetcher"`
+func mfsProvider(mfsRoot *mfs.Root, fetcher fetcher.Factory) provider.KeyChanFunc {
+ return func(ctx context.Context) (<-chan cid.Cid, error) {
+ err := mfsRoot.FlushMemFree(ctx)
+ if err != nil {
+ return nil, fmt.Errorf("error flushing mfs, cannot provide MFS: %w", err)
+ }
+ rootNode, err := mfsRoot.GetDirectory().GetNode()
+ if err != nil {
+ return nil, fmt.Errorf("error loading mfs root, cannot provide MFS: %w", err)
+ }
+
+ kcf := provider.NewDAGProvider(rootNode.Cid(), fetcher)
+ return kcf(ctx)
}
- return func(in input) provider.KeyChanFunc {
- // Pinner-related CIDs will be buffered in memory to avoid
- // deadlocking the pinner when the providing process is slow.
- if onlyRoots {
- return provider.NewBufferedProvider(
- provider.NewPinnedProvider(true, in.Pinner, in.IPLDFetcher),
- )
+}
+
+func mfsRootProvider(mfsRoot *mfs.Root) provider.KeyChanFunc {
+ return func(ctx context.Context) (<-chan cid.Cid, error) {
+ rootNode, err := mfsRoot.GetDirectory().GetNode()
+ if err != nil {
+ return nil, fmt.Errorf("error loading mfs root, cannot provide MFS: %w", err)
+ }
+ ch := make(chan cid.Cid, 1)
+ ch <- rootNode.Cid()
+ close(ch)
+ return ch, nil
+ }
+}
+
+func newProvidingStrategy(strategy string) interface{} {
+ type input struct {
+ fx.In
+ Pinner pin.Pinner
+ Blockstore blockstore.Blockstore
+ OfflineIPLDFetcher fetcher.Factory `name:"offlineIpldFetcher"`
+ OfflineUnixFSFetcher fetcher.Factory `name:"offlineUnixfsFetcher"`
+ MFSRoot *mfs.Root
+ }
+ return func(in input) provider.KeyChanFunc {
+ switch strategy {
+ case "roots":
+ return provider.NewBufferedProvider(provider.NewPinnedProvider(true, in.Pinner, in.OfflineIPLDFetcher))
+ case "pinned":
+ return provider.NewBufferedProvider(provider.NewPinnedProvider(false, in.Pinner, in.OfflineIPLDFetcher))
+ case "pinned+mfs":
+ return provider.NewPrioritizedProvider(
+ provider.NewBufferedProvider(provider.NewPinnedProvider(false, in.Pinner, in.OfflineIPLDFetcher)),
+ mfsProvider(in.MFSRoot, in.OfflineUnixFSFetcher),
+ )
+ case "mfs":
+ return mfsProvider(in.MFSRoot, in.OfflineUnixFSFetcher)
+ case "flat":
+ return provider.NewBlockstoreProvider(in.Blockstore)
+ default: // "all", ""
+ return provider.NewPrioritizedProvider(
+ provider.NewPrioritizedProvider(
+ provider.NewBufferedProvider(provider.NewPinnedProvider(true, in.Pinner, in.OfflineIPLDFetcher)),
+ mfsRootProvider(in.MFSRoot),
+ ),
+ provider.NewBlockstoreProvider(in.Blockstore),
+ )
}
-
- if onlyPinned {
- return provider.NewBufferedProvider(
- provider.NewPinnedProvider(false, in.Pinner, in.IPLDFetcher),
- )
- }
-
- return provider.NewPrioritizedProvider(
- provider.NewBufferedProvider(provider.NewPinnedProvider(true, in.Pinner, in.IPLDFetcher)),
- provider.NewBlockstoreProvider(in.Blockstore),
- )
}
}
diff --git a/docs/changelogs/v0.35.md b/docs/changelogs/v0.35.md
index d1432a1f4..a41a7040c 100644
--- a/docs/changelogs/v0.35.md
+++ b/docs/changelogs/v0.35.md
@@ -10,6 +10,7 @@ This release was brought to you by the [Shipyard](http://ipshipyard.com/) team.
- [Overview](#overview)
- [๐ฆ Highlights](#-highlights)
+ - [Dedicated `Reprovider.Strategy` for MFS](#dedicated-reproviderstrategy-for-mfs)
- [๐ฆ๏ธ Important dependency updates](#-important-dependency-updates)
- [๐ Changelog](#-changelog)
- [๐จโ๐ฉโ๐งโ๐ฆ Contributors](#-contributors)
@@ -18,6 +19,16 @@ This release was brought to you by the [Shipyard](http://ipshipyard.com/) team.
### ๐ฆ Highlights
+#### Dedicated `Reprovider.Strategy` for MFS
+
+The [Mutable File System (MFS)](https://docs.ipfs.tech/concepts/glossary/#mfs) in Kubo is a UnixFS filesystem managed with [`ipfs files`](https://docs.ipfs.tech/reference/kubo/cli/#ipfs-files) commands. It supports familiar file operations like cp and mv within a folder-tree structure, automatically updating a MerkleDAG and a "root CID" that reflects the current MFS state. Files in MFS are protected from garbage collection, offering a simpler alternative to `ipfs pin`. This makes it a popular choice for tools like [IPFS Desktop](https://docs.ipfs.tech/install/ipfs-desktop/) and the [WebUI](https://github.com/ipfs/ipfs-webui/#readme).
+
+Previously, the `pinned` reprovider strategy required manual pin management: each dataset update meant pinning the new version and unpinning the old one. Now, new strategiesโ`mfs` and `pinned+mfs`โlet users limit announcements to data explicitly placed in MFS. This simplifies updating datasets and announcing only the latest version to the Amino DHT.
+
+Users relying on the `pinned` strategy can switch to `pinned+mfs` and use MFS alone to manage updates and announcements, eliminating the need for manual pinning and unpinning. We hope this makes it easier to publish just the data that matters to you.
+
+See [`Reprovider.Strategy`](https://github.com/ipfs/kubo/blob/master/docs/config.md#reproviderstrategy) for more details.
+
##### `Routing.IgnoreProviders`
This new option allows ignoring specific peer IDs when returned by the content
diff --git a/docs/config.md b/docs/config.md
index 6056510b8..8ff11a408 100644
--- a/docs/config.md
+++ b/docs/config.md
@@ -1587,10 +1587,10 @@ Type: `optionalDuration` (unset for the default)
Tells reprovider what should be announced. Valid strategies are:
- `"all"` - announce all CIDs of stored blocks
- - Order: root blocks of direct and recursive pins are announced first, then the rest of blockstore
-- `"pinned"` - only announce pinned CIDs recursively (both roots and child blocks)
+ - Order: root blocks of direct and recursive pins and MFS root are announced first, then the rest of blockstore
+- `"pinned"` - only announce recursively pinned CIDs (`ipfs pin add -r`, both roots and child blocks)
- Order: root blocks of direct and recursive pins are announced first, then the child blocks of recursive pins
-- `"roots"` - only announce the root block of explicitly pinned CIDs
+- `"roots"` - only announce the root block of explicitly pinned CIDs (`ipfs pin add`)
- **โ ๏ธ BE CAREFUL:** node with `roots` strategy will not announce child blocks.
It makes sense only for use cases where the entire DAG is fetched in full,
and a graceful resume does not have to be guaranteed: the lack of child
@@ -1598,10 +1598,15 @@ Tells reprovider what should be announced. Valid strategies are:
providers for the missing block in the middle of a file, unless the peer
happens to already be connected to a provider and ask for child CID over
bitswap.
+- `"mfs"` - announce only the local CIDs that are part of the MFS (`ipfs files`)
+ - Note: MFS is lazy-loaded. Only the MFS blocks present in local datastore are announced.
+- `"pinned+mfs"` - a combination of the `pinned` and `mfs` strategies.
+ - **โน๏ธ NOTE:** This is the suggested strategy for users who run without GC and don't want to provide everything in cache.
+ - Order: first `pinned` and then the locally available part of `mfs`.
- `"flat"` - same as `all`, announce all CIDs of stored blocks, but without prioritizing anything.
> [!IMPORTANT]
-> Reproviding larger pinsets using the `all`, `pinned`, or `roots` strategies requires additional memory, with an estimated ~1 GiB of RAM per 20 million items for reproviding to the Amino DHT.
+> Reproviding larger pinsets using the `all`, `mfs`, `pinned`, `pinned+mfs` or `roots` strategies requires additional memory, with an estimated ~1 GiB of RAM per 20 million items for reproviding to the Amino DHT.
> This is due to the use of a buffered provider, which avoids holding a lock on the entire pinset during the reprovide cycle.
> The `flat` strategy can be used to lower memory requirements, but only recommended if memory utilization is too high, prioritization of pins is not necessary, and it is acceptable to announce every block cached in the local repository.
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index 38b3e64e9..bfaa528c9 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -7,7 +7,7 @@ go 1.24
replace github.com/ipfs/kubo => ./../../..
require (
- github.com/ipfs/boxo v0.29.1
+ github.com/ipfs/boxo v0.29.2-0.20250409154342-bbaf2e146dfb
github.com/ipfs/kubo v0.0.0-00010101000000-000000000000
github.com/libp2p/go-libp2p v0.41.1
github.com/multiformats/go-multiaddr v0.15.0
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index f8fc2a885..eb2997529 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -298,8 +298,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcd
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.29.1 h1:z61ZT4YDfTHLjXTsu/+3wvJ8aJlExthDSOCpx6Nh8xc=
-github.com/ipfs/boxo v0.29.1/go.mod h1:MkDJStXiJS9U99cbAijHdcmwNfVn5DKYBmQCOgjY2NU=
+github.com/ipfs/boxo v0.29.2-0.20250409154342-bbaf2e146dfb h1:kA7c3CF6/d8tUwGJR/SwIfaRz7Xk7Fbyoh2ePZAFMlw=
+github.com/ipfs/boxo v0.29.2-0.20250409154342-bbaf2e146dfb/go.mod h1:omQZmLS7LegSpBy3m4CrAB9/SO7Fq3pfv+5y1FOd+gI=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-bitswap v0.11.0 h1:j1WVvhDX1yhG32NTC9xfxnqycqYIlhzEzLXG/cU1HyQ=
diff --git a/go.mod b/go.mod
index 1abbe7812..8975eb210 100644
--- a/go.mod
+++ b/go.mod
@@ -21,7 +21,7 @@ require (
github.com/hashicorp/go-version v1.7.0
github.com/ipfs-shipyard/nopfs v0.0.14
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0
- github.com/ipfs/boxo v0.29.1
+ github.com/ipfs/boxo v0.29.2-0.20250409154342-bbaf2e146dfb
github.com/ipfs/go-block-format v0.2.0
github.com/ipfs/go-cid v0.5.0
github.com/ipfs/go-cidutil v0.1.0
diff --git a/go.sum b/go.sum
index 91d34dbbd..e926a4596 100644
--- a/go.sum
+++ b/go.sum
@@ -362,8 +362,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcd
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.29.1 h1:z61ZT4YDfTHLjXTsu/+3wvJ8aJlExthDSOCpx6Nh8xc=
-github.com/ipfs/boxo v0.29.1/go.mod h1:MkDJStXiJS9U99cbAijHdcmwNfVn5DKYBmQCOgjY2NU=
+github.com/ipfs/boxo v0.29.2-0.20250409154342-bbaf2e146dfb h1:kA7c3CF6/d8tUwGJR/SwIfaRz7Xk7Fbyoh2ePZAFMlw=
+github.com/ipfs/boxo v0.29.2-0.20250409154342-bbaf2e146dfb/go.mod h1:omQZmLS7LegSpBy3m4CrAB9/SO7Fq3pfv+5y1FOd+gI=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-bitswap v0.11.0 h1:j1WVvhDX1yhG32NTC9xfxnqycqYIlhzEzLXG/cU1HyQ=
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index 3f6a1e39b..0cf72f9ca 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -116,7 +116,7 @@ require (
github.com/huin/goupnp v1.3.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/ipfs/bbloom v0.0.4 // indirect
- github.com/ipfs/boxo v0.29.1 // indirect
+ github.com/ipfs/boxo v0.29.2-0.20250409154342-bbaf2e146dfb // indirect
github.com/ipfs/go-block-format v0.2.0 // indirect
github.com/ipfs/go-cid v0.5.0 // indirect
github.com/ipfs/go-datastore v0.8.2 // indirect
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index 757ab2b7c..4fef97504 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -294,8 +294,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.29.1 h1:z61ZT4YDfTHLjXTsu/+3wvJ8aJlExthDSOCpx6Nh8xc=
-github.com/ipfs/boxo v0.29.1/go.mod h1:MkDJStXiJS9U99cbAijHdcmwNfVn5DKYBmQCOgjY2NU=
+github.com/ipfs/boxo v0.29.2-0.20250409154342-bbaf2e146dfb h1:kA7c3CF6/d8tUwGJR/SwIfaRz7Xk7Fbyoh2ePZAFMlw=
+github.com/ipfs/boxo v0.29.2-0.20250409154342-bbaf2e146dfb/go.mod h1:omQZmLS7LegSpBy3m4CrAB9/SO7Fq3pfv+5y1FOd+gI=
github.com/ipfs/go-block-format v0.2.0 h1:ZqrkxBA2ICbDRbK8KJs/u0O3dlp6gmAuuXUJNiW1Ycs=
github.com/ipfs/go-block-format v0.2.0/go.mod h1:+jpL11nFx5A/SPpsoBn6Bzkra/zaArfSmsknbPMYgzM=
github.com/ipfs/go-cid v0.5.0 h1:goEKKhaGm0ul11IHA7I6p1GmKz8kEYniqFopaB5Otwg=
diff --git a/test/sharness/t0119-prometheus-data/prometheus_metrics b/test/sharness/t0119-prometheus-data/prometheus_metrics
index 60475da43..07cd44d8f 100644
--- a/test/sharness/t0119-prometheus-data/prometheus_metrics
+++ b/test/sharness/t0119-prometheus-data/prometheus_metrics
@@ -1,3 +1,4 @@
+exchange_bitswap_requests_in_flight
exchange_bitswap_response_bytes_bucket
exchange_bitswap_response_bytes_count
exchange_bitswap_response_bytes_sum
From ee7fef251cd23dc69304f8a0edb85884df794139 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Wed, 9 Apr 2025 20:58:32 +0200
Subject: [PATCH 212/499] feat: ipfs-webui v4.7.0 (#10780)
https://github.com/ipfs/ipfs-webui/releases/tag/v4.7.0
---
core/corehttp/webui.go | 3 ++-
docs/changelogs/v0.35.md | 12 +++++++++++-
2 files changed, 13 insertions(+), 2 deletions(-)
diff --git a/core/corehttp/webui.go b/core/corehttp/webui.go
index 32d76a49d..387a5b9ca 100644
--- a/core/corehttp/webui.go
+++ b/core/corehttp/webui.go
@@ -1,11 +1,12 @@
package corehttp
// WebUI version confirmed to work with this Kubo version
-const WebUIPath = "/ipfs/bafybeibpaa5kqrj4gkemiswbwndjqiryl65cks64ypwtyerxixu56gnvvm" // v4.6.0
+const WebUIPath = "/ipfs/bafybeibfd5kbebqqruouji6ct5qku3tay273g7mt24mmrfzrsfeewaal5y" // v4.7.0
// WebUIPaths is a list of all past webUI paths.
var WebUIPaths = []string{
WebUIPath,
+ "/ipfs/bafybeibpaa5kqrj4gkemiswbwndjqiryl65cks64ypwtyerxixu56gnvvm", // v4.6.0
"/ipfs/bafybeiata4qg7xjtwgor6r5dw63jjxyouenyromrrb4lrewxrlvav7gzgi", // v4.5.0
"/ipfs/bafybeigp3zm7cqoiciqk5anlheenqjsgovp7j7zq6hah4nu6iugdgb4nby", // v4.4.2
"/ipfs/bafybeiatztgdllxnp5p6zu7bdwhjmozsmd7jprff4bdjqjljxtylitvss4", // v4.4.1
diff --git a/docs/changelogs/v0.35.md b/docs/changelogs/v0.35.md
index a41a7040c..0d55c1aa6 100644
--- a/docs/changelogs/v0.35.md
+++ b/docs/changelogs/v0.35.md
@@ -11,6 +11,8 @@ This release was brought to you by the [Shipyard](http://ipshipyard.com/) team.
- [Overview](#overview)
- [๐ฆ Highlights](#-highlights)
- [Dedicated `Reprovider.Strategy` for MFS](#dedicated-reproviderstrategy-for-mfs)
+ - [`Routing.IgnoreProviders`](#routingignoreproviders)
+ - [Grid view in WebUI](#grid-view-in-webui)
- [๐ฆ๏ธ Important dependency updates](#-important-dependency-updates)
- [๐ Changelog](#-changelog)
- [๐จโ๐ฉโ๐งโ๐ฆ Contributors](#-contributors)
@@ -29,15 +31,23 @@ Users relying on the `pinned` strategy can switch to `pinned+mfs` and use MFS al
See [`Reprovider.Strategy`](https://github.com/ipfs/kubo/blob/master/docs/config.md#reproviderstrategy) for more details.
-##### `Routing.IgnoreProviders`
+#### `Routing.IgnoreProviders`
This new option allows ignoring specific peer IDs when returned by the content
routing system as providers of content. See the
[documentation](https://github.com/ipfs/kubo/blob/master/docs/config.md#routingignoreproviders)
for for information.
+#### Grid view in WebUI
+
+The WebUI, accessible at http://127.0.0.1:5001/webui/, now includes support for the grid view on the _Files_ screen:
+
+> 
+
#### ๐ฆ๏ธ Important dependency updates
+- update `ipfs-webui` to [v4.7.0](https://github.com/ipfs/ipfs-webui/releases/tag/v4.7.0)
+
### ๐ Changelog
### ๐จโ๐ฉโ๐งโ๐ฆ Contributors
From fe3106f9a645f3a5bc348b94454012d0dd90b448 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Wed, 9 Apr 2025 21:17:19 +0200
Subject: [PATCH 213/499] feat(config): expose ProviderSearchMaxResults
(#10773)
Replacing hardcoded integer with named default and expose
config option for adjusting it, like we do in Rainbow
https://github.com/ipfs/kubo/pull/10765/files#r2025455848
---
config/internal.go | 1 +
core/node/bitswap.go | 9 ++++++---
docs/changelogs/v0.35.md | 10 ++++------
docs/config.md | 14 +++++++++++---
4 files changed, 22 insertions(+), 12 deletions(-)
diff --git a/config/internal.go b/config/internal.go
index f43746534..fe7e84320 100644
--- a/config/internal.go
+++ b/config/internal.go
@@ -14,5 +14,6 @@ type InternalBitswap struct {
EngineTaskWorkerCount OptionalInteger
MaxOutstandingBytesPerPeer OptionalInteger
ProviderSearchDelay OptionalDuration
+ ProviderSearchMaxResults OptionalInteger
WantHaveReplaceSize OptionalInteger
}
diff --git a/core/node/bitswap.go b/core/node/bitswap.go
index 4bcc97066..2408fe371 100644
--- a/core/node/bitswap.go
+++ b/core/node/bitswap.go
@@ -28,6 +28,7 @@ const (
DefaultEngineTaskWorkerCount = 8
DefaultMaxOutstandingBytesPerPeer = 1 << 20
DefaultProviderSearchDelay = 1000 * time.Millisecond
+ DefaultMaxProviders = 10 // matching BitswapClientDefaultMaxProviders from https://github.com/ipfs/boxo/blob/v0.29.1/bitswap/internal/defaults/defaults.go#L15
DefaultWantHaveReplaceSize = 1024
)
@@ -79,11 +80,13 @@ func Bitswap(provide bool) interface{} {
var provider routing.ContentDiscovery
if provide {
- // We need to hardcode the default because it is an
- // internal setting in boxo.
+ var maxProviders int = DefaultMaxProviders
+ if in.Cfg.Internal.Bitswap != nil {
+ maxProviders = int(in.Cfg.Internal.Bitswap.ProviderSearchMaxResults.WithDefault(DefaultMaxProviders))
+ }
pqm, err := rpqm.New(bitswapNetwork,
in.Rt,
- rpqm.WithMaxProviders(10),
+ rpqm.WithMaxProviders(maxProviders),
rpqm.WithIgnoreProviders(in.Cfg.Routing.IgnoreProviders...),
)
if err != nil {
diff --git a/docs/changelogs/v0.35.md b/docs/changelogs/v0.35.md
index 0d55c1aa6..e9daf0d51 100644
--- a/docs/changelogs/v0.35.md
+++ b/docs/changelogs/v0.35.md
@@ -11,7 +11,7 @@ This release was brought to you by the [Shipyard](http://ipshipyard.com/) team.
- [Overview](#overview)
- [๐ฆ Highlights](#-highlights)
- [Dedicated `Reprovider.Strategy` for MFS](#dedicated-reproviderstrategy-for-mfs)
- - [`Routing.IgnoreProviders`](#routingignoreproviders)
+ - [Additional new configuration options](#additional-new-configuration-options)
- [Grid view in WebUI](#grid-view-in-webui)
- [๐ฆ๏ธ Important dependency updates](#-important-dependency-updates)
- [๐ Changelog](#-changelog)
@@ -31,12 +31,10 @@ Users relying on the `pinned` strategy can switch to `pinned+mfs` and use MFS al
See [`Reprovider.Strategy`](https://github.com/ipfs/kubo/blob/master/docs/config.md#reproviderstrategy) for more details.
-#### `Routing.IgnoreProviders`
+#### Additional new configuration options
-This new option allows ignoring specific peer IDs when returned by the content
-routing system as providers of content. See the
-[documentation](https://github.com/ipfs/kubo/blob/master/docs/config.md#routingignoreproviders)
-for for information.
+- [`Internal.Bitswap.ProviderSearchMaxResults`](https://github.com/ipfs/kubo/blob/master/docs/config.md##internalbitswapprovidersearchmaxresults) for adjusting the maximum number of providers bitswap client should aim at before it stops searching for new ones.
+- [`Routing.IgnoreProviders`](https://github.com/ipfs/kubo/blob/master/docs/config.md#routingignoreproviders) allows ignoring specific peer IDs when returned by the content routing system as providers of content.
#### Grid view in WebUI
diff --git a/docs/config.md b/docs/config.md
index 8ff11a408..367fffb83 100644
--- a/docs/config.md
+++ b/docs/config.md
@@ -79,7 +79,8 @@ config file at runtime.
- [`Internal.Bitswap.EngineBlockstoreWorkerCount`](#internalbitswapengineblockstoreworkercount)
- [`Internal.Bitswap.EngineTaskWorkerCount`](#internalbitswapenginetaskworkercount)
- [`Internal.Bitswap.MaxOutstandingBytesPerPeer`](#internalbitswapmaxoutstandingbytesperpeer)
- - [`Internal.Bitswap.ProviderSearchDelay`](#internalbitswapprovidersearchdelay)
+ - [`Internal.Bitswap.ProviderSearchDelay`](#internalbitswapprovidersearchdelay)
+ - [`Internal.Bitswap.ProviderSearchMaxResults`](#internalbitswapprovidersearchmaxresults)
- [`Internal.UnixFSShardingSizeThreshold`](#internalunixfsshardingsizethreshold)
- [`Ipns`](#ipns)
- [`Ipns.RepublishPeriod`](#ipnsrepublishperiod)
@@ -119,7 +120,7 @@ config file at runtime.
- [`Routing.Type`](#routingtype)
- [`Routing.AcceleratedDHTClient`](#routingaccelerateddhtclient)
- [`Routing.LoopbackAddressesOnLanDHT`](#routingloopbackaddressesonlandht)
- - [`Routing.IgnoreProviders`](#routingignoreproviders)
+ - [`Routing.IgnoreProviders`](#routingignoreproviders)
- [`Routing.Routers`](#routingrouters)
- [`Routing.Routers: Type`](#routingrouters-type)
- [`Routing.Routers: Parameters`](#routingrouters-parameters)
@@ -1181,7 +1182,7 @@ deteriorate the quality provided to less aggressively-wanting peers.
Type: `optionalInteger` (byte count, `null` means default which is 1MB)
-### `Internal.Bitswap.ProviderSearchDelay`
+#### `Internal.Bitswap.ProviderSearchDelay`
This parameter determines how long to wait before looking for providers outside of bitswap.
Other routing systems like the Amino DHT are able to provide results in less than a second, so lowering
@@ -1189,6 +1190,13 @@ this number will allow faster peers lookups in some cases.
Type: `optionalDuration` (`null` means default which is 1s)
+#### `Internal.Bitswap.ProviderSearchMaxResults`
+
+Maximum number of providers bitswap client should aim at before it stops searching for new ones.
+Setting to 0 means unlimited.
+
+Type: `optionalInteger` (`null` means default which is 10)
+
### `Internal.UnixFSShardingSizeThreshold`
The sharding threshold used internally to decide whether a UnixFS directory should be sharded or not.
From 6b55e649186b27c3b17b680b013dfad3c9d6d601 Mon Sep 17 00:00:00 2001
From: Hector Sanjuan
Date: Tue, 15 Apr 2025 22:56:38 +0200
Subject: [PATCH 214/499] feat(config): `ipfs add` and `Import` options for
controling UnixFS DAG Width (#10774)
Co-authored-by: Marcin Rataj
---
config/import.go | 30 +-
config/internal.go | 2 +-
config/profile.go | 28 +-
core/commands/add.go | 81 +++--
core/coreapi/unixfs.go | 16 +
core/coreiface/options/unixfs.go | 59 +++-
core/coreunix/add.go | 115 ++++---
core/node/groups.go | 29 +-
docs/changelogs/v0.35.md | 39 +++
docs/config.md | 116 ++++++-
docs/examples/kubo-as-a-library/go.mod | 2 +-
docs/examples/kubo-as-a-library/go.sum | 4 +-
fuse/readonly/ipfs_test.go | 12 +-
go.mod | 2 +-
go.sum | 4 +-
test/cli/add_test.go | 337 ++++++++++++++++++++-
test/cli/harness/ipfs.go | 23 ++
test/cli/harness/pbinspect.go | 54 ++++
test/cli/testutils/random_deterministic.go | 46 +++
test/cli/testutils/random_files.go | 27 +-
test/dependencies/go.mod | 6 +-
test/dependencies/go.sum | 12 +-
test/sharness/t0032-mount-sharded.sh | 2 +-
test/sharness/t0250-files-api.sh | 4 +-
test/sharness/t0260-sharding.sh | 4 +-
25 files changed, 914 insertions(+), 140 deletions(-)
create mode 100644 test/cli/harness/pbinspect.go
create mode 100644 test/cli/testutils/random_deterministic.go
diff --git a/config/import.go b/config/import.go
index 6ea4d060f..21bf232c1 100644
--- a/config/import.go
+++ b/config/import.go
@@ -1,11 +1,18 @@
package config
+import (
+ "github.com/ipfs/boxo/ipld/unixfs/importer/helpers"
+ "github.com/ipfs/boxo/ipld/unixfs/io"
+)
+
const (
DefaultCidVersion = 0
DefaultUnixFSRawLeaves = false
DefaultUnixFSChunker = "size-262144"
DefaultHashFunction = "sha2-256"
+ DefaultUnixFSHAMTDirectorySizeThreshold = "256KiB" // https://github.com/ipfs/boxo/blob/6c5a07602aed248acc86598f30ab61923a54a83e/ipld/unixfs/io/directory.go#L26
+
// DefaultBatchMaxNodes controls the maximum number of nodes in a
// write-batch. The total size of the batch is limited by
// BatchMaxnodes and BatchMaxSize.
@@ -14,15 +21,26 @@ const (
// write-batch. The total size of the batch is limited by
// BatchMaxnodes and BatchMaxSize.
DefaultBatchMaxSize = 100 << 20 // 20MiB
+
+)
+
+var (
+ DefaultUnixFSFileMaxLinks = int64(helpers.DefaultLinksPerBlock)
+ DefaultUnixFSDirectoryMaxLinks = int64(0)
+ DefaultUnixFSHAMTDirectoryMaxFanout = int64(io.DefaultShardWidth)
)
// Import configures the default options for ingesting data. This affects commands
// that ingest data, such as 'ipfs add', 'ipfs dag put, 'ipfs block put', 'ipfs files write'.
type Import struct {
- CidVersion OptionalInteger
- UnixFSRawLeaves Flag
- UnixFSChunker OptionalString
- HashFunction OptionalString
- BatchMaxNodes OptionalInteger
- BatchMaxSize OptionalInteger
+ CidVersion OptionalInteger
+ UnixFSRawLeaves Flag
+ UnixFSChunker OptionalString
+ HashFunction OptionalString
+ UnixFSFileMaxLinks OptionalInteger
+ UnixFSDirectoryMaxLinks OptionalInteger
+ UnixFSHAMTDirectoryMaxFanout OptionalInteger
+ UnixFSHAMTDirectorySizeThreshold OptionalString
+ BatchMaxNodes OptionalInteger
+ BatchMaxSize OptionalInteger
}
diff --git a/config/internal.go b/config/internal.go
index fe7e84320..f8300f540 100644
--- a/config/internal.go
+++ b/config/internal.go
@@ -3,7 +3,7 @@ package config
type Internal struct {
// All marked as omitempty since we are expecting to make changes to all subcomponents of Internal
Bitswap *InternalBitswap `json:",omitempty"`
- UnixFSShardingSizeThreshold *OptionalString `json:",omitempty"`
+ UnixFSShardingSizeThreshold *OptionalString `json:",omitempty"` // moved to Import.UnixFSHAMTDirectorySizeThreshold
Libp2pForceReachability *OptionalString `json:",omitempty"`
BackupBootstrapInterval *OptionalDuration `json:",omitempty"`
}
diff --git a/config/profile.go b/config/profile.go
index 69aaf66dc..a26d74f99 100644
--- a/config/profile.go
+++ b/config/profile.go
@@ -266,24 +266,44 @@ fetching may be degraded.
},
},
"legacy-cid-v0": {
- Description: `Makes UnixFS import produce legacy CIDv0 with no raw leaves, sha2-256 and 256 KiB chunks.`,
-
+ Description: `Makes UnixFS import produce legacy CIDv0 with no raw leaves, sha2-256 and 256 KiB chunks. This is likely the least optimal preset, use only if legacy behavior is required.`,
Transform: func(c *Config) error {
c.Import.CidVersion = *NewOptionalInteger(0)
c.Import.UnixFSRawLeaves = False
c.Import.UnixFSChunker = *NewOptionalString("size-262144")
c.Import.HashFunction = *NewOptionalString("sha2-256")
+ c.Import.UnixFSFileMaxLinks = *NewOptionalInteger(174)
+ c.Import.UnixFSDirectoryMaxLinks = *NewOptionalInteger(0)
+ c.Import.UnixFSHAMTDirectoryMaxFanout = *NewOptionalInteger(256)
+ c.Import.UnixFSHAMTDirectorySizeThreshold = *NewOptionalString("256KiB")
return nil
},
},
"test-cid-v1": {
- Description: `Makes UnixFS import produce modern CIDv1 with raw leaves, sha2-256 and 1 MiB chunks.`,
-
+ Description: `Makes UnixFS import produce CIDv1 with raw leaves, sha2-256 and 1 MiB chunks (max 174 links per file, 256 per HAMT node, switch dir to HAMT above 256KiB).`,
Transform: func(c *Config) error {
c.Import.CidVersion = *NewOptionalInteger(1)
c.Import.UnixFSRawLeaves = True
c.Import.UnixFSChunker = *NewOptionalString("size-1048576")
c.Import.HashFunction = *NewOptionalString("sha2-256")
+ c.Import.UnixFSFileMaxLinks = *NewOptionalInteger(174)
+ c.Import.UnixFSDirectoryMaxLinks = *NewOptionalInteger(0)
+ c.Import.UnixFSHAMTDirectoryMaxFanout = *NewOptionalInteger(256)
+ c.Import.UnixFSHAMTDirectorySizeThreshold = *NewOptionalString("256KiB")
+ return nil
+ },
+ },
+ "test-cid-v1-wide": {
+ Description: `Makes UnixFS import produce CIDv1 with raw leaves, sha2-256 and 1MiB chunks and wider file DAGs (max 1024 links per every node type, switch dir to HAMT above 1MiB).`,
+ Transform: func(c *Config) error {
+ c.Import.CidVersion = *NewOptionalInteger(1)
+ c.Import.UnixFSRawLeaves = True
+ c.Import.UnixFSChunker = *NewOptionalString("size-1048576") // 1MiB
+ c.Import.HashFunction = *NewOptionalString("sha2-256")
+ c.Import.UnixFSFileMaxLinks = *NewOptionalInteger(1024)
+ c.Import.UnixFSDirectoryMaxLinks = *NewOptionalInteger(0) // no limit here, use size-based Import.UnixFSHAMTDirectorySizeThreshold instead
+ c.Import.UnixFSHAMTDirectoryMaxFanout = *NewOptionalInteger(1024)
+ c.Import.UnixFSHAMTDirectorySizeThreshold = *NewOptionalString("1MiB") // 1MiB
return nil
},
},
diff --git a/core/commands/add.go b/core/commands/add.go
index a1642f127..f800e4f42 100644
--- a/core/commands/add.go
+++ b/core/commands/add.go
@@ -37,23 +37,26 @@ type AddEvent struct {
}
const (
- quietOptionName = "quiet"
- quieterOptionName = "quieter"
- silentOptionName = "silent"
- progressOptionName = "progress"
- trickleOptionName = "trickle"
- wrapOptionName = "wrap-with-directory"
- onlyHashOptionName = "only-hash"
- chunkerOptionName = "chunker"
- pinOptionName = "pin"
- rawLeavesOptionName = "raw-leaves"
- noCopyOptionName = "nocopy"
- fstoreCacheOptionName = "fscache"
- cidVersionOptionName = "cid-version"
- hashOptionName = "hash"
- inlineOptionName = "inline"
- inlineLimitOptionName = "inline-limit"
- toFilesOptionName = "to-files"
+ quietOptionName = "quiet"
+ quieterOptionName = "quieter"
+ silentOptionName = "silent"
+ progressOptionName = "progress"
+ trickleOptionName = "trickle"
+ wrapOptionName = "wrap-with-directory"
+ onlyHashOptionName = "only-hash"
+ chunkerOptionName = "chunker"
+ pinOptionName = "pin"
+ rawLeavesOptionName = "raw-leaves"
+ maxFileLinksOptionName = "max-file-links"
+ maxDirectoryLinksOptionName = "max-directory-links"
+ maxHAMTFanoutOptionName = "max-hamt-fanout"
+ noCopyOptionName = "nocopy"
+ fstoreCacheOptionName = "fscache"
+ cidVersionOptionName = "cid-version"
+ hashOptionName = "hash"
+ inlineOptionName = "inline"
+ inlineLimitOptionName = "inline-limit"
+ toFilesOptionName = "to-files"
preserveModeOptionName = "preserve-mode"
preserveMtimeOptionName = "preserve-mtime"
@@ -143,6 +146,9 @@ new flags may be added in the future. It is not guaranteed for the implicit
defaults of 'ipfs add' to remain the same in future Kubo releases, or for other
IPFS software to use the same import parameters as Kubo.
+Use Import.* configuration options to override global implicit defaults:
+https://github.com/ipfs/kubo/blob/master/docs/config.md#import
+
If you need to back up or transport content-addressed data using a non-IPFS
medium, CID can be preserved with CAR files.
See 'dag export' and 'dag import' for more information.
@@ -166,12 +172,15 @@ See 'dag export' and 'dag import' for more information.
cmds.BoolOption(trickleOptionName, "t", "Use trickle-dag format for dag generation."),
cmds.BoolOption(onlyHashOptionName, "n", "Only chunk and hash - do not write to disk."),
cmds.BoolOption(wrapOptionName, "w", "Wrap files with a directory object."),
- cmds.StringOption(chunkerOptionName, "s", "Chunking algorithm, size-[bytes], rabin-[min]-[avg]-[max] or buzhash"),
- cmds.BoolOption(rawLeavesOptionName, "Use raw blocks for leaf nodes."),
+ cmds.StringOption(chunkerOptionName, "s", "Chunking algorithm, size-[bytes], rabin-[min]-[avg]-[max] or buzhash. Default: Import.UnixFSChunker"),
+ cmds.BoolOption(rawLeavesOptionName, "Use raw blocks for leaf nodes. Default: Import.UnixFSRawLeaves"),
+ cmds.IntOption(maxFileLinksOptionName, "Limit the maximum number of links in UnixFS file nodes to this value. (experimental) Default: Import.UnixFSFileMaxLinks"),
+ cmds.IntOption(maxDirectoryLinksOptionName, "Limit the maximum number of links in UnixFS basic directory nodes to this value. Default: Import.UnixFSDirectoryMaxLinks. WARNING: experimental, Import.UnixFSHAMTThreshold is a safer alternative."),
+ cmds.IntOption(maxHAMTFanoutOptionName, "Limit the maximum number of links of a UnixFS HAMT directory node to this (power of 2, multiple of 8). Default: Import.UnixFSHAMTDirectoryMaxFanout WARNING: experimental, see Import.UnixFSHAMTDirectorySizeThreshold as well."),
cmds.BoolOption(noCopyOptionName, "Add the file using filestore. Implies raw-leaves. (experimental)"),
cmds.BoolOption(fstoreCacheOptionName, "Check the filestore for pre-existing blocks. (experimental)"),
- cmds.IntOption(cidVersionOptionName, "CID version. Defaults to 0 unless an option that depends on CIDv1 is passed. Passing version 1 will cause the raw-leaves option to default to true."),
- cmds.StringOption(hashOptionName, "Hash function to use. Implies CIDv1 if not sha2-256. (experimental)"),
+ cmds.IntOption(cidVersionOptionName, "CID version. Defaults to 0 unless an option that depends on CIDv1 is passed. Passing version 1 will cause the raw-leaves option to default to true. Default: Import.CidVersion"),
+ cmds.StringOption(hashOptionName, "Hash function to use. Implies CIDv1 if not sha2-256. Default: Import.HashFunction"),
cmds.BoolOption(inlineOptionName, "Inline small blocks into CIDs. (experimental)"),
cmds.IntOption(inlineLimitOptionName, "Maximum block size to inline. (experimental)").WithDefault(32),
cmds.BoolOption(pinOptionName, "Pin locally to protect added files from garbage collection.").WithDefault(true),
@@ -222,6 +231,9 @@ See 'dag export' and 'dag import' for more information.
chunker, _ := req.Options[chunkerOptionName].(string)
dopin, _ := req.Options[pinOptionName].(bool)
rawblks, rbset := req.Options[rawLeavesOptionName].(bool)
+ maxFileLinks, maxFileLinksSet := req.Options[maxFileLinksOptionName].(int)
+ maxDirectoryLinks, maxDirectoryLinksSet := req.Options[maxDirectoryLinksOptionName].(int)
+ maxHAMTFanout, maxHAMTFanoutSet := req.Options[maxHAMTFanoutOptionName].(int)
nocopy, _ := req.Options[noCopyOptionName].(bool)
fscache, _ := req.Options[fstoreCacheOptionName].(bool)
cidVer, cidVerSet := req.Options[cidVersionOptionName].(int)
@@ -253,6 +265,21 @@ See 'dag export' and 'dag import' for more information.
rawblks = cfg.Import.UnixFSRawLeaves.WithDefault(config.DefaultUnixFSRawLeaves)
}
+ if !maxFileLinksSet && !cfg.Import.UnixFSFileMaxLinks.IsDefault() {
+ maxFileLinksSet = true
+ maxFileLinks = int(cfg.Import.UnixFSFileMaxLinks.WithDefault(config.DefaultUnixFSFileMaxLinks))
+ }
+
+ if !maxDirectoryLinksSet && !cfg.Import.UnixFSDirectoryMaxLinks.IsDefault() {
+ maxDirectoryLinksSet = true
+ maxDirectoryLinks = int(cfg.Import.UnixFSDirectoryMaxLinks.WithDefault(config.DefaultUnixFSDirectoryMaxLinks))
+ }
+
+ if !maxHAMTFanoutSet && !cfg.Import.UnixFSHAMTDirectoryMaxFanout.IsDefault() {
+ maxHAMTFanoutSet = true
+ maxHAMTFanout = int(cfg.Import.UnixFSHAMTDirectoryMaxFanout.WithDefault(config.DefaultUnixFSHAMTDirectoryMaxFanout))
+ }
+
// Storing optional mode or mtime (UnixFS 1.5) requires root block
// to always be 'dag-pb' and not 'raw'. Below adjusts raw-leaves setting, if possible.
if preserveMode || preserveMtime || mode != 0 || mtime != 0 {
@@ -329,6 +356,18 @@ See 'dag export' and 'dag import' for more information.
opts = append(opts, options.Unixfs.RawLeaves(rawblks))
}
+ if maxFileLinksSet {
+ opts = append(opts, options.Unixfs.MaxFileLinks(maxFileLinks))
+ }
+
+ if maxDirectoryLinksSet {
+ opts = append(opts, options.Unixfs.MaxDirectoryLinks(maxDirectoryLinks))
+ }
+
+ if maxHAMTFanoutSet {
+ opts = append(opts, options.Unixfs.MaxHAMTFanout(maxHAMTFanout))
+ }
+
if trickle {
opts = append(opts, options.Unixfs.Layout(options.TrickleLayout))
}
diff --git a/core/coreapi/unixfs.go b/core/coreapi/unixfs.go
index 3a74d3046..eece797a5 100644
--- a/core/coreapi/unixfs.go
+++ b/core/coreapi/unixfs.go
@@ -50,6 +50,12 @@ func (api *UnixfsAPI) Add(ctx context.Context, files files.Node, opts ...options
attribute.Int("inlinelimit", settings.InlineLimit),
attribute.Bool("rawleaves", settings.RawLeaves),
attribute.Bool("rawleavesset", settings.RawLeavesSet),
+ attribute.Int("maxfilelinks", settings.MaxFileLinks),
+ attribute.Bool("maxfilelinksset", settings.MaxFileLinksSet),
+ attribute.Int("maxdirectorylinks", settings.MaxDirectoryLinks),
+ attribute.Bool("maxdirectorylinksset", settings.MaxDirectoryLinksSet),
+ attribute.Int("maxhamtfanout", settings.MaxHAMTFanout),
+ attribute.Bool("maxhamtfanoutset", settings.MaxHAMTFanoutSet),
attribute.Int("layout", int(settings.Layout)),
attribute.Bool("pin", settings.Pin),
attribute.Bool("onlyhash", settings.OnlyHash),
@@ -132,6 +138,16 @@ func (api *UnixfsAPI) Add(ctx context.Context, files files.Node, opts ...options
fileAdder.Pin = settings.Pin && !settings.OnlyHash
fileAdder.Silent = settings.Silent
fileAdder.RawLeaves = settings.RawLeaves
+ if settings.MaxFileLinksSet {
+ fileAdder.MaxLinks = settings.MaxFileLinks
+ }
+ if settings.MaxDirectoryLinksSet {
+ fileAdder.MaxDirectoryLinks = settings.MaxDirectoryLinks
+ }
+
+ if settings.MaxHAMTFanoutSet {
+ fileAdder.MaxHAMTFanout = settings.MaxHAMTFanout
+ }
fileAdder.NoCopy = settings.NoCopy
fileAdder.CidBuilder = prefix
fileAdder.PreserveMode = settings.PreserveMode
diff --git a/core/coreiface/options/unixfs.go b/core/coreiface/options/unixfs.go
index c837ec1b2..20f18d1e0 100644
--- a/core/coreiface/options/unixfs.go
+++ b/core/coreiface/options/unixfs.go
@@ -7,6 +7,8 @@ import (
"time"
dag "github.com/ipfs/boxo/ipld/merkledag"
+ "github.com/ipfs/boxo/ipld/unixfs/importer/helpers"
+ "github.com/ipfs/boxo/ipld/unixfs/io"
cid "github.com/ipfs/go-cid"
mh "github.com/multiformats/go-multihash"
)
@@ -22,10 +24,16 @@ type UnixfsAddSettings struct {
CidVersion int
MhType uint64
- Inline bool
- InlineLimit int
- RawLeaves bool
- RawLeavesSet bool
+ Inline bool
+ InlineLimit int
+ RawLeaves bool
+ RawLeavesSet bool
+ MaxFileLinks int
+ MaxFileLinksSet bool
+ MaxDirectoryLinks int
+ MaxDirectoryLinksSet bool
+ MaxHAMTFanout int
+ MaxHAMTFanoutSet bool
Chunker string
Layout Layout
@@ -60,10 +68,16 @@ func UnixfsAddOptions(opts ...UnixfsAddOption) (*UnixfsAddSettings, cid.Prefix,
CidVersion: -1,
MhType: mh.SHA2_256,
- Inline: false,
- InlineLimit: 32,
- RawLeaves: false,
- RawLeavesSet: false,
+ Inline: false,
+ InlineLimit: 32,
+ RawLeaves: false,
+ RawLeavesSet: false,
+ MaxFileLinks: helpers.DefaultLinksPerBlock,
+ MaxFileLinksSet: false,
+ MaxDirectoryLinks: 0,
+ MaxDirectoryLinksSet: false,
+ MaxHAMTFanout: io.DefaultShardWidth,
+ MaxHAMTFanoutSet: false,
Chunker: "size-262144",
Layout: BalancedLayout,
@@ -190,6 +204,35 @@ func (unixfsOpts) RawLeaves(enable bool) UnixfsAddOption {
}
}
+// MaxFileLinks specifies the maximum number of children for UnixFS file
+// nodes.
+func (unixfsOpts) MaxFileLinks(n int) UnixfsAddOption {
+ return func(settings *UnixfsAddSettings) error {
+ settings.MaxFileLinks = n
+ settings.MaxFileLinksSet = true
+ return nil
+ }
+}
+
+// MaxDirectoryLinks specifies the maximum number of children for UnixFS basic
+// directory nodes.
+func (unixfsOpts) MaxDirectoryLinks(n int) UnixfsAddOption {
+ return func(settings *UnixfsAddSettings) error {
+ settings.MaxDirectoryLinks = n
+ settings.MaxDirectoryLinksSet = true
+ return nil
+ }
+}
+
+// MaxHAMTFanout specifies the maximum width of the HAMT directory shards.
+func (unixfsOpts) MaxHAMTFanout(n int) UnixfsAddOption {
+ return func(settings *UnixfsAddSettings) error {
+ settings.MaxHAMTFanout = n
+ settings.MaxHAMTFanoutSet = true
+ return nil
+ }
+}
+
// Inline tells the adder to inline small blocks into CIDs
func (unixfsOpts) Inline(enable bool) UnixfsAddOption {
return func(settings *UnixfsAddSettings) error {
diff --git a/core/coreunix/add.go b/core/coreunix/add.go
index 5f7cbb610..d9dc555d2 100644
--- a/core/coreunix/add.go
+++ b/core/coreunix/add.go
@@ -19,6 +19,7 @@ import (
"github.com/ipfs/boxo/ipld/unixfs/importer/balanced"
ihelper "github.com/ipfs/boxo/ipld/unixfs/importer/helpers"
"github.com/ipfs/boxo/ipld/unixfs/importer/trickle"
+ uio "github.com/ipfs/boxo/ipld/unixfs/io"
"github.com/ipfs/boxo/mfs"
"github.com/ipfs/boxo/path"
pin "github.com/ipfs/boxo/pinning/pinner"
@@ -51,38 +52,43 @@ func NewAdder(ctx context.Context, p pin.Pinner, bs bstore.GCLocker, ds ipld.DAG
bufferedDS := ipld.NewBufferedDAG(ctx, ds)
return &Adder{
- ctx: ctx,
- pinning: p,
- gcLocker: bs,
- dagService: ds,
- bufferedDS: bufferedDS,
- Progress: false,
- Pin: true,
- Trickle: false,
- Chunker: "",
+ ctx: ctx,
+ pinning: p,
+ gcLocker: bs,
+ dagService: ds,
+ bufferedDS: bufferedDS,
+ Progress: false,
+ Pin: true,
+ Trickle: false,
+ MaxLinks: ihelper.DefaultLinksPerBlock,
+ MaxHAMTFanout: uio.DefaultShardWidth,
+ Chunker: "",
}, nil
}
// Adder holds the switches passed to the `add` command.
type Adder struct {
- ctx context.Context
- pinning pin.Pinner
- gcLocker bstore.GCLocker
- dagService ipld.DAGService
- bufferedDS *ipld.BufferedDAG
- Out chan<- interface{}
- Progress bool
- Pin bool
- Trickle bool
- RawLeaves bool
- Silent bool
- NoCopy bool
- Chunker string
- mroot *mfs.Root
- unlocker bstore.Unlocker
- tempRoot cid.Cid
- CidBuilder cid.Builder
- liveNodes uint64
+ ctx context.Context
+ pinning pin.Pinner
+ gcLocker bstore.GCLocker
+ dagService ipld.DAGService
+ bufferedDS *ipld.BufferedDAG
+ Out chan<- interface{}
+ Progress bool
+ Pin bool
+ Trickle bool
+ RawLeaves bool
+ MaxLinks int
+ MaxDirectoryLinks int
+ MaxHAMTFanout int
+ Silent bool
+ NoCopy bool
+ Chunker string
+ mroot *mfs.Root
+ unlocker bstore.Unlocker
+ tempRoot cid.Cid
+ CidBuilder cid.Builder
+ liveNodes uint64
PreserveMode bool
PreserveMtime bool
@@ -94,12 +100,13 @@ func (adder *Adder) mfsRoot() (*mfs.Root, error) {
if adder.mroot != nil {
return adder.mroot, nil
}
- rnode := unixfs.EmptyDirNode()
- err := rnode.SetCidBuilder(adder.CidBuilder)
- if err != nil {
- return nil, err
- }
- mr, err := mfs.NewRoot(adder.ctx, adder.dagService, rnode, nil)
+
+ // Note, this adds it to DAGService already.
+ mr, err := mfs.NewEmptyRoot(adder.ctx, adder.dagService, nil, mfs.MkdirOpts{
+ CidBuilder: adder.CidBuilder,
+ MaxLinks: adder.MaxDirectoryLinks,
+ MaxHAMTFanout: adder.MaxHAMTFanout,
+ })
if err != nil {
return nil, err
}
@@ -119,10 +126,15 @@ func (adder *Adder) add(reader io.Reader) (ipld.Node, error) {
return nil, err
}
+ maxLinks := ihelper.DefaultLinksPerBlock
+ if adder.MaxLinks > 0 {
+ maxLinks = adder.MaxLinks
+ }
+
params := ihelper.DagBuilderParams{
Dagserv: adder.bufferedDS,
RawLeaves: adder.RawLeaves,
- Maxlinks: ihelper.DefaultLinksPerBlock,
+ Maxlinks: maxLinks,
NoCopy: adder.NoCopy,
CidBuilder: adder.CidBuilder,
FileMode: adder.FileMode,
@@ -252,12 +264,15 @@ func (adder *Adder) addNode(node ipld.Node, path string) error {
if err != nil {
return err
}
+
dir := gopath.Dir(path)
if dir != "." {
opts := mfs.MkdirOpts{
- Mkparents: true,
- Flush: false,
- CidBuilder: adder.CidBuilder,
+ Mkparents: true,
+ Flush: false,
+ CidBuilder: adder.CidBuilder,
+ MaxLinks: adder.MaxDirectoryLinks,
+ MaxHAMTFanout: adder.MaxHAMTFanout,
}
if err := mfs.Mkdir(mr, dir, opts); err != nil {
return err
@@ -460,12 +475,14 @@ func (adder *Adder) addDir(ctx context.Context, path string, dir files.Directory
// if we need to store mode or modification time then create a new root which includes that data
if toplevel && (adder.FileMode != 0 || !adder.FileMtime.IsZero()) {
- nd := unixfs.EmptyDirNodeWithStat(adder.FileMode, adder.FileMtime)
- err := nd.SetCidBuilder(adder.CidBuilder)
- if err != nil {
- return err
- }
- mr, err := mfs.NewRoot(ctx, adder.dagService, nd, nil)
+ mr, err := mfs.NewEmptyRoot(ctx, adder.dagService, nil,
+ mfs.MkdirOpts{
+ CidBuilder: adder.CidBuilder,
+ MaxLinks: adder.MaxDirectoryLinks,
+ MaxHAMTFanout: adder.MaxHAMTFanout,
+ ModTime: adder.FileMtime,
+ Mode: adder.FileMode,
+ })
if err != nil {
return err
}
@@ -478,11 +495,13 @@ func (adder *Adder) addDir(ctx context.Context, path string, dir files.Directory
return err
}
err = mfs.Mkdir(mr, path, mfs.MkdirOpts{
- Mkparents: true,
- Flush: false,
- CidBuilder: adder.CidBuilder,
- Mode: adder.FileMode,
- ModTime: adder.FileMtime,
+ Mkparents: true,
+ Flush: false,
+ CidBuilder: adder.CidBuilder,
+ Mode: adder.FileMode,
+ ModTime: adder.FileMtime,
+ MaxLinks: adder.MaxDirectoryLinks,
+ MaxHAMTFanout: adder.MaxHAMTFanout,
})
if err != nil {
return err
diff --git a/core/node/groups.go b/core/node/groups.go
index e8f9739c3..4a471f170 100644
--- a/core/node/groups.go
+++ b/core/node/groups.go
@@ -408,20 +408,29 @@ func IPFS(ctx context.Context, bcfg *BuildCfg) fx.Option {
return fx.Error(err)
}
+ // Migrate users of deprecated Experimental.ShardingEnabled flag
+ if cfg.Experimental.ShardingEnabled {
+ logger.Fatal("The `Experimental.ShardingEnabled` field is no longer used, please remove it from the config. Use Import.UnixFSHAMTDirectorySizeThreshold instead.")
+ }
+ if !cfg.Internal.UnixFSShardingSizeThreshold.IsDefault() {
+ msg := "The `Internal.UnixFSShardingSizeThreshold` field was renamed to `Import.UnixFSHAMTDirectorySizeThreshold`. Please update your config.\n"
+ if !cfg.Import.UnixFSHAMTDirectorySizeThreshold.IsDefault() {
+ logger.Fatal(msg) // conflicting values, hard fail
+ }
+ logger.Error(msg)
+ cfg.Import.UnixFSHAMTDirectorySizeThreshold = *cfg.Internal.UnixFSShardingSizeThreshold
+ }
+
// Auto-sharding settings
- shardSizeString := cfg.Internal.UnixFSShardingSizeThreshold.WithDefault("256kiB")
- shardSizeInt, err := humanize.ParseBytes(shardSizeString)
+ shardingThresholdString := cfg.Import.UnixFSHAMTDirectorySizeThreshold.WithDefault(config.DefaultUnixFSHAMTDirectorySizeThreshold)
+ shardSingThresholdInt, err := humanize.ParseBytes(shardingThresholdString)
if err != nil {
return fx.Error(err)
}
- uio.HAMTShardingSize = int(shardSizeInt)
-
- // Migrate users of deprecated Experimental.ShardingEnabled flag
- if cfg.Experimental.ShardingEnabled {
- logger.Fatal("The `Experimental.ShardingEnabled` field is no longer used, please remove it from the config.\n" +
- "go-ipfs now automatically shards when directory block is bigger than `" + shardSizeString + "`.\n" +
- "If you need to restore the old behavior (sharding everything) set `Internal.UnixFSShardingSizeThreshold` to `1B`.\n")
- }
+ shardMaxFanout := cfg.Import.UnixFSHAMTDirectoryMaxFanout.WithDefault(config.DefaultUnixFSHAMTDirectoryMaxFanout)
+ // TODO: avoid overriding this globally, see if we can extend Directory interface like Get/SetMaxLinks from https://github.com/ipfs/boxo/pull/906
+ uio.HAMTShardingSize = int(shardSingThresholdInt)
+ uio.DefaultShardWidth = int(shardMaxFanout)
return fx.Options(
bcfgOpts,
diff --git a/docs/changelogs/v0.35.md b/docs/changelogs/v0.35.md
index e9daf0d51..bc3a857f8 100644
--- a/docs/changelogs/v0.35.md
+++ b/docs/changelogs/v0.35.md
@@ -13,6 +13,10 @@ This release was brought to you by the [Shipyard](http://ipshipyard.com/) team.
- [Dedicated `Reprovider.Strategy` for MFS](#dedicated-reproviderstrategy-for-mfs)
- [Additional new configuration options](#additional-new-configuration-options)
- [Grid view in WebUI](#grid-view-in-webui)
+ - [Enhanced DAG-Shaping Controls for `ipfs add`](#enhanced-dag-shaping-controls-for-ipfs-add)
+ - [New `ipfs add` Options](#new-ipfs-add-options)
+ - [Persistent `Import.*` Configuration](#persistent-import-configuration)
+ - [Updated Configuration Profiles](#updated-configuration-profiles)
- [๐ฆ๏ธ Important dependency updates](#-important-dependency-updates)
- [๐ Changelog](#-changelog)
- [๐จโ๐ฉโ๐งโ๐ฆ Contributors](#-contributors)
@@ -42,6 +46,41 @@ The WebUI, accessible at http://127.0.0.1:5001/webui/, now includes support for
> 
+#### Enhanced DAG-Shaping Controls for `ipfs add`
+
+This release advances CIDv1 support by introducing fine-grained control over UnixFS DAG shaping during data ingestion with the `ipfs add` command.
+
+Wider DAG trees (more links per node, higher fanout, larger thresholds) are beneficial for large files and directories with many files, reducing tree depth and lookup latency in high-latency networks, but they increase node size, straining memory and CPU on resource-constrained devices. Narrower trees (lower link count, lower fanout, smaller thresholds) are preferable for smaller directories, frequent updates, or low-power clients, minimizing overhead and ensuring compatibility, though they may increase traversal steps for very large datasets.
+
+Kubo now allows users to act on these tradeoffs and customize the width of the DAG created by `ipfs add` command.
+
+##### New `ipfs add` Options
+
+Three new options allow you to override default settings for specific import operations:
+
+- `--max-file-links`: Sets the maximum number of child links for a single file chunk.
+- `--max-directory-links`: Defines the maximum number of child entries in a "basic" (single-chunk) directory.
+ - Note: Directories exceeding this limit or the `Import.UnixFSHAMTDirectorySizeThreshold` are converted to HAMT-based (sharded across multiple blocks) structures.
+- `--max-hamt-fanout`: Specifies the maximum number of child nodes for HAMT internal structures.
+
+##### Persistent `Import.*` Configuration
+
+You can set default values for these options using the following configuration settings:
+- [`Import.UnixFSFileMaxLinks`](https://github.com/ipfs/kubo/blob/master/docs/config.md#importunixfsfilemaxlinks)
+- [`Import.UnixFSDirectoryMaxLinks`](https://github.com/ipfs/kubo/blob/master/docs/config.md#importunixfsdirectorymaxlinks)
+- [`Import.UnixFSHAMTDirectoryMaxFanout`](https://github.com/ipfs/kubo/blob/master/docs/config.md#importunixfshamtdirectorymaxfanout)
+- [`Import.UnixFSHAMTDirectorySizeThreshold`](https://github.com/ipfs/kubo/blob/master/docs/config.md#importunixfshamtdirectorysizethreshold)
+
+##### Updated Configuration Profiles
+
+The release updated configuration [profiles](https://github.com/ipfs/kubo/blob/master/docs/config.md#profiles) to incorporate these new `Import.*` settings:
+- Updated Profile: `test-cid-v1` now includes current defaults as explicit `Import.UnixFSFileMaxLinks=174`, `Import.UnixFSDirectoryMaxLinks=0`, `Import.UnixFSHAMTDirectoryMaxFanout=256` and `Import.UnixFSHAMTDirectorySizeThreshold=256KiB`
+- New Profile: `test-cid-v1-wide` adopts experimental directory DAG-shaping defaults, increasing the maximum file DAG width from 174 to 1024, HAMT fanout from 256 to 1024, and raising the HAMT directory sharding threshold from 256KiB to 1MiB, aligning with 1MiB file chunks.
+ - Feedback: Try it out and share your thoughts at [discuss.ipfs.tech/t/should-we-profile-cids](https://discuss.ipfs.tech/t/should-we-profile-cids/18507) or [ipfs/specs#499](https://github.com/ipfs/specs/pull/499).
+
+> [!TIP]
+> Apply one of CIDv1 test [profiles](https://github.com/ipfs/kubo/blob/master/docs/config.md#profiles) with `ipfs config profile apply test-cid-v1[-wide]`.
+
#### ๐ฆ๏ธ Important dependency updates
- update `ipfs-webui` to [v4.7.0](https://github.com/ipfs/ipfs-webui/releases/tag/v4.7.0)
diff --git a/docs/config.md b/docs/config.md
index 367fffb83..1ec5677db 100644
--- a/docs/config.md
+++ b/docs/config.md
@@ -185,6 +185,10 @@ config file at runtime.
- [`Import.HashFunction`](#importhashfunction)
- [`Import.BatchMaxNodes`](#importbatchmaxnodes)
- [`Import.BatchMaxSize`](#importbatchmaxsize)
+ - [`Import.UnixFSFileMaxLinks`](#importunixfsfilemaxlinks)
+ - [`Import.UnixFSDirectoryMaxLinks`](#importunixfsdirectorymaxlinks)
+ - [`Import.UnixFSHAMTDirectoryMaxFanout`](#importunixfshamtdirectorymaxfanout)
+ - [`Import.UnixFSHAMTDirectorySizeThreshold`](#importunixfshamtdirectorysizethreshold)
- [`Version`](#version)
- [`Version.AgentSuffix`](#versionagentsuffix)
- [`Version.SwarmCheckEnabled`](#versionswarmcheckenabled)
@@ -1199,15 +1203,7 @@ Type: `optionalInteger` (`null` means default which is 10)
### `Internal.UnixFSShardingSizeThreshold`
-The sharding threshold used internally to decide whether a UnixFS directory should be sharded or not.
-This value is not strictly related to the size of the UnixFS directory block and any increases in
-the threshold should come with being careful that block sizes stay under 2MiB in order for them to be
-reliably transferable through the networking stack (IPFS peers on the public swarm tend to ignore requests for blocks bigger than 2MiB).
-
-Decreasing this value to 1B is functionally equivalent to the previous experimental sharding option to
-shard all directories.
-
-Type: `optionalBytes` (`null` means default which is 256KiB)
+**MOVED:** see [`Import.UnixFSHAMTDirectorySizeThreshold`](#importunixfshamtdirectorysizethreshold)
## `Ipns`
@@ -2560,6 +2556,80 @@ Default: `20971520` (20MiB)
Type: `optionalInteger`
+### `Import.UnixFSFileMaxLinks`
+
+The maximum number of links that a node part of a UnixFS File can have
+when building the DAG while importing.
+
+This setting controls both the fanout in files that are chunked into several
+blocks and grouped as a Unixfs (dag-pb) DAG.
+
+Default: `174`
+
+Type: `optionalInteger`
+
+### `Import.UnixFSDirectoryMaxLinks`
+
+The maximum number of links that a node part of a UnixFS basic directory can
+have when building the DAG while importing.
+
+This setting controls both the fanout for basic, non-HAMT folder nodes. It
+sets a limit after which directories are converted to a HAMT-based structure.
+
+When unset (0), no limit exists for chilcren. Directories will be converted to
+HAMTs based on their estimated size only.
+
+This setting will cause basic directories to be converted to HAMTs when they
+exceed the maximum number of children. This happens transparently during the
+add process. The fanout of HAMT nodes is controlled by `MaxHAMTFanout`.
+
+Commands affected: `ipfs add`
+
+Default: `0` (no limit, because [`Import.UnixFSHAMTDirectorySizeThreshold`](#importunixfshamtdirectorysizethreshold) triggers controls when to switch to HAMT sharding when a directory grows too big)
+
+Type: `optionalInteger`
+
+### `Import.UnixFSHAMTDirectoryMaxFanout`
+
+The maximum number of children that a node part of a Unixfs HAMT directory
+(aka sharded directory) can have.
+
+HAMT directory have unlimited children and are used when basic directories
+become too big or reach `MaxLinks`. A HAMT is an structure made of unixfs
+nodes that store the list of elements in the folder. This option controls the
+maximum number of children that the HAMT nodes can have.
+
+Needs to be a power of two (shard entry size) and multiple of 8 (bitfield size).
+
+Commands affected: `ipfs add`, `ipfs daemon` (globally overrides [`boxo/ipld/unixfs/io.DefaultShardWidth`](https://github.com/ipfs/boxo/blob/6c5a07602aed248acc86598f30ab61923a54a83e/ipld/unixfs/io/directory.go#L30C5-L30C22))
+
+Default: `256`
+
+Type: `optionalInteger`
+
+### `Import.UnixFSHAMTDirectorySizeThreshold`
+
+The sharding threshold to decide whether a basic UnixFS directory
+should be sharded (converted into HAMT Directory) or not.
+
+This value is not strictly related to the size of the UnixFS directory block
+and any increases in the threshold should come with being careful that block
+sizes stay under 2MiB in order for them to be reliably transferable through the
+networking stack. At the time of writing this, IPFS peers on the public swarm
+tend to ignore requests for blocks bigger than 2MiB.
+
+Uses implementation from `boxo/ipld/unixfs/io/directory`, where the size is not
+the *exact* block size of the encoded directory but just the estimated size
+based byte length of DAG-PB Links names and CIDs.
+
+Setting to `1B` is functionally equivalent to always using HAMT (useful in testing).
+
+Commands affected: `ipfs add`, `ipfs daemon` (globally overrides [`boxo/ipld/unixfs/io.HAMTShardingSize`](https://github.com/ipfs/boxo/blob/6c5a07602aed248acc86598f30ab61923a54a83e/ipld/unixfs/io/directory.go#L26))
+
+Default: `256KiB` (may change, inspect `DefaultUnixFSHAMTDirectorySizeThreshold` to confirm)
+
+Type: `optionalBytes`
+
## `Version`
Options to configure agent version announced to the swarm, and leveraging
@@ -2742,16 +2812,38 @@ Disables [Reprovider](#reprovider) system (and announcing to Amino DHT).
Makes UnixFS import (`ipfs add`) produce legacy CIDv0 with no raw leaves, sha2-256 and 256 KiB chunks.
+See for exact [`Import.*`](#import) settings.
+
> [!NOTE]
> This profile is provided for legacy users and should not be used for new projects.
### `test-cid-v1` profile
-Makes UnixFS import (`ipfs add`) produce modern CIDv1 with raw leaves, sha2-256 and 1 MiB chunks.
+Makes UnixFS import (`ipfs add`) produce modern CIDv1 with raw leaves, sha2-256
+and 1 MiB chunks (max 174 links per file, 256 per HAMT node, switch dir to HAMT
+above 256KiB).
+
+See for exact [`Import.*`](#import) settings.
> [!NOTE]
-> This profile will become the new implicit default, provided for testing purposes.
-> Follow [kubo#4143](https://github.com/ipfs/kubo/issues/4143) for more details.
+> [`Import.*`](#import) settings applied by this profile MAY change in future release. Provided for testing purposes.
+>
+> Follow [kubo#4143](https://github.com/ipfs/kubo/issues/4143) for more details,
+> and provide feedback in [discuss.ipfs.tech/t/should-we-profile-cids](https://discuss.ipfs.tech/t/should-we-profile-cids/18507) or [ipfs/specs#499](https://github.com/ipfs/specs/pull/499).
+
+### `test-cid-v1-wide` profile
+
+Makes UnixFS import (`ipfs add`) produce modern CIDv1 with raw leaves, sha2-256
+and 1 MiB chunks and wider file DAGs (max 1024 links per every node type,
+switch dir to HAMT above 1MiB).
+
+See for exact [`Import.*`](#import) settings.
+
+> [!NOTE]
+> [`Import.*`](#import) settings applied by this profile MAY change in future release. Provided for testing purposes.
+>
+> Follow [kubo#4143](https://github.com/ipfs/kubo/issues/4143) for more details,
+> and provide feedback in [discuss.ipfs.tech/t/should-we-profile-cids](https://discuss.ipfs.tech/t/should-we-profile-cids/18507) or [ipfs/specs#499](https://github.com/ipfs/specs/pull/499).
## Types
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index bfaa528c9..7adc7c80a 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -7,7 +7,7 @@ go 1.24
replace github.com/ipfs/kubo => ./../../..
require (
- github.com/ipfs/boxo v0.29.2-0.20250409154342-bbaf2e146dfb
+ github.com/ipfs/boxo v0.29.2-0.20250415191135-dc60fe747c37
github.com/ipfs/kubo v0.0.0-00010101000000-000000000000
github.com/libp2p/go-libp2p v0.41.1
github.com/multiformats/go-multiaddr v0.15.0
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index eb2997529..5e2f686a0 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -298,8 +298,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcd
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.29.2-0.20250409154342-bbaf2e146dfb h1:kA7c3CF6/d8tUwGJR/SwIfaRz7Xk7Fbyoh2ePZAFMlw=
-github.com/ipfs/boxo v0.29.2-0.20250409154342-bbaf2e146dfb/go.mod h1:omQZmLS7LegSpBy3m4CrAB9/SO7Fq3pfv+5y1FOd+gI=
+github.com/ipfs/boxo v0.29.2-0.20250415191135-dc60fe747c37 h1:q3a+2FIbWzZbx/yUqpuG4jLVSa6GvxtRfx9TU5GLiN0=
+github.com/ipfs/boxo v0.29.2-0.20250415191135-dc60fe747c37/go.mod h1:omQZmLS7LegSpBy3m4CrAB9/SO7Fq3pfv+5y1FOd+gI=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-bitswap v0.11.0 h1:j1WVvhDX1yhG32NTC9xfxnqycqYIlhzEzLXG/cU1HyQ=
diff --git a/fuse/readonly/ipfs_test.go b/fuse/readonly/ipfs_test.go
index 6d667843c..e7dfbcb2a 100644
--- a/fuse/readonly/ipfs_test.go
+++ b/fuse/readonly/ipfs_test.go
@@ -150,7 +150,10 @@ func TestIpfsStressRead(t *testing.T) {
// Now make a bunch of dirs
for i := 0; i < ndiriter; i++ {
- db := uio.NewDirectory(nd.DAG)
+ db, err := uio.NewDirectory(nd.DAG)
+ if err != nil {
+ t.Fatal(err)
+ }
for j := 0; j < 1+rand.Intn(10); j++ {
name := fmt.Sprintf("child%d", j)
@@ -245,8 +248,11 @@ func TestIpfsBasicDirRead(t *testing.T) {
fi, data := randObj(t, nd, 10000)
// Make a directory and put that file in it
- db := uio.NewDirectory(nd.DAG)
- err := db.AddChild(nd.Context(), "actual", fi)
+ db, err := uio.NewDirectory(nd.DAG)
+ if err != nil {
+ t.Fatal(err)
+ }
+ err = db.AddChild(nd.Context(), "actual", fi)
if err != nil {
t.Fatal(err)
}
diff --git a/go.mod b/go.mod
index 8975eb210..68e8c7a3f 100644
--- a/go.mod
+++ b/go.mod
@@ -21,7 +21,7 @@ require (
github.com/hashicorp/go-version v1.7.0
github.com/ipfs-shipyard/nopfs v0.0.14
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0
- github.com/ipfs/boxo v0.29.2-0.20250409154342-bbaf2e146dfb
+ github.com/ipfs/boxo v0.29.2-0.20250415191135-dc60fe747c37
github.com/ipfs/go-block-format v0.2.0
github.com/ipfs/go-cid v0.5.0
github.com/ipfs/go-cidutil v0.1.0
diff --git a/go.sum b/go.sum
index e926a4596..cf9c33444 100644
--- a/go.sum
+++ b/go.sum
@@ -362,8 +362,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcd
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.29.2-0.20250409154342-bbaf2e146dfb h1:kA7c3CF6/d8tUwGJR/SwIfaRz7Xk7Fbyoh2ePZAFMlw=
-github.com/ipfs/boxo v0.29.2-0.20250409154342-bbaf2e146dfb/go.mod h1:omQZmLS7LegSpBy3m4CrAB9/SO7Fq3pfv+5y1FOd+gI=
+github.com/ipfs/boxo v0.29.2-0.20250415191135-dc60fe747c37 h1:q3a+2FIbWzZbx/yUqpuG4jLVSa6GvxtRfx9TU5GLiN0=
+github.com/ipfs/boxo v0.29.2-0.20250415191135-dc60fe747c37/go.mod h1:omQZmLS7LegSpBy3m4CrAB9/SO7Fq3pfv+5y1FOd+gI=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-bitswap v0.11.0 h1:j1WVvhDX1yhG32NTC9xfxnqycqYIlhzEzLXG/cU1HyQ=
diff --git a/test/cli/add_test.go b/test/cli/add_test.go
index ae652989a..775a6063b 100644
--- a/test/cli/add_test.go
+++ b/test/cli/add_test.go
@@ -1,10 +1,17 @@
package cli
import (
+ "io"
+ "os"
+ "path/filepath"
+ "strings"
"testing"
+ "github.com/dustin/go-humanize"
"github.com/ipfs/kubo/config"
"github.com/ipfs/kubo/test/cli/harness"
+ "github.com/ipfs/kubo/test/cli/testutils"
+ "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
@@ -19,6 +26,11 @@ func TestAdd(t *testing.T) {
shortStringCidV1Sha512 = "bafkrgqbqt3gerhas23vuzrapkdeqf4vu2dwxp3srdj6hvg6nhsug2tgyn6mj3u23yx7utftq3i2ckw2fwdh5qmhid5qf3t35yvkc5e5ottlw6"
)
+ const (
+ cidV0Length = 34 // cidv0 sha2-256
+ cidV1Length = 36 // cidv1 sha2-256
+ )
+
t.Run("produced cid version: implicit default (CIDv0)", func(t *testing.T) {
t.Parallel()
node := harness.NewT(t).NewNode().Init().StartDaemon()
@@ -96,6 +108,33 @@ func TestAdd(t *testing.T) {
require.Equal(t, shortStringCidV1NoRawLeaves, cidStr)
})
+ t.Run("produced unixfs max file links: command flag --max-file-links overrides configuration in Import.UnixFSFileMaxLinks", func(t *testing.T) {
+ t.Parallel()
+
+ //
+ // UnixFSChunker=size-262144 (256KiB)
+ // Import.UnixFSFileMaxLinks=174
+ node := harness.NewT(t).NewNode().Init("--profile=legacy-cid-v0") // legacy-cid-v0 for determinism across all params
+ node.UpdateConfig(func(cfg *config.Config) {
+ cfg.Import.UnixFSChunker = *config.NewOptionalString("size-262144") // 256 KiB chunks
+ cfg.Import.UnixFSFileMaxLinks = *config.NewOptionalInteger(174) // max 174 per level
+ })
+ node.StartDaemon()
+ defer node.StopDaemon()
+
+ // Add 174MiB file:
+ // 1024 * 256KiB should fit in single layer
+ seed := shortString
+ cidStr := node.IPFSAddDeterministic("262144KiB", seed, "--max-file-links", "1024")
+ root, err := node.InspectPBNode(cidStr)
+ assert.NoError(t, err)
+
+ // Expect 1024 links due to cli parameter raising link limit from 174 to 1024
+ require.Equal(t, 1024, len(root.Links))
+ // expect same CID every time
+ require.Equal(t, "QmbBftNHWmjSWKLC49dMVrfnY8pjrJYntiAXirFJ7oJrNk", cidStr)
+ })
+
t.Run("ipfs init --profile=legacy-cid-v0 sets config that produces legacy CIDv0", func(t *testing.T) {
t.Parallel()
node := harness.NewT(t).NewNode().Init("--profile=legacy-cid-v0")
@@ -106,13 +145,307 @@ func TestAdd(t *testing.T) {
require.Equal(t, shortStringCidV0, cidStr)
})
- t.Run("ipfs init --profile=test-cid-v1 produces modern CIDv1", func(t *testing.T) {
+ t.Run("ipfs init --profile=legacy-cid-v0 applies UnixFSChunker=size-262144 and UnixFSFileMaxLinks", func(t *testing.T) {
+ t.Parallel()
+ seed := "v0-seed"
+ profile := "--profile=legacy-cid-v0"
+
+ t.Run("under UnixFSFileMaxLinks=174", func(t *testing.T) {
+ t.Parallel()
+ node := harness.NewT(t).NewNode().Init(profile)
+ node.StartDaemon()
+ defer node.StopDaemon()
+ // Add 44544KiB file:
+ // 174 * 256KiB should fit in single DAG layer
+ cidStr := node.IPFSAddDeterministic("44544KiB", seed)
+ root, err := node.InspectPBNode(cidStr)
+ assert.NoError(t, err)
+ require.Equal(t, 174, len(root.Links))
+ // expect same CID every time
+ require.Equal(t, "QmUbBALi174SnogsUzLpYbD4xPiBSFANF4iztWCsHbMKh2", cidStr)
+ })
+
+ t.Run("above UnixFSFileMaxLinks=174", func(t *testing.T) {
+ t.Parallel()
+ node := harness.NewT(t).NewNode().Init(profile)
+ node.StartDaemon()
+ defer node.StopDaemon()
+ // add 256KiB (one more block), it should force rebalancing DAG and moving most to second layer
+ cidStr := node.IPFSAddDeterministic("44800KiB", seed)
+ root, err := node.InspectPBNode(cidStr)
+ assert.NoError(t, err)
+ require.Equal(t, 2, len(root.Links))
+ // expect same CID every time
+ require.Equal(t, "QmepeWtdmS1hHXx1oZXsPUv6bMrfRRKfZcoPPU4eEfjnbf", cidStr)
+ })
+ })
+
+ t.Run("ipfs init --profile=legacy-cid-v0 applies UnixFSHAMTDirectoryMaxFanout=256 and UnixFSHAMTDirectorySizeThreshold=256KiB", func(t *testing.T) {
+ t.Parallel()
+ seed := "hamt-legacy-cid-v0"
+ profile := "--profile=legacy-cid-v0"
+
+ t.Run("under UnixFSHAMTDirectorySizeThreshold=256KiB", func(t *testing.T) {
+ t.Parallel()
+ node := harness.NewT(t).NewNode().Init(profile)
+ node.StartDaemon()
+ defer node.StopDaemon()
+
+ randDir, err := os.MkdirTemp(node.Dir, seed)
+ require.NoError(t, err)
+
+ // Create directory with a lot of files that have filenames which together take close to UnixFSHAMTDirectorySizeThreshold in total
+ err = createDirectoryForHAMT(randDir, cidV0Length, "255KiB", seed)
+ require.NoError(t, err)
+ cidStr := node.IPFS("add", "-r", "-Q", randDir).Stdout.Trimmed()
+
+ // Confirm the number of links is more than UnixFSHAMTDirectorySizeThreshold (indicating regular "basic" directory"
+ root, err := node.InspectPBNode(cidStr)
+ assert.NoError(t, err)
+ require.Equal(t, 903, len(root.Links))
+ })
+
+ t.Run("above UnixFSHAMTDirectorySizeThreshold=256KiB", func(t *testing.T) {
+ t.Parallel()
+ node := harness.NewT(t).NewNode().Init(profile)
+ node.StartDaemon()
+ defer node.StopDaemon()
+
+ randDir, err := os.MkdirTemp(node.Dir, seed)
+ require.NoError(t, err)
+
+ // Create directory with a lot of files that have filenames which together take close to UnixFSHAMTDirectorySizeThreshold in total
+ err = createDirectoryForHAMT(randDir, cidV0Length, "257KiB", seed)
+ require.NoError(t, err)
+ cidStr := node.IPFS("add", "-r", "-Q", randDir).Stdout.Trimmed()
+
+ // Confirm this time, the number of links is less than UnixFSHAMTDirectorySizeThreshold
+ root, err := node.InspectPBNode(cidStr)
+ assert.NoError(t, err)
+ require.Equal(t, 252, len(root.Links))
+ })
+ })
+
+ t.Run("ipfs init --profile=test-cid-v1 produces CIDv1 with raw leaves", func(t *testing.T) {
t.Parallel()
node := harness.NewT(t).NewNode().Init("--profile=test-cid-v1")
node.StartDaemon()
defer node.StopDaemon()
cidStr := node.IPFSAddStr(shortString)
- require.Equal(t, shortStringCidV1, cidStr)
+ require.Equal(t, shortStringCidV1, cidStr) // raw leaf
})
+
+ t.Run("ipfs init --profile=test-cid-v1 applies UnixFSChunker=size-1048576", func(t *testing.T) {
+ t.Parallel()
+ seed := "v1-seed"
+ profile := "--profile=test-cid-v1"
+
+ t.Run("under UnixFSFileMaxLinks=174", func(t *testing.T) {
+ t.Parallel()
+ node := harness.NewT(t).NewNode().Init(profile)
+ node.StartDaemon()
+ defer node.StopDaemon()
+ // Add 174MiB file:
+ // 174 * 1MiB should fit in single layer
+ cidStr := node.IPFSAddDeterministic("174MiB", seed)
+ root, err := node.InspectPBNode(cidStr)
+ assert.NoError(t, err)
+ require.Equal(t, 174, len(root.Links))
+ // expect same CID every time
+ require.Equal(t, "bafybeigwduxcf2aawppv3isnfeshnimkyplvw3hthxjhr2bdeje4tdaicu", cidStr)
+ })
+
+ t.Run("above UnixFSFileMaxLinks=174", func(t *testing.T) {
+ t.Parallel()
+ node := harness.NewT(t).NewNode().Init(profile)
+ node.StartDaemon()
+ defer node.StopDaemon()
+ // add +1MiB (one more block), it should force rebalancing DAG and moving most to second layer
+ cidStr := node.IPFSAddDeterministic("175MiB", seed)
+ root, err := node.InspectPBNode(cidStr)
+ assert.NoError(t, err)
+ require.Equal(t, 2, len(root.Links))
+ // expect same CID every time
+ require.Equal(t, "bafybeidhd7lo2n2v7lta5yamob3xwhbxcczmmtmhquwhjesi35jntf7mpu", cidStr)
+ })
+ })
+
+ t.Run("ipfs init --profile=test-cid-v1 applies UnixFSHAMTDirectoryMaxFanout=256 and UnixFSHAMTDirectorySizeThreshold=256KiB", func(t *testing.T) {
+ t.Parallel()
+ seed := "hamt-cid-v1"
+ profile := "--profile=test-cid-v1"
+
+ t.Run("under UnixFSHAMTDirectorySizeThreshold=256KiB", func(t *testing.T) {
+ t.Parallel()
+ node := harness.NewT(t).NewNode().Init(profile)
+ node.StartDaemon()
+ defer node.StopDaemon()
+
+ randDir, err := os.MkdirTemp(node.Dir, seed)
+ require.NoError(t, err)
+
+ // Create directory with a lot of files that have filenames which together take close to UnixFSHAMTDirectorySizeThreshold in total
+ err = createDirectoryForHAMT(randDir, cidV1Length, "255KiB", seed)
+ require.NoError(t, err)
+ cidStr := node.IPFS("add", "-r", "-Q", randDir).Stdout.Trimmed()
+
+ // Confirm the number of links is more than UnixFSHAMTDirectoryMaxFanout (indicating regular "basic" directory"
+ root, err := node.InspectPBNode(cidStr)
+ assert.NoError(t, err)
+ require.Equal(t, 897, len(root.Links))
+ })
+
+ t.Run("above UnixFSHAMTDirectorySizeThreshold=256KiB", func(t *testing.T) {
+ t.Parallel()
+ node := harness.NewT(t).NewNode().Init(profile)
+ node.StartDaemon()
+ defer node.StopDaemon()
+
+ randDir, err := os.MkdirTemp(node.Dir, seed)
+ require.NoError(t, err)
+
+ // Create directory with a lot of files that have filenames which together take close to UnixFSHAMTDirectorySizeThreshold in total
+ err = createDirectoryForHAMT(randDir, cidV1Length, "257KiB", seed)
+ require.NoError(t, err)
+ cidStr := node.IPFS("add", "-r", "-Q", randDir).Stdout.Trimmed()
+
+ // Confirm this time, the number of links is less than UnixFSHAMTDirectoryMaxFanout
+ root, err := node.InspectPBNode(cidStr)
+ assert.NoError(t, err)
+ require.Equal(t, 252, len(root.Links))
+ })
+ })
+
+ t.Run("ipfs init --profile=test-cid-v1-wide applies UnixFSChunker=size-1048576 and UnixFSFileMaxLinks=1024", func(t *testing.T) {
+ t.Parallel()
+ seed := "v1-seed-1024"
+ profile := "--profile=test-cid-v1-wide"
+
+ t.Run("under UnixFSFileMaxLinks=1024", func(t *testing.T) {
+ t.Parallel()
+ node := harness.NewT(t).NewNode().Init(profile)
+ node.StartDaemon()
+ defer node.StopDaemon()
+ // Add 174MiB file:
+ // 1024 * 1MiB should fit in single layer
+ cidStr := node.IPFSAddDeterministic("1024MiB", seed)
+ root, err := node.InspectPBNode(cidStr)
+ assert.NoError(t, err)
+ require.Equal(t, 1024, len(root.Links))
+ // expect same CID every time
+ require.Equal(t, "bafybeiej5w63ir64oxgkr5htqmlerh5k2rqflurn2howimexrlkae64xru", cidStr)
+ })
+
+ t.Run("above UnixFSFileMaxLinks=1024", func(t *testing.T) {
+ t.Parallel()
+ node := harness.NewT(t).NewNode().Init(profile)
+ node.StartDaemon()
+ defer node.StopDaemon()
+ // add +1MiB (one more block), it should force rebalancing DAG and moving most to second layer
+ cidStr := node.IPFSAddDeterministic("1025MiB", seed)
+ root, err := node.InspectPBNode(cidStr)
+ assert.NoError(t, err)
+ require.Equal(t, 2, len(root.Links))
+ // expect same CID every time
+ require.Equal(t, "bafybeieilp2qx24pe76hxrxe6bpef5meuxto3kj5dd6mhb5kplfeglskdm", cidStr)
+ })
+ })
+
+ t.Run("ipfs init --profile=test-cid-v1-wide applies UnixFSHAMTDirectoryMaxFanout=256 and UnixFSHAMTDirectorySizeThreshold=1MiB", func(t *testing.T) {
+ t.Parallel()
+ seed := "hamt-cid-v1"
+ profile := "--profile=test-cid-v1-wide"
+
+ t.Run("under UnixFSHAMTDirectorySizeThreshold=1MiB", func(t *testing.T) {
+ t.Parallel()
+ node := harness.NewT(t).NewNode().Init(profile)
+ node.StartDaemon()
+ defer node.StopDaemon()
+
+ randDir, err := os.MkdirTemp(node.Dir, seed)
+ require.NoError(t, err)
+
+ // Create directory with a lot of files that have filenames which together take close to UnixFSHAMTDirectorySizeThreshold in total
+ err = createDirectoryForHAMT(randDir, cidV1Length, "1023KiB", seed)
+ require.NoError(t, err)
+ cidStr := node.IPFS("add", "-r", "-Q", randDir).Stdout.Trimmed()
+
+ // Confirm the number of links is more than UnixFSHAMTDirectoryMaxFanout (indicating regular "basic" directory"
+ root, err := node.InspectPBNode(cidStr)
+ assert.NoError(t, err)
+ require.Equal(t, 3599, len(root.Links))
+ })
+
+ t.Run("above UnixFSHAMTDirectorySizeThreshold=1MiB", func(t *testing.T) {
+ t.Parallel()
+ node := harness.NewT(t).NewNode().Init(profile)
+ node.StartDaemon()
+ defer node.StopDaemon()
+
+ randDir, err := os.MkdirTemp(node.Dir, seed)
+ require.NoError(t, err)
+
+ // Create directory with a lot of files that have filenames which together take close to UnixFSHAMTDirectorySizeThreshold in total
+ err = createDirectoryForHAMT(randDir, cidV1Length, "1025KiB", seed)
+ require.NoError(t, err)
+ cidStr := node.IPFS("add", "-r", "-Q", randDir).Stdout.Trimmed()
+
+ // Confirm this time, the number of links is less than UnixFSHAMTDirectoryMaxFanout
+ root, err := node.InspectPBNode(cidStr)
+ assert.NoError(t, err)
+ require.Equal(t, 992, len(root.Links))
+ })
+ })
+
+}
+
+// createDirectoryForHAMT aims to create enough files with long names for the directory block to be close to the UnixFSHAMTDirectorySizeThreshold.
+// The calculation is based on boxo's HAMTShardingSize and sizeBelowThreshold which calculates ballpark size of the block
+// by adding length of link names and the binary cid length.
+// See https://github.com/ipfs/boxo/blob/6c5a07602aed248acc86598f30ab61923a54a83e/ipld/unixfs/io/directory.go#L491
+func createDirectoryForHAMT(dirPath string, cidLength int, unixfsNodeSizeTarget, seed string) error {
+ hamtThreshold, err := humanize.ParseBytes(unixfsNodeSizeTarget)
+ if err != nil {
+ return err
+ }
+
+ // Calculate how many files with long filenames are needed to hit UnixFSHAMTDirectorySizeThreshold
+ nameLen := 255 // max that works across windows/macos/linux
+ alphabetLen := len(testutils.AlphabetEasy)
+ numFiles := int(hamtThreshold) / (nameLen + cidLength)
+
+ // Deterministic pseudo-random bytes for static CID
+ drand, err := testutils.DeterministicRandomReader(unixfsNodeSizeTarget, seed)
+ if err != nil {
+ return err
+ }
+
+ // Create necessary files in a single, flat directory
+ for i := 0; i < numFiles; i++ {
+ buf := make([]byte, nameLen)
+ _, err := io.ReadFull(drand, buf)
+ if err != nil {
+ return err
+ }
+
+ // Convert deterministic pseudo-random bytes to ASCII
+ var sb strings.Builder
+
+ for _, b := range buf {
+ // Map byte to printable ASCII range (33-126)
+ char := testutils.AlphabetEasy[int(b)%alphabetLen]
+ sb.WriteRune(char)
+ }
+ filename := sb.String()[:nameLen]
+ filePath := filepath.Join(dirPath, filename)
+
+ // Create empty file
+ f, err := os.Create(filePath)
+ if err != nil {
+ return err
+ }
+ f.Close()
+ }
+ return nil
}
diff --git a/test/cli/harness/ipfs.go b/test/cli/harness/ipfs.go
index 8537e2aa2..0842d3627 100644
--- a/test/cli/harness/ipfs.go
+++ b/test/cli/harness/ipfs.go
@@ -76,6 +76,17 @@ func (n *Node) IPFSAddStr(content string, args ...string) string {
return n.IPFSAdd(strings.NewReader(content), args...)
}
+// IPFSAddDeterministic produces a CID of a file of a certain size, filled with deterministically generated bytes based on some seed.
+// This ensures deterministic CID on the other end, that can be used in tests.
+func (n *Node) IPFSAddDeterministic(size string, seed string, args ...string) string {
+ log.Debugf("node %d adding %s of deterministic pseudo-random data with seed %q and args: %v", n.ID, size, seed, args)
+ reader, err := DeterministicRandomReader(size, seed)
+ if err != nil {
+ panic(err)
+ }
+ return n.IPFSAdd(reader, args...)
+}
+
func (n *Node) IPFSAdd(content io.Reader, args ...string) string {
log.Debugf("node %d adding with args: %v", n.ID, args)
fullArgs := []string{"add", "-q"}
@@ -108,3 +119,15 @@ func (n *Node) IPFSDagImport(content io.Reader, cid string, args ...string) erro
})
return res.Err
}
+
+/*
+func (n *Node) IPFSDagExport(cid string, car *os.File) error {
+ log.Debugf("node %d dag export of %s to %q with args: %v", n.ID, cid, car.Name())
+ res := n.Runner.MustRun(RunRequest{
+ Path: n.IPFSBin,
+ Args: []string{"dag", "export", cid},
+ CmdOpts: []CmdOpt{RunWithStdout(car)},
+ })
+ return res.Err
+}
+*/
diff --git a/test/cli/harness/pbinspect.go b/test/cli/harness/pbinspect.go
new file mode 100644
index 000000000..6abddb61f
--- /dev/null
+++ b/test/cli/harness/pbinspect.go
@@ -0,0 +1,54 @@
+package harness
+
+import (
+ "bytes"
+ "encoding/json"
+)
+
+// InspectPBNode uses dag-json output of 'ipfs dag get' to inspect
+// "Logical Format" of DAG-PB as defined in
+// https://web.archive.org/web/20250403194752/https://ipld.io/specs/codecs/dag-pb/spec/#logical-format
+// (mainly used for inspecting Links without depending on any libraries)
+func (n *Node) InspectPBNode(cid string) (PBNode, error) {
+ log.Debugf("node %d dag get %s as dag-json", n.ID, cid)
+
+ var root PBNode
+ var dagJsonOutput bytes.Buffer
+ res := n.Runner.MustRun(RunRequest{
+ Path: n.IPFSBin,
+ Args: []string{"dag", "get", "--output-codec=dag-json", cid},
+ CmdOpts: []CmdOpt{RunWithStdout(&dagJsonOutput)},
+ })
+ if res.Err != nil {
+ return root, res.Err
+ }
+
+ err := json.Unmarshal(dagJsonOutput.Bytes(), &root)
+ if err != nil {
+ return root, err
+ }
+ return root, nil
+
+}
+
+// Define structs to match the JSON for
+type PBHash struct {
+ Slash string `json:"/"`
+}
+
+type PBLink struct {
+ Hash PBHash `json:"Hash"`
+ Name string `json:"Name"`
+ Tsize int `json:"Tsize"`
+}
+
+type PBData struct {
+ Slash struct {
+ Bytes string `json:"bytes"`
+ } `json:"/"`
+}
+
+type PBNode struct {
+ Data PBData `json:"Data"`
+ Links []PBLink `json:"Links"`
+}
diff --git a/test/cli/testutils/random_deterministic.go b/test/cli/testutils/random_deterministic.go
new file mode 100644
index 000000000..e55404168
--- /dev/null
+++ b/test/cli/testutils/random_deterministic.go
@@ -0,0 +1,46 @@
+package testutils
+
+import (
+ "crypto/sha256"
+ "io"
+
+ "github.com/dustin/go-humanize"
+ "golang.org/x/crypto/chacha20"
+)
+
+type randomReader struct {
+ cipher *chacha20.Cipher
+ remaining int64
+}
+
+func (r *randomReader) Read(p []byte) (int, error) {
+ if r.remaining <= 0 {
+ return 0, io.EOF
+ }
+ n := int64(len(p))
+ if n > r.remaining {
+ n = r.remaining
+ }
+ // Generate random bytes directly into the provided buffer
+ r.cipher.XORKeyStream(p[:n], make([]byte, n))
+ r.remaining -= n
+ return int(n), nil
+}
+
+// createRandomReader produces specified number of pseudo-random bytes
+// from a seed.
+func DeterministicRandomReader(sizeStr string, seed string) (io.Reader, error) {
+ size, err := humanize.ParseBytes(sizeStr)
+ if err != nil {
+ return nil, err
+ }
+ // Hash the seed string to a 32-byte key for ChaCha20
+ key := sha256.Sum256([]byte(seed))
+ // Use ChaCha20 for deterministic random bytes
+ var nonce [chacha20.NonceSize]byte // Zero nonce for simplicity
+ cipher, err := chacha20.NewUnauthenticatedCipher(key[:chacha20.KeySize], nonce[:])
+ if err != nil {
+ return nil, err
+ }
+ return &randomReader{cipher: cipher, remaining: int64(size)}, nil
+}
diff --git a/test/cli/testutils/random_files.go b/test/cli/testutils/random_files.go
index c7dca10d6..7991cad83 100644
--- a/test/cli/testutils/random_files.go
+++ b/test/cli/testutils/random_files.go
@@ -24,20 +24,22 @@ type RandFiles struct {
FanoutFiles int // how many files per dir
FanoutDirs int // how many dirs per dir
- RandomSize bool // randomize file sizes
- RandomFanout bool // randomize fanout numbers
+ RandomSize bool // randomize file sizes
+ RandomNameSize bool // randomize filename lengths
+ RandomFanout bool // randomize fanout numbers
}
func NewRandFiles() *RandFiles {
return &RandFiles{
- Rand: rand.New(rand.NewSource(time.Now().UnixNano())),
- FileSize: 4096,
- FilenameSize: 16,
- Alphabet: AlphabetEasy,
- FanoutDepth: 2,
- FanoutDirs: 5,
- FanoutFiles: 10,
- RandomSize: true,
+ Rand: rand.New(rand.NewSource(time.Now().UnixNano())),
+ FileSize: 4096,
+ FilenameSize: 16,
+ Alphabet: AlphabetEasy,
+ FanoutDepth: 2,
+ FanoutDirs: 5,
+ FanoutFiles: 10,
+ RandomSize: true,
+ RandomNameSize: true,
}
}
@@ -83,7 +85,10 @@ func (r *RandFiles) WriteRandomFile(root string) error {
filesize = r.Rand.Int63n(filesize) + 1
}
- n := rand.Intn(r.FilenameSize-4) + 4
+ n := r.FilenameSize
+ if r.RandomNameSize {
+ n = rand.Intn(r.FilenameSize-4) + 4
+ }
name := r.RandomFilename(n)
filepath := path.Join(root, name)
f, err := os.Create(filepath)
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index 0cf72f9ca..fef506300 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -33,6 +33,7 @@ require (
github.com/Masterminds/semver/v3 v3.2.1 // indirect
github.com/OpenPeeDeeP/depguard/v2 v2.2.0 // indirect
github.com/alecthomas/go-check-sumtype v0.1.4 // indirect
+ github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b // indirect
github.com/alexkohler/nakedret/v2 v2.0.4 // indirect
github.com/alexkohler/prealloc v1.0.0 // indirect
github.com/alingse/asasalint v0.0.11 // indirect
@@ -57,6 +58,7 @@ require (
github.com/chavacava/garif v0.1.0 // indirect
github.com/ckaznocha/intrange v0.1.2 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect
+ github.com/crackcomm/go-gitignore v0.0.0-20241020182519-7843d2ba8fdf // indirect
github.com/curioswitch/go-reassign v0.2.0 // indirect
github.com/daixiang0/gci v0.13.4 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
@@ -116,7 +118,8 @@ require (
github.com/huin/goupnp v1.3.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/ipfs/bbloom v0.0.4 // indirect
- github.com/ipfs/boxo v0.29.2-0.20250409154342-bbaf2e146dfb // indirect
+ github.com/ipfs/boxo v0.29.2-0.20250415191135-dc60fe747c37 // indirect
+ github.com/ipfs/go-bitfield v1.1.0 // indirect
github.com/ipfs/go-block-format v0.2.0 // indirect
github.com/ipfs/go-cid v0.5.0 // indirect
github.com/ipfs/go-datastore v0.8.2 // indirect
@@ -273,6 +276,7 @@ require (
github.com/urfave/cli v1.22.16 // indirect
github.com/uudashr/gocognit v1.1.3 // indirect
github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc // indirect
+ github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f // indirect
github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 // indirect
github.com/wlynxg/anet v0.0.5 // indirect
github.com/xen0n/gosmopolitan v1.2.2 // indirect
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index 4fef97504..a0be36844 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -43,6 +43,8 @@ github.com/alecthomas/go-check-sumtype v0.1.4 h1:WCvlB3l5Vq5dZQTFmodqL2g68uHiSww
github.com/alecthomas/go-check-sumtype v0.1.4/go.mod h1:WyYPfhfkdhyrdaligV6svFopZV8Lqdzn5pyVBaV6jhQ=
github.com/alecthomas/repr v0.2.0 h1:HAzS41CIzNW5syS8Mf9UwXhNH1J9aix/BvDRf1Ml2Yk=
github.com/alecthomas/repr v0.2.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4=
+github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b h1:mimo19zliBX/vSQ6PWWSL9lK8qwHozUj03+zLoEB8O0=
+github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs=
github.com/alexkohler/nakedret/v2 v2.0.4 h1:yZuKmjqGi0pSmjGpOC016LtPJysIL0WEUiaXW5SUnNg=
github.com/alexkohler/nakedret/v2 v2.0.4/go.mod h1:bF5i0zF2Wo2o4X4USt9ntUWve6JbFv02Ff4vlkmS/VU=
github.com/alexkohler/prealloc v1.0.0 h1:Hbq0/3fJPQhNkN0dR95AVrr6R7tou91y0uHG5pOcUuw=
@@ -105,6 +107,8 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:ma
github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/cpuguy83/go-md2man/v2 v2.0.5 h1:ZtcqGrnekaHpVLArFSe4HK5DoKx1T0rq2DwVB0alcyc=
github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
+github.com/crackcomm/go-gitignore v0.0.0-20241020182519-7843d2ba8fdf h1:dwGgBWn84wUS1pVikGiruW+x5XM4amhjaZO20vCjay4=
+github.com/crackcomm/go-gitignore v0.0.0-20241020182519-7843d2ba8fdf/go.mod h1:p1d6YEZWvFzEh4KLyvBcVSnrfNDDvK2zfK/4x2v/4pE=
github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0=
github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis=
github.com/curioswitch/go-reassign v0.2.0 h1:G9UZyOcpk/d7Gd6mqYgd8XYWFMw/znxwGDUstnC9DIo=
@@ -294,8 +298,10 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.29.2-0.20250409154342-bbaf2e146dfb h1:kA7c3CF6/d8tUwGJR/SwIfaRz7Xk7Fbyoh2ePZAFMlw=
-github.com/ipfs/boxo v0.29.2-0.20250409154342-bbaf2e146dfb/go.mod h1:omQZmLS7LegSpBy3m4CrAB9/SO7Fq3pfv+5y1FOd+gI=
+github.com/ipfs/boxo v0.29.2-0.20250415191135-dc60fe747c37 h1:q3a+2FIbWzZbx/yUqpuG4jLVSa6GvxtRfx9TU5GLiN0=
+github.com/ipfs/boxo v0.29.2-0.20250415191135-dc60fe747c37/go.mod h1:omQZmLS7LegSpBy3m4CrAB9/SO7Fq3pfv+5y1FOd+gI=
+github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
+github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-block-format v0.2.0 h1:ZqrkxBA2ICbDRbK8KJs/u0O3dlp6gmAuuXUJNiW1Ycs=
github.com/ipfs/go-block-format v0.2.0/go.mod h1:+jpL11nFx5A/SPpsoBn6Bzkra/zaArfSmsknbPMYgzM=
github.com/ipfs/go-cid v0.5.0 h1:goEKKhaGm0ul11IHA7I6p1GmKz8kEYniqFopaB5Otwg=
@@ -767,6 +773,8 @@ github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0 h1:GDDkbFiaK8jsSD
github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw=
github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc h1:BCPnHtcboadS0DvysUuJXZ4lWVv5Bh5i7+tbIyi+ck4=
github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc/go.mod h1:r45hJU7yEoA81k6MWNhpMj/kms0n14dkzkxYHoB96UM=
+github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E=
+github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8=
github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 h1:EKhdznlJHPMoKr0XTrX+IlJs1LH3lyx2nfr1dOlZ79k=
github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc=
github.com/wlynxg/anet v0.0.3/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA=
diff --git a/test/sharness/t0032-mount-sharded.sh b/test/sharness/t0032-mount-sharded.sh
index 10ba421a2..7a3e51858 100755
--- a/test/sharness/t0032-mount-sharded.sh
+++ b/test/sharness/t0032-mount-sharded.sh
@@ -16,7 +16,7 @@ fi
test_init_ipfs
test_expect_success 'force sharding' '
- ipfs config --json Internal.UnixFSShardingSizeThreshold "\"1B\""
+ ipfs config --json Import.UnixFSHAMTDirectorySizeThreshold "\"1B\""
'
test_launch_ipfs_daemon
diff --git a/test/sharness/t0250-files-api.sh b/test/sharness/t0250-files-api.sh
index 9c01a5bcf..63dacf7d4 100755
--- a/test/sharness/t0250-files-api.sh
+++ b/test/sharness/t0250-files-api.sh
@@ -849,7 +849,7 @@ tests_for_files_api "with-daemon"
test_kill_ipfs_daemon
test_expect_success "enable sharding in config" '
- ipfs config --json Internal.UnixFSShardingSizeThreshold "\"1B\""
+ ipfs config --json Import.UnixFSHAMTDirectorySizeThreshold "\"1B\""
'
test_launch_ipfs_daemon_without_network
@@ -880,7 +880,7 @@ test_expect_success "set up automatic sharding/unsharding data" '
'
test_expect_success "reset automatic sharding" '
- ipfs config --json Internal.UnixFSShardingSizeThreshold null
+ ipfs config --json Import.UnixFSHAMTDirectorySizeThreshold null
'
test_launch_ipfs_daemon_without_network
diff --git a/test/sharness/t0260-sharding.sh b/test/sharness/t0260-sharding.sh
index 85e4a7ca7..7b0094fd4 100755
--- a/test/sharness/t0260-sharding.sh
+++ b/test/sharness/t0260-sharding.sh
@@ -34,7 +34,7 @@ test_init_ipfs
UNSHARDED="QmavrTrQG4VhoJmantURAYuw3bowq3E2WcvP36NRQDAC1N"
test_expect_success "force sharding off" '
-ipfs config --json Internal.UnixFSShardingSizeThreshold "\"1G\""
+ipfs config --json Import.UnixFSHAMTDirectorySizeThreshold "\"1G\""
'
test_add_dir "$UNSHARDED"
@@ -46,7 +46,7 @@ test_add_dir "$UNSHARDED"
test_kill_ipfs_daemon
test_expect_success "force sharding on" '
- ipfs config --json Internal.UnixFSShardingSizeThreshold "\"1B\""
+ ipfs config --json Import.UnixFSHAMTDirectorySizeThreshold "\"1B\""
'
SHARDED="QmSCJD1KYLhVVHqBK3YyXuoEqHt7vggyJhzoFYbT8v1XYL"
From ee5665d37a8d54a520f7af512ad86b435f3af2f9 Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Thu, 24 Apr 2025 08:14:10 -0700
Subject: [PATCH 215/499] remove duplicate workds (#10790)
---
docs/config.md | 2 +-
docs/experimental-features.md | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/docs/config.md b/docs/config.md
index 1ec5677db..3724487d9 100644
--- a/docs/config.md
+++ b/docs/config.md
@@ -367,7 +367,7 @@ secret.
> The RPC API is vast. It grants admin-level access to your Kubo IPFS node, including
> configuration and secret key management.
>
-> - If you need secure access to a subset of RPC, make sure you understand the risk, block everything by default and and allow basic auth access with [`API.Authorizations`](#apiauthorizations) or custom auth middleware running in front of the localhost-only port defined in [`Addresses.API`](#addressesapi).
+> - If you need secure access to a subset of RPC, make sure you understand the risk, block everything by default and allow basic auth access with [`API.Authorizations`](#apiauthorizations) or custom auth middleware running in front of the localhost-only port defined in [`Addresses.API`](#addressesapi).
> - If you are looking for an interface designed for browsers and public internet, use [`Addresses.Gateway`](#addressesgateway) port instead.
Default: `null`
diff --git a/docs/experimental-features.md b/docs/experimental-features.md
index 3fccdad19..c0832b2e1 100644
--- a/docs/experimental-features.md
+++ b/docs/experimental-features.md
@@ -89,7 +89,7 @@ filestore instead of copying the files into your local IPFS repo.
- [ ] Need to address error states and failure conditions
- [ ] cleanup of broken filesystem references (if file is deleted)
- [ ] tests that confirm ability to override preexisting filesystem links (allowing user to fix broken link)
- - [ ] support for a a single block having more than one sources in filesystem (blocks can be shared by unrelated files, and not be broken when some files are unpinned / gc'd)
+ - [ ] support for a single block having more than one sources in filesystem (blocks can be shared by unrelated files, and not be broken when some files are unpinned / gc'd)
- [ ] [other known issues](https://github.com/ipfs/kubo/issues/7161)
- [ ] Need to write docs on usage, advantages, disadvantages
- [ ] Need to merge utility commands to aid in maintenance and repair of filestore
@@ -128,7 +128,7 @@ And then add a file at a specific URL using `ipfs urlstore add `
- [ ] Need to address error states and failure conditions
- [ ] cleanup of broken URL+range references (if URL starts returning 404 or error)
- [ ] tests that confirm ability to override preexisting URL+range links (allowing user to fix broken link)
- - [ ] support for a a single block having more than one URL+range (blocks can be shared by unrelated URLs)
+ - [ ] support for a single block having more than one URL+range (blocks can be shared by unrelated URLs)
- [ ] Need to write docs on usage, advantages, disadvantages
- [ ] Need to implement caching
- [ ] Need to add metrics to monitor performance
From ef399655d6592042de949736a41e07f3a946120e Mon Sep 17 00:00:00 2001
From: Guillaume Michel
Date: Tue, 29 Apr 2025 14:26:50 +0000
Subject: [PATCH 216/499] docs: use latest fuse package (#10791)
---
docs/fuse.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/fuse.md b/docs/fuse.md
index 7744a0d45..b4b966e52 100644
--- a/docs/fuse.md
+++ b/docs/fuse.md
@@ -16,7 +16,7 @@ to your distribution manual to get things working.
Install `fuse` with your favorite package manager:
```
-sudo apt-get install fuse
+sudo apt-get install fuse3
```
On some older Linux distributions, you may need to add yourself to the `fuse` group.
From 05565083df5446ba3a4001d6c8a0dc28809aaf89 Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Wed, 30 Apr 2025 06:07:09 -0700
Subject: [PATCH 217/499] Upgrade to Boxo v0.30.0 (#10794)
* Upgrade to Boxo v0.30.0
---
core/commands/stat_provide.go | 4 +-
docs/changelogs/v0.35.md | 1 +
docs/examples/kubo-as-a-library/go.mod | 42 ++++-----
docs/examples/kubo-as-a-library/go.sum | 88 +++++++++----------
go.mod | 46 +++++-----
go.sum | 96 ++++++++++-----------
test/dependencies/go.mod | 49 +++++------
test/dependencies/go.sum | 113 ++++++++++---------------
8 files changed, 208 insertions(+), 231 deletions(-)
diff --git a/core/commands/stat_provide.go b/core/commands/stat_provide.go
index 8a3dcff30..7a54a79e4 100644
--- a/core/commands/stat_provide.go
+++ b/core/commands/stat_provide.go
@@ -57,8 +57,8 @@ This interface is not stable and may change from release to release.
wtr := tabwriter.NewWriter(w, 1, 2, 1, ' ', 0)
defer wtr.Flush()
- fmt.Fprintf(wtr, "TotalProvides:\t%s\n", humanNumber(s.TotalProvides))
- fmt.Fprintf(wtr, "AvgProvideDuration:\t%s\n", humanDuration(s.AvgProvideDuration))
+ fmt.Fprintf(wtr, "TotalReprovides:\t%s\n", humanNumber(s.TotalReprovides))
+ fmt.Fprintf(wtr, "AvgReprovideDuration:\t%s\n", humanDuration(s.AvgReprovideDuration))
fmt.Fprintf(wtr, "LastReprovideDuration:\t%s\n", humanDuration(s.LastReprovideDuration))
if !s.LastRun.IsZero() {
fmt.Fprintf(wtr, "LastRun:\t%s\n", humanTime(s.LastRun))
diff --git a/docs/changelogs/v0.35.md b/docs/changelogs/v0.35.md
index bc3a857f8..d383fafad 100644
--- a/docs/changelogs/v0.35.md
+++ b/docs/changelogs/v0.35.md
@@ -83,6 +83,7 @@ The release updated configuration [profiles](https://github.com/ipfs/kubo/blob/m
#### ๐ฆ๏ธ Important dependency updates
+- update `boxo` to [v0.30.0](https://github.com/ipfs/boxo/releases/tag/v0.30.0)
- update `ipfs-webui` to [v4.7.0](https://github.com/ipfs/ipfs-webui/releases/tag/v4.7.0)
### ๐ Changelog
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index 7adc7c80a..27e7df28f 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -7,7 +7,7 @@ go 1.24
replace github.com/ipfs/kubo => ./../../..
require (
- github.com/ipfs/boxo v0.29.2-0.20250415191135-dc60fe747c37
+ github.com/ipfs/boxo v0.30.0
github.com/ipfs/kubo v0.0.0-00010101000000-000000000000
github.com/libp2p/go-libp2p v0.41.1
github.com/multiformats/go-multiaddr v0.15.0
@@ -124,8 +124,8 @@ require (
github.com/libp2p/go-doh-resolver v0.5.0 // indirect
github.com/libp2p/go-flow-metrics v0.2.0 // indirect
github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect
- github.com/libp2p/go-libp2p-kad-dht v0.30.2 // indirect
- github.com/libp2p/go-libp2p-kbucket v0.6.5 // indirect
+ github.com/libp2p/go-libp2p-kad-dht v0.32.0 // indirect
+ github.com/libp2p/go-libp2p-kbucket v0.7.0 // indirect
github.com/libp2p/go-libp2p-pubsub v0.13.0 // indirect
github.com/libp2p/go-libp2p-pubsub-router v0.6.0 // indirect
github.com/libp2p/go-libp2p-record v0.3.1 // indirect
@@ -139,7 +139,7 @@ require (
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mholt/acmez/v3 v3.0.0 // indirect
- github.com/miekg/dns v1.1.63 // indirect
+ github.com/miekg/dns v1.1.65 // indirect
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect
github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect
github.com/minio/sha256-simd v1.0.1 // indirect
@@ -181,10 +181,10 @@ require (
github.com/pion/webrtc/v4 v4.0.10 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/polydawn/refmt v0.89.0 // indirect
- github.com/prometheus/client_golang v1.21.1 // indirect
- github.com/prometheus/client_model v0.6.1 // indirect
- github.com/prometheus/common v0.62.0 // indirect
- github.com/prometheus/procfs v0.15.1 // indirect
+ github.com/prometheus/client_golang v1.22.0 // indirect
+ github.com/prometheus/client_model v0.6.2 // indirect
+ github.com/prometheus/common v0.63.0 // indirect
+ github.com/prometheus/procfs v0.16.1 // indirect
github.com/quic-go/qpack v0.5.1 // indirect
github.com/quic-go/quic-go v0.50.1 // indirect
github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 // indirect
@@ -205,15 +205,15 @@ require (
go.opencensus.io v0.24.0 // indirect
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect
- go.opentelemetry.io/otel v1.34.0 // indirect
+ go.opentelemetry.io/otel v1.35.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 // indirect
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 // indirect
go.opentelemetry.io/otel/exporters/zipkin v1.31.0 // indirect
- go.opentelemetry.io/otel/metric v1.34.0 // indirect
+ go.opentelemetry.io/otel/metric v1.35.0 // indirect
go.opentelemetry.io/otel/sdk v1.31.0 // indirect
- go.opentelemetry.io/otel/trace v1.34.0 // indirect
+ go.opentelemetry.io/otel/trace v1.35.0 // indirect
go.opentelemetry.io/proto/otlp v1.3.1 // indirect
go.uber.org/atomic v1.11.0 // indirect
go.uber.org/dig v1.18.0 // indirect
@@ -223,20 +223,20 @@ require (
go.uber.org/zap v1.27.0 // indirect
go.uber.org/zap/exp v0.3.0 // indirect
go4.org v0.0.0-20230225012048-214862532bf5 // indirect
- golang.org/x/crypto v0.35.0 // indirect
- golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa // indirect
- golang.org/x/mod v0.23.0 // indirect
- golang.org/x/net v0.35.0 // indirect
- golang.org/x/sync v0.11.0 // indirect
- golang.org/x/sys v0.30.0 // indirect
- golang.org/x/text v0.22.0 // indirect
- golang.org/x/tools v0.30.0 // indirect
+ golang.org/x/crypto v0.37.0 // indirect
+ golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect
+ golang.org/x/mod v0.24.0 // indirect
+ golang.org/x/net v0.39.0 // indirect
+ golang.org/x/sync v0.13.0 // indirect
+ golang.org/x/sys v0.32.0 // indirect
+ golang.org/x/text v0.24.0 // indirect
+ golang.org/x/tools v0.32.0 // indirect
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
- gonum.org/v1/gonum v0.15.1 // indirect
+ gonum.org/v1/gonum v0.16.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20241007155032-5fefd90f89a9 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 // indirect
google.golang.org/grpc v1.67.1 // indirect
- google.golang.org/protobuf v1.36.5 // indirect
+ google.golang.org/protobuf v1.36.6 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
lukechampine.com/blake3 v1.4.0 // indirect
)
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index 5e2f686a0..76251bf28 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -244,8 +244,8 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
-github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
+github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ=
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8=
@@ -298,8 +298,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcd
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.29.2-0.20250415191135-dc60fe747c37 h1:q3a+2FIbWzZbx/yUqpuG4jLVSa6GvxtRfx9TU5GLiN0=
-github.com/ipfs/boxo v0.29.2-0.20250415191135-dc60fe747c37/go.mod h1:omQZmLS7LegSpBy3m4CrAB9/SO7Fq3pfv+5y1FOd+gI=
+github.com/ipfs/boxo v0.30.0 h1:7afsoxPGGqfoH7Dum/wOTGUB9M5fb8HyKPMlLfBvIEQ=
+github.com/ipfs/boxo v0.30.0/go.mod h1:BPqgGGyHB9rZZcPSzah2Dc9C+5Or3U1aQe7EH1H7370=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-bitswap v0.11.0 h1:j1WVvhDX1yhG32NTC9xfxnqycqYIlhzEzLXG/cU1HyQ=
@@ -461,11 +461,11 @@ github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl9
github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8=
github.com/libp2p/go-libp2p-core v0.2.4/go.mod h1:STh4fdfa5vDYr0/SzYYeqnt+E6KfEV5VxfIrm0bcI0g=
github.com/libp2p/go-libp2p-core v0.3.0/go.mod h1:ACp3DmS3/N64c2jDzcV429ukDpicbL6+TrrxANBjPGw=
-github.com/libp2p/go-libp2p-kad-dht v0.30.2 h1:K0LJPdXynQ+u3rx6uFlrfNy0i11LE6SOCDzwAAaahys=
-github.com/libp2p/go-libp2p-kad-dht v0.30.2/go.mod h1:UV0mxF4ufh/ht05jNg5mcjOMrjK82uecgANa+GKi4y0=
+github.com/libp2p/go-libp2p-kad-dht v0.32.0 h1:dpyq7o00od98vPQG0IZvNHpeLnKyuICN1nVzGnVMC9k=
+github.com/libp2p/go-libp2p-kad-dht v0.32.0/go.mod h1:vQU5oE9hMHXJhSQawbZapC9u0U9dc+tWC0DYasGmIAA=
github.com/libp2p/go-libp2p-kbucket v0.3.1/go.mod h1:oyjT5O7tS9CQurok++ERgc46YLwEpuGoFq9ubvoUOio=
-github.com/libp2p/go-libp2p-kbucket v0.6.5 h1:Fsl1YvZcMwqrR4DYrTO02yo9PGYs2HBQIT3lGXFMTxg=
-github.com/libp2p/go-libp2p-kbucket v0.6.5/go.mod h1:U6WOd0BvnSp03IQSrjgM54tg7zh1UUNsXLJqAQzClTA=
+github.com/libp2p/go-libp2p-kbucket v0.7.0 h1:vYDvRjkyJPeWunQXqcW2Z6E93Ywx7fX0jgzb/dGOKCs=
+github.com/libp2p/go-libp2p-kbucket v0.7.0/go.mod h1:blOINGIj1yiPYlVEX0Rj9QwEkmVnz3EP8LK1dRKBC6g=
github.com/libp2p/go-libp2p-peerstore v0.1.4/go.mod h1:+4BDbDiiKf4PzpANZDAT+knVdLxvqh7hXOujessqdzs=
github.com/libp2p/go-libp2p-pubsub v0.13.0 h1:RmFQ2XAy3zQtbt2iNPy7Tt0/3fwTnHpCQSSnmGnt1Ps=
github.com/libp2p/go-libp2p-pubsub v0.13.0/go.mod h1:m0gpUOyrXKXdE7c8FNQ9/HLfWbxaEw7xku45w+PaqZo=
@@ -512,8 +512,8 @@ github.com/mholt/acmez/v3 v3.0.0 h1:r1NcjuWR0VaKP2BTjDK9LRFBw/WvURx3jlaEUl9Ht8E=
github.com/mholt/acmez/v3 v3.0.0/go.mod h1:L1wOU06KKvq7tswuMDwKdcHeKpFFgkppZy/y0DFxagQ=
github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4=
github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4=
-github.com/miekg/dns v1.1.63 h1:8M5aAw6OMZfFXTT7K5V0Eu5YiiL8l7nUAkyN6C9YwaY=
-github.com/miekg/dns v1.1.63/go.mod h1:6NGHfjhpmr5lt3XPLuyfDJi5AXbNIPM9PY6H6sF1Nfs=
+github.com/miekg/dns v1.1.65 h1:0+tIPHzUW0GCge7IiK3guGP57VAw7hoPDfApjkMD1Fc=
+github.com/miekg/dns v1.1.65/go.mod h1:Dzw9769uoKVaLuODMDZz9M6ynFU6Em65csPuoi8G0ck=
github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8=
github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms=
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc=
@@ -666,18 +666,18 @@ github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e/go.mod h1:uIp+gprXx
github.com/polydawn/refmt v0.89.0 h1:ADJTApkvkeBZsN0tBTx8QjpD9JkmxbKp0cxfr9qszm4=
github.com/polydawn/refmt v0.89.0/go.mod h1:/zvteZs/GwLtCgZ4BL6CBsk9IKIlexP43ObX9AxTqTw=
github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
-github.com/prometheus/client_golang v1.21.1 h1:DOvXXTqVzvkIewV/CDPFdejpMCGeMcbGCQ8YOmu+Ibk=
-github.com/prometheus/client_golang v1.21.1/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg=
+github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q=
+github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
-github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
+github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=
+github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
-github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io=
-github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I=
+github.com/prometheus/common v0.63.0 h1:YR/EIY1o3mEFP/kZCD7iDMnLPlGyuU2Gb3HIcXnA98k=
+github.com/prometheus/common v0.63.0/go.mod h1:VVFF/fBIoToEnWRVkYoXEkq3R3paCoxG9PXP74SnV18=
github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
-github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
-github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
+github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg=
+github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is=
github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI=
github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg=
github.com/quic-go/quic-go v0.50.1 h1:unsgjFIUqW8a2oopkY7YNONpV1gYND6Nt9hnt1PN94Q=
@@ -822,8 +822,8 @@ go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJyS
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM=
-go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY=
-go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI=
+go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ=
+go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 h1:K0XaT3DwHAcV4nKLzcQvwAgSyisUghWoY20I7huthMk=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0/go.mod h1:B5Ki776z/MBnVha1Nzwp5arlzBbE3+1jk+pGmaP5HME=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 h1:FFeLy03iVTXP6ffeN2iXrxfGsZGCjVx0/4KlizjyBwU=
@@ -834,12 +834,12 @@ go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 h1:UGZ1QwZWY67Z6Bm
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0/go.mod h1:fcwWuDuaObkkChiDlhEpSq9+X1C0omv+s5mBtToAQ64=
go.opentelemetry.io/otel/exporters/zipkin v1.31.0 h1:CgucL0tj3717DJnni7HVVB2wExzi8c2zJNEA2BhLMvI=
go.opentelemetry.io/otel/exporters/zipkin v1.31.0/go.mod h1:rfzOVNiSwIcWtEC2J8epwG26fiaXlYvLySJ7bwsrtAE=
-go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ=
-go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE=
+go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M=
+go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE=
go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk=
go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0=
-go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k=
-go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE=
+go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs=
+go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc=
go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0=
go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8=
go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
@@ -890,8 +890,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
-golang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs=
-golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ=
+golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE=
+golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -900,8 +900,8 @@ golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE
golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
-golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa h1:t2QcU6V556bFjYgu4L6C+6VrCPyJZ+eyRsABUPs1mz4=
-golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa/go.mod h1:BHOTPb3L19zxehTsLoJXVaTktb06DFgmdW6Wb9s8jqk=
+golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM=
+golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -925,8 +925,8 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
-golang.org/x/mod v0.23.0 h1:Zb7khfcRGKk+kqfxFaP5tZqCnDZMjC5VtUBs87Hr6QM=
-golang.org/x/mod v0.23.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
+golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU=
+golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -964,8 +964,8 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
-golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8=
-golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk=
+golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY=
+golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -984,8 +984,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w=
-golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610=
+golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1039,8 +1039,8 @@ golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
-golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20=
+golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
@@ -1060,8 +1060,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
-golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM=
-golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
+golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0=
+golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU=
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -1105,8 +1105,8 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
-golang.org/x/tools v0.30.0 h1:BgcpHewrV5AUp2G9MebG4XPFI1E2W41zU1SaqVA9vJY=
-golang.org/x/tools v0.30.0/go.mod h1:c347cR/OJfw5TI+GfX7RUPNMdDRRbjvYTS0jPyvsVtY=
+golang.org/x/tools v0.32.0 h1:Q7N1vhpkQv7ybVzLFtTjvQya2ewbwNDZzUgfXGqtMWU=
+golang.org/x/tools v0.32.0/go.mod h1:ZxrU41P/wAbZD8EDa6dDCa6XfpkhJ7HFMjHJXfBDu8s=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -1114,8 +1114,8 @@ golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8T
golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY=
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90=
-gonum.org/v1/gonum v0.15.1 h1:FNy7N6OUZVUaWG9pTiD+jlhdQ3lMP+/LcTpJ6+a8sQ0=
-gonum.org/v1/gonum v0.15.1/go.mod h1:eZTZuRFrzu5pcyjN5wJhcIhnUdNijYxX1T2IcrOGY0o=
+gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
+gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=
google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y=
@@ -1181,8 +1181,8 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
-google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM=
-google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
+google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
+google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
diff --git a/go.mod b/go.mod
index 68e8c7a3f..c6342a48d 100644
--- a/go.mod
+++ b/go.mod
@@ -21,7 +21,7 @@ require (
github.com/hashicorp/go-version v1.7.0
github.com/ipfs-shipyard/nopfs v0.0.14
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0
- github.com/ipfs/boxo v0.29.2-0.20250415191135-dc60fe747c37
+ github.com/ipfs/boxo v0.30.0
github.com/ipfs/go-block-format v0.2.0
github.com/ipfs/go-cid v0.5.0
github.com/ipfs/go-cidutil v0.1.0
@@ -55,8 +55,8 @@ require (
github.com/libp2p/go-doh-resolver v0.5.0
github.com/libp2p/go-libp2p v0.41.1
github.com/libp2p/go-libp2p-http v0.5.0
- github.com/libp2p/go-libp2p-kad-dht v0.30.2
- github.com/libp2p/go-libp2p-kbucket v0.6.5
+ github.com/libp2p/go-libp2p-kad-dht v0.32.0
+ github.com/libp2p/go-libp2p-kbucket v0.7.0
github.com/libp2p/go-libp2p-pubsub v0.13.0
github.com/libp2p/go-libp2p-pubsub-router v0.6.0
github.com/libp2p/go-libp2p-record v0.3.1
@@ -70,7 +70,7 @@ require (
github.com/multiformats/go-multihash v0.2.3
github.com/opentracing/opentracing-go v1.2.0
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58
- github.com/prometheus/client_golang v1.21.1
+ github.com/prometheus/client_golang v1.22.0
github.com/stretchr/testify v1.10.0
github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d
github.com/tidwall/gjson v1.16.0
@@ -80,19 +80,19 @@ require (
go.opencensus.io v0.24.0
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0
go.opentelemetry.io/contrib/propagators/autoprop v0.46.1
- go.opentelemetry.io/otel v1.34.0
+ go.opentelemetry.io/otel v1.35.0
go.opentelemetry.io/otel/sdk v1.31.0
- go.opentelemetry.io/otel/trace v1.34.0
+ go.opentelemetry.io/otel/trace v1.35.0
go.uber.org/dig v1.18.0
go.uber.org/fx v1.23.0
go.uber.org/multierr v1.11.0
go.uber.org/zap v1.27.0
- golang.org/x/crypto v0.35.0
- golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa
- golang.org/x/mod v0.23.0
- golang.org/x/sync v0.11.0
- golang.org/x/sys v0.30.0
- google.golang.org/protobuf v1.36.5
+ golang.org/x/crypto v0.37.0
+ golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0
+ golang.org/x/mod v0.24.0
+ golang.org/x/sync v0.13.0
+ golang.org/x/sys v0.32.0
+ google.golang.org/protobuf v1.36.6
)
require (
@@ -185,7 +185,7 @@ require (
github.com/mattn/go-runewidth v0.0.15 // indirect
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect
github.com/mholt/acmez/v3 v3.0.0 // indirect
- github.com/miekg/dns v1.1.63 // indirect
+ github.com/miekg/dns v1.1.65 // indirect
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect
github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect
github.com/minio/sha256-simd v1.0.1 // indirect
@@ -222,9 +222,9 @@ require (
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/polydawn/refmt v0.89.0 // indirect
- github.com/prometheus/client_model v0.6.1 // indirect
- github.com/prometheus/common v0.62.0 // indirect
- github.com/prometheus/procfs v0.15.1 // indirect
+ github.com/prometheus/client_model v0.6.2 // indirect
+ github.com/prometheus/common v0.63.0 // indirect
+ github.com/prometheus/procfs v0.16.1 // indirect
github.com/prometheus/statsd_exporter v0.27.1 // indirect
github.com/quic-go/qpack v0.5.1 // indirect
github.com/quic-go/quic-go v0.50.1 // indirect
@@ -257,19 +257,19 @@ require (
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 // indirect
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 // indirect
go.opentelemetry.io/otel/exporters/zipkin v1.31.0 // indirect
- go.opentelemetry.io/otel/metric v1.34.0 // indirect
+ go.opentelemetry.io/otel/metric v1.35.0 // indirect
go.opentelemetry.io/proto/otlp v1.3.1 // indirect
go.uber.org/atomic v1.11.0 // indirect
go.uber.org/mock v0.5.0 // indirect
go.uber.org/zap/exp v0.3.0 // indirect
go4.org v0.0.0-20230225012048-214862532bf5 // indirect
- golang.org/x/net v0.35.0 // indirect
- golang.org/x/oauth2 v0.24.0 // indirect
- golang.org/x/term v0.29.0 // indirect
- golang.org/x/text v0.22.0 // indirect
- golang.org/x/tools v0.30.0 // indirect
+ golang.org/x/net v0.39.0 // indirect
+ golang.org/x/oauth2 v0.25.0 // indirect
+ golang.org/x/term v0.31.0 // indirect
+ golang.org/x/text v0.24.0 // indirect
+ golang.org/x/tools v0.32.0 // indirect
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
- gonum.org/v1/gonum v0.15.1 // indirect
+ gonum.org/v1/gonum v0.16.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20241007155032-5fefd90f89a9 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 // indirect
google.golang.org/grpc v1.67.1 // indirect
diff --git a/go.sum b/go.sum
index cf9c33444..313d66cac 100644
--- a/go.sum
+++ b/go.sum
@@ -300,8 +300,8 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
-github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
-github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
+github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ=
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
@@ -362,8 +362,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcd
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.29.2-0.20250415191135-dc60fe747c37 h1:q3a+2FIbWzZbx/yUqpuG4jLVSa6GvxtRfx9TU5GLiN0=
-github.com/ipfs/boxo v0.29.2-0.20250415191135-dc60fe747c37/go.mod h1:omQZmLS7LegSpBy3m4CrAB9/SO7Fq3pfv+5y1FOd+gI=
+github.com/ipfs/boxo v0.30.0 h1:7afsoxPGGqfoH7Dum/wOTGUB9M5fb8HyKPMlLfBvIEQ=
+github.com/ipfs/boxo v0.30.0/go.mod h1:BPqgGGyHB9rZZcPSzah2Dc9C+5Or3U1aQe7EH1H7370=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-bitswap v0.11.0 h1:j1WVvhDX1yhG32NTC9xfxnqycqYIlhzEzLXG/cU1HyQ=
@@ -547,11 +547,11 @@ github.com/libp2p/go-libp2p-gostream v0.6.0 h1:QfAiWeQRce6pqnYfmIVWJFXNdDyfiR/qk
github.com/libp2p/go-libp2p-gostream v0.6.0/go.mod h1:Nywu0gYZwfj7Jc91PQvbGU8dIpqbQQkjWgDuOrFaRdA=
github.com/libp2p/go-libp2p-http v0.5.0 h1:+x0AbLaUuLBArHubbbNRTsgWz0RjNTy6DJLOxQ3/QBc=
github.com/libp2p/go-libp2p-http v0.5.0/go.mod h1:glh87nZ35XCQyFsdzZps6+F4HYI6DctVFY5u1fehwSg=
-github.com/libp2p/go-libp2p-kad-dht v0.30.2 h1:K0LJPdXynQ+u3rx6uFlrfNy0i11LE6SOCDzwAAaahys=
-github.com/libp2p/go-libp2p-kad-dht v0.30.2/go.mod h1:UV0mxF4ufh/ht05jNg5mcjOMrjK82uecgANa+GKi4y0=
+github.com/libp2p/go-libp2p-kad-dht v0.32.0 h1:dpyq7o00od98vPQG0IZvNHpeLnKyuICN1nVzGnVMC9k=
+github.com/libp2p/go-libp2p-kad-dht v0.32.0/go.mod h1:vQU5oE9hMHXJhSQawbZapC9u0U9dc+tWC0DYasGmIAA=
github.com/libp2p/go-libp2p-kbucket v0.3.1/go.mod h1:oyjT5O7tS9CQurok++ERgc46YLwEpuGoFq9ubvoUOio=
-github.com/libp2p/go-libp2p-kbucket v0.6.5 h1:Fsl1YvZcMwqrR4DYrTO02yo9PGYs2HBQIT3lGXFMTxg=
-github.com/libp2p/go-libp2p-kbucket v0.6.5/go.mod h1:U6WOd0BvnSp03IQSrjgM54tg7zh1UUNsXLJqAQzClTA=
+github.com/libp2p/go-libp2p-kbucket v0.7.0 h1:vYDvRjkyJPeWunQXqcW2Z6E93Ywx7fX0jgzb/dGOKCs=
+github.com/libp2p/go-libp2p-kbucket v0.7.0/go.mod h1:blOINGIj1yiPYlVEX0Rj9QwEkmVnz3EP8LK1dRKBC6g=
github.com/libp2p/go-libp2p-peerstore v0.1.4/go.mod h1:+4BDbDiiKf4PzpANZDAT+knVdLxvqh7hXOujessqdzs=
github.com/libp2p/go-libp2p-pubsub v0.13.0 h1:RmFQ2XAy3zQtbt2iNPy7Tt0/3fwTnHpCQSSnmGnt1Ps=
github.com/libp2p/go-libp2p-pubsub v0.13.0/go.mod h1:m0gpUOyrXKXdE7c8FNQ9/HLfWbxaEw7xku45w+PaqZo=
@@ -610,8 +610,8 @@ github.com/mholt/acmez/v3 v3.0.0 h1:r1NcjuWR0VaKP2BTjDK9LRFBw/WvURx3jlaEUl9Ht8E=
github.com/mholt/acmez/v3 v3.0.0/go.mod h1:L1wOU06KKvq7tswuMDwKdcHeKpFFgkppZy/y0DFxagQ=
github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4=
github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4=
-github.com/miekg/dns v1.1.63 h1:8M5aAw6OMZfFXTT7K5V0Eu5YiiL8l7nUAkyN6C9YwaY=
-github.com/miekg/dns v1.1.63/go.mod h1:6NGHfjhpmr5lt3XPLuyfDJi5AXbNIPM9PY6H6sF1Nfs=
+github.com/miekg/dns v1.1.65 h1:0+tIPHzUW0GCge7IiK3guGP57VAw7hoPDfApjkMD1Fc=
+github.com/miekg/dns v1.1.65/go.mod h1:Dzw9769uoKVaLuODMDZz9M6ynFU6Em65csPuoi8G0ck=
github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8=
github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms=
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc=
@@ -779,14 +779,14 @@ github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqr
github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
github.com/prometheus/client_golang v1.13.0/go.mod h1:vTeo+zgvILHsnnj/39Ou/1fPN5nJFOEMgftOUOmlvYQ=
-github.com/prometheus/client_golang v1.21.1 h1:DOvXXTqVzvkIewV/CDPFdejpMCGeMcbGCQ8YOmu+Ibk=
-github.com/prometheus/client_golang v1.21.1/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg=
+github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q=
+github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
-github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
+github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=
+github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
@@ -794,8 +794,8 @@ github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9
github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
github.com/prometheus/common v0.35.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=
github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=
-github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io=
-github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I=
+github.com/prometheus/common v0.63.0 h1:YR/EIY1o3mEFP/kZCD7iDMnLPlGyuU2Gb3HIcXnA98k=
+github.com/prometheus/common v0.63.0/go.mod h1:VVFF/fBIoToEnWRVkYoXEkq3R3paCoxG9PXP74SnV18=
github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
@@ -803,8 +803,8 @@ github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O
github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=
-github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
-github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
+github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg=
+github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is=
github.com/prometheus/statsd_exporter v0.22.7/go.mod h1:N/TevpjkIh9ccs6nuzY3jQn9dFqnUakOjnEuMPJJJnI=
github.com/prometheus/statsd_exporter v0.27.1 h1:tcRJOmwlA83HPfWzosAgr2+zEN5XDFv+M2mn/uYkn5Y=
github.com/prometheus/statsd_exporter v0.27.1/go.mod h1:vA6ryDfsN7py/3JApEst6nLTJboq66XsNcJGNmC88NQ=
@@ -989,8 +989,8 @@ go.opentelemetry.io/contrib/propagators/jaeger v1.21.1 h1:f4beMGDKiVzg9IcX7/VuWV
go.opentelemetry.io/contrib/propagators/jaeger v1.21.1/go.mod h1:U9jhkEl8d1LL+QXY7q3kneJWJugiN3kZJV2OWz3hkBY=
go.opentelemetry.io/contrib/propagators/ot v1.21.1 h1:3TN5vkXjKYWp0YdMcnUEC/A+pBPvqz9V3nCS2xmcurk=
go.opentelemetry.io/contrib/propagators/ot v1.21.1/go.mod h1:oy0MYCbS/b3cqUDW37wBWtlwBIsutngS++Lklpgh+fc=
-go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY=
-go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI=
+go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ=
+go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 h1:K0XaT3DwHAcV4nKLzcQvwAgSyisUghWoY20I7huthMk=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0/go.mod h1:B5Ki776z/MBnVha1Nzwp5arlzBbE3+1jk+pGmaP5HME=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 h1:FFeLy03iVTXP6ffeN2iXrxfGsZGCjVx0/4KlizjyBwU=
@@ -1001,12 +1001,12 @@ go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 h1:UGZ1QwZWY67Z6Bm
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0/go.mod h1:fcwWuDuaObkkChiDlhEpSq9+X1C0omv+s5mBtToAQ64=
go.opentelemetry.io/otel/exporters/zipkin v1.31.0 h1:CgucL0tj3717DJnni7HVVB2wExzi8c2zJNEA2BhLMvI=
go.opentelemetry.io/otel/exporters/zipkin v1.31.0/go.mod h1:rfzOVNiSwIcWtEC2J8epwG26fiaXlYvLySJ7bwsrtAE=
-go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ=
-go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE=
+go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M=
+go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE=
go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk=
go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0=
-go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k=
-go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE=
+go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs=
+go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc=
go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0=
go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8=
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
@@ -1060,8 +1060,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
-golang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs=
-golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ=
+golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE=
+golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -1072,8 +1072,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
-golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa h1:t2QcU6V556bFjYgu4L6C+6VrCPyJZ+eyRsABUPs1mz4=
-golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa/go.mod h1:BHOTPb3L19zxehTsLoJXVaTktb06DFgmdW6Wb9s8jqk=
+golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM=
+golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -1098,8 +1098,8 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
-golang.org/x/mod v0.23.0 h1:Zb7khfcRGKk+kqfxFaP5tZqCnDZMjC5VtUBs87Hr6QM=
-golang.org/x/mod v0.23.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
+golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU=
+golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -1152,8 +1152,8 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
-golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8=
-golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk=
+golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY=
+golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -1163,8 +1163,8 @@ golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4Iltr
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
-golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE=
-golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
+golang.org/x/oauth2 v0.25.0 h1:CY4y7XT9v0cRI9oupztF8AgiIu99L/ksR/Xp/6jrZ70=
+golang.org/x/oauth2 v0.25.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -1180,8 +1180,8 @@ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w=
-golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610=
+golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1256,8 +1256,8 @@ golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
-golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20=
+golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
@@ -1266,8 +1266,8 @@ golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU=
golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY=
-golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU=
-golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s=
+golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o=
+golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -1279,8 +1279,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
-golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM=
-golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
+golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0=
+golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU=
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -1341,8 +1341,8 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
-golang.org/x/tools v0.30.0 h1:BgcpHewrV5AUp2G9MebG4XPFI1E2W41zU1SaqVA9vJY=
-golang.org/x/tools v0.30.0/go.mod h1:c347cR/OJfw5TI+GfX7RUPNMdDRRbjvYTS0jPyvsVtY=
+golang.org/x/tools v0.32.0 h1:Q7N1vhpkQv7ybVzLFtTjvQya2ewbwNDZzUgfXGqtMWU=
+golang.org/x/tools v0.32.0/go.mod h1:ZxrU41P/wAbZD8EDa6dDCa6XfpkhJ7HFMjHJXfBDu8s=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -1350,8 +1350,8 @@ golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8T
golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY=
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90=
-gonum.org/v1/gonum v0.15.1 h1:FNy7N6OUZVUaWG9pTiD+jlhdQ3lMP+/LcTpJ6+a8sQ0=
-gonum.org/v1/gonum v0.15.1/go.mod h1:eZTZuRFrzu5pcyjN5wJhcIhnUdNijYxX1T2IcrOGY0o=
+gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
+gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=
google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y=
@@ -1448,8 +1448,8 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
-google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM=
-google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
+google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
+google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index fef506300..bfcb2a5e6 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -92,7 +92,6 @@ require (
github.com/go-xmlfmt/xmlfmt v1.1.2 // indirect
github.com/gobwas/glob v0.2.3 // indirect
github.com/gofrs/flock v0.12.1 // indirect
- github.com/gogo/protobuf v1.3.2 // indirect
github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a // indirect
github.com/golangci/gofmt v0.0.0-20240816233607-d8596aa466a9 // indirect
github.com/golangci/misspell v0.6.0 // indirect
@@ -100,7 +99,7 @@ require (
github.com/golangci/plugin-module-register v0.1.1 // indirect
github.com/golangci/revgrep v0.5.3 // indirect
github.com/golangci/unconvert v0.0.0-20240309020433-c5143eacb3ed // indirect
- github.com/google/go-cmp v0.6.0 // indirect
+ github.com/google/go-cmp v0.7.0 // indirect
github.com/google/gopacket v1.1.19 // indirect
github.com/google/pprof v0.0.0-20250208200701-d0013a598941 // indirect
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
@@ -118,7 +117,7 @@ require (
github.com/huin/goupnp v1.3.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/ipfs/bbloom v0.0.4 // indirect
- github.com/ipfs/boxo v0.29.2-0.20250415191135-dc60fe747c37 // indirect
+ github.com/ipfs/boxo v0.30.0 // indirect
github.com/ipfs/go-bitfield v1.1.0 // indirect
github.com/ipfs/go-block-format v0.2.0 // indirect
github.com/ipfs/go-cid v0.5.0 // indirect
@@ -126,7 +125,6 @@ require (
github.com/ipfs/go-ipfs-util v0.0.3 // indirect
github.com/ipfs/go-ipld-format v0.6.0 // indirect
github.com/ipfs/go-ipld-legacy v0.2.1 // indirect
- github.com/ipfs/go-log v1.0.5 // indirect
github.com/ipfs/go-metrics-interface v0.3.0 // indirect
github.com/ipfs/kubo v0.31.0 // indirect
github.com/ipld/go-codec-dagpb v1.6.0 // indirect
@@ -158,8 +156,8 @@ require (
github.com/libp2p/go-flow-metrics v0.2.0 // indirect
github.com/libp2p/go-libp2p v0.41.1 // indirect
github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect
- github.com/libp2p/go-libp2p-kad-dht v0.30.2 // indirect
- github.com/libp2p/go-libp2p-kbucket v0.6.5 // indirect
+ github.com/libp2p/go-libp2p-kad-dht v0.32.0 // indirect
+ github.com/libp2p/go-libp2p-kbucket v0.7.0 // indirect
github.com/libp2p/go-libp2p-record v0.3.1 // indirect
github.com/libp2p/go-libp2p-routing-helpers v0.7.5 // indirect
github.com/libp2p/go-msgio v0.3.0 // indirect
@@ -177,7 +175,7 @@ require (
github.com/mattn/go-shellwords v1.0.12 // indirect
github.com/mgechev/revive v1.3.9 // indirect
github.com/mholt/acmez/v3 v3.0.0 // indirect
- github.com/miekg/dns v1.1.63 // indirect
+ github.com/miekg/dns v1.1.65 // indirect
github.com/minio/sha256-simd v1.0.1 // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
@@ -198,7 +196,6 @@ require (
github.com/nunnatsa/ginkgolinter v0.16.2 // indirect
github.com/olekukonko/tablewriter v0.0.5 // indirect
github.com/onsi/ginkgo/v2 v2.22.2 // indirect
- github.com/opentracing/opentracing-go v1.2.0 // indirect
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
github.com/pion/datachannel v1.5.10 // indirect
@@ -223,10 +220,10 @@ require (
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/polydawn/refmt v0.89.0 // indirect
github.com/polyfloyd/go-errorlint v1.6.0 // indirect
- github.com/prometheus/client_golang v1.21.1 // indirect
- github.com/prometheus/client_model v0.6.1 // indirect
- github.com/prometheus/common v0.62.0 // indirect
- github.com/prometheus/procfs v0.15.1 // indirect
+ github.com/prometheus/client_golang v1.22.0 // indirect
+ github.com/prometheus/client_model v0.6.2 // indirect
+ github.com/prometheus/common v0.63.0 // indirect
+ github.com/prometheus/procfs v0.16.1 // indirect
github.com/quasilyte/go-ruleguard v0.4.2 // indirect
github.com/quasilyte/go-ruleguard/dsl v0.3.22 // indirect
github.com/quasilyte/gogrep v0.5.0 // indirect
@@ -288,9 +285,9 @@ require (
go-simpler.org/musttag v0.12.2 // indirect
go-simpler.org/sloglint v0.7.2 // indirect
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
- go.opentelemetry.io/otel v1.34.0 // indirect
- go.opentelemetry.io/otel/metric v1.34.0 // indirect
- go.opentelemetry.io/otel/trace v1.34.0 // indirect
+ go.opentelemetry.io/otel v1.35.0 // indirect
+ go.opentelemetry.io/otel/metric v1.35.0 // indirect
+ go.opentelemetry.io/otel/trace v1.35.0 // indirect
go.uber.org/automaxprocs v1.5.3 // indirect
go.uber.org/dig v1.18.0 // indirect
go.uber.org/fx v1.23.0 // indirect
@@ -298,18 +295,18 @@ require (
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.27.0 // indirect
go.uber.org/zap/exp v0.3.0 // indirect
- golang.org/x/crypto v0.35.0 // indirect
- golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa // indirect
+ golang.org/x/crypto v0.37.0 // indirect
+ golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect
golang.org/x/exp/typeparams v0.0.0-20240314144324-c7f7c6466f7f // indirect
- golang.org/x/mod v0.23.0 // indirect
- golang.org/x/net v0.35.0 // indirect
- golang.org/x/sync v0.11.0 // indirect
- golang.org/x/sys v0.30.0 // indirect
- golang.org/x/term v0.29.0 // indirect
- golang.org/x/text v0.22.0 // indirect
- golang.org/x/tools v0.30.0 // indirect
- gonum.org/v1/gonum v0.15.1 // indirect
- google.golang.org/protobuf v1.36.5 // indirect
+ golang.org/x/mod v0.24.0 // indirect
+ golang.org/x/net v0.39.0 // indirect
+ golang.org/x/sync v0.13.0 // indirect
+ golang.org/x/sys v0.32.0 // indirect
+ golang.org/x/term v0.31.0 // indirect
+ golang.org/x/text v0.24.0 // indirect
+ golang.org/x/tools v0.32.0 // indirect
+ gonum.org/v1/gonum v0.16.0 // indirect
+ google.golang.org/protobuf v1.36.6 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index a0be36844..1b4a49612 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -243,8 +243,9 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
-github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
+github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ=
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8=
@@ -253,7 +254,6 @@ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXi
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof v0.0.0-20250208200701-d0013a598941 h1:43XjGa6toxLpeksjcxs1jIoIyr+vUfOqY2c6HB4bpoc=
github.com/google/pprof v0.0.0-20250208200701-d0013a598941/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
-github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
@@ -298,8 +298,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.29.2-0.20250415191135-dc60fe747c37 h1:q3a+2FIbWzZbx/yUqpuG4jLVSa6GvxtRfx9TU5GLiN0=
-github.com/ipfs/boxo v0.29.2-0.20250415191135-dc60fe747c37/go.mod h1:omQZmLS7LegSpBy3m4CrAB9/SO7Fq3pfv+5y1FOd+gI=
+github.com/ipfs/boxo v0.30.0 h1:7afsoxPGGqfoH7Dum/wOTGUB9M5fb8HyKPMlLfBvIEQ=
+github.com/ipfs/boxo v0.30.0/go.mod h1:BPqgGGyHB9rZZcPSzah2Dc9C+5Or3U1aQe7EH1H7370=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-block-format v0.2.0 h1:ZqrkxBA2ICbDRbK8KJs/u0O3dlp6gmAuuXUJNiW1Ycs=
@@ -322,9 +322,6 @@ github.com/ipfs/go-ipld-format v0.6.0 h1:VEJlA2kQ3LqFSIm5Vu6eIlSxD/Ze90xtc4Meten
github.com/ipfs/go-ipld-format v0.6.0/go.mod h1:g4QVMTn3marU3qXchwjpKPKgJv+zF+OlaKMyhJ4LHPg=
github.com/ipfs/go-ipld-legacy v0.2.1 h1:mDFtrBpmU7b//LzLSypVrXsD8QxkEWxu5qVxN99/+tk=
github.com/ipfs/go-ipld-legacy v0.2.1/go.mod h1:782MOUghNzMO2DER0FlBR94mllfdCJCkTtDtPM51otM=
-github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8=
-github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo=
-github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g=
github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY=
github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI=
github.com/ipfs/go-metrics-interface v0.3.0 h1:YwG7/Cy4R94mYDUuwsBfeziJCVm9pBMJ6q/JR9V40TU=
@@ -366,7 +363,6 @@ github.com/julz/importas v0.1.0 h1:F78HnrsjY3cR7j0etXy5+TU1Zuy7Xt08X/1aJnH5xXY=
github.com/julz/importas v0.1.0/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0=
github.com/karamaru-alpha/copyloopvar v1.1.0 h1:x7gNyKcC2vRBO1H2Mks5u1VxQtYvFiym7fCjIP8RPos=
github.com/karamaru-alpha/copyloopvar v1.1.0/go.mod h1:u7CIfztblY0jZLOQZgH3oYsJzpC2A7S6u/lfgSXHy0k=
-github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
github.com/kisielk/errcheck v1.7.0 h1:+SbscKmWJ5mOK/bO1zS60F5I9WwZDWOfRsC4RwfwRV0=
github.com/kisielk/errcheck v1.7.0/go.mod h1:1kLL+jV4e+CFfueBmI1dSK2ADDyQnlrnrY/FqKluHJQ=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
@@ -413,10 +409,10 @@ github.com/libp2p/go-libp2p v0.41.1 h1:8ecNQVT5ev/jqALTvisSJeVNvXYJyK4NhQx1nNRXQ
github.com/libp2p/go-libp2p v0.41.1/go.mod h1:DcGTovJzQl/I7HMrby5ZRjeD0kQkGiy+9w6aEkSZpRI=
github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94=
github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8=
-github.com/libp2p/go-libp2p-kad-dht v0.30.2 h1:K0LJPdXynQ+u3rx6uFlrfNy0i11LE6SOCDzwAAaahys=
-github.com/libp2p/go-libp2p-kad-dht v0.30.2/go.mod h1:UV0mxF4ufh/ht05jNg5mcjOMrjK82uecgANa+GKi4y0=
-github.com/libp2p/go-libp2p-kbucket v0.6.5 h1:Fsl1YvZcMwqrR4DYrTO02yo9PGYs2HBQIT3lGXFMTxg=
-github.com/libp2p/go-libp2p-kbucket v0.6.5/go.mod h1:U6WOd0BvnSp03IQSrjgM54tg7zh1UUNsXLJqAQzClTA=
+github.com/libp2p/go-libp2p-kad-dht v0.32.0 h1:dpyq7o00od98vPQG0IZvNHpeLnKyuICN1nVzGnVMC9k=
+github.com/libp2p/go-libp2p-kad-dht v0.32.0/go.mod h1:vQU5oE9hMHXJhSQawbZapC9u0U9dc+tWC0DYasGmIAA=
+github.com/libp2p/go-libp2p-kbucket v0.7.0 h1:vYDvRjkyJPeWunQXqcW2Z6E93Ywx7fX0jgzb/dGOKCs=
+github.com/libp2p/go-libp2p-kbucket v0.7.0/go.mod h1:blOINGIj1yiPYlVEX0Rj9QwEkmVnz3EP8LK1dRKBC6g=
github.com/libp2p/go-libp2p-record v0.3.1 h1:cly48Xi5GjNw5Wq+7gmjfBiG9HCzQVkiZOUZ8kUl+Fg=
github.com/libp2p/go-libp2p-record v0.3.1/go.mod h1:T8itUkLcWQLCYMqtX7Th6r7SexyUJpIyPgks757td/E=
github.com/libp2p/go-libp2p-routing-helpers v0.7.5 h1:HdwZj9NKovMx0vqq6YNPTh6aaNzey5zHD7HeLJtq6fI=
@@ -468,8 +464,8 @@ github.com/mgechev/revive v1.3.9/go.mod h1:+uxEIr5UH0TjXWHTno3xh4u7eg6jDpXKzQccA
github.com/mholt/acmez/v3 v3.0.0 h1:r1NcjuWR0VaKP2BTjDK9LRFBw/WvURx3jlaEUl9Ht8E=
github.com/mholt/acmez/v3 v3.0.0/go.mod h1:L1wOU06KKvq7tswuMDwKdcHeKpFFgkppZy/y0DFxagQ=
github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4=
-github.com/miekg/dns v1.1.63 h1:8M5aAw6OMZfFXTT7K5V0Eu5YiiL8l7nUAkyN6C9YwaY=
-github.com/miekg/dns v1.1.63/go.mod h1:6NGHfjhpmr5lt3XPLuyfDJi5AXbNIPM9PY6H6sF1Nfs=
+github.com/miekg/dns v1.1.65 h1:0+tIPHzUW0GCge7IiK3guGP57VAw7hoPDfApjkMD1Fc=
+github.com/miekg/dns v1.1.65/go.mod h1:Dzw9769uoKVaLuODMDZz9M6ynFU6Em65csPuoi8G0ck=
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc=
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b/go.mod h1:lxPUiZwKoFL8DUUmalo2yJJUCxbPKtm8OKfqr2/FTNU=
github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc h1:PTfri+PuQmWDqERdnNMiD9ZejrlswWrCpBEZgWOiTrc=
@@ -531,8 +527,6 @@ github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8=
github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY=
github.com/opencontainers/runtime-spec v1.2.0 h1:z97+pHb3uELt/yiAWD691HNHQIF07bE7dzrbT927iTk=
github.com/opencontainers/runtime-spec v1.2.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
-github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs=
-github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8=
github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw=
github.com/otiai10/copy v1.14.0 h1:dCI/t1iTdYGtkvCuBG2BgR6KZa83PTclw4U5n2wAllU=
@@ -600,17 +594,17 @@ github.com/polyfloyd/go-errorlint v1.6.0/go.mod h1:HR7u8wuP1kb1NeN1zqTd1ZMlqUKPP
github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g=
github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U=
github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
-github.com/prometheus/client_golang v1.21.1 h1:DOvXXTqVzvkIewV/CDPFdejpMCGeMcbGCQ8YOmu+Ibk=
-github.com/prometheus/client_golang v1.21.1/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg=
+github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q=
+github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
-github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
-github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
+github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=
+github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
-github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io=
-github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I=
+github.com/prometheus/common v0.63.0 h1:YR/EIY1o3mEFP/kZCD7iDMnLPlGyuU2Gb3HIcXnA98k=
+github.com/prometheus/common v0.63.0/go.mod h1:VVFF/fBIoToEnWRVkYoXEkq3R3paCoxG9PXP74SnV18=
github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
-github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
-github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
+github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg=
+github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is=
github.com/quasilyte/go-ruleguard v0.4.2 h1:htXcXDK6/rO12kiTHKfHuqR4kr3Y4M0J0rOL6CH/BYs=
github.com/quasilyte/go-ruleguard v0.4.2/go.mod h1:GJLgqsLeo4qgavUoL8JeGFNS7qcisx3awV/w9eWTmNI=
github.com/quasilyte/go-ruleguard/dsl v0.3.22 h1:wd8zkOhSNr+I+8Qeciml08ivDt1pSXe60+5DqOpCjPE=
@@ -632,7 +626,6 @@ github.com/raulk/go-watchdog v1.3.0/go.mod h1:fIvOnLbF0b0ZwkB9YU4mOW9Did//4vPZtD
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
-github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
@@ -789,7 +782,6 @@ github.com/yeya24/promlinter v0.3.0/go.mod h1:cDfJQQYv9uYciW60QT0eeHlFodotkYZlL+
github.com/ykadowak/zerologlint v0.1.5 h1:Gy/fMz1dFQN9JZTPjv1hxEk+sRWm05row04Yoolgdiw=
github.com/ykadowak/zerologlint v0.1.5/go.mod h1:KaUskqF3e/v59oPmdq1U1DnKcuHokl2/K1U4pmIELKg=
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
@@ -812,13 +804,12 @@ go-simpler.org/sloglint v0.7.2/go.mod h1:US+9C80ppl7VsThQclkM7BkCHQAzuz8kHLsW3pp
go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA=
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
-go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY=
-go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI=
-go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ=
-go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE=
-go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k=
-go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE=
-go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
+go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ=
+go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y=
+go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M=
+go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE=
+go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs=
+go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc=
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/automaxprocs v1.5.3 h1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8=
go.uber.org/automaxprocs v1.5.3/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0=
@@ -831,12 +822,9 @@ go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU=
go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM=
-go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
-go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
-go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ=
go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI=
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
@@ -847,7 +835,6 @@ golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+
golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
@@ -863,11 +850,11 @@ golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
-golang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs=
-golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ=
+golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE=
+golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa h1:t2QcU6V556bFjYgu4L6C+6VrCPyJZ+eyRsABUPs1mz4=
-golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa/go.mod h1:BHOTPb3L19zxehTsLoJXVaTktb06DFgmdW6Wb9s8jqk=
+golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM=
+golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8=
golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
golang.org/x/exp/typeparams v0.0.0-20240314144324-c7f7c6466f7f h1:phY1HzDcf18Aq9A8KkmRtY9WvOFIxN8wgfvy6Zm1DV8=
@@ -877,7 +864,6 @@ golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTk
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
-golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
@@ -894,8 +880,8 @@ golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
-golang.org/x/mod v0.23.0 h1:Zb7khfcRGKk+kqfxFaP5tZqCnDZMjC5VtUBs87Hr6QM=
-golang.org/x/mod v0.23.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
+golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU=
+golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -927,8 +913,8 @@ golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
-golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8=
-golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk=
+golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY=
+golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -948,8 +934,8 @@ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
-golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w=
-golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610=
+golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -988,8 +974,8 @@ golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
-golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20=
+golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
@@ -1006,8 +992,8 @@ golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY=
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58=
-golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU=
-golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s=
+golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o=
+golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
@@ -1022,8 +1008,8 @@ golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
-golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM=
-golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
+golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0=
+golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU=
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U=
@@ -1036,19 +1022,14 @@ golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190321232350-e250d351ecad/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
-golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
-golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU=
golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU=
@@ -1065,14 +1046,14 @@ golang.org/x/tools v0.11.0/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8
golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg=
golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc=
-golang.org/x/tools v0.30.0 h1:BgcpHewrV5AUp2G9MebG4XPFI1E2W41zU1SaqVA9vJY=
-golang.org/x/tools v0.30.0/go.mod h1:c347cR/OJfw5TI+GfX7RUPNMdDRRbjvYTS0jPyvsVtY=
+golang.org/x/tools v0.32.0 h1:Q7N1vhpkQv7ybVzLFtTjvQya2ewbwNDZzUgfXGqtMWU=
+golang.org/x/tools v0.32.0/go.mod h1:ZxrU41P/wAbZD8EDa6dDCa6XfpkhJ7HFMjHJXfBDu8s=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-gonum.org/v1/gonum v0.15.1 h1:FNy7N6OUZVUaWG9pTiD+jlhdQ3lMP+/LcTpJ6+a8sQ0=
-gonum.org/v1/gonum v0.15.1/go.mod h1:eZTZuRFrzu5pcyjN5wJhcIhnUdNijYxX1T2IcrOGY0o=
+gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
+gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=
google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y=
@@ -1089,13 +1070,12 @@ google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmE
google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio=
google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
-google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM=
-google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
+google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
+google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
-gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
@@ -1116,7 +1096,6 @@ grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJd
honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
honnef.co/go/tools v0.5.1 h1:4bH5o3b5ZULQ4UrBmP+63W9r7qIkqJClEA9ko5YKx+I=
honnef.co/go/tools v0.5.1/go.mod h1:e9irvo83WDG9/irijV44wr3tbhcFeRnfpVlRqVwpzMs=
lukechampine.com/blake3 v1.4.0 h1:xDbKOZCVbnZsfzM6mHSYcGRHZ3YrLDzqz8XnV4uaD5w=
From a5997375dbaaceb50d7a7ecb681ef029197c485d Mon Sep 17 00:00:00 2001
From: Guillaume Michel
Date: Wed, 30 Apr 2025 13:32:03 +0000
Subject: [PATCH 218/499] feat: `Provider.WorkerCount` and `stats reprovide`
(#10779)
* adjust ipfs stats provide
* update boxo dep
* bump boxo
* fixing tests
* docs/chore: mark stat reprovide as experimental
* docs: Provider.Strategy
explicitly document it is not used - without this legacy users will have
it in their config and be very confused
---------
Co-authored-by: Marcin Rataj
---
cmd/ipfs/kubo/daemon.go | 3 +
config/config_test.go | 4 +-
config/provider.go | 9 ++-
config/reprovider.go | 2 +
core/commands/commands_test.go | 1 +
core/commands/stat.go | 11 +--
core/commands/stat_provide.go | 49 ++-----------
core/commands/stat_reprovide.go | 104 ++++++++++++++++++++++++++++
core/node/groups.go | 1 +
core/node/provider.go | 8 +--
docs/changelogs/v0.35.md | 32 +++++++++
docs/config.md | 37 ++++++++++
test/sharness/t0002-docker-image.sh | 4 +-
test/sharness/t0070-user-config.sh | 8 +--
14 files changed, 213 insertions(+), 60 deletions(-)
create mode 100644 core/commands/stat_reprovide.go
diff --git a/cmd/ipfs/kubo/daemon.go b/cmd/ipfs/kubo/daemon.go
index 7ee595307..30e805186 100644
--- a/cmd/ipfs/kubo/daemon.go
+++ b/cmd/ipfs/kubo/daemon.go
@@ -485,6 +485,9 @@ func daemonFunc(req *cmds.Request, re cmds.ResponseEmitter, env cmds.Environment
// This should never happen, but better safe than sorry
log.Fatal("Private network does not work with Routing.Type=auto. Update your config to Routing.Type=dht (or none, and do manual peering)")
}
+ if cfg.Provider.Strategy.WithDefault("") != "" && cfg.Reprovider.Strategy.IsDefault() {
+ log.Fatal("Invalid config. Remove unused Provider.Strategy and set Reprovider.Strategy instead. Documentation: https://github.com/ipfs/kubo/blob/master/docs/config.md#reproviderstrategy")
+ }
printLibp2pPorts(node)
diff --git a/config/config_test.go b/config/config_test.go
index d4f38f086..165735043 100644
--- a/config/config_test.go
+++ b/config/config_test.go
@@ -134,9 +134,9 @@ func TestCheckKey(t *testing.T) {
t.Fatal("Foo.Bar isn't a valid key in the config")
}
- err = CheckKey("Provider.Strategy")
+ err = CheckKey("Reprovider.Strategy")
if err != nil {
- t.Fatalf("%s: %s", err, "Provider.Strategy is a valid key in the config")
+ t.Fatalf("%s: %s", err, "Reprovider.Strategy is a valid key in the config")
}
err = CheckKey("Provider.Foo")
diff --git a/config/provider.go b/config/provider.go
index f2b5afe05..a1c448598 100644
--- a/config/provider.go
+++ b/config/provider.go
@@ -1,5 +1,12 @@
package config
+const (
+ DefaultProviderWorkerCount = 64
+)
+
+// Provider configuration describes how NEW CIDs are announced the moment they are created.
+// For periodical reprovide configuration, see Reprovider.*
type Provider struct {
- Strategy string // Which keys to announce
+ Strategy *OptionalString `json:",omitempty"` // Unused, you are likely looking for Reprovider.Strategy instead
+ WorkerCount *OptionalInteger `json:",omitempty"` // Number of concurrent provides allowed, 0 means unlimited
}
diff --git a/config/reprovider.go b/config/reprovider.go
index dae9ae6de..3e8a5b476 100644
--- a/config/reprovider.go
+++ b/config/reprovider.go
@@ -7,6 +7,8 @@ const (
DefaultReproviderStrategy = "all"
)
+// Reprovider configuration describes how CID from local datastore are periodically re-announced to routing systems.
+// For provide behavior of ad-hoc or newly created CIDs and their first-time announcement, see Provider.*
type Reprovider struct {
Interval *OptionalDuration `json:",omitempty"` // Time period to reprovide locally stored objects to the network
Strategy *OptionalString `json:",omitempty"` // Which keys to announce
diff --git a/core/commands/commands_test.go b/core/commands/commands_test.go
index 2dda639f5..d8b4c4083 100644
--- a/core/commands/commands_test.go
+++ b/core/commands/commands_test.go
@@ -184,6 +184,7 @@ func TestCommands(t *testing.T) {
"/stats/bw",
"/stats/dht",
"/stats/provide",
+ "/stats/reprovide",
"/stats/repo",
"/swarm",
"/swarm/addrs",
diff --git a/core/commands/stat.go b/core/commands/stat.go
index 2632d6aa2..2b4485a95 100644
--- a/core/commands/stat.go
+++ b/core/commands/stat.go
@@ -27,11 +27,12 @@ for your IPFS node.`,
},
Subcommands: map[string]*cmds.Command{
- "bw": statBwCmd,
- "repo": repoStatCmd,
- "bitswap": bitswapStatCmd,
- "dht": statDhtCmd,
- "provide": statProvideCmd,
+ "bw": statBwCmd,
+ "repo": repoStatCmd,
+ "bitswap": bitswapStatCmd,
+ "dht": statDhtCmd,
+ "provide": statProvideCmd,
+ "reprovide": statReprovideCmd,
},
}
diff --git a/core/commands/stat_provide.go b/core/commands/stat_provide.go
index 7a54a79e4..ef06d8e28 100644
--- a/core/commands/stat_provide.go
+++ b/core/commands/stat_provide.go
@@ -4,28 +4,20 @@ import (
"fmt"
"io"
"text/tabwriter"
- "time"
- humanize "github.com/dustin/go-humanize"
- "github.com/ipfs/boxo/provider"
cmds "github.com/ipfs/go-ipfs-cmds"
"github.com/ipfs/kubo/core/commands/cmdenv"
"github.com/libp2p/go-libp2p-kad-dht/fullrt"
- "golang.org/x/exp/constraints"
)
-type reprovideStats struct {
- provider.ReproviderStats
- fullRT bool
-}
-
var statProvideCmd = &cmds.Command{
+ Status: cmds.Deprecated,
Helptext: cmds.HelpText{
- Tagline: "Returns statistics about the node's (re)provider system.",
+ Tagline: "Deprecated command, use 'ipfs stats reprovide' instead.",
ShortDescription: `
-Returns statistics about the content the node is advertising.
-
-This interface is not stable and may change from release to release.
+'ipfs stats provide' is deprecated because provide and reprovide operations
+are now distinct. This command may be replaced by provide only stats in the
+future.
`,
},
Arguments: []cmds.Argument{},
@@ -57,8 +49,8 @@ This interface is not stable and may change from release to release.
wtr := tabwriter.NewWriter(w, 1, 2, 1, ' ', 0)
defer wtr.Flush()
- fmt.Fprintf(wtr, "TotalReprovides:\t%s\n", humanNumber(s.TotalReprovides))
- fmt.Fprintf(wtr, "AvgReprovideDuration:\t%s\n", humanDuration(s.AvgReprovideDuration))
+ fmt.Fprintf(wtr, "TotalProvides:\t%s\n", humanNumber(s.TotalReprovides))
+ fmt.Fprintf(wtr, "AvgProvideDuration:\t%s\n", humanDuration(s.AvgReprovideDuration))
fmt.Fprintf(wtr, "LastReprovideDuration:\t%s\n", humanDuration(s.LastReprovideDuration))
if !s.LastRun.IsZero() {
fmt.Fprintf(wtr, "LastRun:\t%s\n", humanTime(s.LastRun))
@@ -71,30 +63,3 @@ This interface is not stable and may change from release to release.
},
Type: reprovideStats{},
}
-
-func humanDuration(val time.Duration) string {
- return val.Truncate(time.Microsecond).String()
-}
-
-func humanTime(val time.Time) string {
- return val.Format("2006-01-02 15:04:05")
-}
-
-func humanNumber[T constraints.Float | constraints.Integer](n T) string {
- nf := float64(n)
- str := humanSI(nf, 0)
- fullStr := humanFull(nf, 0)
- if str != fullStr {
- return fmt.Sprintf("%s\t(%s)", str, fullStr)
- }
- return str
-}
-
-func humanSI(val float64, decimals int) string {
- v, unit := humanize.ComputeSI(val)
- return fmt.Sprintf("%s%s", humanFull(v, decimals), unit)
-}
-
-func humanFull(val float64, decimals int) string {
- return humanize.CommafWithDigits(val, decimals)
-}
diff --git a/core/commands/stat_reprovide.go b/core/commands/stat_reprovide.go
new file mode 100644
index 000000000..10dbc727d
--- /dev/null
+++ b/core/commands/stat_reprovide.go
@@ -0,0 +1,104 @@
+package commands
+
+import (
+ "fmt"
+ "io"
+ "text/tabwriter"
+ "time"
+
+ humanize "github.com/dustin/go-humanize"
+ "github.com/ipfs/boxo/provider"
+ cmds "github.com/ipfs/go-ipfs-cmds"
+ "github.com/ipfs/kubo/core/commands/cmdenv"
+ "github.com/libp2p/go-libp2p-kad-dht/fullrt"
+ "golang.org/x/exp/constraints"
+)
+
+type reprovideStats struct {
+ provider.ReproviderStats
+ fullRT bool
+}
+
+var statReprovideCmd = &cmds.Command{
+ Status: cmds.Experimental,
+ Helptext: cmds.HelpText{
+ Tagline: "Returns statistics about the node's reprovider system.",
+ ShortDescription: `
+Returns statistics about the content the node is reproviding every
+Reprovider.Interval according to Reprovider.Strategy:
+https://github.com/ipfs/kubo/blob/master/docs/config.md#reprovider
+
+This interface is not stable and may change from release to release.
+
+`,
+ },
+ Arguments: []cmds.Argument{},
+ Options: []cmds.Option{},
+ Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
+ nd, err := cmdenv.GetNode(env)
+ if err != nil {
+ return err
+ }
+
+ if !nd.IsOnline {
+ return ErrNotOnline
+ }
+
+ stats, err := nd.Provider.Stat()
+ if err != nil {
+ return err
+ }
+ _, fullRT := nd.DHTClient.(*fullrt.FullRT)
+
+ if err := res.Emit(reprovideStats{stats, fullRT}); err != nil {
+ return err
+ }
+
+ return nil
+ },
+ Encoders: cmds.EncoderMap{
+ cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, s reprovideStats) error {
+ wtr := tabwriter.NewWriter(w, 1, 2, 1, ' ', 0)
+ defer wtr.Flush()
+
+ fmt.Fprintf(wtr, "TotalReprovides:\t%s\n", humanNumber(s.TotalReprovides))
+ fmt.Fprintf(wtr, "AvgReprovideDuration:\t%s\n", humanDuration(s.AvgReprovideDuration))
+ fmt.Fprintf(wtr, "LastReprovideDuration:\t%s\n", humanDuration(s.LastReprovideDuration))
+ if !s.LastRun.IsZero() {
+ fmt.Fprintf(wtr, "LastReprovide:\t%s\n", humanTime(s.LastRun))
+ if s.fullRT {
+ fmt.Fprintf(wtr, "NextReprovide:\t%s\n", humanTime(s.LastRun.Add(s.ReprovideInterval)))
+ }
+ }
+ return nil
+ }),
+ },
+ Type: reprovideStats{},
+}
+
+func humanDuration(val time.Duration) string {
+ return val.Truncate(time.Microsecond).String()
+}
+
+func humanTime(val time.Time) string {
+ return val.Format("2006-01-02 15:04:05")
+}
+
+func humanNumber[T constraints.Float | constraints.Integer](n T) string {
+ nf := float64(n)
+ str := humanSI(nf, 0)
+ fullStr := humanFull(nf, 0)
+ if str != fullStr {
+ return fmt.Sprintf("%s\t(%s)", str, fullStr)
+ }
+ return str
+}
+
+func humanSI(val float64, decimals int) string {
+ v, unit := humanize.ComputeSI(val)
+ return fmt.Sprintf("%s%s", humanFull(v, decimals), unit)
+}
+
+func humanFull(val float64, decimals int) string {
+ return humanize.CommafWithDigits(val, decimals)
+}
diff --git a/core/node/groups.go b/core/node/groups.go
index 4a471f170..0e28444be 100644
--- a/core/node/groups.go
+++ b/core/node/groups.go
@@ -359,6 +359,7 @@ func Online(bcfg *BuildCfg, cfg *config.Config, userResourceOverrides rcmgr.Part
cfg.Reprovider.Strategy.WithDefault(config.DefaultReproviderStrategy),
cfg.Reprovider.Interval.WithDefault(config.DefaultReproviderInterval),
cfg.Routing.AcceleratedDHTClient.WithDefault(config.DefaultAcceleratedDHTClient),
+ int(cfg.Provider.WorkerCount.WithDefault(config.DefaultProviderWorkerCount)),
),
)
}
diff --git a/core/node/provider.go b/core/node/provider.go
index 4638aad4d..d0081eb0a 100644
--- a/core/node/provider.go
+++ b/core/node/provider.go
@@ -21,12 +21,13 @@ import (
// and in 'ipfs stats provide' report.
const sampledBatchSize = 1000
-func ProviderSys(reprovideInterval time.Duration, acceleratedDHTClient bool) fx.Option {
+func ProviderSys(reprovideInterval time.Duration, acceleratedDHTClient bool, provideWorkerCount int) fx.Option {
return fx.Provide(func(lc fx.Lifecycle, cr irouting.ProvideManyRouter, keyProvider provider.KeyChanFunc, repo repo.Repo, bs blockstore.Blockstore) (provider.System, error) {
opts := []provider.Option{
provider.Online(cr),
provider.ReproviderInterval(reprovideInterval),
provider.KeyProvider(keyProvider),
+ provider.ProvideWorkerCount(provideWorkerCount),
}
if !acceleratedDHTClient && reprovideInterval > 0 {
// The estimation kinda suck if you are running with accelerated DHT client,
@@ -131,7 +132,7 @@ https://github.com/ipfs/kubo/blob/master/docs/config.md#routingaccelerateddhtcli
// ONLINE/OFFLINE
// OnlineProviders groups units managing provider routing records online
-func OnlineProviders(useStrategicProviding bool, reprovideStrategy string, reprovideInterval time.Duration, acceleratedDHTClient bool) fx.Option {
+func OnlineProviders(useStrategicProviding bool, reprovideStrategy string, reprovideInterval time.Duration, acceleratedDHTClient bool, provideWorkerCount int) fx.Option {
if useStrategicProviding {
return OfflineProviders()
}
@@ -146,7 +147,7 @@ func OnlineProviders(useStrategicProviding bool, reprovideStrategy string, repro
return fx.Options(
keyProvider,
- ProviderSys(reprovideInterval, acceleratedDHTClient),
+ ProviderSys(reprovideInterval, acceleratedDHTClient, provideWorkerCount),
)
}
@@ -169,7 +170,6 @@ func mfsProvider(mfsRoot *mfs.Root, fetcher fetcher.Factory) provider.KeyChanFun
kcf := provider.NewDAGProvider(rootNode.Cid(), fetcher)
return kcf(ctx)
}
-
}
func mfsRootProvider(mfsRoot *mfs.Root) provider.KeyChanFunc {
diff --git a/docs/changelogs/v0.35.md b/docs/changelogs/v0.35.md
index d383fafad..e20d4759c 100644
--- a/docs/changelogs/v0.35.md
+++ b/docs/changelogs/v0.35.md
@@ -17,6 +17,8 @@ This release was brought to you by the [Shipyard](http://ipshipyard.com/) team.
- [New `ipfs add` Options](#new-ipfs-add-options)
- [Persistent `Import.*` Configuration](#persistent-import-configuration)
- [Updated Configuration Profiles](#updated-configuration-profiles)
+ - [Optimized, dedicated queue for providing fresh CIDs](#optimized-dedicated-queue-for-providing-fresh-cids)
+ - [Deprecated `ipfs stats provider`](#deprecated-ipfs-stats-provider)
- [๐ฆ๏ธ Important dependency updates](#-important-dependency-updates)
- [๐ Changelog](#-changelog)
- [๐จโ๐ฉโ๐งโ๐ฆ Contributors](#-contributors)
@@ -81,6 +83,36 @@ The release updated configuration [profiles](https://github.com/ipfs/kubo/blob/m
> [!TIP]
> Apply one of CIDv1 test [profiles](https://github.com/ipfs/kubo/blob/master/docs/config.md#profiles) with `ipfs config profile apply test-cid-v1[-wide]`.
+#### Optimized, dedicated queue for providing fresh CIDs
+
+From `kubo` [`v0.33.0`](https://github.com/ipfs/kubo/releases/tag/v0.33.0),
+Bitswap stopped advertising newly added and received blocks to the DHT. Since
+then `boxo/provider` is responsible for the provide and reprovide logic. Prior
+to `v0.35.0`, provides and reprovides were handled together in batches, leading
+to delays in initial advertisements (provides).
+
+Provides and Reprovides now have separate queues, allowing for immediate
+provide of new CIDs and optimised batching of reprovides.
+
+This change introduces a new configuration option for limiting the number of
+concurrent provide operations:
+[`Provider.WorkerCount`](https://github.com/ipfs/kubo/blob/master/docs/config.md#providerworkercount).
+
+> [!TIP]
+> Users who need to provide large volumes of content immediately should consider removing the cap on concurrent provide operations and also set `Routing.AcceleratedDHTClient` to `true`.
+
+##### Deprecated `ipfs stats provider`
+
+Since the `ipfs stats provider` command was displaying statistics for both
+provides and reprovides, this command isn't relevant anymore after separating
+the two queues.
+
+The successor command is `ipfs stats reprovide`, showing the same statistics,
+but for reprovides only.
+
+> [!NOTE]
+> `ipfs stats provider` still works, but is marked as deprecated and will be removed in a future release. Be mindful that the command provides only statistics about reprovides (similar to `ipfs stats reprovide`) and not the new provide queue (this will be fixed as a part of wider refactor planned for a future release).
+
#### ๐ฆ๏ธ Important dependency updates
- update `boxo` to [v0.30.0](https://github.com/ipfs/boxo/releases/tag/v0.30.0)
diff --git a/docs/config.md b/docs/config.md
index 3724487d9..d812f8271 100644
--- a/docs/config.md
+++ b/docs/config.md
@@ -105,6 +105,9 @@ config file at runtime.
- [`Pinning.RemoteServices: Policies.MFS.Enabled`](#pinningremoteservices-policiesmfsenabled)
- [`Pinning.RemoteServices: Policies.MFS.PinName`](#pinningremoteservices-policiesmfspinname)
- [`Pinning.RemoteServices: Policies.MFS.RepinInterval`](#pinningremoteservices-policiesmfsrepininterval)
+ - [`Provider`](#provider)
+ - [`Provider.Strategy`](#providerstrategy)
+ - [`Provider.WorkerCount`](#providerworkercount)
- [`Pubsub`](#pubsub)
- [`Pubsub.Enabled`](#pubsubenabled)
- [`Pubsub.Router`](#pubsubrouter)
@@ -207,6 +210,7 @@ config file at runtime.
- [`announce-on` profile](#announce-on-profile)
- [`legacy-cid-v0` profile](#legacy-cid-v0-profile)
- [`test-cid-v1` profile](#test-cid-v1-profile)
+ - [`test-cid-v1-wide` profile](#test-cid-v1-wide-profile)
- [Types](#types)
- [`flag`](#flag)
- [`priority`](#priority)
@@ -1404,6 +1408,39 @@ Default: `"5m"`
Type: `duration`
+## `Provider`
+
+Configuration applied to the initial one-time announcement of fresh CIDs
+created with `ipfs add`, `ipfs files`, `ipfs dag import`, `ipfs block|dag put`
+commands.
+
+For periodical DHT reprovide settings, see [`Reprovide.*`](#reprovider).
+
+### `Provider.Strategy`
+
+Legacy, not used at the moment, see [`Reprovider.Strategy`](#reproviderstrategy) instead.
+
+### `Provider.WorkerCount`
+
+Sets the maximum number of _concurrent_ DHT provide operations. DHT reprovides
+operations do **not** count against that limit. A value of `0` allows an
+unlimited number of provide workers.
+
+If the [accelerated DHT client](#routingaccelerateddhtclient) is enabled, each
+provide operation opens ~20 connections in parallel. With the standard DHT
+client (accelerated disabled), each provide opens between 20 and 60
+connections, with at most 10 active at once. Provides complete more quickly
+when using the accelerated client. Be mindful of how many simultaneous
+connections this setting can generate.
+
+For nodes without strict connection limits that need to provide large volumes
+of content immediately, we recommend enabling the `Routing.AcceleratedDHTClient` and
+setting `Provider.WorkerCount` to `0` (unlimited).
+
+Default: `64`
+
+Type: `integer` (non-negative; `0` means unlimited number of workers)
+
## `Pubsub`
**DEPRECATED**: See [#9717](https://github.com/ipfs/kubo/issues/9717)
diff --git a/test/sharness/t0002-docker-image.sh b/test/sharness/t0002-docker-image.sh
index 8812c277a..81bb8d449 100755
--- a/test/sharness/t0002-docker-image.sh
+++ b/test/sharness/t0002-docker-image.sh
@@ -36,7 +36,7 @@ test_expect_success "docker image build succeeds" '
'
test_expect_success "write init scripts" '
- echo "ipfs config Provider.Strategy Bar" > 001.sh &&
+ echo "ipfs config Mounts.IPFS Bar" > 001.sh &&
echo "ipfs config Pubsub.Router Qux" > 002.sh &&
chmod +x 002.sh
'
@@ -65,7 +65,7 @@ test_expect_success "check that init scripts were run correctly and in the corre
test_expect_success "check that init script configs were applied" '
echo Bar > expected &&
- docker exec "$DOC_ID" ipfs config Provider.Strategy > actual &&
+ docker exec "$DOC_ID" ipfs config Mounts.IPFS > actual &&
test_cmp actual expected &&
echo Qux > expected &&
docker exec "$DOC_ID" ipfs config Pubsub.Router > actual &&
diff --git a/test/sharness/t0070-user-config.sh b/test/sharness/t0070-user-config.sh
index 1dc4c0369..5a8180c73 100755
--- a/test/sharness/t0070-user-config.sh
+++ b/test/sharness/t0070-user-config.sh
@@ -11,12 +11,12 @@ test_description="Test user-provided config values"
test_init_ipfs
test_expect_success "bootstrap doesn't overwrite user-provided config keys (top-level)" '
- ipfs config Provider.Strategy >previous &&
- ipfs config Provider.Strategy foo &&
+ ipfs config Identity.PeerID >previous &&
+ ipfs config Identity.PeerID foo &&
ipfs bootstrap rm --all &&
echo "foo" >expected &&
- ipfs config Provider.Strategy >actual &&
- ipfs config Provider.Strategy $(cat previous) &&
+ ipfs config Identity.PeerID >actual &&
+ ipfs config Identity.PeerID $(cat previous) &&
test_cmp expected actual
'
From 472674fd62ae3f8bd9feb7ff0dda8360dd3f44a3 Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Wed, 30 Apr 2025 12:13:56 -0700
Subject: [PATCH 219/499] feat(pebble): support pinning `FormatMajorVersion`
(#10789)
* Upgrade to pebble v2.0.3
- Configure latest pebble database format at init
- Do not automatically ratchet database format if set in config
- Daemon messge about new available pebble format
- Document pebble config with formatMajorVersion
- Add warning to users running badger, nudging them to switch to flatfs or pebble
- docs: explain Pebble's `FormatMajorVersion`
- Use pebbleds instead of badgerds in t0060-daemon.sh
- Print badgerds warning message to stderr
---
config/init.go | 6 ++--
docs/changelogs/v0.35.md | 15 ++++++++++
docs/datastores.md | 18 +++++++++--
docs/examples/kubo-as-a-library/go.mod | 10 ++++---
docs/examples/kubo-as-a-library/go.sum | 29 ++++++++++++------
go.mod | 10 ++++---
go.sum | 29 ++++++++++++------
plugin/plugins/badgerds/badgerds.go | 1 +
plugin/plugins/pebbleds/pebbleds.go | 11 +++++--
test/dependencies/go.mod | 16 ++++++++++
test/dependencies/go.sum | 41 ++++++++++++++++++++++++++
test/sharness/t0060-daemon.sh | 4 +--
12 files changed, 154 insertions(+), 36 deletions(-)
diff --git a/config/init.go b/config/init.go
index a0351bd8b..c32b53e17 100644
--- a/config/init.go
+++ b/config/init.go
@@ -7,6 +7,7 @@ import (
"io"
"time"
+ "github.com/cockroachdb/pebble/v2"
"github.com/ipfs/kubo/core/coreiface/options"
"github.com/libp2p/go-libp2p/core/crypto"
"github.com/libp2p/go-libp2p/core/peer"
@@ -144,8 +145,9 @@ func pebbleSpec() map[string]interface{} {
"type": "measure",
"prefix": "pebble.datastore",
"child": map[string]interface{}{
- "type": "pebbleds",
- "path": "pebbleds",
+ "formatMajorVersion": int(pebble.FormatNewest),
+ "type": "pebbleds",
+ "path": "pebbleds",
},
}
}
diff --git a/docs/changelogs/v0.35.md b/docs/changelogs/v0.35.md
index e20d4759c..98a7f2af4 100644
--- a/docs/changelogs/v0.35.md
+++ b/docs/changelogs/v0.35.md
@@ -19,6 +19,7 @@ This release was brought to you by the [Shipyard](http://ipshipyard.com/) team.
- [Updated Configuration Profiles](#updated-configuration-profiles)
- [Optimized, dedicated queue for providing fresh CIDs](#optimized-dedicated-queue-for-providing-fresh-cids)
- [Deprecated `ipfs stats provider`](#deprecated-ipfs-stats-provider)
+ - [Pebble Database Format Config](#pebble-database-format-config)
- [๐ฆ๏ธ Important dependency updates](#-important-dependency-updates)
- [๐ Changelog](#-changelog)
- [๐จโ๐ฉโ๐งโ๐ฆ Contributors](#-contributors)
@@ -113,10 +114,24 @@ but for reprovides only.
> [!NOTE]
> `ipfs stats provider` still works, but is marked as deprecated and will be removed in a future release. Be mindful that the command provides only statistics about reprovides (similar to `ipfs stats reprovide`) and not the new provide queue (this will be fixed as a part of wider refactor planned for a future release).
+#### Pebble Database Format Config
+
+This Kubo release provides node operators with more control over [Pebble's `FormatMajorVersion`](https://github.com/cockroachdb/pebble/tree/master?tab=readme-ov-file#format-major-versions). This allows testing a new Kubo release without automatically migrating Pebble datastores, keeping the ability to switch back to older Kubo.
+
+When IPFS is initialized to use the pebbleds datastore (opt-in via `ipfs init --profile=pebbleds`), the latest pebble database format is configured in the pebble datastore config as `"formatMajorVersion"`. Setting this in the datastore config prevents automatically upgrading to the latest available version when Kubo is upgraded. If a later version becomes available, the Kubo daemon prints a startup message to indicate this. The user can them update the config to use the latest format when they are certain a downgrade will not be necessary.
+
+Without the `"formatMajorVersion"` in the pebble datastore config, the database format is automatically upgraded to the latest version. If this happens, then it is possible a downgrade back to the previous version of Kubo will not work if new format is not compatible with the pebble datastore in the previous version of Kubo.
+
+When installing a new version of Kubo when `"formatMajorVersion"` is configured, automatic repository migration (`ipfs daemon with --migrate=true`) does not upgrade this to the latest available version. This is done because a user may have reasons not to upgrade the pebble database format, and may want to be able to downgrade Kubo if something else is not working in the new version. If the configured pebble database format in the old Kubo is not supported in the new Kubo, then the configured version must be updated and the old Kubo run, before installing the new Kubo.
+
+See other caveats and configuration options at [`kubo/docs/datastores.md#pebbleds`](https://github.com/ipfs/kubo/blob/master/docs/datastores.md#pebbleds)
+
#### ๐ฆ๏ธ Important dependency updates
- update `boxo` to [v0.30.0](https://github.com/ipfs/boxo/releases/tag/v0.30.0)
- update `ipfs-webui` to [v4.7.0](https://github.com/ipfs/ipfs-webui/releases/tag/v4.7.0)
+- update `go-ds-pebble` to [v0.5.0](https://github.com/ipfs/go-ds-pebble/releases/tag/v0.5.0)
+ - update `pebble` to [v2.0.3](https://github.com/cockroachdb/pebble/releases/tag/v2.0.3)
### ๐ Changelog
diff --git a/docs/datastores.md b/docs/datastores.md
index 039088ac3..f574bc6a5 100644
--- a/docs/datastores.md
+++ b/docs/datastores.md
@@ -46,9 +46,6 @@ Uses a leveldb database to store key value pairs.
## pebbleds
-> [!WARNING]
-> This is still **EXPERIMENTAL** opt-in. Datastore format can be set when first initializing the node via `ipfs init --profile pebbleds`.
-
Uses [pebble](https://github.com/cockroachdb/pebble) as a key value store.
```json
@@ -64,6 +61,7 @@ If they are not configured (or assigned their zero-valued), then default values
* `bytesPerSync`: int, Sync sstables periodically in order to smooth out writes to disk. (default: 512KB)
* `disableWAL`: true|false, Disable the write-ahead log (WAL) at expense of prohibiting crash recovery. (default: false)
* `cacheSize`: Size of pebble's shared block cache. (default: 8MB)
+* `formatVersionMajor`: int, Sets the format of pebble on-disk files. If 0 or unset, automatically convert to latest format.
* `l0CompactionThreshold`: int, Count of L0 files necessary to trigger an L0 compaction.
* `l0StopWritesThreshold`: int, Limit on L0 read-amplification, computed as the number of L0 sublevels.
* `lBaseMaxBytes`: int, Maximum number of bytes for LBase. The base level is the level which L0 is compacted into.
@@ -76,6 +74,20 @@ If they are not configured (or assigned their zero-valued), then default values
> [!TIP]
> Start using pebble with only default values and configure tuning items are needed for your needs. For a more complete description of these values, see: `https://pkg.go.dev/github.com/cockroachdb/pebble@vA.B.C#Options` (where `A.B.C` is pebble version from Kubo's `go.mod`).
+Using a pebble datastore can be set when initializing kubo `ipfs init --profile pebbleds`.
+
+#### Use of `formatMajorVersion`
+
+[Pebble's `FormatMajorVersion`](https://github.com/cockroachdb/pebble/tree/master?tab=readme-ov-file#format-major-versions) is a constant controlling the format of persisted data. Backwards incompatible changes to durable formats are gated behind new format major versions.
+
+At any point, a database's format major version may be bumped. However, once a database's format major version is increased, previous versions of Pebble will refuse to open the database.
+
+When IPFS is initialized to use the pebbleds datastore (`ipfs init --profile=pebbleds`), the latest pebble database format is configured in the pebble datastore config as `"formatMajorVersion"`. Setting this in the datastore config prevents automatically upgrading to the latest available version when kubo is upgraded. If a later version becomes available, the kubo daemon prints a startup message to indicate this. The user can them update the config to use the latest format when they are certain a downgrade will not be necessary.
+
+Without the `"formatMajorVersion"` in the pebble datastore config, the database format is automatically upgraded to the latest version. If this happens, then it is possible a downgrade back to the previous version of kubo will not work if new format is not compatible with the pebble datastore in the previous version of kubo.
+
+When installing a new version of kubo when `"formatMajorVersion"` is configured, migration does not upgrade this to the latest available version. This is done because a user may have reasons not to upgrade the pebble database format, and may want to be able to downgrade kubo if something else is not working in the new version. If the configured pebble database format in the old kubo is not supported in the new kubo, then the configured version must be updated and the old kubo run, before installing the new kubo.
+
## badgerds
Uses [badger](https://github.com/dgraph-io/badger) as a key value store.
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index 27e7df28f..e94e45c90 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -16,7 +16,7 @@ require (
require (
bazil.org/fuse v0.0.0-20200117225306-7b5117fecadc // indirect
github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96 // indirect
- github.com/DataDog/zstd v1.4.5 // indirect
+ github.com/DataDog/zstd v1.5.6-0.20230824185856-869dae002e5e // indirect
github.com/Jorropo/jsync v1.0.1 // indirect
github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b // indirect
github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5 // indirect
@@ -28,11 +28,13 @@ require (
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
github.com/ceramicnetwork/go-dag-jose v0.1.1 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
+ github.com/cockroachdb/crlib v0.0.0-20241015224233-894974b3ad94 // indirect
github.com/cockroachdb/errors v1.11.3 // indirect
github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect
- github.com/cockroachdb/pebble v1.1.4 // indirect
+ github.com/cockroachdb/pebble/v2 v2.0.3 // indirect
github.com/cockroachdb/redact v1.1.5 // indirect
+ github.com/cockroachdb/swiss v0.0.0-20250327203710-2932b022f6df // indirect
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect
github.com/containerd/cgroups v1.1.0 // indirect
github.com/coreos/go-systemd/v22 v22.5.0 // indirect
@@ -63,7 +65,7 @@ require (
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/glog v1.2.4 // indirect
github.com/golang/protobuf v1.5.4 // indirect
- github.com/golang/snappy v0.0.4 // indirect
+ github.com/golang/snappy v0.0.5-0.20231225225746-43d5d4cd4e0e // indirect
github.com/google/gopacket v1.1.19 // indirect
github.com/google/pprof v0.0.0-20250208200701-d0013a598941 // indirect
github.com/google/uuid v1.6.0 // indirect
@@ -85,7 +87,7 @@ require (
github.com/ipfs/go-ds-flatfs v0.5.5 // indirect
github.com/ipfs/go-ds-leveldb v0.5.2 // indirect
github.com/ipfs/go-ds-measure v0.2.2 // indirect
- github.com/ipfs/go-ds-pebble v0.4.4 // indirect
+ github.com/ipfs/go-ds-pebble v0.5.0 // indirect
github.com/ipfs/go-fs-lock v0.0.7 // indirect
github.com/ipfs/go-ipfs-blockstore v1.3.1 // indirect
github.com/ipfs/go-ipfs-delay v0.0.1 // indirect
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index 76251bf28..f2bb38f70 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -29,11 +29,13 @@ github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96 h1:cTp8I5+VIo
github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
-github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ=
-github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo=
+github.com/DataDog/zstd v1.5.6-0.20230824185856-869dae002e5e h1:ZIWapoIRN1VqT8GR8jAwb1Ie9GyehWjVcGh32Y2MznE=
+github.com/DataDog/zstd v1.5.6-0.20230824185856-869dae002e5e/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw=
github.com/Jorropo/jsync v1.0.1 h1:6HgRolFZnsdfzRUj+ImB9og1JYOxQoReSywkHOGSaUU=
github.com/Jorropo/jsync v1.0.1/go.mod h1:jCOZj3vrBCri3bSU3ErUYvevKlnbssrXeCivybS5ABQ=
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
+github.com/aclements/go-perfevent v0.0.0-20240301234650-f7843625020f h1:JjxwchlOepwsUWcQwD2mLUAGE9aCp0/ehy6yCHFBOvo=
+github.com/aclements/go-perfevent v0.0.0-20240301234650-f7843625020f/go.mod h1:tMDTce/yLLN/SK8gMOxQfnyeMeCg8KGzp0D1cbECEeo=
github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII=
github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b h1:mimo19zliBX/vSQ6PWWSL9lK8qwHozUj03+zLoEB8O0=
github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs=
@@ -80,18 +82,24 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn
github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
-github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4=
-github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU=
+github.com/cockroachdb/crlib v0.0.0-20241015224233-894974b3ad94 h1:bvJv505UUfjzbaIPdNS4AEkHreDqQk6yuNpsdRHpwFA=
+github.com/cockroachdb/crlib v0.0.0-20241015224233-894974b3ad94/go.mod h1:Gq51ZeKaFCXk6QwuGM0w1dnaOqc/F5zKT2zA9D6Xeac=
+github.com/cockroachdb/datadriven v1.0.3-0.20240530155848-7682d40af056 h1:slXychO2uDM6hYRu4c0pD0udNI8uObfeKN6UInWViS8=
+github.com/cockroachdb/datadriven v1.0.3-0.20240530155848-7682d40af056/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU=
github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I=
github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8=
github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce h1:giXvy4KSc/6g/esnpM7Geqxka4WSqI1SZc7sMJFd3y4=
github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M=
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE=
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs=
-github.com/cockroachdb/pebble v1.1.4 h1:5II1uEP4MyHLDnsrbv/EZ36arcb9Mxg3n+owhZ3GrG8=
-github.com/cockroachdb/pebble v1.1.4/go.mod h1:4exszw1r40423ZsmkG/09AFEG83I0uDgfujJdbL6kYU=
+github.com/cockroachdb/metamorphic v0.0.0-20231108215700-4ba948b56895 h1:XANOgPYtvELQ/h4IrmPAohXqe2pWA8Bwhejr3VQoZsA=
+github.com/cockroachdb/metamorphic v0.0.0-20231108215700-4ba948b56895/go.mod h1:aPd7gM9ov9M8v32Yy5NJrDyOcD8z642dqs+F0CeNXfA=
+github.com/cockroachdb/pebble/v2 v2.0.3 h1:YJ3Sc9jRN/q6OOCNyRHPbcpenbxL1DdgdpUqPlPus6o=
+github.com/cockroachdb/pebble/v2 v2.0.3/go.mod h1:NgxgNcWwyG/uxkLUZGM2aelshaLIZvc0hCX7SCfaO8s=
github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30=
github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg=
+github.com/cockroachdb/swiss v0.0.0-20250327203710-2932b022f6df h1:GUJ4KuZtbOcIfRlprHJFFvIqQ4irtQUl+1fJr+yNmPI=
+github.com/cockroachdb/swiss v0.0.0-20250327203710-2932b022f6df/go.mod h1:yBRu/cnL4ks9bgy4vAASdjIW+/xMlFwuHKqtmh3GZQg=
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo=
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ=
github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE=
@@ -172,6 +180,8 @@ github.com/gammazero/deque v1.0.0 h1:LTmimT8H7bXkkCy6gZX7zNLtkbz4NdS2z8LZuor3j34
github.com/gammazero/deque v1.0.0/go.mod h1:iflpYvtGfM3U8S8j+sZEKIak3SAKYpA5/SQewgfXDKo=
github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps=
github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY=
+github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9 h1:r5GgOLGbza2wVHRzK7aAj6lWZjfbAwiu/RDCVOKjRyM=
+github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98=
@@ -231,8 +241,9 @@ github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
-github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v0.0.5-0.20231225225746-43d5d4cd4e0e h1:4bw4WeyTYPp0smaXiJZCNnLrvVBqirQVreixayXezGc=
+github.com/golang/snappy v0.0.5-0.20231225225746-43d5d4cd4e0e/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
@@ -332,8 +343,8 @@ github.com/ipfs/go-ds-leveldb v0.5.2 h1:6nmxlQ2zbp4LCNdJVsmHfs9GP0eylfBNxpmY1csp
github.com/ipfs/go-ds-leveldb v0.5.2/go.mod h1:2fAwmcvD3WoRT72PzEekHBkQmBDhc39DJGoREiuGmYo=
github.com/ipfs/go-ds-measure v0.2.2 h1:4kwvBGbbSXNYe4ANlg7qTIYoZU6mNlqzQHdVqICkqGI=
github.com/ipfs/go-ds-measure v0.2.2/go.mod h1:b/87ak0jMgH9Ylt7oH0+XGy4P8jHx9KG09Qz+pOeTIs=
-github.com/ipfs/go-ds-pebble v0.4.4 h1:V/QlTCjQ4cTYQUvDRbDBKVZNYaMi4QV7Du4acPoRvg0=
-github.com/ipfs/go-ds-pebble v0.4.4/go.mod h1:a4F6QyaamnD/MsgQH1KpYf5s0YvPODw6eOk9PBhLQMg=
+github.com/ipfs/go-ds-pebble v0.5.0 h1:lXffYCAKVD7nLLPqwJ9D8IxgO7Kz8woiX021tezdsIM=
+github.com/ipfs/go-ds-pebble v0.5.0/go.mod h1:aiCRVcj3K60sxc6k5C+HO9C6rouqiSkjR/WKnbTcMfQ=
github.com/ipfs/go-fs-lock v0.0.7 h1:6BR3dajORFrFTkb5EpCUFIAypsoxpGpDSVUdFwzgL9U=
github.com/ipfs/go-fs-lock v0.0.7/go.mod h1:Js8ka+FNYmgQRLrRXzU3CB/+Csr1BwrRilEcvYrHhhc=
github.com/ipfs/go-ipfs-blockstore v1.3.1 h1:cEI9ci7V0sRNivqaOr0elDsamxXFxJMMMy7PTTDQNsQ=
diff --git a/go.mod b/go.mod
index c6342a48d..3d86274d0 100644
--- a/go.mod
+++ b/go.mod
@@ -10,7 +10,7 @@ require (
github.com/cenkalti/backoff/v4 v4.3.0
github.com/ceramicnetwork/go-dag-jose v0.1.1
github.com/cheggaaa/pb v1.0.29
- github.com/cockroachdb/pebble v1.1.4
+ github.com/cockroachdb/pebble/v2 v2.0.3
github.com/coreos/go-systemd/v22 v22.5.0
github.com/dustin/go-humanize v1.0.1
github.com/elgris/jsondiff v0.0.0-20160530203242-765b5c24c302
@@ -31,7 +31,7 @@ require (
github.com/ipfs/go-ds-flatfs v0.5.5
github.com/ipfs/go-ds-leveldb v0.5.2
github.com/ipfs/go-ds-measure v0.2.2
- github.com/ipfs/go-ds-pebble v0.4.4
+ github.com/ipfs/go-ds-pebble v0.5.0
github.com/ipfs/go-fs-lock v0.0.7
github.com/ipfs/go-ipfs-cmds v0.14.1
github.com/ipfs/go-ipld-cbor v0.2.0
@@ -97,7 +97,7 @@ require (
require (
github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96 // indirect
- github.com/DataDog/zstd v1.4.5 // indirect
+ github.com/DataDog/zstd v1.5.6-0.20230824185856-869dae002e5e // indirect
github.com/Jorropo/jsync v1.0.1 // indirect
github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b // indirect
github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5 // indirect
@@ -105,10 +105,12 @@ require (
github.com/beorn7/perks v1.0.1 // indirect
github.com/caddyserver/zerossl v0.1.3 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
+ github.com/cockroachdb/crlib v0.0.0-20241015224233-894974b3ad94 // indirect
github.com/cockroachdb/errors v1.11.3 // indirect
github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect
github.com/cockroachdb/redact v1.1.5 // indirect
+ github.com/cockroachdb/swiss v0.0.0-20250327203710-2932b022f6df // indirect
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect
github.com/containerd/cgroups v1.1.0 // indirect
github.com/crackcomm/go-gitignore v0.0.0-20241020182519-7843d2ba8fdf // indirect
@@ -139,7 +141,7 @@ require (
github.com/golang/glog v1.2.4 // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/golang/protobuf v1.5.4 // indirect
- github.com/golang/snappy v0.0.4 // indirect
+ github.com/golang/snappy v0.0.5-0.20231225225746-43d5d4cd4e0e // indirect
github.com/google/gopacket v1.1.19 // indirect
github.com/google/pprof v0.0.0-20250208200701-d0013a598941 // indirect
github.com/gorilla/mux v1.8.1 // indirect
diff --git a/go.sum b/go.sum
index 313d66cac..46350b8e3 100644
--- a/go.sum
+++ b/go.sum
@@ -47,11 +47,13 @@ github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96 h1:cTp8I5+VIo
github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
-github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ=
-github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo=
+github.com/DataDog/zstd v1.5.6-0.20230824185856-869dae002e5e h1:ZIWapoIRN1VqT8GR8jAwb1Ie9GyehWjVcGh32Y2MznE=
+github.com/DataDog/zstd v1.5.6-0.20230824185856-869dae002e5e/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw=
github.com/Jorropo/jsync v1.0.1 h1:6HgRolFZnsdfzRUj+ImB9og1JYOxQoReSywkHOGSaUU=
github.com/Jorropo/jsync v1.0.1/go.mod h1:jCOZj3vrBCri3bSU3ErUYvevKlnbssrXeCivybS5ABQ=
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
+github.com/aclements/go-perfevent v0.0.0-20240301234650-f7843625020f h1:JjxwchlOepwsUWcQwD2mLUAGE9aCp0/ehy6yCHFBOvo=
+github.com/aclements/go-perfevent v0.0.0-20240301234650-f7843625020f/go.mod h1:tMDTce/yLLN/SK8gMOxQfnyeMeCg8KGzp0D1cbECEeo=
github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII=
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
@@ -108,18 +110,24 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn
github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
-github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4=
-github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU=
+github.com/cockroachdb/crlib v0.0.0-20241015224233-894974b3ad94 h1:bvJv505UUfjzbaIPdNS4AEkHreDqQk6yuNpsdRHpwFA=
+github.com/cockroachdb/crlib v0.0.0-20241015224233-894974b3ad94/go.mod h1:Gq51ZeKaFCXk6QwuGM0w1dnaOqc/F5zKT2zA9D6Xeac=
+github.com/cockroachdb/datadriven v1.0.3-0.20240530155848-7682d40af056 h1:slXychO2uDM6hYRu4c0pD0udNI8uObfeKN6UInWViS8=
+github.com/cockroachdb/datadriven v1.0.3-0.20240530155848-7682d40af056/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU=
github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I=
github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8=
github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce h1:giXvy4KSc/6g/esnpM7Geqxka4WSqI1SZc7sMJFd3y4=
github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M=
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE=
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs=
-github.com/cockroachdb/pebble v1.1.4 h1:5II1uEP4MyHLDnsrbv/EZ36arcb9Mxg3n+owhZ3GrG8=
-github.com/cockroachdb/pebble v1.1.4/go.mod h1:4exszw1r40423ZsmkG/09AFEG83I0uDgfujJdbL6kYU=
+github.com/cockroachdb/metamorphic v0.0.0-20231108215700-4ba948b56895 h1:XANOgPYtvELQ/h4IrmPAohXqe2pWA8Bwhejr3VQoZsA=
+github.com/cockroachdb/metamorphic v0.0.0-20231108215700-4ba948b56895/go.mod h1:aPd7gM9ov9M8v32Yy5NJrDyOcD8z642dqs+F0CeNXfA=
+github.com/cockroachdb/pebble/v2 v2.0.3 h1:YJ3Sc9jRN/q6OOCNyRHPbcpenbxL1DdgdpUqPlPus6o=
+github.com/cockroachdb/pebble/v2 v2.0.3/go.mod h1:NgxgNcWwyG/uxkLUZGM2aelshaLIZvc0hCX7SCfaO8s=
github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30=
github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg=
+github.com/cockroachdb/swiss v0.0.0-20250327203710-2932b022f6df h1:GUJ4KuZtbOcIfRlprHJFFvIqQ4irtQUl+1fJr+yNmPI=
+github.com/cockroachdb/swiss v0.0.0-20250327203710-2932b022f6df/go.mod h1:yBRu/cnL4ks9bgy4vAASdjIW+/xMlFwuHKqtmh3GZQg=
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo=
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ=
github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE=
@@ -206,6 +214,8 @@ github.com/gammazero/deque v1.0.0 h1:LTmimT8H7bXkkCy6gZX7zNLtkbz4NdS2z8LZuor3j34
github.com/gammazero/deque v1.0.0/go.mod h1:iflpYvtGfM3U8S8j+sZEKIak3SAKYpA5/SQewgfXDKo=
github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps=
github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY=
+github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9 h1:r5GgOLGbza2wVHRzK7aAj6lWZjfbAwiu/RDCVOKjRyM=
+github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98=
@@ -284,8 +294,9 @@ github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
-github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v0.0.5-0.20231225225746-43d5d4cd4e0e h1:4bw4WeyTYPp0smaXiJZCNnLrvVBqirQVreixayXezGc=
+github.com/golang/snappy v0.0.5-0.20231225225746-43d5d4cd4e0e/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
@@ -396,8 +407,8 @@ github.com/ipfs/go-ds-leveldb v0.5.2 h1:6nmxlQ2zbp4LCNdJVsmHfs9GP0eylfBNxpmY1csp
github.com/ipfs/go-ds-leveldb v0.5.2/go.mod h1:2fAwmcvD3WoRT72PzEekHBkQmBDhc39DJGoREiuGmYo=
github.com/ipfs/go-ds-measure v0.2.2 h1:4kwvBGbbSXNYe4ANlg7qTIYoZU6mNlqzQHdVqICkqGI=
github.com/ipfs/go-ds-measure v0.2.2/go.mod h1:b/87ak0jMgH9Ylt7oH0+XGy4P8jHx9KG09Qz+pOeTIs=
-github.com/ipfs/go-ds-pebble v0.4.4 h1:V/QlTCjQ4cTYQUvDRbDBKVZNYaMi4QV7Du4acPoRvg0=
-github.com/ipfs/go-ds-pebble v0.4.4/go.mod h1:a4F6QyaamnD/MsgQH1KpYf5s0YvPODw6eOk9PBhLQMg=
+github.com/ipfs/go-ds-pebble v0.5.0 h1:lXffYCAKVD7nLLPqwJ9D8IxgO7Kz8woiX021tezdsIM=
+github.com/ipfs/go-ds-pebble v0.5.0/go.mod h1:aiCRVcj3K60sxc6k5C+HO9C6rouqiSkjR/WKnbTcMfQ=
github.com/ipfs/go-fs-lock v0.0.7 h1:6BR3dajORFrFTkb5EpCUFIAypsoxpGpDSVUdFwzgL9U=
github.com/ipfs/go-fs-lock v0.0.7/go.mod h1:Js8ka+FNYmgQRLrRXzU3CB/+Csr1BwrRilEcvYrHhhc=
github.com/ipfs/go-ipfs-blockstore v1.3.1 h1:cEI9ci7V0sRNivqaOr0elDsamxXFxJMMMy7PTTDQNsQ=
diff --git a/plugin/plugins/badgerds/badgerds.go b/plugin/plugins/badgerds/badgerds.go
index 5f5781f8f..2410f196c 100644
--- a/plugin/plugins/badgerds/badgerds.go
+++ b/plugin/plugins/badgerds/badgerds.go
@@ -108,6 +108,7 @@ func (c *datastoreConfig) DiskSpec() fsrepo.DiskSpec {
}
func (c *datastoreConfig) Create(path string) (repo.Datastore, error) {
+ fmt.Fprintln(os.Stderr, "โ ๏ธ badgerds is based on badger 1.x, which has known bugs and is no longer supported by the upstream team. Please switch to a newer datastore such as pebbleds or flatfs.")
p := c.path
if !filepath.IsAbs(p) {
p = filepath.Join(path, p)
diff --git a/plugin/plugins/pebbleds/pebbleds.go b/plugin/plugins/pebbleds/pebbleds.go
index 13287a5f3..fab1cc16a 100644
--- a/plugin/plugins/pebbleds/pebbleds.go
+++ b/plugin/plugins/pebbleds/pebbleds.go
@@ -5,7 +5,7 @@ import (
"path/filepath"
"time"
- "github.com/cockroachdb/pebble"
+ "github.com/cockroachdb/pebble/v2"
pebbleds "github.com/ipfs/go-ds-pebble"
"github.com/ipfs/kubo/misc/fsutil"
"github.com/ipfs/kubo/plugin"
@@ -110,10 +110,15 @@ func (*pebbledsPlugin) DatastoreConfigParser() fsrepo.ConfigFromMap {
return nil, err
}
- // Use latest version by default. This will ensure that format is
- // compatible across database upgrades.
if formatMajorVersion == 0 {
+ // Pebble DB format not configured. Automatically ratchet the
+ // database to the latest format. This may prevent downgrade.
formatMajorVersion = pebble.FormatNewest
+ } else if formatMajorVersion < pebble.FormatNewest {
+ // Pebble DB format is configured, but is not the latest.
+ fmt.Println("โ ๏ธ A newer pebble db format is available.")
+ fmt.Println(" To upgrade, set the following in the pebble datastore config:")
+ fmt.Println(" \"formatMajorVersion\":", int(pebble.FormatNewest))
}
if bytesPerSync != 0 || disableWAL || formatMajorVersion != 0 || l0CompactionThreshold != 0 || l0StopWritesThreshold != 0 || lBaseMaxBytes != 0 || maxConcurrentCompactions != 0 || memTableSize != 0 || memTableStopWritesThreshold != 0 || walBytesPerSync != 0 || walMinSyncSec != 0 {
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index bfcb2a5e6..1c617ef83 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -28,6 +28,7 @@ require (
github.com/Antonboom/testifylint v1.4.3 // indirect
github.com/BurntSushi/toml v1.4.1-0.20240526193622-a339e1f7089c // indirect
github.com/Crocmagnon/fatcontext v0.4.0 // indirect
+ github.com/DataDog/zstd v1.5.6-0.20230824185856-869dae002e5e // indirect
github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 // indirect
github.com/GaijinEntertainment/go-exhaustruct/v3 v3.3.0 // indirect
github.com/Masterminds/semver/v3 v3.2.1 // indirect
@@ -57,6 +58,14 @@ require (
github.com/charithe/durationcheck v0.0.10 // indirect
github.com/chavacava/garif v0.1.0 // indirect
github.com/ckaznocha/intrange v0.1.2 // indirect
+ github.com/cockroachdb/crlib v0.0.0-20241015224233-894974b3ad94 // indirect
+ github.com/cockroachdb/errors v1.11.3 // indirect
+ github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect
+ github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect
+ github.com/cockroachdb/pebble/v2 v2.0.3 // indirect
+ github.com/cockroachdb/redact v1.1.5 // indirect
+ github.com/cockroachdb/swiss v0.0.0-20250327203710-2932b022f6df // indirect
+ github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect
github.com/crackcomm/go-gitignore v0.0.0-20241020182519-7843d2ba8fdf // indirect
github.com/curioswitch/go-reassign v0.2.0 // indirect
@@ -76,6 +85,7 @@ require (
github.com/fsnotify/fsnotify v1.7.0 // indirect
github.com/fzipp/gocyclo v0.6.0 // indirect
github.com/gammazero/deque v1.0.0 // indirect
+ github.com/getsentry/sentry-go v0.27.0 // indirect
github.com/ghostiam/protogetter v0.3.6 // indirect
github.com/go-critic/go-critic v0.11.4 // indirect
github.com/go-logr/logr v1.4.2 // indirect
@@ -92,6 +102,8 @@ require (
github.com/go-xmlfmt/xmlfmt v1.1.2 // indirect
github.com/gobwas/glob v0.2.3 // indirect
github.com/gofrs/flock v0.12.1 // indirect
+ github.com/gogo/protobuf v1.3.2 // indirect
+ github.com/golang/snappy v0.0.5-0.20231225225746-43d5d4cd4e0e // indirect
github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a // indirect
github.com/golangci/gofmt v0.0.0-20240816233607-d8596aa466a9 // indirect
github.com/golangci/misspell v0.6.0 // indirect
@@ -143,6 +155,8 @@ require (
github.com/klauspost/compress v1.18.0 // indirect
github.com/klauspost/cpuid/v2 v2.2.10 // indirect
github.com/koron/go-ssdp v0.0.5 // indirect
+ github.com/kr/pretty v0.3.1 // indirect
+ github.com/kr/text v0.2.0 // indirect
github.com/kulti/thelper v0.6.3 // indirect
github.com/kunwardeep/paralleltest v1.0.10 // indirect
github.com/kyoh86/exportloopref v0.1.11 // indirect
@@ -217,6 +231,7 @@ require (
github.com/pion/transport/v3 v3.0.7 // indirect
github.com/pion/turn/v4 v4.0.0 // indirect
github.com/pion/webrtc/v4 v4.0.10 // indirect
+ github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/polydawn/refmt v0.89.0 // indirect
github.com/polyfloyd/go-errorlint v1.6.0 // indirect
@@ -233,6 +248,7 @@ require (
github.com/quic-go/quic-go v0.50.1 // indirect
github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 // indirect
github.com/rivo/uniseg v0.4.7 // indirect
+ github.com/rogpeppe/go-internal v1.13.1 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/ryancurrah/gomodguard v1.3.3 // indirect
github.com/ryanrolds/sqlclosecheck v0.5.1 // indirect
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index 1b4a49612..5b5eb3a45 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -27,6 +27,8 @@ github.com/BurntSushi/toml v1.4.1-0.20240526193622-a339e1f7089c h1:pxW6RcqyfI9/k
github.com/BurntSushi/toml v1.4.1-0.20240526193622-a339e1f7089c/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
github.com/Crocmagnon/fatcontext v0.4.0 h1:4ykozu23YHA0JB6+thiuEv7iT6xq995qS1vcuWZq0tg=
github.com/Crocmagnon/fatcontext v0.4.0/go.mod h1:ZtWrXkgyfsYPzS6K3O88va6t2GEglG93vnII/F94WC0=
+github.com/DataDog/zstd v1.5.6-0.20230824185856-869dae002e5e h1:ZIWapoIRN1VqT8GR8jAwb1Ie9GyehWjVcGh32Y2MznE=
+github.com/DataDog/zstd v1.5.6-0.20230824185856-869dae002e5e/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw=
github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 h1:sHglBQTwgx+rWPdisA5ynNEsoARbiCBOyGcJM4/OzsM=
github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs=
github.com/GaijinEntertainment/go-exhaustruct/v3 v3.3.0 h1:/fTUt5vmbkAcMBt4YQiuC23cV0kEsN1MVMNqeOW43cU=
@@ -37,6 +39,8 @@ github.com/Masterminds/semver/v3 v3.2.1 h1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0
github.com/Masterminds/semver/v3 v3.2.1/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ=
github.com/OpenPeeDeeP/depguard/v2 v2.2.0 h1:vDfG60vDtIuf0MEOhmLlLLSzqaRM8EMcgJPdp74zmpA=
github.com/OpenPeeDeeP/depguard/v2 v2.2.0/go.mod h1:CIzddKRvLBC4Au5aYP/i3nyaWQ+ClszLIuVocRiCYFQ=
+github.com/aclements/go-perfevent v0.0.0-20240301234650-f7843625020f h1:JjxwchlOepwsUWcQwD2mLUAGE9aCp0/ehy6yCHFBOvo=
+github.com/aclements/go-perfevent v0.0.0-20240301234650-f7843625020f/go.mod h1:tMDTce/yLLN/SK8gMOxQfnyeMeCg8KGzp0D1cbECEeo=
github.com/alecthomas/assert/v2 v2.2.2 h1:Z/iVC0xZfWTaFNE6bA3z07T86hd45Xe2eLt6WVy2bbk=
github.com/alecthomas/assert/v2 v2.2.2/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ=
github.com/alecthomas/go-check-sumtype v0.1.4 h1:WCvlB3l5Vq5dZQTFmodqL2g68uHiSwwlWcT5a2FGK0c=
@@ -97,6 +101,26 @@ github.com/chavacava/garif v0.1.0/go.mod h1:XMyYCkEL58DF0oyW4qDjjnPWONs2HBqYKI+U
github.com/ckaznocha/intrange v0.1.2 h1:3Y4JAxcMntgb/wABQ6e8Q8leMd26JbX2790lIss9MTI=
github.com/ckaznocha/intrange v0.1.2/go.mod h1:RWffCw/vKBwHeOEwWdCikAtY0q4gGt8VhJZEEA5n+RE=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/cockroachdb/crlib v0.0.0-20241015224233-894974b3ad94 h1:bvJv505UUfjzbaIPdNS4AEkHreDqQk6yuNpsdRHpwFA=
+github.com/cockroachdb/crlib v0.0.0-20241015224233-894974b3ad94/go.mod h1:Gq51ZeKaFCXk6QwuGM0w1dnaOqc/F5zKT2zA9D6Xeac=
+github.com/cockroachdb/datadriven v1.0.3-0.20240530155848-7682d40af056 h1:slXychO2uDM6hYRu4c0pD0udNI8uObfeKN6UInWViS8=
+github.com/cockroachdb/datadriven v1.0.3-0.20240530155848-7682d40af056/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU=
+github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I=
+github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8=
+github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce h1:giXvy4KSc/6g/esnpM7Geqxka4WSqI1SZc7sMJFd3y4=
+github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M=
+github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE=
+github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs=
+github.com/cockroachdb/metamorphic v0.0.0-20231108215700-4ba948b56895 h1:XANOgPYtvELQ/h4IrmPAohXqe2pWA8Bwhejr3VQoZsA=
+github.com/cockroachdb/metamorphic v0.0.0-20231108215700-4ba948b56895/go.mod h1:aPd7gM9ov9M8v32Yy5NJrDyOcD8z642dqs+F0CeNXfA=
+github.com/cockroachdb/pebble/v2 v2.0.3 h1:YJ3Sc9jRN/q6OOCNyRHPbcpenbxL1DdgdpUqPlPus6o=
+github.com/cockroachdb/pebble/v2 v2.0.3/go.mod h1:NgxgNcWwyG/uxkLUZGM2aelshaLIZvc0hCX7SCfaO8s=
+github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30=
+github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg=
+github.com/cockroachdb/swiss v0.0.0-20250327203710-2932b022f6df h1:GUJ4KuZtbOcIfRlprHJFFvIqQ4irtQUl+1fJr+yNmPI=
+github.com/cockroachdb/swiss v0.0.0-20250327203710-2932b022f6df/go.mod h1:yBRu/cnL4ks9bgy4vAASdjIW+/xMlFwuHKqtmh3GZQg=
+github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo=
+github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ=
github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM=
github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw=
github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d h1:t5Wuyh53qYyg9eqn4BbnlIT+vmhyww0TatL+zT3uWgI=
@@ -109,6 +133,7 @@ github.com/cpuguy83/go-md2man/v2 v2.0.5 h1:ZtcqGrnekaHpVLArFSe4HK5DoKx1T0rq2DwVB
github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/crackcomm/go-gitignore v0.0.0-20241020182519-7843d2ba8fdf h1:dwGgBWn84wUS1pVikGiruW+x5XM4amhjaZO20vCjay4=
github.com/crackcomm/go-gitignore v0.0.0-20241020182519-7843d2ba8fdf/go.mod h1:p1d6YEZWvFzEh4KLyvBcVSnrfNDDvK2zfK/4x2v/4pE=
+github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0=
github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis=
github.com/curioswitch/go-reassign v0.2.0 h1:G9UZyOcpk/d7Gd6mqYgd8XYWFMw/znxwGDUstnC9DIo=
@@ -164,6 +189,10 @@ github.com/gammazero/chanqueue v1.1.0 h1:yiwtloc1azhgGLFo2gMloJtQvkYD936Ai7tBfa+
github.com/gammazero/chanqueue v1.1.0/go.mod h1:fMwpwEiuUgpab0sH4VHiVcEoji1pSi+EIzeG4TPeKPc=
github.com/gammazero/deque v1.0.0 h1:LTmimT8H7bXkkCy6gZX7zNLtkbz4NdS2z8LZuor3j34=
github.com/gammazero/deque v1.0.0/go.mod h1:iflpYvtGfM3U8S8j+sZEKIak3SAKYpA5/SQewgfXDKo=
+github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps=
+github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY=
+github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9 h1:r5GgOLGbza2wVHRzK7aAj6lWZjfbAwiu/RDCVOKjRyM=
+github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/ghostiam/protogetter v0.3.6 h1:R7qEWaSgFCsy20yYHNIJsU9ZOb8TziSRRxuAOTVKeOk=
github.com/ghostiam/protogetter v0.3.6/go.mod h1:7lpeDnEJ1ZjL/YtyoN99ljO4z0pd3H0d18/t2dPBxHw=
@@ -171,6 +200,8 @@ github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aev
github.com/go-critic/go-critic v0.11.4 h1:O7kGOCx0NDIni4czrkRIXTnit0mkyKOCePh3My6OyEU=
github.com/go-critic/go-critic v0.11.4/go.mod h1:2QAdo4iuLik5S9YG0rT4wcZ8QxwHYkrr6/2MWAiv/vc=
github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q=
+github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA=
+github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
@@ -219,6 +250,8 @@ github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfb
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/snappy v0.0.5-0.20231225225746-43d5d4cd4e0e h1:4bw4WeyTYPp0smaXiJZCNnLrvVBqirQVreixayXezGc=
+github.com/golang/snappy v0.0.5-0.20231225225746-43d5d4cd4e0e/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a h1:w8hkcTqaFpzKqonE9uMCefW1WDie15eSP/4MssdenaM=
github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk=
github.com/golangci/gofmt v0.0.0-20240816233607-d8596aa466a9 h1:/1322Qns6BtQxUZDTAT4SdcoxknUki7IAoK4SAXr8ME=
@@ -363,6 +396,7 @@ github.com/julz/importas v0.1.0 h1:F78HnrsjY3cR7j0etXy5+TU1Zuy7Xt08X/1aJnH5xXY=
github.com/julz/importas v0.1.0/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0=
github.com/karamaru-alpha/copyloopvar v1.1.0 h1:x7gNyKcC2vRBO1H2Mks5u1VxQtYvFiym7fCjIP8RPos=
github.com/karamaru-alpha/copyloopvar v1.1.0/go.mod h1:u7CIfztblY0jZLOQZgH3oYsJzpC2A7S6u/lfgSXHy0k=
+github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
github.com/kisielk/errcheck v1.7.0 h1:+SbscKmWJ5mOK/bO1zS60F5I9WwZDWOfRsC4RwfwRV0=
github.com/kisielk/errcheck v1.7.0/go.mod h1:1kLL+jV4e+CFfueBmI1dSK2ADDyQnlrnrY/FqKluHJQ=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
@@ -539,6 +573,8 @@ github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2D
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y=
github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM=
github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
+github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4=
+github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
github.com/pion/datachannel v1.5.10 h1:ly0Q26K1i6ZkGf42W7D4hQYR90pZwzFOjTq5AuCKk4o=
github.com/pion/datachannel v1.5.10/go.mod h1:p/jJfC9arb29W7WrxyKbepTU20CFgyx5oLo8Rs4Py/M=
github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s=
@@ -581,6 +617,7 @@ github.com/pion/turn/v4 v4.0.0 h1:qxplo3Rxa9Yg1xXDxxH8xaqcyGUtbHYw4QSCvmFWvhM=
github.com/pion/turn/v4 v4.0.0/go.mod h1:MuPDkm15nYSklKpN8vWJ9W2M0PlyQZqYt1McGuxG7mA=
github.com/pion/webrtc/v4 v4.0.10 h1:Hq/JLjhqLxi+NmCtE8lnRPDr8H4LcNvwg8OxVcdv56Q=
github.com/pion/webrtc/v4 v4.0.10/go.mod h1:ViHLVaNpiuvaH8pdiuQxuA9awuE6KVzAXx3vVWilOck=
+github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
@@ -626,6 +663,7 @@ github.com/raulk/go-watchdog v1.3.0/go.mod h1:fIvOnLbF0b0ZwkB9YU4mOW9Did//4vPZtD
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
+github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
@@ -782,6 +820,7 @@ github.com/yeya24/promlinter v0.3.0/go.mod h1:cDfJQQYv9uYciW60QT0eeHlFodotkYZlL+
github.com/ykadowak/zerologlint v0.1.5 h1:Gy/fMz1dFQN9JZTPjv1hxEk+sRWm05row04Yoolgdiw=
github.com/ykadowak/zerologlint v0.1.5/go.mod h1:KaUskqF3e/v59oPmdq1U1DnKcuHokl2/K1U4pmIELKg=
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
@@ -1027,9 +1066,11 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
+golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU=
golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU=
diff --git a/test/sharness/t0060-daemon.sh b/test/sharness/t0060-daemon.sh
index 2a25f5852..45788da55 100755
--- a/test/sharness/t0060-daemon.sh
+++ b/test/sharness/t0060-daemon.sh
@@ -9,7 +9,7 @@ test_description="Test daemon command"
. lib/test-lib.sh
test_expect_success "create badger config" '
- ipfs init --profile=badgerds,test > /dev/null &&
+ ipfs init --profile=pebbleds,test > /dev/null &&
cp "$IPFS_PATH/config" init-config
'
@@ -22,7 +22,7 @@ test_kill_ipfs_daemon
test_expect_success "daemon initialization with existing config works" '
ipfs config "Datastore.Spec.child.path" >actual &&
- test $(cat actual) = "badgerds" &&
+ test $(cat actual) = "pebbleds" &&
ipfs config Addresses > orig_addrs
'
From de168619a5f2fc29c0a19e8af8678d8935393395 Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Wed, 30 Apr 2025 12:15:55 -0700
Subject: [PATCH 220/499] feat(pebble): support pinning `FormatMajorVersion`
(#10789)
* Upgrade to pebble v2.0.3
- Configure latest pebble database format at init
- Do not automatically ratchet database format if set in config
- Daemon messge about new available pebble format
- Document pebble config with formatMajorVersion
- Add warning to users running badger, nudging them to switch to flatfs or pebble
- docs: explain Pebble's `FormatMajorVersion`
- Use pebbleds instead of badgerds in t0060-daemon.sh
- Print badgerds warning message to stderr
From b3973fa016c3a12d6f866e6c8c538c94a6fe5a8a Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Wed, 30 Apr 2025 13:01:24 -0700
Subject: [PATCH 221/499] refactor: make datastore metrics opt-in (#10788)
* datastore: metrics optional and off by default
When ipfs is initialized, the datastore metrics wrapper is not configured by default as it previously was. To enable datastore metrics during initialization, specifying the appropriate `--profile` option.
To enable datastore metrics tracking wrapper, initialize with datastore profile name + "-measure" suffix. For example:
```
ipfs init --profile flatfs-measure
```
Closes #10767
* fix sharness tests for new datastore dafaults
* Add sharness test to check metrics added by flatfs-measure profile
* Document updated metrics in changelog
* update config doc with new profiles
* docs(changelog): separate section
* initialize non-measure pebbleds with FormatMajorVersion config
* docs: fix typos, add docs link
---------
Co-authored-by: gammazero
Co-authored-by: Marcin Rataj
---
config/init.go | 42 +++++
config/profile.go | 42 +++++
docs/changelogs/v0.35.md | 14 +-
docs/config.md | 41 ++++-
test/sharness/lib/test-lib.sh | 21 +++
test/sharness/t0060-daemon.sh | 4 +-
.../t0119-prometheus-data/prometheus_metrics | 158 ------------------
...rometheus_metrics_added_by_measure_profile | 158 ++++++++++++++++++
test/sharness/t0119-prometheus.sh | 24 +++
9 files changed, 341 insertions(+), 163 deletions(-)
create mode 100644 test/sharness/t0119-prometheus-data/prometheus_metrics_added_by_measure_profile
diff --git a/config/init.go b/config/init.go
index c32b53e17..1da876313 100644
--- a/config/init.go
+++ b/config/init.go
@@ -141,6 +141,15 @@ func DefaultDatastoreConfig() Datastore {
}
func pebbleSpec() map[string]interface{} {
+ return map[string]interface{}{
+ "type": "pebbleds",
+ "prefix": "pebble.datastore",
+ "path": "pebbleds",
+ "formatMajorVersion": int(pebble.FormatNewest),
+ }
+}
+
+func pebbleSpecMeasure() map[string]interface{} {
return map[string]interface{}{
"type": "measure",
"prefix": "pebble.datastore",
@@ -153,6 +162,16 @@ func pebbleSpec() map[string]interface{} {
}
func badgerSpec() map[string]interface{} {
+ return map[string]interface{}{
+ "type": "badgerds",
+ "prefix": "badger.datastore",
+ "path": "badgerds",
+ "syncWrites": false,
+ "truncate": true,
+ }
+}
+
+func badgerSpecMeasure() map[string]interface{} {
return map[string]interface{}{
"type": "measure",
"prefix": "badger.datastore",
@@ -166,6 +185,29 @@ func badgerSpec() map[string]interface{} {
}
func flatfsSpec() map[string]interface{} {
+ return map[string]interface{}{
+ "type": "mount",
+ "mounts": []interface{}{
+ map[string]interface{}{
+ "mountpoint": "/blocks",
+ "type": "flatfs",
+ "prefix": "flatfs.datastore",
+ "path": "blocks",
+ "sync": false,
+ "shardFunc": "/repo/flatfs/shard/v1/next-to-last/2",
+ },
+ map[string]interface{}{
+ "mountpoint": "/",
+ "type": "levelds",
+ "prefix": "leveldb.datastore",
+ "path": "datastore",
+ "compression": "none",
+ },
+ },
+ }
+}
+
+func flatfsSpecMeasure() map[string]interface{} {
return map[string]interface{}{
"type": "mount",
"mounts": []interface{}{
diff --git a/config/profile.go b/config/profile.go
index a26d74f99..605af3555 100644
--- a/config/profile.go
+++ b/config/profile.go
@@ -150,6 +150,20 @@ NOTE: This profile may only be applied when first initializing node at IPFS_PATH
return nil
},
},
+ "flatfs-measure": {
+ Description: `Configures the node to use the flatfs datastore with metrics tracking wrapper.
+Additional '*_datastore_*' metrics will be exposed on /debug/metrics/prometheus
+
+NOTE: This profile may only be applied when first initializing node at IPFS_PATH
+ via 'ipfs init --profile flatfs-measure'
+`,
+
+ InitOnly: true,
+ Transform: func(c *Config) error {
+ c.Datastore.Spec = flatfsSpecMeasure()
+ return nil
+ },
+ },
"pebbleds": {
Description: `Configures the node to use the pebble high-performance datastore.
@@ -176,6 +190,20 @@ NOTE: This profile may only be applied when first initializing node at IPFS_PATH
return nil
},
},
+ "pebbleds-measure": {
+ Description: `Configures the node to use the pebble datastore with metrics tracking wrapper.
+Additional '*_datastore_*' metrics will be exposed on /debug/metrics/prometheus
+
+NOTE: This profile may only be applied when first initializing node at IPFS_PATH
+ via 'ipfs init --profile pebbleds-measure'
+`,
+
+ InitOnly: true,
+ Transform: func(c *Config) error {
+ c.Datastore.Spec = pebbleSpecMeasure()
+ return nil
+ },
+ },
"badgerds": {
Description: `Configures the node to use the legacy badgerv1 datastore.
@@ -205,6 +233,20 @@ NOTE: This profile may only be applied when first initializing node at IPFS_PATH
return nil
},
},
+ "badgerds-measure": {
+ Description: `Configures the node to use the legacy badgerv1 datastore with metrics wrapper.
+Additional '*_datastore_*' metrics will be exposed on /debug/metrics/prometheus
+
+NOTE: This profile may only be applied when first initializing node at IPFS_PATH
+ via 'ipfs init --profile badgerds-measure'
+`,
+
+ InitOnly: true,
+ Transform: func(c *Config) error {
+ c.Datastore.Spec = badgerSpecMeasure()
+ return nil
+ },
+ },
"lowpower": {
Description: `Reduces daemon overhead on the system. May affect node
functionality - performance of content discovery and data
diff --git a/docs/changelogs/v0.35.md b/docs/changelogs/v0.35.md
index 98a7f2af4..825d536fa 100644
--- a/docs/changelogs/v0.35.md
+++ b/docs/changelogs/v0.35.md
@@ -16,7 +16,8 @@ This release was brought to you by the [Shipyard](http://ipshipyard.com/) team.
- [Enhanced DAG-Shaping Controls for `ipfs add`](#enhanced-dag-shaping-controls-for-ipfs-add)
- [New `ipfs add` Options](#new-ipfs-add-options)
- [Persistent `Import.*` Configuration](#persistent-import-configuration)
- - [Updated Configuration Profiles](#updated-configuration-profiles)
+ - [Updated `Import` Profiles](#updated-import-profiles)
+ - [`Datastore` Metrics Now Opt-In](#datastore-metrics-now-opt-in)
- [Optimized, dedicated queue for providing fresh CIDs](#optimized-dedicated-queue-for-providing-fresh-cids)
- [Deprecated `ipfs stats provider`](#deprecated-ipfs-stats-provider)
- [Pebble Database Format Config](#pebble-database-format-config)
@@ -74,7 +75,7 @@ You can set default values for these options using the following configuration s
- [`Import.UnixFSHAMTDirectoryMaxFanout`](https://github.com/ipfs/kubo/blob/master/docs/config.md#importunixfshamtdirectorymaxfanout)
- [`Import.UnixFSHAMTDirectorySizeThreshold`](https://github.com/ipfs/kubo/blob/master/docs/config.md#importunixfshamtdirectorysizethreshold)
-##### Updated Configuration Profiles
+##### Updated `Import` Profiles
The release updated configuration [profiles](https://github.com/ipfs/kubo/blob/master/docs/config.md#profiles) to incorporate these new `Import.*` settings:
- Updated Profile: `test-cid-v1` now includes current defaults as explicit `Import.UnixFSFileMaxLinks=174`, `Import.UnixFSDirectoryMaxLinks=0`, `Import.UnixFSHAMTDirectoryMaxFanout=256` and `Import.UnixFSHAMTDirectorySizeThreshold=256KiB`
@@ -84,6 +85,15 @@ The release updated configuration [profiles](https://github.com/ipfs/kubo/blob/m
> [!TIP]
> Apply one of CIDv1 test [profiles](https://github.com/ipfs/kubo/blob/master/docs/config.md#profiles) with `ipfs config profile apply test-cid-v1[-wide]`.
+#### `Datastore` Metrics Now Opt-In
+
+To reduce overhead in the default configuration, datastore metrics are no longer enabled by default when initializing a Kubo repository with `ipfs init`.
+Metrics prefixed with `_datastore` (e.g., `flatfs_datastore_...`, `leveldb_datastore_...`) are not exposed unless explicitly enabled. For a complete list of affected default metrics, refer to [`prometheus_metrics_added_by_measure_profile`](https://github.com/ipfs/kubo/blob/master/test/sharness/t0119-prometheus-data/prometheus_metrics_added_by_measure_profile).
+
+Convenience opt-in [profiles](https://github.com/ipfs/kubo/blob/master/docs/config.md#profiles) can be enabled at initialization time with `ipfs init --profile`: `flatfs-measure`, `pebbleds-measure`, `badgerds-measure`
+
+It is also possible to manually add the `measure` wrapper. See examples in [`Datastore.Spec`](https://github.com/ipfs/kubo/blob/master/docs/config.md#datastorespec) documentation.
+
#### Optimized, dedicated queue for providing fresh CIDs
From `kubo` [`v0.33.0`](https://github.com/ipfs/kubo/releases/tag/v0.33.0),
diff --git a/docs/config.md b/docs/config.md
index d812f8271..504597aa2 100644
--- a/docs/config.md
+++ b/docs/config.md
@@ -203,8 +203,11 @@ config file at runtime.
- [`local-discovery` profile](#local-discovery-profile)
- [`default-networking` profile](#default-networking-profile)
- [`flatfs` profile](#flatfs-profile)
+ - [`flatfs-measure` profile](#flatfs-measure-profile)
- [`pebbleds` profile](#pebbleds-profile)
+ - [`pebbleds-measure` profile](#pebbleds-measure-profile)
- [`badgerds` profile](#badgerds-profile)
+ - [`badgerds-measure` profile](#badgerds-measure-profile)
- [`lowpower` profile](#lowpower-profile)
- [`announce-off` profile](#announce-off-profile)
- [`announce-on` profile](#announce-on-profile)
@@ -735,6 +738,30 @@ datastores to provide extra functionality (eg metrics, logging, or caching).
Default:
```
+{
+ "mounts": [
+ {
+ "mountpoint": "/blocks",
+ "path": "blocks",
+ "prefix": "flatfs.datastore",
+ "shardFunc": "/repo/flatfs/shard/v1/next-to-last/2",
+ "sync": false,
+ "type": "flatfs"
+ },
+ {
+ "compression": "none",
+ "mountpoint": "/",
+ "path": "datastore",
+ "prefix": "leveldb.datastore",
+ "type": "levelds"
+ }
+ ],
+ "type": "mount"
+}
+```
+
+With `flatfs-measure` profile:
+```
{
"mounts": [
{
@@ -2773,9 +2800,13 @@ You should use this datastore if:
> [!NOTE]
> See caveats and configuration options at [`datastores.md#flatfs`](datastores.md#flatfs)
+### `flatfs-measure` profile
+
+Configures the node to use the flatfs datastore with metrics. This is the same as [`flatfs` profile](#flatfs-profile) with the addition of the `measure` datastore wrapper.
+
### `pebbleds` profile
-Configures the node to use the **EXPERIMENTAL** pebble high-performance datastore.
+Configures the node to use the pebble high-performance datastore.
Pebble is a LevelDB/RocksDB inspired key-value store focused on performance and internal usage by CockroachDB.
You should use this datastore if:
@@ -2793,6 +2824,10 @@ You should use this datastore if:
> [!NOTE]
> See other caveats and configuration options at [`datastores.md#pebbleds`](datastores.md#pebbleds)
+### `pebbleds-measure` profile
+
+Configures the node to use the pebble datastore with metrics. This is the same as [`pebbleds` profile](#pebble-profile) with the addition of the `measure` datastore wrapper.
+
### `badgerds` profile
Configures the node to use the **legacy** badgerv1 datastore.
@@ -2818,6 +2853,10 @@ Also, be aware that:
> [!NOTE]
> See other caveats and configuration options at [`datastores.md#pebbleds`](datastores.md#pebbleds)
+### `badgerds-measure` profile
+
+Configures the node to use the **legacy** badgerv1 datastore with metrics. This is the same as [`badgerds` profile](#badger-profile) with the addition of the `measure` datastore wrapper.
+
### `lowpower` profile
Reduces daemon overhead on the system by disabling optional swarm services.
diff --git a/test/sharness/lib/test-lib.sh b/test/sharness/lib/test-lib.sh
index e5714d622..12a1f71be 100644
--- a/test/sharness/lib/test-lib.sh
+++ b/test/sharness/lib/test-lib.sh
@@ -214,6 +214,27 @@ test_init_ipfs() {
}
+test_init_ipfs_measure() {
+ args=("$@")
+
+ # we set the Addresses.API config variable.
+ # the cli client knows to use it, so only need to set.
+ # todo: in the future, use env?
+
+ test_expect_success "ipfs init succeeds" '
+ export IPFS_PATH="$(pwd)/.ipfs" &&
+ ipfs init "${args[@]}" --profile=test,flatfs-measure > /dev/null
+ '
+
+ test_expect_success "prepare config -- mounting" '
+ mkdir mountdir ipfs ipns &&
+ test_config_set Mounts.IPFS "$(pwd)/ipfs" &&
+ test_config_set Mounts.IPNS "$(pwd)/ipns" ||
+ test_fsh cat "\"$IPFS_PATH/config\""
+ '
+
+}
+
test_wait_for_file() {
loops=$1
delay=$2
diff --git a/test/sharness/t0060-daemon.sh b/test/sharness/t0060-daemon.sh
index 45788da55..5dbbd852f 100755
--- a/test/sharness/t0060-daemon.sh
+++ b/test/sharness/t0060-daemon.sh
@@ -8,7 +8,7 @@ test_description="Test daemon command"
. lib/test-lib.sh
-test_expect_success "create badger config" '
+test_expect_success "create pebble config" '
ipfs init --profile=pebbleds,test > /dev/null &&
cp "$IPFS_PATH/config" init-config
'
@@ -21,7 +21,7 @@ test_launch_ipfs_daemon --init --init-config="$(pwd)/init-config" --init-profile
test_kill_ipfs_daemon
test_expect_success "daemon initialization with existing config works" '
- ipfs config "Datastore.Spec.child.path" >actual &&
+ ipfs config "Datastore.Spec.path" >actual &&
test $(cat actual) = "pebbleds" &&
ipfs config Addresses > orig_addrs
'
diff --git a/test/sharness/t0119-prometheus-data/prometheus_metrics b/test/sharness/t0119-prometheus-data/prometheus_metrics
index 07cd44d8f..d0900322b 100644
--- a/test/sharness/t0119-prometheus-data/prometheus_metrics
+++ b/test/sharness/t0119-prometheus-data/prometheus_metrics
@@ -7,85 +7,6 @@ exchange_bitswap_wantlists_seconds_bucket
exchange_bitswap_wantlists_seconds_count
exchange_bitswap_wantlists_seconds_sum
exchange_bitswap_wantlists_total
-flatfs_datastore_batchcommit_errors_total
-flatfs_datastore_batchcommit_latency_seconds_bucket
-flatfs_datastore_batchcommit_latency_seconds_count
-flatfs_datastore_batchcommit_latency_seconds_sum
-flatfs_datastore_batchcommit_total
-flatfs_datastore_batchdelete_errors_total
-flatfs_datastore_batchdelete_latency_seconds_bucket
-flatfs_datastore_batchdelete_latency_seconds_count
-flatfs_datastore_batchdelete_latency_seconds_sum
-flatfs_datastore_batchdelete_total
-flatfs_datastore_batchput_errors_total
-flatfs_datastore_batchput_latency_seconds_bucket
-flatfs_datastore_batchput_latency_seconds_count
-flatfs_datastore_batchput_latency_seconds_sum
-flatfs_datastore_batchput_size_bytes_bucket
-flatfs_datastore_batchput_size_bytes_count
-flatfs_datastore_batchput_size_bytes_sum
-flatfs_datastore_batchput_total
-flatfs_datastore_check_errors_total
-flatfs_datastore_check_latency_seconds_bucket
-flatfs_datastore_check_latency_seconds_count
-flatfs_datastore_check_latency_seconds_sum
-flatfs_datastore_check_total
-flatfs_datastore_delete_errors_total
-flatfs_datastore_delete_latency_seconds_bucket
-flatfs_datastore_delete_latency_seconds_count
-flatfs_datastore_delete_latency_seconds_sum
-flatfs_datastore_delete_total
-flatfs_datastore_du_errors_total
-flatfs_datastore_du_latency_seconds_bucket
-flatfs_datastore_du_latency_seconds_count
-flatfs_datastore_du_latency_seconds_sum
-flatfs_datastore_du_total
-flatfs_datastore_gc_errors_total
-flatfs_datastore_gc_latency_seconds_bucket
-flatfs_datastore_gc_latency_seconds_count
-flatfs_datastore_gc_latency_seconds_sum
-flatfs_datastore_gc_total
-flatfs_datastore_get_errors_total
-flatfs_datastore_get_latency_seconds_bucket
-flatfs_datastore_get_latency_seconds_count
-flatfs_datastore_get_latency_seconds_sum
-flatfs_datastore_get_size_bytes_bucket
-flatfs_datastore_get_size_bytes_count
-flatfs_datastore_get_size_bytes_sum
-flatfs_datastore_get_total
-flatfs_datastore_getsize_errors_total
-flatfs_datastore_getsize_latency_seconds_bucket
-flatfs_datastore_getsize_latency_seconds_count
-flatfs_datastore_getsize_latency_seconds_sum
-flatfs_datastore_getsize_total
-flatfs_datastore_has_errors_total
-flatfs_datastore_has_latency_seconds_bucket
-flatfs_datastore_has_latency_seconds_count
-flatfs_datastore_has_latency_seconds_sum
-flatfs_datastore_has_total
-flatfs_datastore_put_errors_total
-flatfs_datastore_put_latency_seconds_bucket
-flatfs_datastore_put_latency_seconds_count
-flatfs_datastore_put_latency_seconds_sum
-flatfs_datastore_put_size_bytes_bucket
-flatfs_datastore_put_size_bytes_count
-flatfs_datastore_put_size_bytes_sum
-flatfs_datastore_put_total
-flatfs_datastore_query_errors_total
-flatfs_datastore_query_latency_seconds_bucket
-flatfs_datastore_query_latency_seconds_count
-flatfs_datastore_query_latency_seconds_sum
-flatfs_datastore_query_total
-flatfs_datastore_scrub_errors_total
-flatfs_datastore_scrub_latency_seconds_bucket
-flatfs_datastore_scrub_latency_seconds_count
-flatfs_datastore_scrub_latency_seconds_sum
-flatfs_datastore_scrub_total
-flatfs_datastore_sync_errors_total
-flatfs_datastore_sync_latency_seconds_bucket
-flatfs_datastore_sync_latency_seconds_count
-flatfs_datastore_sync_latency_seconds_sum
-flatfs_datastore_sync_total
go_gc_duration_seconds
go_gc_duration_seconds_count
go_gc_duration_seconds_sum
@@ -227,85 +148,6 @@ ipfs_http_response_size_bytes
ipfs_http_response_size_bytes_count
ipfs_http_response_size_bytes_sum
ipfs_info
-leveldb_datastore_batchcommit_errors_total
-leveldb_datastore_batchcommit_latency_seconds_bucket
-leveldb_datastore_batchcommit_latency_seconds_count
-leveldb_datastore_batchcommit_latency_seconds_sum
-leveldb_datastore_batchcommit_total
-leveldb_datastore_batchdelete_errors_total
-leveldb_datastore_batchdelete_latency_seconds_bucket
-leveldb_datastore_batchdelete_latency_seconds_count
-leveldb_datastore_batchdelete_latency_seconds_sum
-leveldb_datastore_batchdelete_total
-leveldb_datastore_batchput_errors_total
-leveldb_datastore_batchput_latency_seconds_bucket
-leveldb_datastore_batchput_latency_seconds_count
-leveldb_datastore_batchput_latency_seconds_sum
-leveldb_datastore_batchput_size_bytes_bucket
-leveldb_datastore_batchput_size_bytes_count
-leveldb_datastore_batchput_size_bytes_sum
-leveldb_datastore_batchput_total
-leveldb_datastore_check_errors_total
-leveldb_datastore_check_latency_seconds_bucket
-leveldb_datastore_check_latency_seconds_count
-leveldb_datastore_check_latency_seconds_sum
-leveldb_datastore_check_total
-leveldb_datastore_delete_errors_total
-leveldb_datastore_delete_latency_seconds_bucket
-leveldb_datastore_delete_latency_seconds_count
-leveldb_datastore_delete_latency_seconds_sum
-leveldb_datastore_delete_total
-leveldb_datastore_du_errors_total
-leveldb_datastore_du_latency_seconds_bucket
-leveldb_datastore_du_latency_seconds_count
-leveldb_datastore_du_latency_seconds_sum
-leveldb_datastore_du_total
-leveldb_datastore_gc_errors_total
-leveldb_datastore_gc_latency_seconds_bucket
-leveldb_datastore_gc_latency_seconds_count
-leveldb_datastore_gc_latency_seconds_sum
-leveldb_datastore_gc_total
-leveldb_datastore_get_errors_total
-leveldb_datastore_get_latency_seconds_bucket
-leveldb_datastore_get_latency_seconds_count
-leveldb_datastore_get_latency_seconds_sum
-leveldb_datastore_get_size_bytes_bucket
-leveldb_datastore_get_size_bytes_count
-leveldb_datastore_get_size_bytes_sum
-leveldb_datastore_get_total
-leveldb_datastore_getsize_errors_total
-leveldb_datastore_getsize_latency_seconds_bucket
-leveldb_datastore_getsize_latency_seconds_count
-leveldb_datastore_getsize_latency_seconds_sum
-leveldb_datastore_getsize_total
-leveldb_datastore_has_errors_total
-leveldb_datastore_has_latency_seconds_bucket
-leveldb_datastore_has_latency_seconds_count
-leveldb_datastore_has_latency_seconds_sum
-leveldb_datastore_has_total
-leveldb_datastore_put_errors_total
-leveldb_datastore_put_latency_seconds_bucket
-leveldb_datastore_put_latency_seconds_count
-leveldb_datastore_put_latency_seconds_sum
-leveldb_datastore_put_size_bytes_bucket
-leveldb_datastore_put_size_bytes_count
-leveldb_datastore_put_size_bytes_sum
-leveldb_datastore_put_total
-leveldb_datastore_query_errors_total
-leveldb_datastore_query_latency_seconds_bucket
-leveldb_datastore_query_latency_seconds_count
-leveldb_datastore_query_latency_seconds_sum
-leveldb_datastore_query_total
-leveldb_datastore_scrub_errors_total
-leveldb_datastore_scrub_latency_seconds_bucket
-leveldb_datastore_scrub_latency_seconds_count
-leveldb_datastore_scrub_latency_seconds_sum
-leveldb_datastore_scrub_total
-leveldb_datastore_sync_errors_total
-leveldb_datastore_sync_latency_seconds_bucket
-leveldb_datastore_sync_latency_seconds_count
-leveldb_datastore_sync_latency_seconds_sum
-leveldb_datastore_sync_total
libp2p_autonat_next_probe_timestamp
libp2p_autonat_reachability_status
libp2p_autonat_reachability_status_confidence
diff --git a/test/sharness/t0119-prometheus-data/prometheus_metrics_added_by_measure_profile b/test/sharness/t0119-prometheus-data/prometheus_metrics_added_by_measure_profile
new file mode 100644
index 000000000..03f132701
--- /dev/null
+++ b/test/sharness/t0119-prometheus-data/prometheus_metrics_added_by_measure_profile
@@ -0,0 +1,158 @@
+flatfs_datastore_batchcommit_errors_total
+flatfs_datastore_batchcommit_latency_seconds_bucket
+flatfs_datastore_batchcommit_latency_seconds_count
+flatfs_datastore_batchcommit_latency_seconds_sum
+flatfs_datastore_batchcommit_total
+flatfs_datastore_batchdelete_errors_total
+flatfs_datastore_batchdelete_latency_seconds_bucket
+flatfs_datastore_batchdelete_latency_seconds_count
+flatfs_datastore_batchdelete_latency_seconds_sum
+flatfs_datastore_batchdelete_total
+flatfs_datastore_batchput_errors_total
+flatfs_datastore_batchput_latency_seconds_bucket
+flatfs_datastore_batchput_latency_seconds_count
+flatfs_datastore_batchput_latency_seconds_sum
+flatfs_datastore_batchput_size_bytes_bucket
+flatfs_datastore_batchput_size_bytes_count
+flatfs_datastore_batchput_size_bytes_sum
+flatfs_datastore_batchput_total
+flatfs_datastore_check_errors_total
+flatfs_datastore_check_latency_seconds_bucket
+flatfs_datastore_check_latency_seconds_count
+flatfs_datastore_check_latency_seconds_sum
+flatfs_datastore_check_total
+flatfs_datastore_delete_errors_total
+flatfs_datastore_delete_latency_seconds_bucket
+flatfs_datastore_delete_latency_seconds_count
+flatfs_datastore_delete_latency_seconds_sum
+flatfs_datastore_delete_total
+flatfs_datastore_du_errors_total
+flatfs_datastore_du_latency_seconds_bucket
+flatfs_datastore_du_latency_seconds_count
+flatfs_datastore_du_latency_seconds_sum
+flatfs_datastore_du_total
+flatfs_datastore_gc_errors_total
+flatfs_datastore_gc_latency_seconds_bucket
+flatfs_datastore_gc_latency_seconds_count
+flatfs_datastore_gc_latency_seconds_sum
+flatfs_datastore_gc_total
+flatfs_datastore_get_errors_total
+flatfs_datastore_get_latency_seconds_bucket
+flatfs_datastore_get_latency_seconds_count
+flatfs_datastore_get_latency_seconds_sum
+flatfs_datastore_get_size_bytes_bucket
+flatfs_datastore_get_size_bytes_count
+flatfs_datastore_get_size_bytes_sum
+flatfs_datastore_get_total
+flatfs_datastore_getsize_errors_total
+flatfs_datastore_getsize_latency_seconds_bucket
+flatfs_datastore_getsize_latency_seconds_count
+flatfs_datastore_getsize_latency_seconds_sum
+flatfs_datastore_getsize_total
+flatfs_datastore_has_errors_total
+flatfs_datastore_has_latency_seconds_bucket
+flatfs_datastore_has_latency_seconds_count
+flatfs_datastore_has_latency_seconds_sum
+flatfs_datastore_has_total
+flatfs_datastore_put_errors_total
+flatfs_datastore_put_latency_seconds_bucket
+flatfs_datastore_put_latency_seconds_count
+flatfs_datastore_put_latency_seconds_sum
+flatfs_datastore_put_size_bytes_bucket
+flatfs_datastore_put_size_bytes_count
+flatfs_datastore_put_size_bytes_sum
+flatfs_datastore_put_total
+flatfs_datastore_query_errors_total
+flatfs_datastore_query_latency_seconds_bucket
+flatfs_datastore_query_latency_seconds_count
+flatfs_datastore_query_latency_seconds_sum
+flatfs_datastore_query_total
+flatfs_datastore_scrub_errors_total
+flatfs_datastore_scrub_latency_seconds_bucket
+flatfs_datastore_scrub_latency_seconds_count
+flatfs_datastore_scrub_latency_seconds_sum
+flatfs_datastore_scrub_total
+flatfs_datastore_sync_errors_total
+flatfs_datastore_sync_latency_seconds_bucket
+flatfs_datastore_sync_latency_seconds_count
+flatfs_datastore_sync_latency_seconds_sum
+flatfs_datastore_sync_total
+leveldb_datastore_batchcommit_errors_total
+leveldb_datastore_batchcommit_latency_seconds_bucket
+leveldb_datastore_batchcommit_latency_seconds_count
+leveldb_datastore_batchcommit_latency_seconds_sum
+leveldb_datastore_batchcommit_total
+leveldb_datastore_batchdelete_errors_total
+leveldb_datastore_batchdelete_latency_seconds_bucket
+leveldb_datastore_batchdelete_latency_seconds_count
+leveldb_datastore_batchdelete_latency_seconds_sum
+leveldb_datastore_batchdelete_total
+leveldb_datastore_batchput_errors_total
+leveldb_datastore_batchput_latency_seconds_bucket
+leveldb_datastore_batchput_latency_seconds_count
+leveldb_datastore_batchput_latency_seconds_sum
+leveldb_datastore_batchput_size_bytes_bucket
+leveldb_datastore_batchput_size_bytes_count
+leveldb_datastore_batchput_size_bytes_sum
+leveldb_datastore_batchput_total
+leveldb_datastore_check_errors_total
+leveldb_datastore_check_latency_seconds_bucket
+leveldb_datastore_check_latency_seconds_count
+leveldb_datastore_check_latency_seconds_sum
+leveldb_datastore_check_total
+leveldb_datastore_delete_errors_total
+leveldb_datastore_delete_latency_seconds_bucket
+leveldb_datastore_delete_latency_seconds_count
+leveldb_datastore_delete_latency_seconds_sum
+leveldb_datastore_delete_total
+leveldb_datastore_du_errors_total
+leveldb_datastore_du_latency_seconds_bucket
+leveldb_datastore_du_latency_seconds_count
+leveldb_datastore_du_latency_seconds_sum
+leveldb_datastore_du_total
+leveldb_datastore_gc_errors_total
+leveldb_datastore_gc_latency_seconds_bucket
+leveldb_datastore_gc_latency_seconds_count
+leveldb_datastore_gc_latency_seconds_sum
+leveldb_datastore_gc_total
+leveldb_datastore_get_errors_total
+leveldb_datastore_get_latency_seconds_bucket
+leveldb_datastore_get_latency_seconds_count
+leveldb_datastore_get_latency_seconds_sum
+leveldb_datastore_get_size_bytes_bucket
+leveldb_datastore_get_size_bytes_count
+leveldb_datastore_get_size_bytes_sum
+leveldb_datastore_get_total
+leveldb_datastore_getsize_errors_total
+leveldb_datastore_getsize_latency_seconds_bucket
+leveldb_datastore_getsize_latency_seconds_count
+leveldb_datastore_getsize_latency_seconds_sum
+leveldb_datastore_getsize_total
+leveldb_datastore_has_errors_total
+leveldb_datastore_has_latency_seconds_bucket
+leveldb_datastore_has_latency_seconds_count
+leveldb_datastore_has_latency_seconds_sum
+leveldb_datastore_has_total
+leveldb_datastore_put_errors_total
+leveldb_datastore_put_latency_seconds_bucket
+leveldb_datastore_put_latency_seconds_count
+leveldb_datastore_put_latency_seconds_sum
+leveldb_datastore_put_size_bytes_bucket
+leveldb_datastore_put_size_bytes_count
+leveldb_datastore_put_size_bytes_sum
+leveldb_datastore_put_total
+leveldb_datastore_query_errors_total
+leveldb_datastore_query_latency_seconds_bucket
+leveldb_datastore_query_latency_seconds_count
+leveldb_datastore_query_latency_seconds_sum
+leveldb_datastore_query_total
+leveldb_datastore_scrub_errors_total
+leveldb_datastore_scrub_latency_seconds_bucket
+leveldb_datastore_scrub_latency_seconds_count
+leveldb_datastore_scrub_latency_seconds_sum
+leveldb_datastore_scrub_total
+leveldb_datastore_sync_errors_total
+leveldb_datastore_sync_latency_seconds_bucket
+leveldb_datastore_sync_latency_seconds_count
+leveldb_datastore_sync_latency_seconds_sum
+leveldb_datastore_sync_total
diff --git a/test/sharness/t0119-prometheus.sh b/test/sharness/t0119-prometheus.sh
index fef204e23..4daf8281b 100755
--- a/test/sharness/t0119-prometheus.sh
+++ b/test/sharness/t0119-prometheus.sh
@@ -57,4 +57,28 @@ test_expect_success "make sure initial metrics added by setting ResourceMgr.Enab
diff -u ../t0119-prometheus-data/prometheus_metrics_added_by_enabling_rcmgr rcmgr_metrics
'
+# Reinitialize ipfs with --profile=flatfs-measure and check metrics.
+
+test_expect_success "remove ipfs directory" '
+ rm -rf .ipfs mountdir ipfs ipns
+'
+
+test_init_ipfs_measure
+
+test_launch_ipfs_daemon
+
+test_expect_success "collect metrics" '
+ curl "$API_ADDR/debug/metrics/prometheus" > raw_metrics
+'
+test_kill_ipfs_daemon
+
+test_expect_success "filter metrics and find ones added by enabling flatfs-measure profile" '
+ sed -ne "s/^\([a-z0-9_]\+\).*/\1/p" raw_metrics | LC_ALL=C sort > filtered_metrics &&
+ grep -v -x -f ../t0119-prometheus-data/prometheus_metrics filtered_metrics | LC_ALL=C sort | uniq > measure_metrics
+'
+
+test_expect_success "make sure initial metrics added by initializing with flatfs-measure profile haven't changed" '
+ diff -u ../t0119-prometheus-data/prometheus_metrics_added_by_measure_profile measure_metrics
+'
+
test_done
From e8ff2d59de68b014ffee2c0d741f33612e5af5a3 Mon Sep 17 00:00:00 2001
From: IGP <84940636+gystemd@users.noreply.github.com>
Date: Wed, 30 Apr 2025 22:23:51 +0200
Subject: [PATCH 222/499] feat(config): ability to disable Bitswap fully or
just server (#10782)
* feat: add Bitswap configuration and related tests
* fix: update Bitswap function to use 'provide' parameter for server enablement
* docs: update changelog for Bitswap functionality changes
* fix: update Bitswap server enablement logic and improve related tests
* fix: rename BitswapConfig to Bitswap and update references
* docs: config and changelog
* fix: `ipfs cat` panic when `Bitswap.Enabled=false`
Fixes panic described in:
https://github.com/ipfs/kubo/pull/10782#discussion_r2069116219
---------
Co-authored-by: gystemd
Co-authored-by: gammazero <11790789+gammazero@users.noreply.github.com>
Co-authored-by: Giulio Piva
Co-authored-by: Marcin Rataj
---
config/bitswap.go | 14 ++++
config/config.go | 2 +
core/node/bitswap.go | 52 ++++++++++--
core/node/groups.go | 8 +-
docs/changelogs/v0.35.md | 4 +-
docs/config.md | 34 ++++++++
test/cli/bitswap_config_test.go | 138 ++++++++++++++++++++++++++++++++
7 files changed, 241 insertions(+), 11 deletions(-)
create mode 100644 config/bitswap.go
create mode 100644 test/cli/bitswap_config_test.go
diff --git a/config/bitswap.go b/config/bitswap.go
new file mode 100644
index 000000000..38c817577
--- /dev/null
+++ b/config/bitswap.go
@@ -0,0 +1,14 @@
+package config
+
+// Bitswap holds Bitswap configuration options
+type Bitswap struct {
+ // Enabled controls both client and server (enabled by default)
+ Enabled Flag `json:",omitempty"`
+ // ServerEnabled controls if the node responds to WANTs (depends on Enabled, enabled by default)
+ ServerEnabled Flag `json:",omitempty"`
+}
+
+const (
+ DefaultBitswapEnabled = true
+ DefaultBitswapServerEnabled = true
+)
diff --git a/config/config.go b/config/config.go
index 3db7573d0..68e57e1c3 100644
--- a/config/config.go
+++ b/config/config.go
@@ -42,6 +42,8 @@ type Config struct {
Version Version
Internal Internal // experimental/unstable options
+
+ Bitswap Bitswap `json:",omitempty"`
}
const (
diff --git a/core/node/bitswap.go b/core/node/bitswap.go
index 2408fe371..b69e7f510 100644
--- a/core/node/bitswap.go
+++ b/core/node/bitswap.go
@@ -2,6 +2,7 @@ package node
import (
"context"
+ "io"
"time"
"github.com/ipfs/boxo/bitswap"
@@ -12,12 +13,16 @@ import (
"github.com/ipfs/boxo/exchange/providing"
provider "github.com/ipfs/boxo/provider"
rpqm "github.com/ipfs/boxo/routing/providerquerymanager"
+ "github.com/ipfs/go-cid"
+ "github.com/ipfs/go-datastore"
+ ipld "github.com/ipfs/go-ipld-format"
"github.com/ipfs/kubo/config"
irouting "github.com/ipfs/kubo/routing"
"github.com/libp2p/go-libp2p/core/host"
"github.com/libp2p/go-libp2p/core/routing"
"go.uber.org/fx"
+ blocks "github.com/ipfs/go-block-format"
"github.com/ipfs/kubo/core/node/helpers"
)
@@ -72,18 +77,21 @@ type bitswapIn struct {
}
// Bitswap creates the BitSwap server/client instance.
-// Additional options to bitswap.New can be provided via the "bitswap-options"
-// group.
+// If Bitswap.ServerEnabled is false, the node will act only as a client
+// using an empty blockstore to prevent serving blocks to other peers.
func Bitswap(provide bool) interface{} {
return func(in bitswapIn, lc fx.Lifecycle) (*bitswap.Bitswap, error) {
bitswapNetwork := bsnet.NewFromIpfsHost(in.Host)
-
+ var blockstoree blockstore.Blockstore = in.Bs
var provider routing.ContentDiscovery
+
if provide {
+
var maxProviders int = DefaultMaxProviders
if in.Cfg.Internal.Bitswap != nil {
maxProviders = int(in.Cfg.Internal.Bitswap.ProviderSearchMaxResults.WithDefault(DefaultMaxProviders))
}
+
pqm, err := rpqm.New(bitswapNetwork,
in.Rt,
rpqm.WithMaxProviders(maxProviders),
@@ -93,10 +101,16 @@ func Bitswap(provide bool) interface{} {
return nil, err
}
in.BitswapOpts = append(in.BitswapOpts, bitswap.WithClientOption(client.WithDefaultProviderQueryManager(false)))
+ in.BitswapOpts = append(in.BitswapOpts, bitswap.WithServerEnabled(true))
provider = pqm
-
+ } else {
+ provider = nil
+ // When server is disabled, use an empty blockstore to prevent serving blocks
+ blockstoree = blockstore.NewBlockstore(datastore.NewMapDatastore())
+ in.BitswapOpts = append(in.BitswapOpts, bitswap.WithServerEnabled(false))
}
- bs := bitswap.New(helpers.LifecycleCtx(in.Mctx, lc), bitswapNetwork, provider, in.Bs, in.BitswapOpts...)
+
+ bs := bitswap.New(helpers.LifecycleCtx(in.Mctx, lc), bitswapNetwork, provider, blockstoree, in.BitswapOpts...)
lc.Append(fx.Hook{
OnStop: func(ctx context.Context) error {
@@ -108,8 +122,12 @@ func Bitswap(provide bool) interface{} {
}
// OnlineExchange creates new LibP2P backed block exchange.
-func OnlineExchange() interface{} {
+// Returns a no-op exchange if Bitswap is disabled.
+func OnlineExchange(isBitswapActive bool) interface{} {
return func(in *bitswap.Bitswap, lc fx.Lifecycle) exchange.Interface {
+ if !isBitswapActive {
+ return &noopExchange{closer: in}
+ }
lc.Append(fx.Hook{
OnStop: func(ctx context.Context) error {
return in.Close()
@@ -144,3 +162,25 @@ func ProvidingExchange(provide bool) interface{} {
return exch
}
}
+
+type noopExchange struct {
+ closer io.Closer
+}
+
+func (e *noopExchange) GetBlock(ctx context.Context, c cid.Cid) (blocks.Block, error) {
+ return nil, ipld.ErrNotFound{Cid: c}
+}
+
+func (e *noopExchange) GetBlocks(ctx context.Context, cids []cid.Cid) (<-chan blocks.Block, error) {
+ ch := make(chan blocks.Block)
+ close(ch)
+ return ch, nil
+}
+
+func (e *noopExchange) NotifyNewBlocks(ctx context.Context, blocks ...blocks.Block) error {
+ return nil
+}
+
+func (e *noopExchange) Close() error {
+ return e.closer.Close()
+}
diff --git a/core/node/groups.go b/core/node/groups.go
index 0e28444be..f82da293f 100644
--- a/core/node/groups.go
+++ b/core/node/groups.go
@@ -335,13 +335,15 @@ func Online(bcfg *BuildCfg, cfg *config.Config, userResourceOverrides rcmgr.Part
recordLifetime = d
}
- /* don't provide from bitswap when the strategic provider service is active */
- shouldBitswapProvide := !cfg.Experimental.StrategicProviding
+ isBitswapEnabled := cfg.Bitswap.Enabled.WithDefault(config.DefaultBitswapEnabled)
+ isBitswapServerEnabled := cfg.Bitswap.ServerEnabled.WithDefault(config.DefaultBitswapServerEnabled)
+ // Don't provide from bitswap when the strategic provider service is active
+ shouldBitswapProvide := isBitswapEnabled && isBitswapServerEnabled && !cfg.Experimental.StrategicProviding
return fx.Options(
fx.Provide(BitswapOptions(cfg)),
fx.Provide(Bitswap(shouldBitswapProvide)),
- fx.Provide(OnlineExchange()),
+ fx.Provide(OnlineExchange(isBitswapEnabled)),
// Replace our Exchange with a Providing exchange!
fx.Decorate(ProvidingExchange(shouldBitswapProvide)),
fx.Provide(DNSResolver),
diff --git a/docs/changelogs/v0.35.md b/docs/changelogs/v0.35.md
index 825d536fa..07543b24d 100644
--- a/docs/changelogs/v0.35.md
+++ b/docs/changelogs/v0.35.md
@@ -41,7 +41,8 @@ See [`Reprovider.Strategy`](https://github.com/ipfs/kubo/blob/master/docs/config
#### Additional new configuration options
-- [`Internal.Bitswap.ProviderSearchMaxResults`](https://github.com/ipfs/kubo/blob/master/docs/config.md##internalbitswapprovidersearchmaxresults) for adjusting the maximum number of providers bitswap client should aim at before it stops searching for new ones.
+- [`Bitswap`](https://github.com/ipfs/kubo/blob/master/docs/config.md#bitswap) section with `Enabled` and `ServerEnabled` flags determine whether Kubo initializes Bitswap, enabling just the client or both the client and server.
+- [`Internal.Bitswap.ProviderSearchMaxResults`](https://github.com/ipfs/kubo/blob/master/docs/config.md#internalbitswapprovidersearchmaxresults) for adjusting the maximum number of providers bitswap client should aim at before it stops searching for new ones.
- [`Routing.IgnoreProviders`](https://github.com/ipfs/kubo/blob/master/docs/config.md#routingignoreproviders) allows ignoring specific peer IDs when returned by the content routing system as providers of content.
#### Grid view in WebUI
@@ -144,5 +145,4 @@ See other caveats and configuration options at [`kubo/docs/datastores.md#pebbled
- update `pebble` to [v2.0.3](https://github.com/cockroachdb/pebble/releases/tag/v2.0.3)
### ๐ Changelog
-
### ๐จโ๐ฉโ๐งโ๐ฆ Contributors
diff --git a/docs/config.md b/docs/config.md
index 504597aa2..770155783 100644
--- a/docs/config.md
+++ b/docs/config.md
@@ -36,6 +36,9 @@ config file at runtime.
- [`AutoTLS.RegistrationToken`](#autotlsregistrationtoken)
- [`AutoTLS.RegistrationDelay`](#autotlsregistrationdelay)
- [`AutoTLS.CAEndpoint`](#autotlscaendpoint)
+ - [`Bitswap`](#bitswap)
+ - [`Bitswap.Enabled`](#bitswapenabled)
+ - [`Bitswap.ServerEnabled`](#bitswapserverenabled)
- [`Bootstrap`](#bootstrap)
- [`Datastore`](#datastore)
- [`Datastore.StorageMax`](#datastorestoragemax)
@@ -619,6 +622,33 @@ Default: [certmagic.LetsEncryptProductionCA](https://pkg.go.dev/github.com/caddy
Type: `optionalString`
+## `Bitswap`
+
+High level client and server configuration of the [Bitswap Protocol](https://specs.ipfs.tech/bitswap-protocol/).
+
+For internal configuration see [`Internal.Bitswap`](#internalbitswap).
+
+### `Bitswap.Enabled`
+
+Manages both Bitswap client and server functionality. For testing or operating a node without Bitswap requirements.
+
+> [!WARNING]
+> Bitswap is a core component of Kubo, and disabling it completely may cause unpredictable outcomes. Treat this as experimental and use it solely for testing purposes.
+
+Default: `true`
+
+Type: `flag`
+
+### `Bitswap.ServerEnabled`
+
+Determines whether Kubo functions as a Bitswap server to host and respond to block requests.
+
+Disabling the server retains client and protocol support in libp2p identify responses but causes Kubo to reply with "don't have" to all block requests.
+
+Default: `true`
+
+Type: `flag`
+
## `Bootstrap`
Bootstrap is an array of [multiaddrs][multiaddr] of trusted nodes that your node connects to, to fetch other nodes of the network on startup.
@@ -1151,6 +1181,10 @@ This section includes internal knobs for various subsystems to allow advanced us
### `Internal.Bitswap`
`Internal.Bitswap` contains knobs for tuning bitswap resource utilization.
+
+> [!TIP]
+> For high level configuration see [`Bitswap`](#bitswap).
+
The knobs (below) document how their value should related to each other.
Whether their values should be raised or lowered should be determined
based on the metrics `ipfs_bitswap_active_tasks`, `ipfs_bitswap_pending_tasks`,
diff --git a/test/cli/bitswap_config_test.go b/test/cli/bitswap_config_test.go
new file mode 100644
index 000000000..19ae3e34d
--- /dev/null
+++ b/test/cli/bitswap_config_test.go
@@ -0,0 +1,138 @@
+package cli
+
+import (
+ "testing"
+ "time"
+
+ "github.com/ipfs/kubo/config"
+ "github.com/ipfs/kubo/test/cli/harness"
+ "github.com/ipfs/kubo/test/cli/testutils"
+ "github.com/stretchr/testify/assert"
+)
+
+func TestBitswapConfig(t *testing.T) {
+ t.Parallel()
+
+ // Create test data that will be shared between nodes
+ testData := testutils.RandomBytes(100)
+
+ t.Run("server enabled (default)", func(t *testing.T) {
+ t.Parallel()
+ h := harness.NewT(t)
+ provider := h.NewNode().Init().StartDaemon()
+ requester := h.NewNode().Init().StartDaemon()
+
+ hash := provider.IPFSAddStr(string(testData))
+ requester.Connect(provider)
+
+ res := requester.IPFS("cat", hash)
+ assert.Equal(t, testData, res.Stdout.Bytes(), "retrieved data should match original")
+ })
+
+ t.Run("server disabled", func(t *testing.T) {
+ t.Parallel()
+ h := harness.NewT(t)
+
+ provider := h.NewNode().Init()
+ provider.SetIPFSConfig("Bitswap.ServerEnabled", false)
+ provider = provider.StartDaemon()
+
+ requester := h.NewNode().Init().StartDaemon()
+
+ hash := provider.IPFSAddStr(string(testData))
+ requester.Connect(provider)
+
+ // If the data was available, it would be retrieved immediately.
+ // Therefore, after the timeout, we can assume the data is not available
+ // i.e. the server is disabled
+ timeout := time.After(3 * time.Second)
+ dataChan := make(chan []byte)
+
+ go func() {
+ res := requester.RunIPFS("cat", hash)
+ dataChan <- res.Stdout.Bytes()
+ }()
+
+ select {
+ case data := <-dataChan:
+ assert.NotEqual(t, testData, data, "retrieved data should not match original")
+ case <-timeout:
+ t.Log("Test passed: operation timed out after 3 seconds as expected")
+ }
+ })
+
+ t.Run("server disabled and client enabled", func(t *testing.T) {
+ t.Parallel()
+ h := harness.NewT(t)
+
+ provider := h.NewNode().Init()
+ provider.SetIPFSConfig("Bitswap.ServerEnabled", false)
+ provider.StartDaemon()
+
+ requester := h.NewNode().Init().StartDaemon()
+ hash := requester.IPFSAddStr(string(testData))
+
+ provider.Connect(requester)
+
+ // Even when the server is disabled, the client should be able to retrieve data
+ res := provider.RunIPFS("cat", hash)
+ assert.Equal(t, testData, res.Stdout.Bytes(), "retrieved data should match original")
+ })
+
+ t.Run("bitswap completely disabled", func(t *testing.T) {
+ t.Parallel()
+ h := harness.NewT(t)
+
+ requester := h.NewNode().Init()
+ requester.UpdateConfig(func(cfg *config.Config) {
+ cfg.Bitswap.Enabled = config.False
+ cfg.Bitswap.ServerEnabled = config.False
+ })
+ requester.StartDaemon()
+
+ provider := h.NewNode().Init().StartDaemon()
+ hash := provider.IPFSAddStr(string(testData))
+
+ requester.Connect(provider)
+ res := requester.RunIPFS("cat", hash)
+ assert.Equal(t, []byte{}, res.Stdout.Bytes(), "cat should not return any data")
+ assert.Contains(t, res.Stderr.String(), "Error: ipld: could not find")
+
+ // Verify that basic operations still work with bitswap disabled
+ res = requester.IPFS("id")
+ assert.Equal(t, 0, res.ExitCode(), "basic IPFS operations should work")
+ res = requester.IPFS("bitswap", "stat")
+ assert.Equal(t, 0, res.ExitCode(), "bitswap stat should work even with bitswap disabled")
+ res = requester.IPFS("bitswap", "wantlist")
+ assert.Equal(t, 0, res.ExitCode(), "bitswap wantlist should work even with bitswap disabled")
+
+ // Verify local operations still work
+ hashNew := requester.IPFSAddStr("random")
+ res = requester.IPFS("cat", hashNew)
+ assert.Equal(t, []byte("random"), res.Stdout.Bytes(), "cat should return the added data")
+ })
+
+ // TODO: Disabling Bitswap.Enabled should remove /ifps/bitswap* protocols from `ipfs id`
+ // t.Run("bitswap protocols disabled", func(t *testing.T) {
+ // t.Parallel()
+ // harness.EnableDebugLogging()
+ // h := harness.NewT(t)
+
+ // provider := h.NewNode().Init()
+ // provider.SetIPFSConfig("Bitswap.ServerEnabled", false)
+ // provider = provider.StartDaemon()
+ // requester := h.NewNode().Init().StartDaemon()
+ // requester.Connect(provider)
+ // // Parse and check ID output
+ // res := provider.IPFS("id", "-f", "")
+ // protocols := strings.Split(strings.TrimSpace(res.Stdout.String()), "\n")
+
+ // // No bitswap protocols should be present
+ // for _, proto := range protocols {
+ // assert.NotContains(t, proto, bsnet.ProtocolBitswap, "bitswap protocol %s should not be advertised when server is disabled", proto)
+ // assert.NotContains(t, proto, bsnet.ProtocolBitswapNoVers, "bitswap protocol %s should not be advertised when server is disabled", proto)
+ // assert.NotContains(t, proto, bsnet.ProtocolBitswapOneOne, "bitswap protocol %s should not be advertised when server is disabled", proto)
+ // assert.NotContains(t, proto, bsnet.ProtocolBitswapOneZero, "bitswap protocol %s should not be advertised when server is disabled", proto)
+ // }
+ // })
+}
From 705962018189ba2e5843ec8e3303f115d7c1e2f8 Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Wed, 30 Apr 2025 13:40:34 -0700
Subject: [PATCH 223/499] Update go-libp2p-pubsub to v0.13.1 (#10795)
---
docs/changelogs/v0.35.md | 1 +
docs/examples/kubo-as-a-library/go.mod | 2 +-
docs/examples/kubo-as-a-library/go.sum | 4 ++--
go.mod | 2 +-
go.sum | 4 ++--
5 files changed, 7 insertions(+), 6 deletions(-)
diff --git a/docs/changelogs/v0.35.md b/docs/changelogs/v0.35.md
index 07543b24d..5bd49d1d3 100644
--- a/docs/changelogs/v0.35.md
+++ b/docs/changelogs/v0.35.md
@@ -143,6 +143,7 @@ See other caveats and configuration options at [`kubo/docs/datastores.md#pebbled
- update `ipfs-webui` to [v4.7.0](https://github.com/ipfs/ipfs-webui/releases/tag/v4.7.0)
- update `go-ds-pebble` to [v0.5.0](https://github.com/ipfs/go-ds-pebble/releases/tag/v0.5.0)
- update `pebble` to [v2.0.3](https://github.com/cockroachdb/pebble/releases/tag/v2.0.3)
+- update `go-libp2p-pubsub` to [v0.13.1](https://github.com:/libp2p/go-libp2p-pubsub/releases/tag/v0.13.1)
### ๐ Changelog
### ๐จโ๐ฉโ๐งโ๐ฆ Contributors
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index e94e45c90..25442a1c9 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -128,7 +128,7 @@ require (
github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect
github.com/libp2p/go-libp2p-kad-dht v0.32.0 // indirect
github.com/libp2p/go-libp2p-kbucket v0.7.0 // indirect
- github.com/libp2p/go-libp2p-pubsub v0.13.0 // indirect
+ github.com/libp2p/go-libp2p-pubsub v0.13.1 // indirect
github.com/libp2p/go-libp2p-pubsub-router v0.6.0 // indirect
github.com/libp2p/go-libp2p-record v0.3.1 // indirect
github.com/libp2p/go-libp2p-routing-helpers v0.7.5 // indirect
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index f2bb38f70..00b24d1af 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -478,8 +478,8 @@ github.com/libp2p/go-libp2p-kbucket v0.3.1/go.mod h1:oyjT5O7tS9CQurok++ERgc46YLw
github.com/libp2p/go-libp2p-kbucket v0.7.0 h1:vYDvRjkyJPeWunQXqcW2Z6E93Ywx7fX0jgzb/dGOKCs=
github.com/libp2p/go-libp2p-kbucket v0.7.0/go.mod h1:blOINGIj1yiPYlVEX0Rj9QwEkmVnz3EP8LK1dRKBC6g=
github.com/libp2p/go-libp2p-peerstore v0.1.4/go.mod h1:+4BDbDiiKf4PzpANZDAT+knVdLxvqh7hXOujessqdzs=
-github.com/libp2p/go-libp2p-pubsub v0.13.0 h1:RmFQ2XAy3zQtbt2iNPy7Tt0/3fwTnHpCQSSnmGnt1Ps=
-github.com/libp2p/go-libp2p-pubsub v0.13.0/go.mod h1:m0gpUOyrXKXdE7c8FNQ9/HLfWbxaEw7xku45w+PaqZo=
+github.com/libp2p/go-libp2p-pubsub v0.13.1 h1:tV3ttzzZSCk0EtEXnxVmWIXgjVxXx+20Jwjbs/Ctzjo=
+github.com/libp2p/go-libp2p-pubsub v0.13.1/go.mod h1:MKPU5vMI8RRFyTP0HfdsF9cLmL1nHAeJm44AxJGJx44=
github.com/libp2p/go-libp2p-pubsub-router v0.6.0 h1:D30iKdlqDt5ZmLEYhHELCMRj8b4sFAqrUcshIUvVP/s=
github.com/libp2p/go-libp2p-pubsub-router v0.6.0/go.mod h1:FY/q0/RBTKsLA7l4vqC2cbRbOvyDotg8PJQ7j8FDudE=
github.com/libp2p/go-libp2p-record v0.3.1 h1:cly48Xi5GjNw5Wq+7gmjfBiG9HCzQVkiZOUZ8kUl+Fg=
diff --git a/go.mod b/go.mod
index 3d86274d0..4d0235792 100644
--- a/go.mod
+++ b/go.mod
@@ -57,7 +57,7 @@ require (
github.com/libp2p/go-libp2p-http v0.5.0
github.com/libp2p/go-libp2p-kad-dht v0.32.0
github.com/libp2p/go-libp2p-kbucket v0.7.0
- github.com/libp2p/go-libp2p-pubsub v0.13.0
+ github.com/libp2p/go-libp2p-pubsub v0.13.1
github.com/libp2p/go-libp2p-pubsub-router v0.6.0
github.com/libp2p/go-libp2p-record v0.3.1
github.com/libp2p/go-libp2p-routing-helpers v0.7.5
diff --git a/go.sum b/go.sum
index 46350b8e3..782427ead 100644
--- a/go.sum
+++ b/go.sum
@@ -564,8 +564,8 @@ github.com/libp2p/go-libp2p-kbucket v0.3.1/go.mod h1:oyjT5O7tS9CQurok++ERgc46YLw
github.com/libp2p/go-libp2p-kbucket v0.7.0 h1:vYDvRjkyJPeWunQXqcW2Z6E93Ywx7fX0jgzb/dGOKCs=
github.com/libp2p/go-libp2p-kbucket v0.7.0/go.mod h1:blOINGIj1yiPYlVEX0Rj9QwEkmVnz3EP8LK1dRKBC6g=
github.com/libp2p/go-libp2p-peerstore v0.1.4/go.mod h1:+4BDbDiiKf4PzpANZDAT+knVdLxvqh7hXOujessqdzs=
-github.com/libp2p/go-libp2p-pubsub v0.13.0 h1:RmFQ2XAy3zQtbt2iNPy7Tt0/3fwTnHpCQSSnmGnt1Ps=
-github.com/libp2p/go-libp2p-pubsub v0.13.0/go.mod h1:m0gpUOyrXKXdE7c8FNQ9/HLfWbxaEw7xku45w+PaqZo=
+github.com/libp2p/go-libp2p-pubsub v0.13.1 h1:tV3ttzzZSCk0EtEXnxVmWIXgjVxXx+20Jwjbs/Ctzjo=
+github.com/libp2p/go-libp2p-pubsub v0.13.1/go.mod h1:MKPU5vMI8RRFyTP0HfdsF9cLmL1nHAeJm44AxJGJx44=
github.com/libp2p/go-libp2p-pubsub-router v0.6.0 h1:D30iKdlqDt5ZmLEYhHELCMRj8b4sFAqrUcshIUvVP/s=
github.com/libp2p/go-libp2p-pubsub-router v0.6.0/go.mod h1:FY/q0/RBTKsLA7l4vqC2cbRbOvyDotg8PJQ7j8FDudE=
github.com/libp2p/go-libp2p-record v0.3.1 h1:cly48Xi5GjNw5Wq+7gmjfBiG9HCzQVkiZOUZ8kUl+Fg=
From b5d73695ba0fdbd71147b5c0e874d65a7bea915a Mon Sep 17 00:00:00 2001
From: Hector Sanjuan
Date: Tue, 6 May 2025 19:06:40 +0200
Subject: [PATCH 224/499] feat: opt-in http retrieval client (#10772)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* Feat: http retrieval as experimental feature
This introduces the http-retrieval capability as an experimental feature.
It can be enabled in the configuration `Experimental.HTTPRetrieval.Enabled = true`.
Documentation and changelog to be added later.
* refactor: HTTPRetrieval.Enabled as Flag
* docs(config): HTTPRetrieval section
* refactor: reusable MockHTTPContentRouter
* feat: HTTPRetrieval.TLSInsecureSkipVerify
allows self-signed certificates in tests
* feat(config): HTTPRetrieval.MaxBlockSize
* test: end-to-end HTTPRetrieval.Enabled
this spawns two http services on localhost:
1. HTTP router that returns HTTP provider when /routing/v1/providers/cid i queried
2. HTTP provider that returns a block when /ipfs/cid is queried
3. Configures Kubo to use (1) instead of cid.contact
this seems to work (running test with DEBUG=true shows (1) was queried
for the test CID and returned multiaddr of (2), but Kubo never requested
test CID block from (2) โ needs investigation
* fix: enable /routing/v1/peers for non-cid.contact
we artificially limited every delegated routing endpoint because of
cid.contact being limited to one endpoint
* feat: Routing.DelegatedRouters
make it easy to override the hardcoded implicit HTTP routeur URL
without having to set the entire custom Router.Routers and
Router.Methods
(http_retrieval_client_test.go still needs to be fixed in future commit)
* test: flag remaining work
* docs: review feedback
* refactor: providerQueryMgr with bitswapNetworks
this fixes two regressions:
(1) introduced in https://github.com/ipfs/kubo/issues/10717
where we only used bitswapLib2p query manager
(this is why E2E did not act on http provider)
(2) introduced in https://github.com/ipfs/kubo/pull/10765
where it was not possible to set binary peerID in IgnoreProviders
(we changed to []string)
* refactor: Bitswap.Libp2pEnabled
replaces Bitswap.Enabled with Bitswap.Libp2pEnabled
adds tests that confirm it is possible to disable libp2p bitswap fully
and only keep http in client mode
also, removes the need for passing empty blockstore in client-only mode
* docs: changelog
---------
Co-authored-by: Marcin Rataj
---
cmd/ipfs/kubo/daemon.go | 1 +
config/bitswap.go | 9 +-
config/config.go | 15 +-
config/http_retrieval.go | 19 +++
config/init.go | 7 -
config/routing.go | 23 +--
core/node/bitswap.go | 79 ++++++---
core/node/groups.go | 13 +-
core/node/libp2p/routingopt.go | 49 ++++--
docs/changelogs/v0.35.md | 128 ++++++++++++---
docs/config.md | 150 ++++++++++++++++--
docs/delegated-routing.md | 8 +
routing/delegated.go | 23 ++-
test/cli/bitswap_config_test.go | 102 ++++++++----
test/cli/content_routing_http_test.go | 64 ++------
test/cli/http_retrieval_client_test.go | 145 +++++++++++++++++
.../httprouting/mock_http_content_router.go | 117 ++++++++++++++
17 files changed, 750 insertions(+), 202 deletions(-)
create mode 100644 config/http_retrieval.go
create mode 100644 test/cli/http_retrieval_client_test.go
create mode 100644 test/cli/testutils/httprouting/mock_http_content_router.go
diff --git a/cmd/ipfs/kubo/daemon.go b/cmd/ipfs/kubo/daemon.go
index 30e805186..3676ed891 100644
--- a/cmd/ipfs/kubo/daemon.go
+++ b/cmd/ipfs/kubo/daemon.go
@@ -458,6 +458,7 @@ func daemonFunc(req *cmds.Request, re cmds.ResponseEmitter, env cmds.Environment
cfg.Identity.PeerID,
cfg.Addresses,
cfg.Identity.PrivKey,
+ cfg.HTTPRetrieval.Enabled.WithDefault(config.DefaultHTTPRetrievalEnabled),
)
default:
return fmt.Errorf("unrecognized routing option: %s", routingOption)
diff --git a/config/bitswap.go b/config/bitswap.go
index 38c817577..5adcdef9c 100644
--- a/config/bitswap.go
+++ b/config/bitswap.go
@@ -2,13 +2,14 @@ package config
// Bitswap holds Bitswap configuration options
type Bitswap struct {
- // Enabled controls both client and server (enabled by default)
- Enabled Flag `json:",omitempty"`
- // ServerEnabled controls if the node responds to WANTs (depends on Enabled, enabled by default)
+ // Libp2pEnabled controls if the node initializes bitswap over libp2p (enabled by default)
+ // (This can be disabled if HTTPRetrieval.Enabled is set to true)
+ Libp2pEnabled Flag `json:",omitempty"`
+ // ServerEnabled controls if the node responds to WANTs (depends on Libp2pEnabled, enabled by default)
ServerEnabled Flag `json:",omitempty"`
}
const (
- DefaultBitswapEnabled = true
+ DefaultBitswapLibp2pEnabled = true
DefaultBitswapServerEnabled = true
)
diff --git a/config/config.go b/config/config.go
index 68e57e1c3..eee7e768b 100644
--- a/config/config.go
+++ b/config/config.go
@@ -33,13 +33,14 @@ type Config struct {
DNS DNS
Migration Migration
- Provider Provider
- Reprovider Reprovider
- Experimental Experiments
- Plugins Plugins
- Pinning Pinning
- Import Import
- Version Version
+ Provider Provider
+ Reprovider Reprovider
+ HTTPRetrieval HTTPRetrieval
+ Experimental Experiments
+ Plugins Plugins
+ Pinning Pinning
+ Import Import
+ Version Version
Internal Internal // experimental/unstable options
diff --git a/config/http_retrieval.go b/config/http_retrieval.go
new file mode 100644
index 000000000..a058e26c4
--- /dev/null
+++ b/config/http_retrieval.go
@@ -0,0 +1,19 @@
+package config
+
+// HTTPRetrieval is the configuration object for HTTP Retrieval settings.
+// Implicit defaults can be found in core/node/bitswap.go
+type HTTPRetrieval struct {
+ Enabled Flag `json:",omitempty"`
+ Allowlist []string `json:",omitempty"`
+ Denylist []string `json:",omitempty"`
+ NumWorkers *OptionalInteger `json:",omitempty"`
+ MaxBlockSize *OptionalString `json:",omitempty"`
+ TLSInsecureSkipVerify Flag `json:",omitempty"`
+}
+
+const (
+ DefaultHTTPRetrievalEnabled = false // opt-in for now, until we figure out https://github.com/ipfs/specs/issues/496
+ DefaultHTTPRetrievalNumWorkers = 16
+ DefaultHTTPRetrievalTLSInsecureSkipVerify = false // only for testing with self-signed HTTPS certs
+ DefaultHTTPRetrievalMaxBlockSize = "2MiB" // matching bitswap: https://specs.ipfs.tech/bitswap-protocol/#block-sizes
+)
diff --git a/config/init.go b/config/init.go
index 1da876313..a40efdead 100644
--- a/config/init.go
+++ b/config/init.go
@@ -48,13 +48,6 @@ func InitWithIdentity(identity Identity) (*Config, error) {
},
},
- Routing: Routing{
- Type: nil,
- Methods: nil,
- Routers: nil,
- IgnoreProviders: []peer.ID{},
- },
-
// setup the node mount points.
Mounts: Mounts{
IPFS: "/ipfs",
diff --git a/config/routing.go b/config/routing.go
index a6f899a1c..3fe501ee4 100644
--- a/config/routing.go
+++ b/config/routing.go
@@ -6,27 +6,30 @@ import (
"os"
"runtime"
"strings"
-
- peer "github.com/libp2p/go-libp2p/core/peer"
)
const (
DefaultAcceleratedDHTClient = false
DefaultLoopbackAddressesOnLanDHT = false
+ CidContactRoutingURL = "https://cid.contact"
+ PublicGoodDelegatedRoutingURL = "https://delegated-ipfs.dev" // cid.contact + amino dht (incl. IPNS PUTs)
+ EnvHTTPRouters = "IPFS_HTTP_ROUTERS"
+ EnvHTTPRoutersFilterProtocols = "IPFS_HTTP_ROUTERS_FILTER_PROTOCOLS"
)
var (
// Default HTTP routers used in parallel to DHT when Routing.Type = "auto"
- DefaultHTTPRouters = getEnvOrDefault("IPFS_HTTP_ROUTERS", []string{
- "https://cid.contact", // https://github.com/ipfs/kubo/issues/9422#issuecomment-1338142084
+ DefaultHTTPRouters = getEnvOrDefault(EnvHTTPRouters, []string{
+ CidContactRoutingURL, // https://github.com/ipfs/kubo/issues/9422#issuecomment-1338142084
})
// Default filter-protocols to pass along with delegated routing requests (as defined in IPIP-484)
// and also filter out locally
- DefaultHTTPRoutersFilterProtocols = getEnvOrDefault("IPFS_HTTP_ROUTERS_FILTER_PROTOCOLS", []string{
+ DefaultHTTPRoutersFilterProtocols = getEnvOrDefault(EnvHTTPRoutersFilterProtocols, []string{
"unknown", // allow results without protocol list, we can do libp2p identify to test them
"transport-bitswap",
- // TODO: add 'transport-ipfs-gateway-http' once https://github.com/ipfs/rainbow/issues/125 is addressed
+ // http is added dynamically in routing/delegated.go.
+ // 'transport-ipfs-gateway-http'
})
)
@@ -43,11 +46,13 @@ type Routing struct {
LoopbackAddressesOnLanDHT Flag `json:",omitempty"`
- IgnoreProviders []peer.ID
+ IgnoreProviders []string `json:",omitempty"`
- Routers Routers
+ DelegatedRouters []string `json:",omitempty"`
- Methods Methods
+ Routers Routers `json:",omitempty"`
+
+ Methods Methods `json:",omitempty"`
}
type Router struct {
diff --git a/core/node/bitswap.go b/core/node/bitswap.go
index b69e7f510..a52b3e75d 100644
--- a/core/node/bitswap.go
+++ b/core/node/bitswap.go
@@ -2,24 +2,28 @@ package node
import (
"context"
+ "errors"
"io"
"time"
+ "github.com/dustin/go-humanize"
"github.com/ipfs/boxo/bitswap"
"github.com/ipfs/boxo/bitswap/client"
+ "github.com/ipfs/boxo/bitswap/network"
bsnet "github.com/ipfs/boxo/bitswap/network/bsnet"
+ "github.com/ipfs/boxo/bitswap/network/httpnet"
blockstore "github.com/ipfs/boxo/blockstore"
exchange "github.com/ipfs/boxo/exchange"
"github.com/ipfs/boxo/exchange/providing"
provider "github.com/ipfs/boxo/provider"
rpqm "github.com/ipfs/boxo/routing/providerquerymanager"
"github.com/ipfs/go-cid"
- "github.com/ipfs/go-datastore"
ipld "github.com/ipfs/go-ipld-format"
+ version "github.com/ipfs/kubo"
"github.com/ipfs/kubo/config"
irouting "github.com/ipfs/kubo/routing"
"github.com/libp2p/go-libp2p/core/host"
- "github.com/libp2p/go-libp2p/core/routing"
+ peer "github.com/libp2p/go-libp2p/core/peer"
"go.uber.org/fx"
blocks "github.com/ipfs/go-block-format"
@@ -79,38 +83,63 @@ type bitswapIn struct {
// Bitswap creates the BitSwap server/client instance.
// If Bitswap.ServerEnabled is false, the node will act only as a client
// using an empty blockstore to prevent serving blocks to other peers.
-func Bitswap(provide bool) interface{} {
+func Bitswap(serverEnabled bool) interface{} {
return func(in bitswapIn, lc fx.Lifecycle) (*bitswap.Bitswap, error) {
- bitswapNetwork := bsnet.NewFromIpfsHost(in.Host)
- var blockstoree blockstore.Blockstore = in.Bs
- var provider routing.ContentDiscovery
+ var bitswapNetworks, bitswapLibp2p network.BitSwapNetwork
+ var bitswapBlockstore blockstore.Blockstore = in.Bs
- if provide {
+ libp2pEnabled := in.Cfg.Bitswap.Libp2pEnabled.WithDefault(config.DefaultBitswapLibp2pEnabled)
+ if libp2pEnabled {
+ bitswapLibp2p = bsnet.NewFromIpfsHost(in.Host)
+ }
- var maxProviders int = DefaultMaxProviders
- if in.Cfg.Internal.Bitswap != nil {
- maxProviders = int(in.Cfg.Internal.Bitswap.ProviderSearchMaxResults.WithDefault(DefaultMaxProviders))
- }
-
- pqm, err := rpqm.New(bitswapNetwork,
- in.Rt,
- rpqm.WithMaxProviders(maxProviders),
- rpqm.WithIgnoreProviders(in.Cfg.Routing.IgnoreProviders...),
- )
+ if httpCfg := in.Cfg.HTTPRetrieval; httpCfg.Enabled.WithDefault(config.DefaultHTTPRetrievalEnabled) {
+ maxBlockSize, err := humanize.ParseBytes(httpCfg.MaxBlockSize.WithDefault(config.DefaultHTTPRetrievalMaxBlockSize))
if err != nil {
return nil, err
}
- in.BitswapOpts = append(in.BitswapOpts, bitswap.WithClientOption(client.WithDefaultProviderQueryManager(false)))
- in.BitswapOpts = append(in.BitswapOpts, bitswap.WithServerEnabled(true))
- provider = pqm
+ bitswapHTTP := httpnet.New(in.Host,
+ httpnet.WithHTTPWorkers(int(httpCfg.NumWorkers.WithDefault(config.DefaultHTTPRetrievalNumWorkers))),
+ httpnet.WithAllowlist(httpCfg.Allowlist),
+ httpnet.WithDenylist(httpCfg.Denylist),
+ httpnet.WithInsecureSkipVerify(httpCfg.TLSInsecureSkipVerify.WithDefault(config.DefaultHTTPRetrievalTLSInsecureSkipVerify)),
+ httpnet.WithMaxBlockSize(int64(maxBlockSize)),
+ httpnet.WithUserAgent(version.GetUserAgentVersion()),
+ )
+ bitswapNetworks = network.New(in.Host.Peerstore(), bitswapLibp2p, bitswapHTTP)
+ } else if libp2pEnabled {
+ bitswapNetworks = bitswapLibp2p
} else {
- provider = nil
- // When server is disabled, use an empty blockstore to prevent serving blocks
- blockstoree = blockstore.NewBlockstore(datastore.NewMapDatastore())
- in.BitswapOpts = append(in.BitswapOpts, bitswap.WithServerEnabled(false))
+ return nil, errors.New("invalid configuration: Bitswap.Libp2pEnabled and HTTPRetrieval.Enabled are both disabled, unable to initialize Bitswap")
}
- bs := bitswap.New(helpers.LifecycleCtx(in.Mctx, lc), bitswapNetwork, provider, blockstoree, in.BitswapOpts...)
+ // Kubo uses own, customized ProviderQueryManager
+ in.BitswapOpts = append(in.BitswapOpts, bitswap.WithClientOption(client.WithDefaultProviderQueryManager(false)))
+ var maxProviders int = DefaultMaxProviders
+ if in.Cfg.Internal.Bitswap != nil {
+ maxProviders = int(in.Cfg.Internal.Bitswap.ProviderSearchMaxResults.WithDefault(DefaultMaxProviders))
+ }
+ ignoredPeerIDs := make([]peer.ID, 0, len(in.Cfg.Routing.IgnoreProviders))
+ for _, str := range in.Cfg.Routing.IgnoreProviders {
+ pid, err := peer.Decode(str)
+ if err != nil {
+ return nil, err
+ }
+ ignoredPeerIDs = append(ignoredPeerIDs, pid)
+ }
+ providerQueryMgr, err := rpqm.New(bitswapNetworks,
+ in.Rt,
+ rpqm.WithMaxProviders(maxProviders),
+ rpqm.WithIgnoreProviders(ignoredPeerIDs...),
+ )
+ if err != nil {
+ return nil, err
+ }
+
+ // Explicitly enable/disable server to ensure desired provide mode
+ in.BitswapOpts = append(in.BitswapOpts, bitswap.WithServerEnabled(serverEnabled))
+
+ bs := bitswap.New(helpers.LifecycleCtx(in.Mctx, lc), bitswapNetworks, providerQueryMgr, bitswapBlockstore, in.BitswapOpts...)
lc.Append(fx.Hook{
OnStop: func(ctx context.Context) error {
diff --git a/core/node/groups.go b/core/node/groups.go
index f82da293f..e4682f6a6 100644
--- a/core/node/groups.go
+++ b/core/node/groups.go
@@ -335,17 +335,18 @@ func Online(bcfg *BuildCfg, cfg *config.Config, userResourceOverrides rcmgr.Part
recordLifetime = d
}
- isBitswapEnabled := cfg.Bitswap.Enabled.WithDefault(config.DefaultBitswapEnabled)
+ isBitswapLibp2pEnabled := cfg.Bitswap.Libp2pEnabled.WithDefault(config.DefaultBitswapLibp2pEnabled)
isBitswapServerEnabled := cfg.Bitswap.ServerEnabled.WithDefault(config.DefaultBitswapServerEnabled)
- // Don't provide from bitswap when the strategic provider service is active
- shouldBitswapProvide := isBitswapEnabled && isBitswapServerEnabled && !cfg.Experimental.StrategicProviding
+
+ // Don't provide from bitswap when the legacy noop experiment "strategic provider service" is active
+ isBitswapServerEnabled = isBitswapServerEnabled && !cfg.Experimental.StrategicProviding
return fx.Options(
fx.Provide(BitswapOptions(cfg)),
- fx.Provide(Bitswap(shouldBitswapProvide)),
- fx.Provide(OnlineExchange(isBitswapEnabled)),
+ fx.Provide(Bitswap(isBitswapServerEnabled)),
+ fx.Provide(OnlineExchange(isBitswapLibp2pEnabled)),
// Replace our Exchange with a Providing exchange!
- fx.Decorate(ProvidingExchange(shouldBitswapProvide)),
+ fx.Decorate(ProvidingExchange(isBitswapServerEnabled)),
fx.Provide(DNSResolver),
fx.Provide(Namesys(ipnsCacheSize, cfg.Ipns.MaxCacheTTL.WithDefault(config.DefaultIpnsMaxCacheTTL))),
fx.Provide(Peering),
diff --git a/core/node/libp2p/routingopt.go b/core/node/libp2p/routingopt.go
index 292f49fe4..43565265b 100644
--- a/core/node/libp2p/routingopt.go
+++ b/core/node/libp2p/routingopt.go
@@ -2,6 +2,7 @@ package libp2p
import (
"context"
+ "os"
"time"
"github.com/ipfs/go-datastore"
@@ -29,21 +30,44 @@ type RoutingOptionArgs struct {
type RoutingOption func(args RoutingOptionArgs) (routing.Routing, error)
+var noopRouter = routinghelpers.Null{}
+
func constructDefaultHTTPRouters(cfg *config.Config) ([]*routinghelpers.ParallelRouter, error) {
var routers []*routinghelpers.ParallelRouter
+ httpRetrievalEnabled := cfg.HTTPRetrieval.Enabled.WithDefault(config.DefaultHTTPRetrievalEnabled)
+
+ // Use config.DefaultHTTPRouters if custom override was sent via config.EnvHTTPRouters
+ // or if user did not set any preference in cfg.Routing.DelegatedRouters
+ var httpRouterEndpoints []string
+ if os.Getenv(config.EnvHTTPRouters) != "" || len(cfg.Routing.DelegatedRouters) == 0 {
+ httpRouterEndpoints = config.DefaultHTTPRouters
+ } else {
+ httpRouterEndpoints = cfg.Routing.DelegatedRouters
+ }
+
// Append HTTP routers for additional speed
- for _, endpoint := range config.DefaultHTTPRouters {
- httpRouter, err := irouting.ConstructHTTPRouter(endpoint, cfg.Identity.PeerID, httpAddrsFromConfig(cfg.Addresses), cfg.Identity.PrivKey)
+ for _, endpoint := range httpRouterEndpoints {
+ httpRouter, err := irouting.ConstructHTTPRouter(endpoint, cfg.Identity.PeerID, httpAddrsFromConfig(cfg.Addresses), cfg.Identity.PrivKey, httpRetrievalEnabled)
if err != nil {
return nil, err
}
-
+ // Mapping router to /routing/v1/* endpoints
+ // https://specs.ipfs.tech/routing/http-routing-v1/
r := &irouting.Composer{
- GetValueRouter: routinghelpers.Null{},
- PutValueRouter: routinghelpers.Null{},
- ProvideRouter: routinghelpers.Null{}, // modify this when indexers supports provide
- FindPeersRouter: routinghelpers.Null{},
- FindProvidersRouter: httpRouter,
+ GetValueRouter: httpRouter, // GET /routing/v1/ipns
+ PutValueRouter: httpRouter, // PUT /routing/v1/ipns
+ ProvideRouter: noopRouter, // we don't have spec for sending provides to /routing/v1 (revisit once https://github.com/ipfs/specs/pull/378 or similar is ratified)
+ FindPeersRouter: httpRouter, // /routing/v1/peers
+ FindProvidersRouter: httpRouter, // /routing/v1/providers
+ }
+
+ if endpoint == config.CidContactRoutingURL {
+ // Special-case: cid.contact only supports /routing/v1/providers/cid
+ // we disable other endpoints to avoid sending requests that always fail
+ r.GetValueRouter = noopRouter
+ r.PutValueRouter = noopRouter
+ r.ProvideRouter = noopRouter
+ r.FindPeersRouter = noopRouter
}
routers = append(routers, &routinghelpers.ParallelRouter{
@@ -119,7 +143,7 @@ func constructDHTRouting(mode dht.ModeOpt) RoutingOption {
}
// ConstructDelegatedRouting is used when Routing.Type = "custom"
-func ConstructDelegatedRouting(routers config.Routers, methods config.Methods, peerID string, addrs config.Addresses, privKey string) RoutingOption {
+func ConstructDelegatedRouting(routers config.Routers, methods config.Methods, peerID string, addrs config.Addresses, privKey string, httpRetrieval bool) RoutingOption {
return func(args RoutingOptionArgs) (routing.Routing, error) {
return irouting.Parse(routers, methods,
&irouting.ExtraDHTParams{
@@ -130,9 +154,10 @@ func ConstructDelegatedRouting(routers config.Routers, methods config.Methods, p
Context: args.Ctx,
},
&irouting.ExtraHTTPParams{
- PeerID: peerID,
- Addrs: httpAddrsFromConfig(addrs),
- PrivKeyB64: privKey,
+ PeerID: peerID,
+ Addrs: httpAddrsFromConfig(addrs),
+ PrivKeyB64: privKey,
+ HTTPRetrieval: httpRetrieval,
},
)
}
diff --git a/docs/changelogs/v0.35.md b/docs/changelogs/v0.35.md
index 5bd49d1d3..2826541cc 100644
--- a/docs/changelogs/v0.35.md
+++ b/docs/changelogs/v0.35.md
@@ -10,25 +10,50 @@ This release was brought to you by the [Shipyard](http://ipshipyard.com/) team.
- [Overview](#overview)
- [๐ฆ Highlights](#-highlights)
+ - [Opt-in HTTP Retrieval client](#opt-in-http-retrieval-client)
- [Dedicated `Reprovider.Strategy` for MFS](#dedicated-reproviderstrategy-for-mfs)
- - [Additional new configuration options](#additional-new-configuration-options)
- [Grid view in WebUI](#grid-view-in-webui)
- - [Enhanced DAG-Shaping Controls for `ipfs add`](#enhanced-dag-shaping-controls-for-ipfs-add)
- - [New `ipfs add` Options](#new-ipfs-add-options)
- - [Persistent `Import.*` Configuration](#persistent-import-configuration)
- - [Updated `Import` Profiles](#updated-import-profiles)
+ - [Enhanced DAG-Shaping Controls](#enhanced-dag-shaping-controls)
+ - [New DAG-Shaping `ipfs add` Options](#new-dag-shaping-ipfs-add-options)
+ - [Persistent DAG-Shaping `Import.*` Configuration](#persistent-dag-shaping-import-configuration)
+ - [Updated DAG-Shaping `Import` Profiles](#updated-dag-shaping-import-profiles)
- [`Datastore` Metrics Now Opt-In](#datastore-metrics-now-opt-in)
- - [Optimized, dedicated queue for providing fresh CIDs](#optimized-dedicated-queue-for-providing-fresh-cids)
- - [Deprecated `ipfs stats provider`](#deprecated-ipfs-stats-provider)
- - [Pebble Database Format Config](#pebble-database-format-config)
+ - [Improved performance of data onboarding](#improved-performance-of-data-onboarding)
+ - [Fast `ipfs add` in online mode](#fast-ipfs-add-in-online-mode)
+ - [Optimized, dedicated queue for providing fresh CIDs](#optimized-dedicated-queue-for-providing-fresh-cids)
+ - [Deprecated `ipfs stats provider`](#deprecated-ipfs-stats-provider)
+ - [New `Bitswap` configuration options](#new-bitswap-configuration-options)
+ - [New `Routing` configuration options](#new-routing-configuration-options)
+ - [New Pebble database format config](#new-pebble-database-format-config)
- [๐ฆ๏ธ Important dependency updates](#-important-dependency-updates)
- [๐ Changelog](#-changelog)
- [๐จโ๐ฉโ๐งโ๐ฆ Contributors](#-contributors)
### Overview
+This release brings significant UX and performance improvements to data onboarding, provisioning, and retrieval systems.
+
+New configuration options let you customize the shape of UnixFS DAGs generated during the data import, control the scope of DAGs announced on the Amino DHT, select which delegated routing endpoints are queried, and choose whether to enable HTTP retrieval alongside Bitswap over Libp2p.
+
+Continue reading for more details.
+
+
### ๐ฆ Highlights
+#### Opt-in HTTP Retrieval client
+
+This release adds experimental support for retrieving blocks directly over HTTPS (HTTP/2), complementing the existing Bitswap over Libp2p.
+
+The opt-in client enables Kubo to use [delegated routing](https://github.com/ipfs/kubo/blob/master/docs/config.md#routingdelegatedrouters) results with `/tls/http` multiaddrs, connecting to HTTPS servers that support [Trustless HTTP Gateway](https://specs.ipfs.tech/http-gateways/trustless-gateway)'s Block Responses (`?format=raw`, `application/vnd.ipld.raw`). Fetching blocks via HTTPS (HTTP/2) simplifies infrastructure and reduces costs for storage providers by leveraging HTTP caching and CDNs.
+
+To enable this feature for testing and feedback, set:
+
+```console
+$ ipfs config --json HTTPRetrieval.Enabled true
+```
+
+See [`HTTPRetrieval`](https://github.com/ipfs/kubo/blob/master/docs/config.md#httpretrieval) for more details.
+
#### Dedicated `Reprovider.Strategy` for MFS
The [Mutable File System (MFS)](https://docs.ipfs.tech/concepts/glossary/#mfs) in Kubo is a UnixFS filesystem managed with [`ipfs files`](https://docs.ipfs.tech/reference/kubo/cli/#ipfs-files) commands. It supports familiar file operations like cp and mv within a folder-tree structure, automatically updating a MerkleDAG and a "root CID" that reflects the current MFS state. Files in MFS are protected from garbage collection, offering a simpler alternative to `ipfs pin`. This makes it a popular choice for tools like [IPFS Desktop](https://docs.ipfs.tech/install/ipfs-desktop/) and the [WebUI](https://github.com/ipfs/ipfs-webui/#readme).
@@ -39,19 +64,13 @@ Users relying on the `pinned` strategy can switch to `pinned+mfs` and use MFS al
See [`Reprovider.Strategy`](https://github.com/ipfs/kubo/blob/master/docs/config.md#reproviderstrategy) for more details.
-#### Additional new configuration options
-
-- [`Bitswap`](https://github.com/ipfs/kubo/blob/master/docs/config.md#bitswap) section with `Enabled` and `ServerEnabled` flags determine whether Kubo initializes Bitswap, enabling just the client or both the client and server.
-- [`Internal.Bitswap.ProviderSearchMaxResults`](https://github.com/ipfs/kubo/blob/master/docs/config.md#internalbitswapprovidersearchmaxresults) for adjusting the maximum number of providers bitswap client should aim at before it stops searching for new ones.
-- [`Routing.IgnoreProviders`](https://github.com/ipfs/kubo/blob/master/docs/config.md#routingignoreproviders) allows ignoring specific peer IDs when returned by the content routing system as providers of content.
-
#### Grid view in WebUI
The WebUI, accessible at http://127.0.0.1:5001/webui/, now includes support for the grid view on the _Files_ screen:
> 
-#### Enhanced DAG-Shaping Controls for `ipfs add`
+#### Enhanced DAG-Shaping Controls
This release advances CIDv1 support by introducing fine-grained control over UnixFS DAG shaping during data ingestion with the `ipfs add` command.
@@ -59,7 +78,7 @@ Wider DAG trees (more links per node, higher fanout, larger thresholds) are bene
Kubo now allows users to act on these tradeoffs and customize the width of the DAG created by `ipfs add` command.
-##### New `ipfs add` Options
+##### New DAG-Shaping `ipfs add` Options
Three new options allow you to override default settings for specific import operations:
@@ -68,7 +87,7 @@ Three new options allow you to override default settings for specific import ope
- Note: Directories exceeding this limit or the `Import.UnixFSHAMTDirectorySizeThreshold` are converted to HAMT-based (sharded across multiple blocks) structures.
- `--max-hamt-fanout`: Specifies the maximum number of child nodes for HAMT internal structures.
-##### Persistent `Import.*` Configuration
+##### Persistent DAG-Shaping `Import.*` Configuration
You can set default values for these options using the following configuration settings:
- [`Import.UnixFSFileMaxLinks`](https://github.com/ipfs/kubo/blob/master/docs/config.md#importunixfsfilemaxlinks)
@@ -76,7 +95,7 @@ You can set default values for these options using the following configuration s
- [`Import.UnixFSHAMTDirectoryMaxFanout`](https://github.com/ipfs/kubo/blob/master/docs/config.md#importunixfshamtdirectorymaxfanout)
- [`Import.UnixFSHAMTDirectorySizeThreshold`](https://github.com/ipfs/kubo/blob/master/docs/config.md#importunixfshamtdirectorysizethreshold)
-##### Updated `Import` Profiles
+##### Updated DAG-Shaping `Import` Profiles
The release updated configuration [profiles](https://github.com/ipfs/kubo/blob/master/docs/config.md#profiles) to incorporate these new `Import.*` settings:
- Updated Profile: `test-cid-v1` now includes current defaults as explicit `Import.UnixFSFileMaxLinks=174`, `Import.UnixFSDirectoryMaxLinks=0`, `Import.UnixFSHAMTDirectoryMaxFanout=256` and `Import.UnixFSHAMTDirectorySizeThreshold=256KiB`
@@ -95,11 +114,55 @@ Convenience opt-in [profiles](https://github.com/ipfs/kubo/blob/master/docs/conf
It is also possible to manually add the `measure` wrapper. See examples in [`Datastore.Spec`](https://github.com/ipfs/kubo/blob/master/docs/config.md#datastorespec) documentation.
-#### Optimized, dedicated queue for providing fresh CIDs
+#### Improved performance of data onboarding
+
+This Kubo release significantly improves both the speed of ingesting data via `ipfs add` and announcing newly produced CIDs to Amino DHT.
+
+##### Fast `ipfs add` in online mode
+
+Adding a large directory of data when `ipfs daemon` was running in online mode took a long time. A significant amount of this time was spent writing to and reading from the persisted provider queue. Due to this, many users had to shut down the daemon and perform data import in offline mode. This release fixes this known limitation, significantly improving the speed of `ipfs add`.
+
+> [!IMPORTANT]
+> Performing `ipfs add` of 10GiB file would take about 30 minutes.
+> Now it takes close to 30 seconds.
+
+Kubo v0.34:
+
+```console
+$ time kubo/cmd/ipfs/ipfs add -r /tmp/testfiles-100M > /dev/null
+ 100.00 MiB / 100.00 MiB [=====================================================================] 100.00%
+real 0m6.464s
+
+$ time kubo/cmd/ipfs/ipfs add -r /tmp/testfiles-1G > /dev/null
+ 1000.00 MiB / 1000.00 MiB [===================================================================] 100.00%
+real 1m10.542s
+
+$ time kubo/cmd/ipfs/ipfs add -r /tmp/testfiles-10G > /dev/null
+ 10.00 GiB / 10.00 GiB [=======================================================================] 100.00%
+real 24m5.744s
+```
+
+Kubo v0.35:
+
+```console
+$ time kubo/cmd/ipfs/ipfs add -r /tmp/testfiles-100M > /dev/null
+ 100.00 MiB / 100.00 MiB [=====================================================================] 100.00%
+real 0m0.326s
+
+$ time kubo/cmd/ipfs/ipfs add -r /tmp/testfiles-1G > /dev/null
+ 1.00 GiB / 1.00 GiB [=========================================================================] 100.00%
+real 0m2.819s
+
+$ time kubo/cmd/ipfs/ipfs add -r /tmp/testfiles-10G > /dev/null
+ 10.00 GiB / 10.00 GiB [=======================================================================] 100.00%
+real 0m28.405s
+```
+
+##### Optimized, dedicated queue for providing fresh CIDs
From `kubo` [`v0.33.0`](https://github.com/ipfs/kubo/releases/tag/v0.33.0),
Bitswap stopped advertising newly added and received blocks to the DHT. Since
-then `boxo/provider` is responsible for the provide and reprovide logic. Prior
+then `boxo/provider` is responsible for the first time provide and the recurring reprovide logic. Prior
to `v0.35.0`, provides and reprovides were handled together in batches, leading
to delays in initial advertisements (provides).
@@ -113,7 +176,7 @@ concurrent provide operations:
> [!TIP]
> Users who need to provide large volumes of content immediately should consider removing the cap on concurrent provide operations and also set `Routing.AcceleratedDHTClient` to `true`.
-##### Deprecated `ipfs stats provider`
+###### Deprecated `ipfs stats provider`
Since the `ipfs stats provider` command was displaying statistics for both
provides and reprovides, this command isn't relevant anymore after separating
@@ -125,7 +188,28 @@ but for reprovides only.
> [!NOTE]
> `ipfs stats provider` still works, but is marked as deprecated and will be removed in a future release. Be mindful that the command provides only statistics about reprovides (similar to `ipfs stats reprovide`) and not the new provide queue (this will be fixed as a part of wider refactor planned for a future release).
-#### Pebble Database Format Config
+#### New `Bitswap` configuration options
+
+- [`Bitswap.Libp2pEnabled`](https://github.com/ipfs/kubo/blob/master/docs/config.md#bitswaplibp2penabled) determines whether Kubo will use Bitswap over libp2p (both client and server).
+- [`Bitswap.ServerEnabled`](https://github.com/ipfs/kubo/blob/master/docs/config.md#bitswapserverenabled) controls whether Kubo functions as a Bitswap server to host and respond to block requests.
+- [`Internal.Bitswap.ProviderSearchMaxResults`](https://github.com/ipfs/kubo/blob/master/docs/config.md#internalbitswapprovidersearchmaxresults) for adjusting the maximum number of providers bitswap client should aim at before it stops searching for new ones.
+
+#### New `Routing` configuration options
+
+- [`Routing.IgnoreProviders`](https://github.com/ipfs/kubo/blob/master/docs/config.md#routingignoreproviders) allows ignoring specific peer IDs when returned by the content routing system as providers of content.
+ - Simplifies testing `HTTPRetrieval.Enabled` in setups where Bitswap over Libp2p and HTTP retrieval is served under different PeerIDs.
+- [`Routing.DelegatedRouters`](https://github.com/ipfs/kubo/blob/master/docs/config.md#routingdelegatedrouters) allows customizing HTTP routers used by Kubo when `Routing.Type` is set to `auto` or `autoclient`.
+ - Users are now able to adjust the default routing system and directly query custom routers for increased resiliency or when dataset is too big and CIDs are not announced on Amino DHT.
+
+> [!TIP]
+>
+> For example, to use Pinata's routing endpoint in addition to IPNI at `cid.contact`:
+>
+> ```console
+> $ ipfs config --json Routing.DelegatedRouters '["https://cid.contact","https://indexer.pinata.cloud"]'
+> ```
+
+#### New Pebble database format config
This Kubo release provides node operators with more control over [Pebble's `FormatMajorVersion`](https://github.com/cockroachdb/pebble/tree/master?tab=readme-ov-file#format-major-versions). This allows testing a new Kubo release without automatically migrating Pebble datastores, keeping the ability to switch back to older Kubo.
diff --git a/docs/config.md b/docs/config.md
index 770155783..91cefe8dc 100644
--- a/docs/config.md
+++ b/docs/config.md
@@ -37,7 +37,7 @@ config file at runtime.
- [`AutoTLS.RegistrationDelay`](#autotlsregistrationdelay)
- [`AutoTLS.CAEndpoint`](#autotlscaendpoint)
- [`Bitswap`](#bitswap)
- - [`Bitswap.Enabled`](#bitswapenabled)
+ - [`Bitswap.Libp2pEnabled`](#bitswaplibp2penabled)
- [`Bitswap.ServerEnabled`](#bitswapserverenabled)
- [`Bootstrap`](#bootstrap)
- [`Datastore`](#datastore)
@@ -127,6 +127,7 @@ config file at runtime.
- [`Routing.AcceleratedDHTClient`](#routingaccelerateddhtclient)
- [`Routing.LoopbackAddressesOnLanDHT`](#routingloopbackaddressesonlandht)
- [`Routing.IgnoreProviders`](#routingignoreproviders)
+ - [`Routing.DelegatedRouters`](#routingdelegatedrouters)
- [`Routing.Routers`](#routingrouters)
- [`Routing.Routers: Type`](#routingrouters-type)
- [`Routing.Routers: Parameters`](#routingrouters-parameters)
@@ -184,6 +185,13 @@ config file at runtime.
- [`DNS`](#dns)
- [`DNS.Resolvers`](#dnsresolvers)
- [`DNS.MaxCacheTTL`](#dnsmaxcachettl)
+ - [`HTTPRetrieval`](#httpretrieval)
+ - [`HTTPRetrieval.Enabled`](#httpretrievalenabled)
+ - [`HTTPRetrieval.Allowlist`](#httpretrievalallowlist)
+ - [`HTTPRetrieval.Denylist`](#httpretrievaldenylist)
+ - [`HTTPRetrieval.NumWorkers`](#httpretrievalnumworkers)
+ - [`HTTPRetrieval.MaxBlockSize`](#httpretrievalmaxblocksize)
+ - [`HTTPRetrieval.TLSInsecureSkipVerify`](#httpretrievaltlsinsecureskipverify)
- [`Import`](#import)
- [`Import.CidVersion`](#importcidversion)
- [`Import.UnixFSRawLeaves`](#importunixfsrawleaves)
@@ -624,16 +632,20 @@ Type: `optionalString`
## `Bitswap`
-High level client and server configuration of the [Bitswap Protocol](https://specs.ipfs.tech/bitswap-protocol/).
+High level client and server configuration of the [Bitswap Protocol](https://specs.ipfs.tech/bitswap-protocol/) over libp2p.
For internal configuration see [`Internal.Bitswap`](#internalbitswap).
-### `Bitswap.Enabled`
+For HTTP version see [`HTTPRetrieval`](#httpretrieval).
-Manages both Bitswap client and server functionality. For testing or operating a node without Bitswap requirements.
+### `Bitswap.Libp2pEnabled`
+
+Determines whether Kubo will use Bitswap over libp2p.
+
+Disabling this, will remove `/ipfs/bitswap/*` protocol support from [libp2p identify](https://github.com/libp2p/specs/blob/master/identify/README.md) responses, effectively shutting down both Bitswap libp2p client and server.
> [!WARNING]
-> Bitswap is a core component of Kubo, and disabling it completely may cause unpredictable outcomes. Treat this as experimental and use it solely for testing purposes.
+> Bitswap over libp2p is a core component of Kubo and the oldest way of exchanging blocks. Disabling it completely may cause unpredictable outcomes, such as retrieval failures, if the only providers were libp2p ones. Treat this as experimental and use it solely for testing purposes with `HTTPRetrieval.Enabled`.
Default: `true`
@@ -643,9 +655,9 @@ Type: `flag`
Determines whether Kubo functions as a Bitswap server to host and respond to block requests.
-Disabling the server retains client and protocol support in libp2p identify responses but causes Kubo to reply with "don't have" to all block requests.
+Disabling the server retains client and protocol support in [libp2p identify](https://github.com/libp2p/specs/blob/master/identify/README.md) responses but causes Kubo to reply with "don't have" to all block requests.
-Default: `true`
+Default: `true` (requires `Bitswap.Libp2pEnabled`)
Type: `flag`
@@ -1725,7 +1737,7 @@ Contains options for content, peer, and IPNS routing mechanisms.
There are multiple routing options: "auto", "autoclient", "none", "dht", "dhtclient", and "custom".
* **DEFAULT:** If unset, or set to "auto", your node will use the public IPFS DHT (aka "Amino")
- and parallel HTTP routers listed below for additional speed.
+ and parallel [`Routing.DelegatedRouters`](#routingdelegatedrouters) for additional speed.
* If set to "autoclient", your node will behave as in "auto" but without running a DHT server.
@@ -1755,15 +1767,13 @@ To force a specific Amino DHT-only mode, client or server, set `Routing.Type` to
unless you're sure your node is reachable from the public network.
When `Routing.Type` is set to `auto` or `autoclient` your node will accelerate some types of routing
-by leveraging HTTP endpoints compatible with [Delegated Routing V1 HTTP API](https://specs.ipfs.tech/routing/http-routing-v1/)
+by leveraging [`Routing.DelegatedRouters`](#routingdelegatedrouters) HTTP endpoints compatible with [Delegated Routing V1 HTTP API](https://specs.ipfs.tech/routing/http-routing-v1/)
introduced in [IPIP-337](https://github.com/ipfs/specs/pull/337)
in addition to the Amino DHT.
-By default, an instance of [IPNI](https://github.com/ipni/specs/blob/main/IPNI.md#readme)
-at https://cid.contact is used.
-Alternative routing rules can be configured in `Routing.Routers` after setting `Routing.Type` to `custom`.
+[Advanced routing rules](https://github.com/ipfs/kubo/blob/master/docs/delegated-routing.md) can be configured in `Routing.Routers` after setting `Routing.Type` to `custom`.
-Default: `auto` (DHT + IPNI)
+Default: `auto` (DHT + [`Routing.DelegatedRouters`](#routingdelegatedrouters))
Type: `optionalString` (`null`/missing means the default)
@@ -1828,16 +1838,32 @@ Type: `bool` (missing means `false`)
### `Routing.IgnoreProviders`
-An array of peerIDs. Any provider record associated to one of these peer IDs is ignored.
+An array of [string-encoded PeerIDs](https://github.com/libp2p/specs/blob/master/peer-ids/peer-ids.md#string-representation). Any provider record associated to one of these peer IDs is ignored.
Apart from ignoring specific providers for reasons like misbehaviour etc. this
setting is useful to ignore providers as a way to indicate preference, when the same provider
is found under different peerIDs (i.e. one for HTTP and one for Bitswap retrieval).
+> [!TIP]
+> This denylist operates on PeerIDs.
+> To deny specific HTTP Provider URL, use [`HTTPRetrieval.Denylist`](#httpretrievaldenylist) instead.
+
Default: `[]`
-Type: `array[peerID]`
+Type: `array[string]`
+### `Routing.DelegatedRouters`
+
+This is an array of URL hostnames that support the [Delegated Routing V1 HTTP API](https://specs.ipfs.tech/routing/http-routing-v1/) which are used alongside the DHT when [`Routing.Type`](#routingtype) is set to `auto` or `autoclient`.
+
+> [!TIP]
+> Delegated routing allows IPFS implementations to offload tasks like content routing, peer routing, and naming to a separate process or server while also benefiting from HTTP caching.
+>
+> One can run their own delegated router either by implementing the [Delegated Routing V1 HTTP API](https://specs.ipfs.tech/routing/http-routing-v1/) themselves, or by using [Someguy](https://github.com/ipfs/someguy), a turn-key implementation that proxies requests to the Amino DHT and other delegated routing servers, such as the Network Indexer at `cid.contact`. Public utility instance of Someguy is hosted at [`https://delegated-ipfs.dev`](https://docs.ipfs.tech/concepts/public-utilities/#delegated-routing).
+
+Default: `["https://cid.contact"]` (empty or `nil` will also use this default; to disable delegated routing, set `Routing.Type` to `dht` or `dhtclient`)
+
+Type: `array[string]`
### `Routing.Routers`
@@ -2596,6 +2622,100 @@ Default: Respect DNS Response TTL
Type: `optionalDuration`
+## `HTTPRetrieval`
+
+`HTTPRetrieval` is configuration for pure HTTP retrieval based on Trustless HTTP Gateways'
+[Block Responses (`application/vnd.ipld.raw`)](https://specs.ipfs.tech/http-gateways/trustless-gateway/#block-responses-application-vnd-ipld-raw)
+which can be used in addition to or instead of retrieving blocks with [Bitswap over Libp2p](#bitswap).
+
+Default: `{}`
+
+Type: `object`
+
+### `HTTPRetrieval.Enabled`
+
+> [!CAUTION]
+> This feature is **EXPERIMENTAL** and may change in future release. Enable with caution, and provide feedback via GitHub issues.
+
+Controls whether HTTP-based block retrieval is enabled.
+
+When enabled, Kubo will be able to act on `/tls/http` (HTTP/2) providers ([Trustless HTTP Gateways](https://specs.ipfs.tech/http-gateways/trustless-gateway/)) returned by the [`Routing.DelegatedRouters`](#routingdelegatedrouters)
+to perform pure HTTP [block retrievals](https://specs.ipfs.tech/http-gateways/trustless-gateway/#block-responses-application-vnd-ipld-raw)
+in addition to [Bitswap over Libp2p](#bitswap).
+
+HTTP requests for `application/vnd.ipld.raw` will be issued instead of Bitswap if a peer has a `/tls/http` multiaddr
+and the HTTPS server returns HTTP 200 for the [probe path](https://specs.ipfs.tech/http-gateways/trustless-gateway/#dedicated-probe-paths).
+
+> [!IMPORTANT]
+> - Requires TLS and HTTP/2.
+> - This feature works in the same way as Bitswap: connected HTTP-peers receive optimistic block requests even for content that they are not announcing.
+> - HTTP client does not follow redirects. Providers should keep announcements up to date.
+> - IPFS ecosystem is working towards [supporting HTTP providers on Amino DHT](https://github.com/ipfs/specs/issues/496). Currently, HTTP providers are mostly limited to results from [`Routing.DelegatedRouters`](#routingdelegatedrouters) endpoints and requires `Routing.Type=auto|autoclient`.
+
+Default: `false`
+
+Type: `flag`
+
+### `HTTPRetrieval.Allowlist`
+
+Optional list of hostnames for which HTTP retrieval is allowed for.
+If this list is not empty, only hosts matching these entries will be allowed for HTTP retrieval.
+
+> [!TIP]
+> To limit HTTP retrieval to a provider at `/dns4/example.com/tcp/443/tls/http` (which would serve `HEAD|GET https://example.com/ipfs/cid?format=raw`), set this to `["example.com"]`
+
+Default: `[]`
+
+Type: `array[string]`
+
+### `HTTPRetrieval.Denylist`
+
+Optional list of hostnames for which HTTP retrieval is not allowed.
+Denylist entries take precedence over Allowlist entries.
+
+
+> [!TIP]
+> This denylist operates on HTTP endpoint hostnames.
+> To deny specific PeerID, use [`Routing.IgnoreProviders`](#routingignoreproviders) instead.
+
+Default: `[]`
+
+Type: `array[string]`
+
+### `HTTPRetrieval.NumWorkers`
+
+The number of worker goroutines to use for concurrent HTTP retrieval operations.
+This setting controls the level of parallelism for HTTP-based block retrieval operations.
+Higher values can improve performance when retrieving many blocks but may increase resource usage.
+
+Default: `16`
+
+Type: `optionalInteger`
+
+### `HTTPRetrieval.MaxBlockSize`
+
+Sets the maximum size of a block that the HTTP retrieval client will accept.
+
+> [!NOTE]
+> This setting is a security feature designed to protect Kubo from malicious providers who might send excessively large or invalid data.
+> Increasing this value allows Kubo to retrieve larger blocks from compatible HTTP providers, but doing so reduces interoperability with Bitswap, and increases potential security risks.
+>
+> Learn more: [Supporting Large IPLD Blocks: Why block limits?](https://discuss.ipfs.tech/t/supporting-large-ipld-blocks/15093#why-block-limits-5)
+
+Default: `2MiB` (matching [Bitswap size limit](https://specs.ipfs.tech/bitswap-protocol/#block-sizes))
+
+Type: `optionalString`
+
+### `HTTPRetrieval.TLSInsecureSkipVerify`
+
+Disables TLS certificate validation.
+Allows making HTTPS connections to HTTP/2 test servers with self-signed TLS certificates.
+Only for testing, do not use in production.
+
+Default: `false`
+
+Type: `flag`
+
## `Import`
Options to configure the default options used for ingesting data, in commands such as `ipfs add` or `ipfs block put`. All affected commands are detailed per option.
diff --git a/docs/delegated-routing.md b/docs/delegated-routing.md
index 8f80beab6..ddc4e48ed 100644
--- a/docs/delegated-routing.md
+++ b/docs/delegated-routing.md
@@ -16,6 +16,14 @@ which then got changed and standardized as [Routing V1 HTTP API](https://specs.i
Kubo 0.23.0 release added support for [self-hosting Routing V1 HTTP API server](https://github.com/ipfs/kubo/blob/master/docs/changelogs/v0.23.md#self-hosting-routingv1-endpoint-for-delegated-routing-needs).
+
+> [!TIP]
+> Kubo 0.35 added support for [`Routing.DelegatedRouters`](https://github.com/ipfs/kubo/blob/master/docs/config.md#routingdelegatedrouters).
+>
+> Most of users are best served by setting delegated HTTP router URLs there and `Routing.Type` to `auto` or `autoclient`, rather than custom routing with complex `Routing.Routers` and `Routing.Methods` directly.
+>
+> The rest of this documentation should be considered only by advanced users and researchers.
+
Now we need a better way to add different routers using different protocols
like [Routing V1](https://specs.ipfs.tech/routing/http-routing-v1/) or Amino
DHT, and be able to configure them (future routing systems to come) to cover different use cases.
diff --git a/routing/delegated.go b/routing/delegated.go
index f5f98a03f..420f30c83 100644
--- a/routing/delegated.go
+++ b/routing/delegated.go
@@ -149,12 +149,13 @@ func parse(visited map[string]bool,
}
type ExtraHTTPParams struct {
- PeerID string
- Addrs []string
- PrivKeyB64 string
+ PeerID string
+ Addrs []string
+ PrivKeyB64 string
+ HTTPRetrieval bool
}
-func ConstructHTTPRouter(endpoint string, peerID string, addrs []string, privKey string) (routing.Routing, error) {
+func ConstructHTTPRouter(endpoint string, peerID string, addrs []string, privKey string, httpRetrieval bool) (routing.Routing, error) {
return httpRoutingFromConfig(
config.Router{
Type: "http",
@@ -163,9 +164,10 @@ func ConstructHTTPRouter(endpoint string, peerID string, addrs []string, privKey
},
},
&ExtraHTTPParams{
- PeerID: peerID,
- Addrs: addrs,
- PrivKeyB64: privKey,
+ PeerID: peerID,
+ Addrs: addrs,
+ PrivKeyB64: privKey,
+ HTTPRetrieval: httpRetrieval,
},
)
}
@@ -200,13 +202,18 @@ func httpRoutingFromConfig(conf config.Router, extraHTTP *ExtraHTTPParams) (rout
return nil, err
}
+ protocols := config.DefaultHTTPRoutersFilterProtocols
+ if extraHTTP.HTTPRetrieval {
+ protocols = append(protocols, "transport-ipfs-gateway-http")
+ }
+
cli, err := drclient.New(
params.Endpoint,
drclient.WithHTTPClient(delegateHTTPClient),
drclient.WithIdentity(key),
drclient.WithProviderInfo(addrInfo.ID, addrInfo.Addrs),
drclient.WithUserAgent(version.GetUserAgentVersion()),
- drclient.WithProtocolFilter(config.DefaultHTTPRoutersFilterProtocols),
+ drclient.WithProtocolFilter(protocols),
drclient.WithStreamResultsRequired(), // https://specs.ipfs.tech/routing/http-routing-v1/#streaming
drclient.WithDisabledLocalFiltering(false), // force local filtering in case remote server does not support IPIP-484
)
diff --git a/test/cli/bitswap_config_test.go b/test/cli/bitswap_config_test.go
index 19ae3e34d..db7656ef2 100644
--- a/test/cli/bitswap_config_test.go
+++ b/test/cli/bitswap_config_test.go
@@ -1,9 +1,11 @@
package cli
import (
+ "strings"
"testing"
"time"
+ "github.com/ipfs/boxo/bitswap/network/bsnet"
"github.com/ipfs/kubo/config"
"github.com/ipfs/kubo/test/cli/harness"
"github.com/ipfs/kubo/test/cli/testutils"
@@ -61,32 +63,32 @@ func TestBitswapConfig(t *testing.T) {
}
})
- t.Run("server disabled and client enabled", func(t *testing.T) {
+ t.Run("client still works when server disabled", func(t *testing.T) {
t.Parallel()
h := harness.NewT(t)
- provider := h.NewNode().Init()
- provider.SetIPFSConfig("Bitswap.ServerEnabled", false)
- provider.StartDaemon()
+ requester := h.NewNode().Init()
+ requester.SetIPFSConfig("Bitswap.ServerEnabled", false)
+ requester.StartDaemon()
- requester := h.NewNode().Init().StartDaemon()
- hash := requester.IPFSAddStr(string(testData))
-
- provider.Connect(requester)
+ provider := h.NewNode().Init().StartDaemon()
+ hash := provider.IPFSAddStr(string(testData))
+ requester.Connect(provider)
// Even when the server is disabled, the client should be able to retrieve data
- res := provider.RunIPFS("cat", hash)
+ res := requester.RunIPFS("cat", hash)
assert.Equal(t, testData, res.Stdout.Bytes(), "retrieved data should match original")
})
- t.Run("bitswap completely disabled", func(t *testing.T) {
+ t.Run("bitswap over libp2p disabled", func(t *testing.T) {
t.Parallel()
h := harness.NewT(t)
requester := h.NewNode().Init()
requester.UpdateConfig(func(cfg *config.Config) {
- cfg.Bitswap.Enabled = config.False
+ cfg.Bitswap.Libp2pEnabled = config.False
cfg.Bitswap.ServerEnabled = config.False
+ cfg.HTTPRetrieval.Enabled = config.True
})
requester.StartDaemon()
@@ -112,27 +114,63 @@ func TestBitswapConfig(t *testing.T) {
assert.Equal(t, []byte("random"), res.Stdout.Bytes(), "cat should return the added data")
})
- // TODO: Disabling Bitswap.Enabled should remove /ifps/bitswap* protocols from `ipfs id`
- // t.Run("bitswap protocols disabled", func(t *testing.T) {
- // t.Parallel()
- // harness.EnableDebugLogging()
- // h := harness.NewT(t)
+ // Disabling Bitswap.Libp2pEnabled should remove /ipfs/bitswap* protocols from `ipfs id`
+ t.Run("disabling bitswap over libp2p removes it from identify protocol list", func(t *testing.T) {
+ t.Parallel()
+ h := harness.NewT(t)
- // provider := h.NewNode().Init()
- // provider.SetIPFSConfig("Bitswap.ServerEnabled", false)
- // provider = provider.StartDaemon()
- // requester := h.NewNode().Init().StartDaemon()
- // requester.Connect(provider)
- // // Parse and check ID output
- // res := provider.IPFS("id", "-f", "")
- // protocols := strings.Split(strings.TrimSpace(res.Stdout.String()), "\n")
+ provider := h.NewNode().Init()
+ provider.UpdateConfig(func(cfg *config.Config) {
+ cfg.Bitswap.Libp2pEnabled = config.False
+ cfg.Bitswap.ServerEnabled = config.False
+ cfg.HTTPRetrieval.Enabled = config.True
+ })
+ provider = provider.StartDaemon()
+ requester := h.NewNode().Init().StartDaemon()
+ requester.Connect(provider)
- // // No bitswap protocols should be present
- // for _, proto := range protocols {
- // assert.NotContains(t, proto, bsnet.ProtocolBitswap, "bitswap protocol %s should not be advertised when server is disabled", proto)
- // assert.NotContains(t, proto, bsnet.ProtocolBitswapNoVers, "bitswap protocol %s should not be advertised when server is disabled", proto)
- // assert.NotContains(t, proto, bsnet.ProtocolBitswapOneOne, "bitswap protocol %s should not be advertised when server is disabled", proto)
- // assert.NotContains(t, proto, bsnet.ProtocolBitswapOneZero, "bitswap protocol %s should not be advertised when server is disabled", proto)
- // }
- // })
+ // read libp2p identify from remote peer, and print protocols
+ res := requester.IPFS("id", "-f", "", provider.PeerID().String())
+ protocols := strings.Split(strings.TrimSpace(res.Stdout.String()), "\n")
+
+ // No bitswap protocols should be present
+ for _, proto := range protocols {
+ assert.NotContains(t, proto, bsnet.ProtocolBitswap, "bitswap protocol %s should not be advertised when server is disabled", proto)
+ assert.NotContains(t, proto, bsnet.ProtocolBitswapNoVers, "bitswap protocol %s should not be advertised when server is disabled", proto)
+ assert.NotContains(t, proto, bsnet.ProtocolBitswapOneOne, "bitswap protocol %s should not be advertised when server is disabled", proto)
+ assert.NotContains(t, proto, bsnet.ProtocolBitswapOneZero, "bitswap protocol %s should not be advertised when server is disabled", proto)
+ }
+ })
+
+ // HTTPRetrieval uses bitswap engine, we need it
+ t.Run("errors when both HTTP and libp2p are disabled", func(t *testing.T) {
+ t.Parallel()
+
+ // init Kubo repo
+ node := harness.NewT(t).NewNode().Init()
+ node.UpdateConfig(func(cfg *config.Config) {
+ cfg.HTTPRetrieval.Enabled = config.False
+ cfg.Bitswap.Libp2pEnabled = config.False
+ cfg.Bitswap.ServerEnabled = config.Default
+ })
+ res := node.RunIPFS("daemon")
+ assert.Contains(t, res.Stderr.Trimmed(), "invalid configuration: Bitswap.Libp2pEnabled and HTTPRetrieval.Enabled are both disabled, unable to initialize Bitswap")
+ assert.Equal(t, 1, res.ExitCode())
+ })
+
+ // HTTPRetrieval uses bitswap engine, we need it
+ t.Run("errors when user set conflicting HTTP and libp2p flags", func(t *testing.T) {
+ t.Parallel()
+
+ // init Kubo repo
+ node := harness.NewT(t).NewNode().Init()
+ node.UpdateConfig(func(cfg *config.Config) {
+ cfg.HTTPRetrieval.Enabled = config.False
+ cfg.Bitswap.Libp2pEnabled = config.False
+ cfg.Bitswap.ServerEnabled = config.True // bad user config: cant enable server when libp2p is down
+ })
+ res := node.RunIPFS("daemon")
+ assert.Contains(t, res.Stderr.Trimmed(), "invalid configuration: Bitswap.Libp2pEnabled and HTTPRetrieval.Enabled are both disabled, unable to initialize Bitswap")
+ assert.Equal(t, 1, res.ExitCode())
+ })
}
diff --git a/test/cli/content_routing_http_test.go b/test/cli/content_routing_http_test.go
index aea5c41ca..4b210cfba 100644
--- a/test/cli/content_routing_http_test.go
+++ b/test/cli/content_routing_http_test.go
@@ -1,69 +1,20 @@
package cli
import (
- "context"
"net/http"
"net/http/httptest"
"os/exec"
- "sync"
"testing"
"time"
- "github.com/ipfs/boxo/ipns"
"github.com/ipfs/boxo/routing/http/server"
- "github.com/ipfs/boxo/routing/http/types"
- "github.com/ipfs/boxo/routing/http/types/iter"
- "github.com/ipfs/go-cid"
+ "github.com/ipfs/kubo/config"
"github.com/ipfs/kubo/test/cli/harness"
"github.com/ipfs/kubo/test/cli/testutils"
- "github.com/libp2p/go-libp2p/core/peer"
- "github.com/libp2p/go-libp2p/core/routing"
+ "github.com/ipfs/kubo/test/cli/testutils/httprouting"
"github.com/stretchr/testify/assert"
)
-type fakeHTTPContentRouter struct {
- m sync.Mutex
- provideBitswapCalls int
- findProvidersCalls int
- findPeersCalls int
-}
-
-func (r *fakeHTTPContentRouter) FindProviders(ctx context.Context, key cid.Cid, limit int) (iter.ResultIter[types.Record], error) {
- r.m.Lock()
- defer r.m.Unlock()
- r.findProvidersCalls++
- return iter.FromSlice([]iter.Result[types.Record]{}), nil
-}
-
-// nolint deprecated
-func (r *fakeHTTPContentRouter) ProvideBitswap(ctx context.Context, req *server.BitswapWriteProvideRequest) (time.Duration, error) {
- r.m.Lock()
- defer r.m.Unlock()
- r.provideBitswapCalls++
- return 0, nil
-}
-
-func (r *fakeHTTPContentRouter) FindPeers(ctx context.Context, pid peer.ID, limit int) (iter.ResultIter[*types.PeerRecord], error) {
- r.m.Lock()
- defer r.m.Unlock()
- r.findPeersCalls++
- return iter.FromSlice([]iter.Result[*types.PeerRecord]{}), nil
-}
-
-func (r *fakeHTTPContentRouter) GetIPNS(ctx context.Context, name ipns.Name) (*ipns.Record, error) {
- return nil, routing.ErrNotSupported
-}
-
-func (r *fakeHTTPContentRouter) PutIPNS(ctx context.Context, name ipns.Name, rec *ipns.Record) error {
- return routing.ErrNotSupported
-}
-
-func (r *fakeHTTPContentRouter) numFindProvidersCalls() int {
- r.m.Lock()
- defer r.m.Unlock()
- return r.findProvidersCalls
-}
-
// userAgentRecorder records the user agent of every HTTP request
type userAgentRecorder struct {
delegate http.Handler
@@ -76,16 +27,19 @@ func (r *userAgentRecorder) ServeHTTP(w http.ResponseWriter, req *http.Request)
}
func TestContentRoutingHTTP(t *testing.T) {
- cr := &fakeHTTPContentRouter{}
+ mockRouter := &httprouting.MockHTTPContentRouter{}
// run the content routing HTTP server
- userAgentRecorder := &userAgentRecorder{delegate: server.Handler(cr)}
+ userAgentRecorder := &userAgentRecorder{delegate: server.Handler(mockRouter)}
server := httptest.NewServer(userAgentRecorder)
t.Cleanup(func() { server.Close() })
// setup the node
node := harness.NewT(t).NewNode().Init()
- node.Runner.Env["IPFS_HTTP_ROUTERS"] = server.URL
+ node.UpdateConfig(func(cfg *config.Config) {
+ // setup Kubo node to use mocked HTTP Router
+ cfg.Routing.DelegatedRouters = []string{server.URL}
+ })
node.StartDaemon()
// compute a random CID
@@ -107,7 +61,7 @@ func TestContentRoutingHTTP(t *testing.T) {
// verify the content router was called
assert.Eventually(t, func() bool {
- return cr.numFindProvidersCalls() > 0
+ return mockRouter.NumFindProvidersCalls() > 0
}, time.Minute, 10*time.Millisecond)
assert.NotEmpty(t, userAgentRecorder.userAgents)
diff --git a/test/cli/http_retrieval_client_test.go b/test/cli/http_retrieval_client_test.go
new file mode 100644
index 000000000..f845c818e
--- /dev/null
+++ b/test/cli/http_retrieval_client_test.go
@@ -0,0 +1,145 @@
+package cli
+
+import (
+ "fmt"
+ "net"
+ "net/http"
+ "net/http/httptest"
+ "net/url"
+ "os"
+ "strings"
+ "testing"
+
+ "github.com/ipfs/boxo/routing/http/server"
+ "github.com/ipfs/boxo/routing/http/types"
+ "github.com/ipfs/go-cid"
+ "github.com/ipfs/kubo/config"
+ "github.com/ipfs/kubo/test/cli/harness"
+ "github.com/ipfs/kubo/test/cli/testutils"
+ "github.com/ipfs/kubo/test/cli/testutils/httprouting"
+ "github.com/libp2p/go-libp2p/core/peer"
+ "github.com/multiformats/go-multiaddr"
+ "github.com/stretchr/testify/assert"
+)
+
+func TestHTTPRetrievalClient(t *testing.T) {
+ t.Parallel()
+
+ // many moving pieces here, show more when debug is needed
+ debug := os.Getenv("DEBUG") == "true"
+
+ // usee local /routing/v1/providers/{cid} and
+ // /ipfs/{cid} HTTP servers to confirm HTTP-only retrieval works end-to-end.
+ t.Run("works end-to-end with an HTTP-only provider", func(t *testing.T) {
+ // setup mocked HTTP Router to handle /routing/v1/providers/cid
+ mockRouter := &httprouting.MockHTTPContentRouter{Debug: debug}
+ delegatedRoutingServer := httptest.NewServer(server.Handler(mockRouter))
+ t.Cleanup(func() { delegatedRoutingServer.Close() })
+
+ // init Kubo repo
+ node := harness.NewT(t).NewNode().Init()
+
+ node.UpdateConfig(func(cfg *config.Config) {
+ // explicitly enable http client
+ cfg.HTTPRetrieval.Enabled = config.True
+ // allow NewMockHTTPProviderServer to use self-signed TLS cert
+ cfg.HTTPRetrieval.TLSInsecureSkipVerify = config.True
+ // setup client-only routing which asks both HTTP + DHT
+ // cfg.Routing.Type = config.NewOptionalString("autoclient")
+ // setup Kubo node to use mocked HTTP Router
+ cfg.Routing.DelegatedRouters = []string{delegatedRoutingServer.URL}
+ })
+
+ // compute a random CID
+ randStr := string(testutils.RandomBytes(100))
+ res := node.PipeStrToIPFS(randStr, "add", "-qn", "--cid-version", "1") // -n means dont add to local repo, just produce CID
+ wantCIDStr := res.Stdout.Trimmed()
+ testCid := cid.MustParse(wantCIDStr)
+
+ // setup mock HTTP provider
+ httpProviderServer := NewMockHTTPProviderServer(testCid, randStr, debug)
+ t.Cleanup(func() { httpProviderServer.Close() })
+ httpHost, httpPort, err := splitHostPort(httpProviderServer.URL)
+ assert.NoError(t, err)
+
+ // setup /routing/v1/providers/cid result that points at our mocked HTTP provider
+ mockHTTPProviderPeerID := "12D3KooWCjfPiojcCUmv78Wd1NJzi4Mraj1moxigp7AfQVQvGLwH" // static, it does not matter, we only care about multiaddr
+ mockHTTPMultiaddr, _ := multiaddr.NewMultiaddr(fmt.Sprintf("/ip4/%s/tcp/%s/tls/http", httpHost, httpPort))
+ mpid, _ := peer.Decode(mockHTTPProviderPeerID)
+ mockRouter.AddProvider(testCid, &types.PeerRecord{
+ Schema: types.SchemaPeer,
+ ID: &mpid,
+ Addrs: []types.Multiaddr{{Multiaddr: mockHTTPMultiaddr}},
+ // no explicit Protocols, ensure multiaddr alone is enough
+ })
+
+ // Start Kubo
+ node.StartDaemon()
+
+ if debug {
+ fmt.Printf("delegatedRoutingServer.URL: %s\n", delegatedRoutingServer.URL)
+ fmt.Printf("httpProviderServer.URL: %s\n", httpProviderServer.URL)
+ fmt.Printf("httpProviderServer.Multiaddr: %s\n", mockHTTPMultiaddr)
+ fmt.Printf("testCid: %s\n", testCid)
+ }
+
+ // Now, make Kubo to read testCid. it was not added to local blockstore, so it has only one provider -- a HTTP server.
+
+ // First, confirm delegatedRoutingServer returned HTTP provider
+ findprovsRes := node.IPFS("routing", "findprovs", testCid.String())
+ assert.Equal(t, mockHTTPProviderPeerID, findprovsRes.Stdout.Trimmed())
+
+ // Ok, now attempt retrieval.
+ // If there was no timeout and returned bytes match expected body, HTTP routing and retrieval worked end-to-end.
+ catRes := node.IPFS("cat", testCid.String())
+ assert.Equal(t, randStr, catRes.Stdout.Trimmed())
+ })
+}
+
+// NewMockHTTPProviderServer pretends to be http provider that supports
+// block response https://specs.ipfs.tech/http-gateways/trustless-gateway/#block-responses-application-vnd-ipld-raw
+func NewMockHTTPProviderServer(c cid.Cid, body string, debug bool) *httptest.Server {
+ expectedPathPrefix := "/ipfs/" + c.String()
+ handler := http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
+ if debug {
+ fmt.Printf("NewMockHTTPProviderServer GET %s\n", req.URL.Path)
+ }
+ if strings.HasPrefix(req.URL.Path, expectedPathPrefix) {
+ w.Header().Set("Content-Type", "application/vnd.ipld.raw")
+ w.WriteHeader(http.StatusOK)
+ if req.Method == "GET" {
+ _, err := w.Write([]byte(body))
+ if err != nil {
+ fmt.Fprintf(os.Stderr, "NewMockHTTPProviderServer GET %s error: %v\n", req.URL.Path, err)
+ }
+ }
+ } else if strings.HasPrefix(req.URL.Path, "/ipfs/bafkqaaa") {
+ // This is probe from https://specs.ipfs.tech/http-gateways/trustless-gateway/#dedicated-probe-paths
+ w.Header().Set("Content-Type", "application/vnd.ipld.raw")
+ w.WriteHeader(http.StatusOK)
+ } else {
+ http.Error(w, "Not Found", http.StatusNotFound)
+ }
+ })
+
+ // Make it HTTP/2 with self-signed TLS cert
+ srv := httptest.NewUnstartedServer(handler)
+ srv.EnableHTTP2 = true
+ srv.StartTLS()
+ return srv
+}
+
+func splitHostPort(httpUrl string) (ipAddr string, port string, err error) {
+ u, err := url.Parse(httpUrl)
+ if err != nil {
+ return "", "", err
+ }
+ if u.Scheme == "" || u.Host == "" {
+ return "", "", fmt.Errorf("invalid URL format: missing scheme or host")
+ }
+ ipAddr, port, err = net.SplitHostPort(u.Host)
+ if err != nil {
+ return "", "", fmt.Errorf("failed to split host and port from %q: %w", u.Host, err)
+ }
+ return ipAddr, port, nil
+}
diff --git a/test/cli/testutils/httprouting/mock_http_content_router.go b/test/cli/testutils/httprouting/mock_http_content_router.go
new file mode 100644
index 000000000..8f6f31023
--- /dev/null
+++ b/test/cli/testutils/httprouting/mock_http_content_router.go
@@ -0,0 +1,117 @@
+package httprouting
+
+import (
+ "context"
+ "fmt"
+ "sync"
+ "time"
+
+ "github.com/ipfs/boxo/ipns"
+ "github.com/ipfs/boxo/routing/http/server"
+ "github.com/ipfs/boxo/routing/http/types"
+ "github.com/ipfs/boxo/routing/http/types/iter"
+ "github.com/ipfs/go-cid"
+ "github.com/libp2p/go-libp2p/core/peer"
+ "github.com/libp2p/go-libp2p/core/routing"
+)
+
+// MockHTTPContentRouter provides /routing/v1
+// (https://specs.ipfs.tech/routing/http-routing-v1/) server implementation
+// based on github.com/ipfs/boxo/routing/http/server
+type MockHTTPContentRouter struct {
+ m sync.Mutex
+ provideBitswapCalls int
+ findProvidersCalls int
+ findPeersCalls int
+ providers map[cid.Cid][]types.Record
+ peers map[peer.ID][]*types.PeerRecord
+ Debug bool
+}
+
+func (r *MockHTTPContentRouter) FindProviders(ctx context.Context, key cid.Cid, limit int) (iter.ResultIter[types.Record], error) {
+ if r.Debug {
+ fmt.Printf("MockHTTPContentRouter.FindProviders(%s)\n", key.String())
+ }
+ r.m.Lock()
+ defer r.m.Unlock()
+ r.findProvidersCalls++
+ if r.providers == nil {
+ r.providers = make(map[cid.Cid][]types.Record)
+ }
+ records, found := r.providers[key]
+ if !found {
+ return iter.FromSlice([]iter.Result[types.Record]{}), nil
+ }
+ results := make([]iter.Result[types.Record], len(records))
+ for i, rec := range records {
+ results[i] = iter.Result[types.Record]{Val: rec}
+ if r.Debug {
+ fmt.Printf("MockHTTPContentRouter.FindProviders(%s) result: %+v\n", key.String(), rec)
+ }
+ }
+ return iter.FromSlice(results), nil
+}
+
+// nolint deprecated
+func (r *MockHTTPContentRouter) ProvideBitswap(ctx context.Context, req *server.BitswapWriteProvideRequest) (time.Duration, error) {
+ r.m.Lock()
+ defer r.m.Unlock()
+ r.provideBitswapCalls++
+ return 0, nil
+}
+
+func (r *MockHTTPContentRouter) FindPeers(ctx context.Context, pid peer.ID, limit int) (iter.ResultIter[*types.PeerRecord], error) {
+ r.m.Lock()
+ defer r.m.Unlock()
+ r.findPeersCalls++
+
+ if r.peers == nil {
+ r.peers = make(map[peer.ID][]*types.PeerRecord)
+ }
+ records, found := r.peers[pid]
+ if !found {
+ return iter.FromSlice([]iter.Result[*types.PeerRecord]{}), nil
+ }
+
+ results := make([]iter.Result[*types.PeerRecord], len(records))
+ for i, rec := range records {
+ results[i] = iter.Result[*types.PeerRecord]{Val: rec}
+ if r.Debug {
+ fmt.Printf("MockHTTPContentRouter.FindPeers(%s) result: %+v\n", pid.String(), rec)
+ }
+ }
+ return iter.FromSlice(results), nil
+}
+
+func (r *MockHTTPContentRouter) GetIPNS(ctx context.Context, name ipns.Name) (*ipns.Record, error) {
+ return nil, routing.ErrNotSupported
+}
+
+func (r *MockHTTPContentRouter) PutIPNS(ctx context.Context, name ipns.Name, rec *ipns.Record) error {
+ return routing.ErrNotSupported
+}
+
+func (r *MockHTTPContentRouter) NumFindProvidersCalls() int {
+ r.m.Lock()
+ defer r.m.Unlock()
+ return r.findProvidersCalls
+}
+
+// AddProvider adds a record for a given CID
+func (r *MockHTTPContentRouter) AddProvider(key cid.Cid, record types.Record) {
+ r.m.Lock()
+ defer r.m.Unlock()
+ if r.providers == nil {
+ r.providers = make(map[cid.Cid][]types.Record)
+ }
+ r.providers[key] = append(r.providers[key], record)
+
+ peerRecord, ok := record.(*types.PeerRecord)
+ if ok {
+ if r.peers == nil {
+ r.peers = make(map[peer.ID][]*types.PeerRecord)
+ }
+ pid := peerRecord.ID
+ r.peers[*pid] = append(r.peers[*pid], peerRecord)
+ }
+}
From 7c844baceadf991ca49f427f4ac17b0eab4b314f Mon Sep 17 00:00:00 2001
From: Sergey Gorbunov
Date: Tue, 6 May 2025 22:55:53 +0300
Subject: [PATCH 225/499] feat(fuse): Expose MFS as FUSE mount point (#10781)
* Add MFS command line options, extend existing mount functions for MFS, set defaults.
* Directory listing and file stat.
* Add a read-only MFS view.
* Add mkdir and interface checks.
* Add remove and rename functionality.
* Implement all required write interfaces.
* Adjust mount functions for other architechtures.
* Merge branch 'master' into feat/10710-mfs-fuse-mount
* Write a basic read/write test.
* Write more basic tests, add a mutex to the file object, fix modtime.
* Add a concurrency test, remove mutexes from file and directory structures.
* Refactor naming(mfdir -> mfsdir) and add documentation.
* Add CID retrieval through ipfs_cid xattr.
* Add docs, add xattr listing, fix bugs for mv and stat, refactor.
* Add MFS command line options, extend existing mount functions for MFS, set defaults.
* docs phrasing
* docs: Mounts.MFS
* docs: warn about lazy-loaded DAGs
* test: TEST_FUSE=1 ./t0030-mount.sh -v
---------
Co-authored-by: Guillaume Michel
Co-authored-by: guillaumemichel
Co-authored-by: Marcin Rataj
---
cmd/ipfs/kubo/daemon.go | 10 +-
config/init.go | 1 +
config/mounts.go | 1 +
core/commands/mount_nofuse.go | 5 +-
core/commands/mount_unix.go | 22 +-
core/core.go | 1 +
docs/changelogs/v0.35.md | 9 +
docs/config.md | 16 +-
docs/experimental-features.md | 2 +-
docs/fuse.md | 28 +-
fuse/mfs/mfs_test.go | 342 ++++++++++++++++++++
fuse/mfs/mfs_unix.go | 414 +++++++++++++++++++++++++
fuse/mfs/mount_unix.go | 21 ++
fuse/node/mount_nofuse.go | 2 +-
fuse/node/mount_notsupp.go | 2 +-
fuse/node/mount_test.go | 4 +-
fuse/node/mount_unix.go | 36 ++-
fuse/node/mount_windows.go | 2 +-
test/3nodetest/bootstrap/config | 3 +-
test/3nodetest/client/config | 3 +-
test/3nodetest/server/config | 3 +-
test/cli/bitswap_config_test.go | 2 +-
test/sharness/lib/test-lib.sh | 7 +-
test/sharness/t0030-mount.sh | 64 +++-
test/sharness/t0270-filestore.sh | 2 +-
test/sharness/t0271-filestore-utils.sh | 2 +-
26 files changed, 962 insertions(+), 42 deletions(-)
create mode 100644 fuse/mfs/mfs_test.go
create mode 100644 fuse/mfs/mfs_unix.go
create mode 100644 fuse/mfs/mount_unix.go
diff --git a/cmd/ipfs/kubo/daemon.go b/cmd/ipfs/kubo/daemon.go
index 3676ed891..ea6ccfc1d 100644
--- a/cmd/ipfs/kubo/daemon.go
+++ b/cmd/ipfs/kubo/daemon.go
@@ -56,6 +56,7 @@ const (
initProfileOptionKwd = "init-profile"
ipfsMountKwd = "mount-ipfs"
ipnsMountKwd = "mount-ipns"
+ mfsMountKwd = "mount-mfs"
migrateKwd = "migrate"
mountKwd = "mount"
offlineKwd = "offline" // global option
@@ -173,6 +174,7 @@ Headers.
cmds.BoolOption(mountKwd, "Mounts IPFS to the filesystem using FUSE (experimental)"),
cmds.StringOption(ipfsMountKwd, "Path to the mountpoint for IPFS (if using --mount). Defaults to config setting."),
cmds.StringOption(ipnsMountKwd, "Path to the mountpoint for IPNS (if using --mount). Defaults to config setting."),
+ cmds.StringOption(mfsMountKwd, "Path to the mountpoint for MFS (if using --mount). Defaults to config setting."),
cmds.BoolOption(unrestrictedAPIAccessKwd, "Allow RPC API access to unlisted hashes"),
cmds.BoolOption(unencryptTransportKwd, "Disable transport encryption (for debugging protocols)"),
cmds.BoolOption(enableGCKwd, "Enable automatic periodic repo garbage collection"),
@@ -1062,17 +1064,23 @@ func mountFuse(req *cmds.Request, cctx *oldcmds.Context) error {
nsdir = cfg.Mounts.IPNS
}
+ mfsdir, found := req.Options[mfsMountKwd].(string)
+ if !found {
+ mfsdir = cfg.Mounts.MFS
+ }
+
node, err := cctx.ConstructNode()
if err != nil {
return fmt.Errorf("mountFuse: ConstructNode() failed: %s", err)
}
- err = nodeMount.Mount(node, fsdir, nsdir)
+ err = nodeMount.Mount(node, fsdir, nsdir, mfsdir)
if err != nil {
return err
}
fmt.Printf("IPFS mounted at: %s\n", fsdir)
fmt.Printf("IPNS mounted at: %s\n", nsdir)
+ fmt.Printf("MFS mounted at: %s\n", mfsdir)
return nil
}
diff --git a/config/init.go b/config/init.go
index a40efdead..40c24bd25 100644
--- a/config/init.go
+++ b/config/init.go
@@ -52,6 +52,7 @@ func InitWithIdentity(identity Identity) (*Config, error) {
Mounts: Mounts{
IPFS: "/ipfs",
IPNS: "/ipns",
+ MFS: "/mfs",
},
Ipns: Ipns{
diff --git a/config/mounts.go b/config/mounts.go
index dfdd1e5bf..571316cf3 100644
--- a/config/mounts.go
+++ b/config/mounts.go
@@ -4,5 +4,6 @@ package config
type Mounts struct {
IPFS string
IPNS string
+ MFS string
FuseAllowOther bool
}
diff --git a/core/commands/mount_nofuse.go b/core/commands/mount_nofuse.go
index c425aff0f..103678e77 100644
--- a/core/commands/mount_nofuse.go
+++ b/core/commands/mount_nofuse.go
@@ -14,10 +14,11 @@ var MountCmd = &cmds.Command{
ShortDescription: `
This version of ipfs is compiled without fuse support, which is required
for mounting. If you'd like to be able to mount, please use a version of
-ipfs compiled with fuse.
+Kubo compiled with fuse.
For the latest instructions, please check the project's repository:
- http://github.com/ipfs/go-ipfs
+ http://github.com/ipfs/kubo
+ https://github.com/ipfs/kubo/blob/master/docs/fuse.md
`,
},
}
diff --git a/core/commands/mount_unix.go b/core/commands/mount_unix.go
index 52a1b843b..6051f86aa 100644
--- a/core/commands/mount_unix.go
+++ b/core/commands/mount_unix.go
@@ -18,6 +18,7 @@ import (
const (
mountIPFSPathOptionName = "ipfs-path"
mountIPNSPathOptionName = "ipns-path"
+ mountMFSPathOptionName = "mfs-path"
)
var MountCmd = &cmds.Command{
@@ -25,14 +26,14 @@ var MountCmd = &cmds.Command{
Helptext: cmds.HelpText{
Tagline: "Mounts IPFS to the filesystem (read-only).",
ShortDescription: `
-Mount IPFS at a read-only mountpoint on the OS (default: /ipfs and /ipns).
+Mount IPFS at a read-only mountpoint on the OS (default: /ipfs, /ipns, /mfs).
All IPFS objects will be accessible under that directory. Note that the
root will not be listable, as it is virtual. Access known paths directly.
You may have to create /ipfs and /ipns before using 'ipfs mount':
-> sudo mkdir /ipfs /ipns
-> sudo chown $(whoami) /ipfs /ipns
+> sudo mkdir /ipfs /ipns /mfs
+> sudo chown $(whoami) /ipfs /ipns /mfs
> ipfs daemon &
> ipfs mount
`,
@@ -44,8 +45,8 @@ root will not be listable, as it is virtual. Access known paths directly.
You may have to create /ipfs and /ipns before using 'ipfs mount':
-> sudo mkdir /ipfs /ipns
-> sudo chown $(whoami) /ipfs /ipns
+> sudo mkdir /ipfs /ipns /mfs
+> sudo chown $(whoami) /ipfs /ipns /mfs
> ipfs daemon &
> ipfs mount
@@ -67,6 +68,7 @@ baz
> ipfs mount
IPFS mounted at: /ipfs
IPNS mounted at: /ipns
+MFS mounted at: /mfs
> cd /ipfs/QmSh5e7S6fdcu75LAbXNZAFY2nGyZUJXyLCJDvn2zRkWyC
> ls
bar
@@ -81,6 +83,7 @@ baz
Options: []cmds.Option{
cmds.StringOption(mountIPFSPathOptionName, "f", "The path where IPFS should be mounted."),
cmds.StringOption(mountIPNSPathOptionName, "n", "The path where IPNS should be mounted."),
+ cmds.StringOption(mountMFSPathOptionName, "m", "The path where MFS should be mounted."),
},
Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
cfg, err := env.(*oldcmds.Context).GetConfig()
@@ -109,7 +112,12 @@ baz
nsdir = cfg.Mounts.IPNS // NB: be sure to not redeclare!
}
- err = nodeMount.Mount(nd, fsdir, nsdir)
+ mfsdir, found := req.Options[mountMFSPathOptionName].(string)
+ if !found {
+ mfsdir = cfg.Mounts.MFS
+ }
+
+ err = nodeMount.Mount(nd, fsdir, nsdir, mfsdir)
if err != nil {
return err
}
@@ -117,6 +125,7 @@ baz
var output config.Mounts
output.IPFS = fsdir
output.IPNS = nsdir
+ output.MFS = mfsdir
return cmds.EmitOnce(res, &output)
},
Type: config.Mounts{},
@@ -124,6 +133,7 @@ baz
cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, mounts *config.Mounts) error {
fmt.Fprintf(w, "IPFS mounted at: %s\n", cmdenv.EscNonPrint(mounts.IPFS))
fmt.Fprintf(w, "IPNS mounted at: %s\n", cmdenv.EscNonPrint(mounts.IPNS))
+ fmt.Fprintf(w, "MFS mounted at: %s\n", cmdenv.EscNonPrint(mounts.MFS))
return nil
}),
diff --git a/core/core.go b/core/core.go
index 54c987527..3440895e7 100644
--- a/core/core.go
+++ b/core/core.go
@@ -134,6 +134,7 @@ type IpfsNode struct {
type Mounts struct {
Ipfs mount.Mount
Ipns mount.Mount
+ Mfs mount.Mount
}
// Close calls Close() on the App object
diff --git a/docs/changelogs/v0.35.md b/docs/changelogs/v0.35.md
index 2826541cc..c5fccf7ad 100644
--- a/docs/changelogs/v0.35.md
+++ b/docs/changelogs/v0.35.md
@@ -12,6 +12,7 @@ This release was brought to you by the [Shipyard](http://ipshipyard.com/) team.
- [๐ฆ Highlights](#-highlights)
- [Opt-in HTTP Retrieval client](#opt-in-http-retrieval-client)
- [Dedicated `Reprovider.Strategy` for MFS](#dedicated-reproviderstrategy-for-mfs)
+ - [Experimental support for MFS as a FUSE mount point](#experimental-support-for-mfs-as-a-fuse-mount-point)
- [Grid view in WebUI](#grid-view-in-webui)
- [Enhanced DAG-Shaping Controls](#enhanced-dag-shaping-controls)
- [New DAG-Shaping `ipfs add` Options](#new-dag-shaping-ipfs-add-options)
@@ -64,6 +65,14 @@ Users relying on the `pinned` strategy can switch to `pinned+mfs` and use MFS al
See [`Reprovider.Strategy`](https://github.com/ipfs/kubo/blob/master/docs/config.md#reproviderstrategy) for more details.
+#### Experimental support for MFS as a FUSE mount point
+
+The MFS root (filesystem behind the `ipfs files` API) is now available as a read/write FUSE mount point at `Mounts.MFS`. This filesystem is mounted in the same way as `Mounts.IPFS` and `Mounts.IPNS` when running `ipfs mount` or `ipfs daemon --mount`.
+
+Note that the operations supported by the MFS FUSE mountpoint are limited, since MFS doesn't store file attributes.
+
+See [`Mounts`](https://github.com/ipfs/kubo/blob/master/docs/config.md#mounts) and [`docs/fuse.md`](https://github.com/ipfs/kubo/blob/master/docs/fuse.md) for more details.
+
#### Grid view in WebUI
The WebUI, accessible at http://127.0.0.1:5001/webui/, now includes support for the grid view on the _Files_ screen:
diff --git a/docs/config.md b/docs/config.md
index 91cefe8dc..3da157d19 100644
--- a/docs/config.md
+++ b/docs/config.md
@@ -97,6 +97,7 @@ config file at runtime.
- [`Mounts`](#mounts)
- [`Mounts.IPFS`](#mountsipfs)
- [`Mounts.IPNS`](#mountsipns)
+ - [`Mounts.MFS`](#mountsmfs)
- [`Mounts.FuseAllowOther`](#mountsfuseallowother)
- [`Pinning`](#pinning)
- [`Pinning.RemoteServices`](#pinningremoteservices)
@@ -1368,7 +1369,8 @@ Default: `cache`
## `Mounts`
-**EXPERIMENTAL:** read about current limitations at [fuse.md](./fuse.md).
+> [!CAUTION]
+> **EXPERIMENTAL:** read about current limitations at [fuse.md](./fuse.md).
FUSE mount point configuration options.
@@ -1388,6 +1390,18 @@ Default: `/ipns`
Type: `string` (filesystem path)
+### `Mounts.MFS`
+
+Mountpoint for Mutable File System (MFS) behind the `ipfs files` API.
+
+> [!CAUTION]
+> - Write support is highly experimental and not recommended for mission-critical deployments.
+> - Avoid storing lazy-loaded datasets in MFS. Exposing a partially local, lazy-loaded DAG risks operating system search indexers crawling it, which may trigger unintended network prefetching of non-local DAG components.
+
+Default: `/mfs`
+
+Type: `string` (filesystem path)
+
### `Mounts.FuseAllowOther`
Sets the 'FUSE allow other'-option on the mount point.
diff --git a/docs/experimental-features.md b/docs/experimental-features.md
index c0832b2e1..7d0069fc6 100644
--- a/docs/experimental-features.md
+++ b/docs/experimental-features.md
@@ -404,7 +404,7 @@ We also support the use of protocol names of the form /x/$NAME/http where $NAME
## FUSE
-FUSE makes it possible to mount `/ipfs` and `/ipns` namespaces in your OS,
+FUSE makes it possible to mount `/ipfs`, `/ipns` and `/mfs` namespaces in your OS,
allowing arbitrary apps access to IPFS using a subset of filesystem abstractions.
It is considered EXPERIMENTAL due to limited (and buggy) support on some platforms.
diff --git a/docs/fuse.md b/docs/fuse.md
index b4b966e52..fde9307fd 100644
--- a/docs/fuse.md
+++ b/docs/fuse.md
@@ -2,7 +2,7 @@
**EXPERIMENTAL:** FUSE support is limited, YMMV.
-Kubo makes it possible to mount `/ipfs` and `/ipns` namespaces in your OS,
+Kubo makes it possible to mount `/ipfs`, `/ipns` and `/mfs` namespaces in your OS,
allowing arbitrary apps access to IPFS.
## Install FUSE
@@ -50,18 +50,20 @@ speak with us, or if you figure something new out, please add to this document!
## Prepare mountpoints
-By default ipfs uses `/ipfs` and `/ipns` directories for mounting, this can be
-changed in config. You will have to create the `/ipfs` and `/ipns` directories
+By default ipfs uses `/ipfs`, `/ipns` and `/mfs` directories for mounting, this can be
+changed in config. You will have to create the `/ipfs`, `/ipns` and `/mfs` directories
explicitly. Note that modifying root requires sudo permissions.
```sh
# make the directories
sudo mkdir /ipfs
sudo mkdir /ipns
+sudo mkdir /mfs
# chown them so ipfs can use them without root permissions
sudo chown /ipfs
sudo chown /ipns
+sudo chown /mfs
```
Depending on whether you are using OSX or Linux, follow the proceeding instructions.
@@ -105,6 +107,25 @@ ipfs config --json Mounts.FuseAllowOther true
ipfs daemon --mount
```
+## MFS mountpoint
+
+Kubo v0.35.0 and later supports mounting the MFS (Mutable File System) root as
+a FUSE filesystem, enabling manipulation of content-addressed data like regular
+files. The CID for any file or directory is retrievable via the `ipfs_cid`
+extended attribute.
+
+```sh
+getfattr -n ipfs_cid /mfs/welcome-to-IPFS.jpg
+getfattr: Removing leading '/' from absolute path names
+# file: mfs/welcome-to-IPFS.jpg
+ipfs_cid="QmaeXDdwpUeKQcMy7d5SFBfVB4y7LtREbhm5KizawPsBSH"
+```
+
+Please note that the operations supported by the MFS FUSE mountpoint are
+limited. Since the MFS wasn't designed to store file attributes like ownership
+information, permissions and creation date, some applications like `vim` and
+`sed` may misbehave due to missing functionality.
+
## Troubleshooting
#### `Permission denied` or `fusermount: user has no write access to mountpoint` error in Linux
@@ -145,6 +166,7 @@ set for user running `ipfs mount` command.
```
sudo umount /ipfs
sudo umount /ipns
+sudo umount /mfs
```
#### Mounting fails with "error mounting: could not resolve name"
diff --git a/fuse/mfs/mfs_test.go b/fuse/mfs/mfs_test.go
new file mode 100644
index 000000000..cedbe9967
--- /dev/null
+++ b/fuse/mfs/mfs_test.go
@@ -0,0 +1,342 @@
+//go:build !nofuse && !openbsd && !netbsd && !plan9
+// +build !nofuse,!openbsd,!netbsd,!plan9
+
+package mfs
+
+import (
+ "bytes"
+ "context"
+ "crypto/rand"
+ "errors"
+ iofs "io/fs"
+ "os"
+ "slices"
+ "strconv"
+ "testing"
+ "time"
+
+ "bazil.org/fuse"
+ "bazil.org/fuse/fs"
+ "bazil.org/fuse/fs/fstestutil"
+ "github.com/ipfs/kubo/core"
+ "github.com/ipfs/kubo/core/node"
+ "github.com/libp2p/go-libp2p-testing/ci"
+)
+
+// Create an Ipfs.Node, a filesystem and a mount point.
+func setUp(t *testing.T, ipfs *core.IpfsNode) (fs.FS, *fstestutil.Mount) {
+ if ci.NoFuse() {
+ t.Skip("Skipping FUSE tests")
+ }
+
+ if ipfs == nil {
+ var err error
+ ipfs, err = core.NewNode(context.Background(), &node.BuildCfg{})
+ if err != nil {
+ t.Fatal(err)
+ }
+ }
+
+ fs := NewFileSystem(ipfs)
+ mnt, err := fstestutil.MountedT(t, fs, nil)
+ if err == fuse.ErrOSXFUSENotFound {
+ t.Skip(err)
+ }
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ return fs, mnt
+}
+
+// Test reading and writing a file.
+func TestReadWrite(t *testing.T) {
+ _, mnt := setUp(t, nil)
+ defer mnt.Close()
+
+ path := mnt.Dir + "/testrw"
+ content := make([]byte, 8196)
+ _, err := rand.Read(content)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ t.Run("write", func(t *testing.T) {
+ f, err := os.Create(path)
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer f.Close()
+
+ _, err = f.Write(content)
+ if err != nil {
+ t.Fatal(err)
+ }
+ })
+ t.Run("read", func(t *testing.T) {
+ f, err := os.Open(path)
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer f.Close()
+
+ buf := make([]byte, 8196)
+ l, err := f.Read(buf)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if bytes.Equal(content, buf[:l]) != true {
+ t.Fatal("read and write not equal")
+ }
+ })
+}
+
+// Test creating a directory.
+func TestMkdir(t *testing.T) {
+ _, mnt := setUp(t, nil)
+ defer mnt.Close()
+
+ path := mnt.Dir + "/foo/bar/baz/qux/quux"
+
+ t.Run("write", func(t *testing.T) {
+ err := os.MkdirAll(path, iofs.ModeDir)
+ if err != nil {
+ t.Fatal(err)
+ }
+ })
+ t.Run("read", func(t *testing.T) {
+ stat, err := os.Stat(path)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if !stat.IsDir() {
+ t.Fatal("not dir")
+ }
+ })
+}
+
+// Test file persistence across mounts.
+func TestPersistence(t *testing.T) {
+ ipfs, err := core.NewNode(context.Background(), &node.BuildCfg{})
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ content := make([]byte, 8196)
+ _, err = rand.Read(content)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ t.Run("write", func(t *testing.T) {
+ _, mnt := setUp(t, ipfs)
+ defer mnt.Close()
+ path := mnt.Dir + "/testpersistence"
+
+ f, err := os.Create(path)
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer f.Close()
+
+ _, err = f.Write(content)
+ if err != nil {
+ t.Fatal(err)
+ }
+ })
+ t.Run("read", func(t *testing.T) {
+ _, mnt := setUp(t, ipfs)
+ defer mnt.Close()
+ path := mnt.Dir + "/testpersistence"
+
+ f, err := os.Open(path)
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer f.Close()
+
+ buf := make([]byte, 8196)
+ l, err := f.Read(buf)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if bytes.Equal(content, buf[:l]) != true {
+ t.Fatal("read and write not equal")
+ }
+ })
+}
+
+// Test getting the file attributes.
+func TestAttr(t *testing.T) {
+ _, mnt := setUp(t, nil)
+ defer mnt.Close()
+
+ path := mnt.Dir + "/testattr"
+ content := make([]byte, 8196)
+ _, err := rand.Read(content)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ t.Run("write", func(t *testing.T) {
+ f, err := os.Create(path)
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer f.Close()
+
+ _, err = f.Write(content)
+ if err != nil {
+ t.Fatal(err)
+ }
+ })
+ t.Run("read", func(t *testing.T) {
+ fi, err := os.Stat(path)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if fi.IsDir() {
+ t.Fatal("file is a directory")
+ }
+
+ if fi.ModTime().After(time.Now()) {
+ t.Fatal("future modtime")
+ }
+ if time.Since(fi.ModTime()) > time.Second {
+ t.Fatal("past modtime")
+ }
+
+ if fi.Name() != "testattr" {
+ t.Fatal("invalid filename")
+ }
+
+ if fi.Size() != 8196 {
+ t.Fatal("invalid size")
+ }
+ })
+}
+
+// Test concurrent access to the filesystem.
+func TestConcurrentRW(t *testing.T) {
+ _, mnt := setUp(t, nil)
+ defer mnt.Close()
+
+ files := 5
+ fileWorkers := 5
+
+ path := mnt.Dir + "/testconcurrent"
+ content := make([][]byte, files)
+
+ for i := range content {
+ content[i] = make([]byte, 8196)
+ _, err := rand.Read(content[i])
+ if err != nil {
+ t.Fatal(err)
+ }
+ }
+
+ t.Run("write", func(t *testing.T) {
+ errs := make(chan (error), 1)
+ for i := 0; i < files; i++ {
+ go func() {
+ var err error
+ defer func() { errs <- err }()
+
+ f, err := os.Create(path + strconv.Itoa(i))
+ if err != nil {
+ return
+ }
+ defer f.Close()
+
+ _, err = f.Write(content[i])
+ if err != nil {
+ return
+ }
+ }()
+ }
+ for i := 0; i < files; i++ {
+ err := <-errs
+ if err != nil {
+ t.Fatal(err)
+ }
+ }
+ })
+ t.Run("read", func(t *testing.T) {
+ errs := make(chan (error), 1)
+ for i := 0; i < files*fileWorkers; i++ {
+ go func() {
+ var err error
+ defer func() { errs <- err }()
+
+ f, err := os.Open(path + strconv.Itoa(i/fileWorkers))
+ if err != nil {
+ return
+ }
+ defer f.Close()
+
+ buf := make([]byte, 8196)
+ l, err := f.Read(buf)
+ if err != nil {
+ return
+ }
+ if bytes.Equal(content[i/fileWorkers], buf[:l]) != true {
+ err = errors.New("read and write not equal")
+ return
+ }
+ }()
+ }
+ for i := 0; i < files; i++ {
+ err := <-errs
+ if err != nil {
+ t.Fatal(err)
+ }
+ }
+ })
+}
+
+// Test ipfs_cid extended attribute
+func TestMFSRootXattr(t *testing.T) {
+ ipfs, err := core.NewNode(context.Background(), &node.BuildCfg{})
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ fs, mnt := setUp(t, ipfs)
+ defer mnt.Close()
+
+ node, err := fs.Root()
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ root := node.(*Dir)
+
+ listReq := fuse.ListxattrRequest{}
+ listRes := fuse.ListxattrResponse{}
+ err = root.Listxattr(context.Background(), &listReq, &listRes)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if slices.Compare(listRes.Xattr, []byte("ipfs_cid\x00")) != 0 {
+ t.Fatal("list xattr returns invalid value")
+ }
+
+ getReq := fuse.GetxattrRequest{
+ Name: "ipfs_cid",
+ }
+ getRes := fuse.GetxattrResponse{}
+ err = root.Getxattr(context.Background(), &getReq, &getRes)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ ipldNode, err := ipfs.FilesRoot.GetDirectory().GetNode()
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if slices.Compare(getRes.Xattr, []byte(ipldNode.Cid().String())) != 0 {
+ t.Fatal("xattr cid not equal to mfs root cid")
+ }
+}
diff --git a/fuse/mfs/mfs_unix.go b/fuse/mfs/mfs_unix.go
new file mode 100644
index 000000000..91cad257d
--- /dev/null
+++ b/fuse/mfs/mfs_unix.go
@@ -0,0 +1,414 @@
+//go:build (linux || darwin || freebsd || netbsd || openbsd) && !nofuse
+// +build linux darwin freebsd netbsd openbsd
+// +build !nofuse
+
+package mfs
+
+import (
+ "context"
+ "io"
+ "os"
+ "sync"
+ "syscall"
+ "time"
+
+ "bazil.org/fuse"
+ "bazil.org/fuse/fs"
+
+ dag "github.com/ipfs/boxo/ipld/merkledag"
+ ft "github.com/ipfs/boxo/ipld/unixfs"
+ "github.com/ipfs/boxo/mfs"
+ "github.com/ipfs/kubo/core"
+)
+
+const (
+ ipfsCIDXattr = "ipfs_cid"
+ mfsDirMode = os.ModeDir | 0755
+ mfsFileMode = 0644
+ blockSize = 512
+ dirSize = 8
+)
+
+// FUSE filesystem mounted at /mfs.
+type FileSystem struct {
+ root Dir
+}
+
+// Get filesystem root.
+func (fs *FileSystem) Root() (fs.Node, error) {
+ return &fs.root, nil
+}
+
+// FUSE Adapter for MFS directories.
+type Dir struct {
+ mfsDir *mfs.Directory
+}
+
+// Directory attributes (stat).
+func (dir *Dir) Attr(ctx context.Context, attr *fuse.Attr) error {
+ attr.Mode = mfsDirMode
+ attr.Size = dirSize * blockSize
+ attr.Blocks = dirSize
+ return nil
+}
+
+// Access files in a directory.
+func (dir *Dir) Lookup(ctx context.Context, req *fuse.LookupRequest, resp *fuse.LookupResponse) (fs.Node, error) {
+ mfsNode, err := dir.mfsDir.Child(req.Name)
+ switch err {
+ case os.ErrNotExist:
+ return nil, syscall.Errno(syscall.ENOENT)
+ case nil:
+ default:
+ return nil, err
+ }
+
+ switch mfsNode.Type() {
+ case mfs.TDir:
+ result := Dir{
+ mfsDir: mfsNode.(*mfs.Directory),
+ }
+ return &result, nil
+ case mfs.TFile:
+ result := File{
+ mfsFile: mfsNode.(*mfs.File),
+ }
+ return &result, nil
+ }
+
+ return nil, syscall.Errno(syscall.ENOENT)
+}
+
+// List (ls) MFS directory.
+func (dir *Dir) ReadDirAll(ctx context.Context) ([]fuse.Dirent, error) {
+ var res []fuse.Dirent
+ nodes, err := dir.mfsDir.List(ctx)
+ if err != nil {
+ return nil, err
+ }
+
+ for _, node := range nodes {
+ nodeType := fuse.DT_File
+ if node.Type == 1 {
+ nodeType = fuse.DT_Dir
+ }
+ res = append(res, fuse.Dirent{
+ Type: nodeType,
+ Name: node.Name,
+ })
+ }
+ return res, nil
+}
+
+// Mkdir (mkdir) in MFS.
+func (dir *Dir) Mkdir(ctx context.Context, req *fuse.MkdirRequest) (fs.Node, error) {
+ mfsDir, err := dir.mfsDir.Mkdir(req.Name)
+ if err != nil {
+ return nil, err
+ }
+ return &Dir{
+ mfsDir: mfsDir,
+ }, nil
+}
+
+// Remove (rm/rmdir) an MFS file.
+func (dir *Dir) Remove(ctx context.Context, req *fuse.RemoveRequest) error {
+ // Check for empty directory.
+ if req.Dir {
+ targetNode, err := dir.mfsDir.Child(req.Name)
+ if err != nil {
+ return err
+ }
+ target := targetNode.(*mfs.Directory)
+
+ children, err := target.ListNames(ctx)
+ if err != nil {
+ return err
+ }
+ if len(children) > 0 {
+ return os.ErrExist
+ }
+ }
+ err := dir.mfsDir.Unlink(req.Name)
+ if err != nil {
+ return err
+ }
+ return dir.mfsDir.Flush()
+}
+
+// Move (mv) an MFS file.
+func (dir *Dir) Rename(ctx context.Context, req *fuse.RenameRequest, newDir fs.Node) error {
+ file, err := dir.mfsDir.Child(req.OldName)
+ if err != nil {
+ return err
+ }
+ node, err := file.GetNode()
+ if err != nil {
+ return err
+ }
+ targetDir := newDir.(*Dir)
+
+ // Remove file if exists
+ err = targetDir.mfsDir.Unlink(req.NewName)
+ if err != nil && err != os.ErrNotExist {
+ return err
+ }
+
+ err = targetDir.mfsDir.AddChild(req.NewName, node)
+ if err != nil {
+ return err
+ }
+
+ err = dir.mfsDir.Unlink(req.OldName)
+ if err != nil {
+ return err
+ }
+
+ return dir.mfsDir.Flush()
+}
+
+// Create (touch) an MFS file.
+func (dir *Dir) Create(ctx context.Context, req *fuse.CreateRequest, resp *fuse.CreateResponse) (fs.Node, fs.Handle, error) {
+ node := dag.NodeWithData(ft.FilePBData(nil, 0))
+ if err := node.SetCidBuilder(dir.mfsDir.GetCidBuilder()); err != nil {
+ return nil, nil, err
+ }
+
+ if err := dir.mfsDir.AddChild(req.Name, node); err != nil {
+ return nil, nil, err
+ }
+
+ if err := dir.mfsDir.Flush(); err != nil {
+ return nil, nil, err
+ }
+
+ mfsNode, err := dir.mfsDir.Child(req.Name)
+ if err != nil {
+ return nil, nil, err
+ }
+ if err := mfsNode.SetModTime(time.Now()); err != nil {
+ return nil, nil, err
+ }
+
+ mfsFile := mfsNode.(*mfs.File)
+
+ file := File{
+ mfsFile: mfsFile,
+ }
+
+ // Read access flags and create a handler.
+ accessMode := req.Flags & fuse.OpenAccessModeMask
+ flags := mfs.Flags{
+ Read: accessMode == fuse.OpenReadOnly || accessMode == fuse.OpenReadWrite,
+ Write: accessMode == fuse.OpenWriteOnly || accessMode == fuse.OpenReadWrite,
+ Sync: req.Flags|fuse.OpenSync > 0,
+ }
+
+ fd, err := mfsFile.Open(flags)
+ if err != nil {
+ return nil, nil, err
+ }
+ handler := FileHandler{
+ mfsFD: fd,
+ }
+
+ return &file, &handler, nil
+}
+
+// List dir xattr.
+func (dir *Dir) Listxattr(ctx context.Context, req *fuse.ListxattrRequest, resp *fuse.ListxattrResponse) error {
+ resp.Append(ipfsCIDXattr)
+ return nil
+}
+
+// Get dir xattr.
+func (dir *Dir) Getxattr(ctx context.Context, req *fuse.GetxattrRequest, resp *fuse.GetxattrResponse) error {
+ switch req.Name {
+ case ipfsCIDXattr:
+ node, err := dir.mfsDir.GetNode()
+ if err != nil {
+ return err
+ }
+ resp.Xattr = []byte(node.Cid().String())
+ return nil
+ default:
+ return fuse.ErrNoXattr
+ }
+}
+
+// FUSE adapter for MFS files.
+type File struct {
+ mfsFile *mfs.File
+}
+
+// File attributes.
+func (file *File) Attr(ctx context.Context, attr *fuse.Attr) error {
+ size, _ := file.mfsFile.Size()
+
+ attr.Size = uint64(size)
+ if size%blockSize == 0 {
+ attr.Blocks = uint64(size / blockSize)
+ } else {
+ attr.Blocks = uint64(size/blockSize + 1)
+ }
+
+ mtime, _ := file.mfsFile.ModTime()
+ attr.Mtime = mtime
+
+ attr.Mode = mfsFileMode
+ return nil
+}
+
+// Open an MFS file.
+func (file *File) Open(ctx context.Context, req *fuse.OpenRequest, resp *fuse.OpenResponse) (fs.Handle, error) {
+ accessMode := req.Flags & fuse.OpenAccessModeMask
+ flags := mfs.Flags{
+ Read: accessMode == fuse.OpenReadOnly || accessMode == fuse.OpenReadWrite,
+ Write: accessMode == fuse.OpenWriteOnly || accessMode == fuse.OpenReadWrite,
+ Sync: req.Flags|fuse.OpenSync > 0,
+ }
+ fd, err := file.mfsFile.Open(flags)
+ if err != nil {
+ return nil, err
+ }
+
+ if flags.Write {
+ if err := file.mfsFile.SetModTime(time.Now()); err != nil {
+ return nil, err
+ }
+ }
+
+ return &FileHandler{
+ mfsFD: fd,
+ }, nil
+}
+
+// Sync the file's contents to MFS.
+func (file *File) Fsync(ctx context.Context, req *fuse.FsyncRequest) error {
+ return file.mfsFile.Sync()
+}
+
+// List file xattr.
+func (file *File) Listxattr(ctx context.Context, req *fuse.ListxattrRequest, resp *fuse.ListxattrResponse) error {
+ resp.Append(ipfsCIDXattr)
+ return nil
+}
+
+// Get file xattr.
+func (file *File) Getxattr(ctx context.Context, req *fuse.GetxattrRequest, resp *fuse.GetxattrResponse) error {
+ switch req.Name {
+ case ipfsCIDXattr:
+ node, err := file.mfsFile.GetNode()
+ if err != nil {
+ return err
+ }
+ resp.Xattr = []byte(node.Cid().String())
+ return nil
+ default:
+ return fuse.ErrNoXattr
+ }
+}
+
+// Wrapper for MFS's file descriptor that conforms to the FUSE fs.Handler
+// interface.
+type FileHandler struct {
+ mfsFD mfs.FileDescriptor
+ mu sync.Mutex
+}
+
+// Read a opened MFS file.
+func (fh *FileHandler) Read(ctx context.Context, req *fuse.ReadRequest, resp *fuse.ReadResponse) error {
+ fh.mu.Lock()
+ defer fh.mu.Unlock()
+
+ _, err := fh.mfsFD.Seek(req.Offset, io.SeekStart)
+ if err != nil {
+ return err
+ }
+
+ buf := make([]byte, req.Size)
+ l, err := fh.mfsFD.Read(buf)
+
+ resp.Data = buf[:l]
+
+ switch err {
+ case nil, io.EOF, io.ErrUnexpectedEOF:
+ return nil
+ default:
+ return err
+ }
+}
+
+// Write writes to an opened MFS file.
+func (fh *FileHandler) Write(ctx context.Context, req *fuse.WriteRequest, resp *fuse.WriteResponse) error {
+ fh.mu.Lock()
+ defer fh.mu.Unlock()
+
+ l, err := fh.mfsFD.WriteAt(req.Data, req.Offset)
+ if err != nil {
+ return err
+ }
+ resp.Size = l
+
+ return nil
+}
+
+// Flushes the file's buffer.
+func (fh *FileHandler) Flush(ctx context.Context, req *fuse.FlushRequest) error {
+ fh.mu.Lock()
+ defer fh.mu.Unlock()
+
+ return fh.mfsFD.Flush()
+}
+
+// Closes the file.
+func (fh *FileHandler) Release(ctx context.Context, req *fuse.ReleaseRequest) error {
+ fh.mu.Lock()
+ defer fh.mu.Unlock()
+
+ return fh.mfsFD.Close()
+}
+
+// Create new filesystem.
+func NewFileSystem(ipfs *core.IpfsNode) fs.FS {
+ return &FileSystem{
+ root: Dir{
+ mfsDir: ipfs.FilesRoot.GetDirectory(),
+ },
+ }
+}
+
+// Check that our structs implement all the interfaces we want.
+type mfsDir interface {
+ fs.Node
+ fs.NodeGetxattrer
+ fs.NodeListxattrer
+ fs.HandleReadDirAller
+ fs.NodeRequestLookuper
+ fs.NodeMkdirer
+ fs.NodeRenamer
+ fs.NodeRemover
+ fs.NodeCreater
+}
+
+var _ mfsDir = (*Dir)(nil)
+
+type mfsFile interface {
+ fs.Node
+ fs.NodeGetxattrer
+ fs.NodeListxattrer
+ fs.NodeOpener
+ fs.NodeFsyncer
+}
+
+var _ mfsFile = (*File)(nil)
+
+type mfsHandler interface {
+ fs.Handle
+ fs.HandleReader
+ fs.HandleWriter
+ fs.HandleFlusher
+ fs.HandleReleaser
+}
+
+var _ mfsHandler = (*FileHandler)(nil)
diff --git a/fuse/mfs/mount_unix.go b/fuse/mfs/mount_unix.go
new file mode 100644
index 000000000..7fe72e8df
--- /dev/null
+++ b/fuse/mfs/mount_unix.go
@@ -0,0 +1,21 @@
+//go:build (linux || darwin || freebsd || netbsd || openbsd) && !nofuse
+// +build linux darwin freebsd netbsd openbsd
+// +build !nofuse
+
+package mfs
+
+import (
+ core "github.com/ipfs/kubo/core"
+ mount "github.com/ipfs/kubo/fuse/mount"
+)
+
+// Mount mounts MFS at a given location, and returns a mount.Mount instance.
+func Mount(ipfs *core.IpfsNode, mountpoint string) (mount.Mount, error) {
+ cfg, err := ipfs.Repo.Config()
+ if err != nil {
+ return nil, err
+ }
+ allowOther := cfg.Mounts.FuseAllowOther
+ fsys := NewFileSystem(ipfs)
+ return mount.NewMount(ipfs.Process, fsys, mountpoint, allowOther)
+}
diff --git a/fuse/node/mount_nofuse.go b/fuse/node/mount_nofuse.go
index e6f512f8e..7423cb24d 100644
--- a/fuse/node/mount_nofuse.go
+++ b/fuse/node/mount_nofuse.go
@@ -9,6 +9,6 @@ import (
core "github.com/ipfs/kubo/core"
)
-func Mount(node *core.IpfsNode, fsdir, nsdir string) error {
+func Mount(node *core.IpfsNode, fsdir, nsdir, mfsdir string) error {
return errors.New("not compiled in")
}
diff --git a/fuse/node/mount_notsupp.go b/fuse/node/mount_notsupp.go
index e9762a3e4..79ac0e791 100644
--- a/fuse/node/mount_notsupp.go
+++ b/fuse/node/mount_notsupp.go
@@ -9,6 +9,6 @@ import (
core "github.com/ipfs/kubo/core"
)
-func Mount(node *core.IpfsNode, fsdir, nsdir string) error {
+func Mount(node *core.IpfsNode, fsdir, nsdir, mfsdir string) error {
return errors.New("FUSE not supported on OpenBSD or NetBSD. See #5334 (https://github.com/ipfs/kubo/issues/5334).")
}
diff --git a/fuse/node/mount_test.go b/fuse/node/mount_test.go
index 178fddcf6..1947f759f 100644
--- a/fuse/node/mount_test.go
+++ b/fuse/node/mount_test.go
@@ -56,10 +56,12 @@ func TestExternalUnmount(t *testing.T) {
ipfsDir := dir + "/ipfs"
ipnsDir := dir + "/ipns"
+ mfsDir := dir + "/mfs"
mkdir(t, ipfsDir)
mkdir(t, ipnsDir)
+ mkdir(t, mfsDir)
- err = Mount(node, ipfsDir, ipnsDir)
+ err = Mount(node, ipfsDir, ipnsDir, mfsDir)
if err != nil {
if strings.Contains(err.Error(), "unable to check fuse version") || err == fuse.ErrOSXFUSENotFound {
t.Skip(err)
diff --git a/fuse/node/mount_unix.go b/fuse/node/mount_unix.go
index a5a2a3716..9846d7a42 100644
--- a/fuse/node/mount_unix.go
+++ b/fuse/node/mount_unix.go
@@ -11,6 +11,7 @@ import (
core "github.com/ipfs/kubo/core"
ipns "github.com/ipfs/kubo/fuse/ipns"
+ mfs "github.com/ipfs/kubo/fuse/mfs"
mount "github.com/ipfs/kubo/fuse/mount"
rofs "github.com/ipfs/kubo/fuse/readonly"
@@ -31,7 +32,7 @@ var platformFuseChecks = func(*core.IpfsNode) error {
return nil
}
-func Mount(node *core.IpfsNode, fsdir, nsdir string) error {
+func Mount(node *core.IpfsNode, fsdir, nsdir, mfsdir string) error {
// check if we already have live mounts.
// if the user said "Mount", then there must be something wrong.
// so, close them and try again.
@@ -43,15 +44,19 @@ func Mount(node *core.IpfsNode, fsdir, nsdir string) error {
// best effort
_ = node.Mounts.Ipns.Unmount()
}
+ if node.Mounts.Mfs != nil && node.Mounts.Mfs.IsActive() {
+ // best effort
+ _ = node.Mounts.Mfs.Unmount()
+ }
if err := platformFuseChecks(node); err != nil {
return err
}
- return doMount(node, fsdir, nsdir)
+ return doMount(node, fsdir, nsdir, mfsdir)
}
-func doMount(node *core.IpfsNode, fsdir, nsdir string) error {
+func doMount(node *core.IpfsNode, fsdir, nsdir, mfsdir string) error {
fmtFuseErr := func(err error, mountpoint string) error {
s := err.Error()
if strings.Contains(s, fuseNoDirectory) {
@@ -67,8 +72,8 @@ func doMount(node *core.IpfsNode, fsdir, nsdir string) error {
}
// this sync stuff is so that both can be mounted simultaneously.
- var fsmount, nsmount mount.Mount
- var err1, err2 error
+ var fsmount, nsmount, mfmount mount.Mount
+ var err1, err2, err3 error
var wg sync.WaitGroup
@@ -86,6 +91,12 @@ func doMount(node *core.IpfsNode, fsdir, nsdir string) error {
}()
}
+ wg.Add(1)
+ go func() {
+ defer wg.Done()
+ mfmount, err3 = mfs.Mount(node, mfsdir)
+ }()
+
wg.Wait()
if err1 != nil {
@@ -96,22 +107,33 @@ func doMount(node *core.IpfsNode, fsdir, nsdir string) error {
log.Errorf("error mounting IPNS %s for IPFS %s: %s", nsdir, fsdir, err2)
}
- if err1 != nil || err2 != nil {
+ if err3 != nil {
+ log.Errorf("error mounting MFS %s: %s", mfsdir, err3)
+ }
+
+ if err1 != nil || err2 != nil || err3 != nil {
if fsmount != nil {
_ = fsmount.Unmount()
}
if nsmount != nil {
_ = nsmount.Unmount()
}
+ if mfmount != nil {
+ _ = mfmount.Unmount()
+ }
if err1 != nil {
return fmtFuseErr(err1, fsdir)
}
- return fmtFuseErr(err2, nsdir)
+ if err2 != nil {
+ return fmtFuseErr(err2, nsdir)
+ }
+ return fmtFuseErr(err3, mfsdir)
}
// setup node state, so that it can be canceled
node.Mounts.Ipfs = fsmount
node.Mounts.Ipns = nsmount
+ node.Mounts.Mfs = mfmount
return nil
}
diff --git a/fuse/node/mount_windows.go b/fuse/node/mount_windows.go
index 33393f99a..42e6bc10b 100644
--- a/fuse/node/mount_windows.go
+++ b/fuse/node/mount_windows.go
@@ -4,7 +4,7 @@ import (
"github.com/ipfs/kubo/core"
)
-func Mount(node *core.IpfsNode, fsdir, nsdir string) error {
+func Mount(node *core.IpfsNode, fsdir, nsdir, mfsdir string) error {
// TODO
// currently a no-op, but we don't want to return an error
return nil
diff --git a/test/3nodetest/bootstrap/config b/test/3nodetest/bootstrap/config
index ac441a19f..e22f25e90 100644
--- a/test/3nodetest/bootstrap/config
+++ b/test/3nodetest/bootstrap/config
@@ -15,7 +15,8 @@
},
"Mounts": {
"IPFS": "/ipfs",
- "IPNS": "/ipns"
+ "IPNS": "/ipns",
+ "MFS": "/mfs"
},
"Version": {
"Current": "0.1.7",
diff --git a/test/3nodetest/client/config b/test/3nodetest/client/config
index 86ef0668d..fa8f923d5 100644
--- a/test/3nodetest/client/config
+++ b/test/3nodetest/client/config
@@ -17,7 +17,8 @@
},
"Mounts": {
"IPFS": "/ipfs",
- "IPNS": "/ipns"
+ "IPNS": "/ipns",
+ "MFS": "/mfs"
},
"Version": {
"AutoUpdate": "minor",
diff --git a/test/3nodetest/server/config b/test/3nodetest/server/config
index fb16a6d7a..1e9db2a63 100644
--- a/test/3nodetest/server/config
+++ b/test/3nodetest/server/config
@@ -17,7 +17,8 @@
},
"Mounts": {
"IPFS": "/ipfs",
- "IPNS": "/ipns"
+ "IPNS": "/ipns",
+ "MFS": "/mfs"
},
"Version": {
"AutoUpdate": "minor",
diff --git a/test/cli/bitswap_config_test.go b/test/cli/bitswap_config_test.go
index db7656ef2..9674d3cb6 100644
--- a/test/cli/bitswap_config_test.go
+++ b/test/cli/bitswap_config_test.go
@@ -167,7 +167,7 @@ func TestBitswapConfig(t *testing.T) {
node.UpdateConfig(func(cfg *config.Config) {
cfg.HTTPRetrieval.Enabled = config.False
cfg.Bitswap.Libp2pEnabled = config.False
- cfg.Bitswap.ServerEnabled = config.True // bad user config: cant enable server when libp2p is down
+ cfg.Bitswap.ServerEnabled = config.True // bad user config: can't enable server when libp2p is down
})
res := node.RunIPFS("daemon")
assert.Contains(t, res.Stderr.Trimmed(), "invalid configuration: Bitswap.Libp2pEnabled and HTTPRetrieval.Enabled are both disabled, unable to initialize Bitswap")
diff --git a/test/sharness/lib/test-lib.sh b/test/sharness/lib/test-lib.sh
index 12a1f71be..f9292cb23 100644
--- a/test/sharness/lib/test-lib.sh
+++ b/test/sharness/lib/test-lib.sh
@@ -206,9 +206,10 @@ test_init_ipfs() {
'
test_expect_success "prepare config -- mounting" '
- mkdir mountdir ipfs ipns &&
+ mkdir mountdir ipfs ipns mfs &&
test_config_set Mounts.IPFS "$(pwd)/ipfs" &&
- test_config_set Mounts.IPNS "$(pwd)/ipns" ||
+ test_config_set Mounts.IPNS "$(pwd)/ipns" &&
+ test_config_set Mounts.MFS "$(pwd)/mfs" ||
test_fsh cat "\"$IPFS_PATH/config\""
'
@@ -321,12 +322,14 @@ test_mount_ipfs() {
test_expect_success FUSE "'ipfs mount' succeeds" '
do_umount "$(pwd)/ipfs" || true &&
do_umount "$(pwd)/ipns" || true &&
+ do_umount "$(pwd)/mfs" || true &&
ipfs mount >actual
'
test_expect_success FUSE "'ipfs mount' output looks good" '
echo "IPFS mounted at: $(pwd)/ipfs" >expected &&
echo "IPNS mounted at: $(pwd)/ipns" >>expected &&
+ echo "MFS mounted at: $(pwd)/mfs" >>expected &&
test_cmp expected actual
'
diff --git a/test/sharness/t0030-mount.sh b/test/sharness/t0030-mount.sh
index 0c0983d0c..6df7a26bb 100755
--- a/test/sharness/t0030-mount.sh
+++ b/test/sharness/t0030-mount.sh
@@ -16,7 +16,8 @@ if ! test_have_prereq FUSE; then
fi
-export IPFS_NS_MAP="welcome.example.com:/ipfs/$HASH_WELCOME_DOCS"
+# echo -n "ipfs" > expected && ipfs add --cid-version 1 -Q -w expected
+export IPFS_NS_MAP="welcome.example.com:/ipfs/bafybeicq7bvn5lz42qlmghaoiwrve74pzi53auqetbantp5kajucsabike"
# start iptb + wait for peering
NUM_NODES=5
@@ -27,17 +28,17 @@ startup_cluster $NUM_NODES
# test mount failure before mounting properly.
test_expect_success "'ipfs mount' fails when there is no mount dir" '
- tmp_ipfs_mount() { ipfsi 0 mount -f=not_ipfs -n=not_ipns >output 2>output.err; } &&
+ tmp_ipfs_mount() { ipfsi 0 mount -f=not_ipfs -n=not_ipns -m=not_mfs >output 2>output.err; } &&
test_must_fail tmp_ipfs_mount
'
test_expect_success "'ipfs mount' output looks good" '
test_must_be_empty output &&
- test_should_contain "not_ipns\|not_ipfs" output.err
+ test_should_contain "not_ipns\|not_ipfs\|not_mfs" output.err
'
test_expect_success "setup and publish default IPNS value" '
- mkdir "$(pwd)/ipfs" "$(pwd)/ipns" &&
+ mkdir "$(pwd)/ipfs" "$(pwd)/ipns" "$(pwd)/mfs" &&
ipfsi 0 name publish QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn
'
@@ -46,12 +47,14 @@ test_expect_success "setup and publish default IPNS value" '
test_expect_success FUSE "'ipfs mount' succeeds" '
do_umount "$(pwd)/ipfs" || true &&
do_umount "$(pwd)/ipns" || true &&
- ipfsi 0 mount -f "$(pwd)/ipfs" -n "$(pwd)/ipns" >actual
+ do_umount "$(pwd)/mfs" || true &&
+ ipfsi 0 mount -f "$(pwd)/ipfs" -n "$(pwd)/ipns" -m "$(pwd)/mfs" >actual
'
test_expect_success FUSE "'ipfs mount' output looks good" '
echo "IPFS mounted at: $(pwd)/ipfs" >expected &&
echo "IPNS mounted at: $(pwd)/ipns" >>expected &&
+ echo "MFS mounted at: $(pwd)/mfs" >>expected &&
test_cmp expected actual
'
@@ -63,21 +66,64 @@ test_expect_success FUSE "local symlink works" '
test_expect_success FUSE "can resolve ipns names" '
echo -n "ipfs" > expected &&
- cat ipns/welcome.example.com/ping > actual &&
+ ipfsi 0 add --cid-version 1 -Q -w expected &&
+ cat ipns/welcome.example.com/expected > actual &&
test_cmp expected actual
'
+test_expect_success FUSE "create mfs file via fuse" '
+ touch mfs/testfile &&
+ ipfsi 0 files ls | grep testfile
+'
+
+test_expect_success FUSE "create mfs dir via fuse" '
+ mkdir mfs/testdir &&
+ ipfsi 0 files ls | grep testdir
+'
+
+test_expect_success FUSE "read mfs file from fuse" '
+ echo content > mfs/testfile &&
+ getfattr -n ipfs_cid mfs/testfile
+'
+test_expect_success FUSE "ipfs add file and read it back via fuse" '
+ echo content3 | ipfsi 0 files write -e /testfile3 &&
+ grep content3 mfs/testfile3
+'
+
+test_expect_success FUSE "ipfs add file and read it back via fuse" '
+ echo content > testfile2 &&
+ ipfsi 0 add --to-files /testfile2 testfile2 &&
+ grep content mfs/testfile2
+'
+
+test_expect_success FUSE "test file xattr" '
+ echo content > mfs/testfile &&
+ getfattr -n ipfs_cid mfs/testfile
+'
+
+test_expect_success FUSE "test file removal" '
+ touch mfs/testfile &&
+ rm mfs/testfile
+'
+
+test_expect_success FUSE "test nested dirs" '
+ mkdir -p mfs/foo/bar/baz/qux &&
+ echo content > mfs/foo/bar/baz/qux/quux &&
+ ipfsi 0 files stat /foo/bar/baz/qux/quux
+'
+
test_expect_success "mount directories cannot be removed while active" '
- test_must_fail rmdir ipfs ipns 2>/dev/null
+ test_must_fail rmdir ipfs ipns mfs 2>/dev/null
'
test_expect_success "unmount directories" '
do_umount "$(pwd)/ipfs" &&
- do_umount "$(pwd)/ipns"
+ do_umount "$(pwd)/ipns" &&
+ do_umount "$(pwd)/mfs"
'
test_expect_success "mount directories can be removed after shutdown" '
- rmdir ipfs ipns
+ rmdir ipfs ipns mfs
'
test_expect_success 'stop iptb' '
diff --git a/test/sharness/t0270-filestore.sh b/test/sharness/t0270-filestore.sh
index f2f63b0de..fc377c2d2 100755
--- a/test/sharness/t0270-filestore.sh
+++ b/test/sharness/t0270-filestore.sh
@@ -63,7 +63,7 @@ test_filestore_adds() {
init_ipfs_filestore() {
test_expect_success "clean up old node" '
- rm -rf "$IPFS_PATH" mountdir ipfs ipns
+ rm -rf "$IPFS_PATH" mountdir ipfs ipns mfs
'
test_init_ipfs
diff --git a/test/sharness/t0271-filestore-utils.sh b/test/sharness/t0271-filestore-utils.sh
index e7c11646c..5fd335659 100755
--- a/test/sharness/t0271-filestore-utils.sh
+++ b/test/sharness/t0271-filestore-utils.sh
@@ -10,7 +10,7 @@ test_description="Test out the filestore nocopy functionality"
test_init_filestore() {
test_expect_success "clean up old node" '
- rm -rf "$IPFS_PATH" mountdir ipfs ipns
+ rm -rf "$IPFS_PATH" mountdir ipfs ipns mfs
'
test_init_ipfs
From fffdec35849ece4ae9be7dcbf7e4608ff9a4aec1 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Tue, 6 May 2025 21:39:43 +0200
Subject: [PATCH 226/499] chore: ensure /mfs is present in docker
---
Dockerfile | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Dockerfile b/Dockerfile
index 1465e5d02..98e44a1b6 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -80,8 +80,8 @@ RUN mkdir -p $IPFS_PATH \
&& chown ipfs:users $IPFS_PATH
# Create mount points for `ipfs mount` command
-RUN mkdir /ipfs /ipns \
- && chown ipfs:users /ipfs /ipns
+RUN mkdir /ipfs /ipns /mfs \
+ && chown ipfs:users /ipfs /ipns /mfs
# Create the init scripts directory
RUN mkdir /container-init.d \
From 4e326775389a8dba6eca08d16ccb816c856ed6b9 Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Wed, 7 May 2025 05:37:22 -0700
Subject: [PATCH 227/499] logging: upgrade to go-log/v2 v2.6.0 (#10798)
---
docs/changelogs/v0.35.md | 9 +++++++++
docs/examples/kubo-as-a-library/go.mod | 4 ++--
docs/examples/kubo-as-a-library/go.sum | 22 ++++------------------
go.mod | 4 ++--
go.sum | 22 ++++------------------
test/dependencies/go.mod | 4 ++--
test/dependencies/go.sum | 20 ++++----------------
7 files changed, 27 insertions(+), 58 deletions(-)
diff --git a/docs/changelogs/v0.35.md b/docs/changelogs/v0.35.md
index c5fccf7ad..92ae64bdd 100644
--- a/docs/changelogs/v0.35.md
+++ b/docs/changelogs/v0.35.md
@@ -230,6 +230,14 @@ When installing a new version of Kubo when `"formatMajorVersion"` is configured,
See other caveats and configuration options at [`kubo/docs/datastores.md#pebbleds`](https://github.com/ipfs/kubo/blob/master/docs/datastores.md#pebbleds)
+#### Improved Log Output Setting
+
+When stderr and/or stdout options are configured or specified by the `GOLOG_OUTPUT` environ variable, log only to the output(s) specified. For example:
+
+- `GOLOG_OUTPUT="stderr"` logs only to stderr
+- `GOLOG_OUTPUT="stdout"` logs only to stdout
+- `GOLOG_OUTPUT="stderr+stdout"` logs to both stderr and stdout
+
#### ๐ฆ๏ธ Important dependency updates
- update `boxo` to [v0.30.0](https://github.com/ipfs/boxo/releases/tag/v0.30.0)
@@ -237,6 +245,7 @@ See other caveats and configuration options at [`kubo/docs/datastores.md#pebbled
- update `go-ds-pebble` to [v0.5.0](https://github.com/ipfs/go-ds-pebble/releases/tag/v0.5.0)
- update `pebble` to [v2.0.3](https://github.com/cockroachdb/pebble/releases/tag/v2.0.3)
- update `go-libp2p-pubsub` to [v0.13.1](https://github.com:/libp2p/go-libp2p-pubsub/releases/tag/v0.13.1)
+- update `go-log` to [v2.6.0](https://github.com/ipfs/go-log/releases/tag/v2.6.0)
### ๐ Changelog
### ๐จโ๐ฉโ๐งโ๐ฆ Contributors
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index 25442a1c9..84b77f97b 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -101,7 +101,7 @@ require (
github.com/ipfs/go-ipld-git v0.1.1 // indirect
github.com/ipfs/go-ipld-legacy v0.2.1 // indirect
github.com/ipfs/go-log v1.0.5 // indirect
- github.com/ipfs/go-log/v2 v2.5.1 // indirect
+ github.com/ipfs/go-log/v2 v2.6.0 // indirect
github.com/ipfs/go-merkledag v0.11.0 // indirect
github.com/ipfs/go-metrics-interface v0.3.0 // indirect
github.com/ipfs/go-peertaskqueue v0.8.2 // indirect
@@ -230,7 +230,7 @@ require (
golang.org/x/mod v0.24.0 // indirect
golang.org/x/net v0.39.0 // indirect
golang.org/x/sync v0.13.0 // indirect
- golang.org/x/sys v0.32.0 // indirect
+ golang.org/x/sys v0.33.0 // indirect
golang.org/x/text v0.24.0 // indirect
golang.org/x/tools v0.32.0 // indirect
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index 00b24d1af..ddd8f8329 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -43,7 +43,6 @@ github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5 h1:iW0a5
github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5/go.mod h1:Y2QMoi1vgtOIfc+6DhrMOGkLoGzqSV2rKp4Sm+opsyA=
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
-github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o=
github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
@@ -383,8 +382,8 @@ github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8=
github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo=
github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g=
github.com/ipfs/go-log/v2 v2.3.0/go.mod h1:QqGoj30OTpnKaG/LKTGTxoP2mmQtjVMEnK72gynbe/g=
-github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY=
-github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI=
+github.com/ipfs/go-log/v2 v2.6.0 h1:2Nu1KKQQ2ayonKp4MPo6pXCjqw1ULc9iohRqWV5EYqg=
+github.com/ipfs/go-log/v2 v2.6.0/go.mod h1:p+Efr3qaY5YXpx9TX7MoLCSEZX5boSWj9wh86P5HJa8=
github.com/ipfs/go-merkledag v0.11.0 h1:DgzwK5hprESOzS4O1t/wi6JDpyVQdvm9Bs59N/jqfBY=
github.com/ipfs/go-merkledag v0.11.0/go.mod h1:Q4f/1ezvBiJV0YCIXvt51W/9/kqJGH4I1LsA7+djsM4=
github.com/ipfs/go-metrics-interface v0.3.0 h1:YwG7/Cy4R94mYDUuwsBfeziJCVm9pBMJ6q/JR9V40TU=
@@ -514,7 +513,6 @@ github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcncea
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
-github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
@@ -764,7 +762,6 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
-github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
@@ -813,7 +810,6 @@ github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7V
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
github.com/zeebo/assert v1.1.0 h1:hU1L1vLTHsnO8x8c9KAR5GmM5QscxHg5RNU5z5qbUWY=
github.com/zeebo/assert v1.1.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0=
@@ -861,7 +857,6 @@ go.uber.org/dig v1.18.0 h1:imUL1UiY0Mg4bqbFfsRQO5G4CGRBec/ZujWTvSVp3pw=
go.uber.org/dig v1.18.0/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE=
go.uber.org/fx v1.23.0 h1:lIr/gYWQGfTwGcSXWXu4vP5Ws6iqnNEIY+F/aFzCKTg=
go.uber.org/fx v1.23.0/go.mod h1:o/D9n+2mLP6v1EG+qsdT1O8wKopYAsqZasju97SDFCU=
-go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU=
@@ -872,7 +867,6 @@ go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ=
-go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI=
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
go.uber.org/zap/exp v0.3.0 h1:6JYzdifzYkGmTdRR59oYH+Ng7k49H9qVpWwNSsGJj3U=
@@ -933,7 +927,6 @@ golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU=
@@ -963,7 +956,6 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
@@ -1033,12 +1025,9 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210426080607-c94f62235c83/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@@ -1050,8 +1039,8 @@ golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20=
-golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
+golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
+golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
@@ -1113,7 +1102,6 @@ golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapK
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/tools v0.32.0 h1:Q7N1vhpkQv7ybVzLFtTjvQya2ewbwNDZzUgfXGqtMWU=
@@ -1209,12 +1197,10 @@ gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWD
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o=
diff --git a/go.mod b/go.mod
index 4d0235792..61f1a2045 100644
--- a/go.mod
+++ b/go.mod
@@ -39,7 +39,7 @@ require (
github.com/ipfs/go-ipld-git v0.1.1
github.com/ipfs/go-ipld-legacy v0.2.1
github.com/ipfs/go-log v1.0.5
- github.com/ipfs/go-log/v2 v2.5.1
+ github.com/ipfs/go-log/v2 v2.6.0
github.com/ipfs/go-metrics-interface v0.3.0
github.com/ipfs/go-metrics-prometheus v0.1.0
github.com/ipfs/go-test v0.2.1
@@ -91,7 +91,7 @@ require (
golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0
golang.org/x/mod v0.24.0
golang.org/x/sync v0.13.0
- golang.org/x/sys v0.32.0
+ golang.org/x/sys v0.33.0
google.golang.org/protobuf v1.36.6
)
diff --git a/go.sum b/go.sum
index 782427ead..585763c5f 100644
--- a/go.sum
+++ b/go.sum
@@ -67,7 +67,6 @@ github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5 h1:iW0a5
github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5/go.mod h1:Y2QMoi1vgtOIfc+6DhrMOGkLoGzqSV2rKp4Sm+opsyA=
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
-github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o=
github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
@@ -451,8 +450,8 @@ github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JP
github.com/ipfs/go-log/v2 v2.0.3/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0=
github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g=
github.com/ipfs/go-log/v2 v2.3.0/go.mod h1:QqGoj30OTpnKaG/LKTGTxoP2mmQtjVMEnK72gynbe/g=
-github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY=
-github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI=
+github.com/ipfs/go-log/v2 v2.6.0 h1:2Nu1KKQQ2ayonKp4MPo6pXCjqw1ULc9iohRqWV5EYqg=
+github.com/ipfs/go-log/v2 v2.6.0/go.mod h1:p+Efr3qaY5YXpx9TX7MoLCSEZX5boSWj9wh86P5HJa8=
github.com/ipfs/go-merkledag v0.11.0 h1:DgzwK5hprESOzS4O1t/wi6JDpyVQdvm9Bs59N/jqfBY=
github.com/ipfs/go-merkledag v0.11.0/go.mod h1:Q4f/1ezvBiJV0YCIXvt51W/9/kqJGH4I1LsA7+djsM4=
github.com/ipfs/go-metrics-interface v0.3.0 h1:YwG7/Cy4R94mYDUuwsBfeziJCVm9pBMJ6q/JR9V40TU=
@@ -607,7 +606,6 @@ github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=
github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
-github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
@@ -902,7 +900,6 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
@@ -968,7 +965,6 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
github.com/zeebo/assert v1.1.0 h1:hU1L1vLTHsnO8x8c9KAR5GmM5QscxHg5RNU5z5qbUWY=
github.com/zeebo/assert v1.1.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0=
@@ -1029,7 +1025,6 @@ go.uber.org/dig v1.18.0 h1:imUL1UiY0Mg4bqbFfsRQO5G4CGRBec/ZujWTvSVp3pw=
go.uber.org/dig v1.18.0/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE=
go.uber.org/fx v1.23.0 h1:lIr/gYWQGfTwGcSXWXu4vP5Ws6iqnNEIY+F/aFzCKTg=
go.uber.org/fx v1.23.0/go.mod h1:o/D9n+2mLP6v1EG+qsdT1O8wKopYAsqZasju97SDFCU=
-go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU=
@@ -1042,7 +1037,6 @@ go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN8
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ=
-go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI=
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
go.uber.org/zap/exp v0.3.0 h1:6JYzdifzYkGmTdRR59oYH+Ng7k49H9qVpWwNSsGJj3U=
@@ -1106,7 +1100,6 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB
golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU=
@@ -1149,7 +1142,6 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
@@ -1246,13 +1238,10 @@ golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210426080607-c94f62235c83/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@@ -1267,8 +1256,8 @@ golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20=
-golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
+golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
+golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
@@ -1349,7 +1338,6 @@ golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc
golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/tools v0.32.0 h1:Q7N1vhpkQv7ybVzLFtTjvQya2ewbwNDZzUgfXGqtMWU=
@@ -1478,12 +1466,10 @@ gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o=
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index 1c617ef83..dc66b2708 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -8,7 +8,7 @@ require (
github.com/Kubuxu/gocovmerge v0.0.0-20161216165753-7ecaa51963cd
github.com/golangci/golangci-lint v1.60.2
github.com/ipfs/go-cidutil v0.1.0
- github.com/ipfs/go-log/v2 v2.5.1
+ github.com/ipfs/go-log/v2 v2.6.0
github.com/ipfs/go-test v0.2.1
github.com/ipfs/hang-fds v0.1.0
github.com/ipfs/iptb v1.4.1
@@ -317,7 +317,7 @@ require (
golang.org/x/mod v0.24.0 // indirect
golang.org/x/net v0.39.0 // indirect
golang.org/x/sync v0.13.0 // indirect
- golang.org/x/sys v0.32.0 // indirect
+ golang.org/x/sys v0.33.0 // indirect
golang.org/x/term v0.31.0 // indirect
golang.org/x/text v0.24.0 // indirect
golang.org/x/tools v0.32.0 // indirect
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index 5b5eb3a45..adc5ae5d6 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -60,7 +60,6 @@ github.com/ashanbrown/forbidigo v1.6.0 h1:D3aewfM37Yb3pxHujIPSpTf6oQk9sc9WZi8ger
github.com/ashanbrown/forbidigo v1.6.0/go.mod h1:Y8j9jy9ZYAEHXdu723cUlraTqbzjKF1MUyfOKL+AjcU=
github.com/ashanbrown/makezero v1.1.1 h1:iCQ87C0V0vSyO+M9E/FZYbu65auqH0lnsOkf5FcB28s=
github.com/ashanbrown/makezero v1.1.1/go.mod h1:i1bJLCRSCHOcOa9Y6MyF2FTfMZMFdHvxKHxgO5Z1axI=
-github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o=
github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
@@ -355,8 +354,8 @@ github.com/ipfs/go-ipld-format v0.6.0 h1:VEJlA2kQ3LqFSIm5Vu6eIlSxD/Ze90xtc4Meten
github.com/ipfs/go-ipld-format v0.6.0/go.mod h1:g4QVMTn3marU3qXchwjpKPKgJv+zF+OlaKMyhJ4LHPg=
github.com/ipfs/go-ipld-legacy v0.2.1 h1:mDFtrBpmU7b//LzLSypVrXsD8QxkEWxu5qVxN99/+tk=
github.com/ipfs/go-ipld-legacy v0.2.1/go.mod h1:782MOUghNzMO2DER0FlBR94mllfdCJCkTtDtPM51otM=
-github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY=
-github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI=
+github.com/ipfs/go-log/v2 v2.6.0 h1:2Nu1KKQQ2ayonKp4MPo6pXCjqw1ULc9iohRqWV5EYqg=
+github.com/ipfs/go-log/v2 v2.6.0/go.mod h1:p+Efr3qaY5YXpx9TX7MoLCSEZX5boSWj9wh86P5HJa8=
github.com/ipfs/go-metrics-interface v0.3.0 h1:YwG7/Cy4R94mYDUuwsBfeziJCVm9pBMJ6q/JR9V40TU=
github.com/ipfs/go-metrics-interface v0.3.0/go.mod h1:OxxQjZDGocXVdyTPocns6cOLwHieqej/jos7H4POwoY=
github.com/ipfs/go-peertaskqueue v0.8.2 h1:PaHFRaVFdxQk1Qo3OKiHPYjmmusQy7gKQUaL8JDszAU=
@@ -481,7 +480,6 @@ github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE=
github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
-github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
@@ -849,22 +847,18 @@ go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/
go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE=
go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs=
go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc=
-go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/automaxprocs v1.5.3 h1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8=
go.uber.org/automaxprocs v1.5.3/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0=
go.uber.org/dig v1.18.0 h1:imUL1UiY0Mg4bqbFfsRQO5G4CGRBec/ZujWTvSVp3pw=
go.uber.org/dig v1.18.0/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE=
go.uber.org/fx v1.23.0 h1:lIr/gYWQGfTwGcSXWXu4vP5Ws6iqnNEIY+F/aFzCKTg=
go.uber.org/fx v1.23.0/go.mod h1:o/D9n+2mLP6v1EG+qsdT1O8wKopYAsqZasju97SDFCU=
-go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU=
go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM=
-go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
-go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI=
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
go.uber.org/zap/exp v0.3.0 h1:6JYzdifzYkGmTdRR59oYH+Ng7k49H9qVpWwNSsGJj3U=
@@ -901,7 +895,6 @@ golang.org/x/exp/typeparams v0.0.0-20240314144324-c7f7c6466f7f/go.mod h1:AbB0pIl
golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
-golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
@@ -991,7 +984,6 @@ golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@@ -1013,8 +1005,8 @@ golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20=
-golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
+golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
+golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
@@ -1058,7 +1050,6 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm
golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
-golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190321232350-e250d351ecad/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
@@ -1114,7 +1105,6 @@ google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZi
google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
@@ -1122,11 +1112,9 @@ gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gotest.tools/gotestsum v1.12.0 h1:CmwtaGDkHxrZm4Ib0Vob89MTfpc3GrEFMJKovliPwGk=
From f7e0568a50fd008f33722b4e925203ce3aed7420 Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Wed, 7 May 2025 07:28:43 -0700
Subject: [PATCH 228/499] feat: IPFS_WAIT_REPO_LOCK (#10797)
* repo: optionally wait to acquire repo lock
Retry acquiring repo lock for a specified amount of time. Retry once per second until time is expired ro lock is acquired.
Lock wait timeout is specified using the environment variable `IPFS_WAIT_REPO_LOCK` and assigning it a value that is parsable as a golang `time.Duration`. For example:
```
IPFS_WAIT_REPO_LOCK="5s"
```
Closes #10482
* document IPFS_WAIT_REPO_LOCK
---------
Co-authored-by: Marcin Rataj
---
docs/changelogs/v0.35.md | 18 ++++++++++-
docs/environment-variables.md | 44 ++++++++++++++++++++++++++
docs/examples/kubo-as-a-library/go.mod | 4 +--
docs/examples/kubo-as-a-library/go.sum | 14 +++-----
go.mod | 4 +--
go.sum | 12 +++----
repo/fsrepo/fsrepo.go | 19 ++++++++++-
test/dependencies/go.mod | 3 +-
test/dependencies/go.sum | 6 ++--
9 files changed, 94 insertions(+), 30 deletions(-)
diff --git a/docs/changelogs/v0.35.md b/docs/changelogs/v0.35.md
index 92ae64bdd..9314390ad 100644
--- a/docs/changelogs/v0.35.md
+++ b/docs/changelogs/v0.35.md
@@ -26,6 +26,9 @@ This release was brought to you by the [Shipyard](http://ipshipyard.com/) team.
- [New `Bitswap` configuration options](#new-bitswap-configuration-options)
- [New `Routing` configuration options](#new-routing-configuration-options)
- [New Pebble database format config](#new-pebble-database-format-config)
+ - [New environment variables](#new-environment-variables)
+ - [Improved Log Output Setting](#improved-log-output-setting)
+ - [New Repo Lock Optional Wait](#new-repo-lock-optional-wait)
- [๐ฆ๏ธ Important dependency updates](#-important-dependency-updates)
- [๐ Changelog](#-changelog)
- [๐จโ๐ฉโ๐งโ๐ฆ Contributors](#-contributors)
@@ -230,7 +233,11 @@ When installing a new version of Kubo when `"formatMajorVersion"` is configured,
See other caveats and configuration options at [`kubo/docs/datastores.md#pebbleds`](https://github.com/ipfs/kubo/blob/master/docs/datastores.md#pebbleds)
-#### Improved Log Output Setting
+#### New environment variables
+
+The [`environment-variables.md`](https://github.com/ipfs/kubo/blob/master/docs/environment-variables.md) was extended with two new features:
+
+##### Improved Log Output Setting
When stderr and/or stdout options are configured or specified by the `GOLOG_OUTPUT` environ variable, log only to the output(s) specified. For example:
@@ -238,6 +245,15 @@ When stderr and/or stdout options are configured or specified by the `GOLOG_OUTP
- `GOLOG_OUTPUT="stdout"` logs only to stdout
- `GOLOG_OUTPUT="stderr+stdout"` logs to both stderr and stdout
+##### New Repo Lock Optional Wait
+
+The environment variable `IPFS_WAIT_REPO_LOCK` specifies the amount of time to wait for the repo lock. Set the value of this variable to a string that can be [parsed](https://pkg.go.dev/time@go1.24.3#ParseDuration) as a golang `time.Duration`. For example:
+```
+IPFS_WAIT_REPO_LOCK="15s"
+```
+
+If the lock cannot be acquired because someone else has the lock, and `IPFS_WAIT_REPO_LOCK` is set to a valid value, then acquiring the lock is retried every second until the lock is acquired or the specified wait time has elapsed.
+
#### ๐ฆ๏ธ Important dependency updates
- update `boxo` to [v0.30.0](https://github.com/ipfs/boxo/releases/tag/v0.30.0)
diff --git a/docs/environment-variables.md b/docs/environment-variables.md
index bbbc66626..2b763721b 100644
--- a/docs/environment-variables.md
+++ b/docs/environment-variables.md
@@ -1,5 +1,32 @@
# Kubo environment variables
+- [Variables](#variables)
+ - [`IPFS_PATH`](#ipfs_path)
+ - [`IPFS_LOGGING`](#ipfs_logging)
+ - [`IPFS_LOGGING_FMT`](#ipfs_logging_fmt)
+ - [`GOLOG_LOG_LEVEL`](#golog_log_level)
+ - [`GOLOG_LOG_FMT`](#golog_log_fmt)
+ - [`GOLOG_FILE`](#golog_file)
+ - [`GOLOG_OUTPUT`](#golog_output)
+ - [`GOLOG_TRACING_FILE`](#golog_tracing_file)
+ - [`IPFS_FUSE_DEBUG`](#ipfs_fuse_debug)
+ - [`YAMUX_DEBUG`](#yamux_debug)
+ - [`IPFS_FD_MAX`](#ipfs_fd_max)
+ - [`IPFS_DIST_PATH`](#ipfs_dist_path)
+ - [`IPFS_NS_MAP`](#ipfs_ns_map)
+ - [`IPFS_HTTP_ROUTERS`](#ipfs_http_routers)
+ - [`IPFS_HTTP_ROUTERS_FILTER_PROTOCOLS`](#ipfs_http_routers_filter_protocols)
+ - [`IPFS_CONTENT_BLOCKING_DISABLE`](#ipfs_content_blocking_disable)
+ - [`IPFS_WAIT_REPO_LOCK`](#ipfs_wait_repo_lock)
+ - [`LIBP2P_TCP_REUSEPORT`](#libp2p_tcp_reuseport)
+ - [`LIBP2P_TCP_MUX`](#libp2p_tcp_mux)
+ - [`LIBP2P_MUX_PREFS`](#libp2p_mux_prefs)
+ - [`LIBP2P_RCMGR`](#libp2p_rcmgr)
+ - [`LIBP2P_DEBUG_RCMGR`](#libp2p_debug_rcmgr)
+- [Tracing](#tracing)
+
+# Variables
+
## `IPFS_PATH`
Sets the location of the IPFS repo (where the config, blocks, etc.
@@ -63,6 +90,14 @@ The logging format defaults to `color` when the output is a terminal, and `nocol
Sets the file to which Kubo logs. By default, Kubo logs to standard error.
+## `GOLOG_OUTPUT`
+
+When stderr and/or stdout options are configured or specified by the `GOLOG_OUTPUT` environ variable, log only to the output(s) specified. For example:
+
+- `GOLOG_OUTPUT="stderr"` logs only to stderr
+- `GOLOG_OUTPUT="stdout"` logs only to stdout
+- `GOLOG_OUTPUT="stderr+stdout"` logs to both stderr and stdout
+
## `GOLOG_TRACING_FILE`
Sets the file to which Kubo sends tracing events. By default, tracing is
@@ -149,6 +184,15 @@ Default: `config.DefaultHTTPRoutersFilterProtocols`
Disables the content-blocking subsystem. No denylists will be watched and no
content will be blocked.
+## `IPFS_WAIT_REPO_LOCK`
+
+Specifies the amount of time to wait for the repo lock. Set the value of this variable to a string that can be [parsed](https://pkg.go.dev/time@go1.24.3#ParseDuration) as a golang `time.Duration`. For example:
+```
+IPFS_WAIT_REPO_LOCK="15s"
+```
+
+If the lock cannot be acquired because someone else has the lock, and `IPFS_WAIT_REPO_LOCK` is set to a valid value, then acquiring the lock is retried every second until the lock is acquired or the specified wait time has elapsed.
+
## `LIBP2P_TCP_REUSEPORT`
Kubo tries to reuse the same source port for all connections to improve NAT
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index 84b77f97b..c4b559744 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -78,7 +78,7 @@ require (
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 // indirect
github.com/ipfs/bbloom v0.0.4 // indirect
github.com/ipfs/go-bitfield v1.1.0 // indirect
- github.com/ipfs/go-block-format v0.2.0 // indirect
+ github.com/ipfs/go-block-format v0.2.1 // indirect
github.com/ipfs/go-blockservice v0.5.2 // indirect
github.com/ipfs/go-cid v0.5.0 // indirect
github.com/ipfs/go-cidutil v0.1.0 // indirect
@@ -88,7 +88,7 @@ require (
github.com/ipfs/go-ds-leveldb v0.5.2 // indirect
github.com/ipfs/go-ds-measure v0.2.2 // indirect
github.com/ipfs/go-ds-pebble v0.5.0 // indirect
- github.com/ipfs/go-fs-lock v0.0.7 // indirect
+ github.com/ipfs/go-fs-lock v0.1.1 // indirect
github.com/ipfs/go-ipfs-blockstore v1.3.1 // indirect
github.com/ipfs/go-ipfs-delay v0.0.1 // indirect
github.com/ipfs/go-ipfs-ds-help v1.1.1 // indirect
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index ddd8f8329..29c11e008 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -315,8 +315,8 @@ github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL
github.com/ipfs/go-bitswap v0.11.0 h1:j1WVvhDX1yhG32NTC9xfxnqycqYIlhzEzLXG/cU1HyQ=
github.com/ipfs/go-bitswap v0.11.0/go.mod h1:05aE8H3XOU+LXpTedeAS0OZpcO1WFsj5niYQH9a1Tmk=
github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk=
-github.com/ipfs/go-block-format v0.2.0 h1:ZqrkxBA2ICbDRbK8KJs/u0O3dlp6gmAuuXUJNiW1Ycs=
-github.com/ipfs/go-block-format v0.2.0/go.mod h1:+jpL11nFx5A/SPpsoBn6Bzkra/zaArfSmsknbPMYgzM=
+github.com/ipfs/go-block-format v0.2.1 h1:96kW71XGNNa+mZw/MTzJrCpMhBWCrd9kBLoKm9Iip/Q=
+github.com/ipfs/go-block-format v0.2.1/go.mod h1:frtvXHMQhM6zn7HvEQu+Qz5wSTj+04oEH/I+NjDgEjk=
github.com/ipfs/go-blockservice v0.5.2 h1:in9Bc+QcXwd1apOVM7Un9t8tixPKdaHQFdLSUM1Xgk8=
github.com/ipfs/go-blockservice v0.5.2/go.mod h1:VpMblFEqG67A/H2sHKAemeH9vlURVavlysbdUI632yk=
github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM=
@@ -344,8 +344,8 @@ github.com/ipfs/go-ds-measure v0.2.2 h1:4kwvBGbbSXNYe4ANlg7qTIYoZU6mNlqzQHdVqICk
github.com/ipfs/go-ds-measure v0.2.2/go.mod h1:b/87ak0jMgH9Ylt7oH0+XGy4P8jHx9KG09Qz+pOeTIs=
github.com/ipfs/go-ds-pebble v0.5.0 h1:lXffYCAKVD7nLLPqwJ9D8IxgO7Kz8woiX021tezdsIM=
github.com/ipfs/go-ds-pebble v0.5.0/go.mod h1:aiCRVcj3K60sxc6k5C+HO9C6rouqiSkjR/WKnbTcMfQ=
-github.com/ipfs/go-fs-lock v0.0.7 h1:6BR3dajORFrFTkb5EpCUFIAypsoxpGpDSVUdFwzgL9U=
-github.com/ipfs/go-fs-lock v0.0.7/go.mod h1:Js8ka+FNYmgQRLrRXzU3CB/+Csr1BwrRilEcvYrHhhc=
+github.com/ipfs/go-fs-lock v0.1.1 h1:TecsP/Uc7WqYYatasreZQiP9EGRy4ZnKoG4yXxR33nw=
+github.com/ipfs/go-fs-lock v0.1.1/go.mod h1:2goSXMCw7QfscHmSe09oXiR34DQeUdm+ei+dhonqly0=
github.com/ipfs/go-ipfs-blockstore v1.3.1 h1:cEI9ci7V0sRNivqaOr0elDsamxXFxJMMMy7PTTDQNsQ=
github.com/ipfs/go-ipfs-blockstore v1.3.1/go.mod h1:KgtZyc9fq+P2xJUiCAzbRdhhqJHvsw8u2Dlqy2MyRTE=
github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ=
@@ -381,7 +381,6 @@ github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9
github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8=
github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo=
github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g=
-github.com/ipfs/go-log/v2 v2.3.0/go.mod h1:QqGoj30OTpnKaG/LKTGTxoP2mmQtjVMEnK72gynbe/g=
github.com/ipfs/go-log/v2 v2.6.0 h1:2Nu1KKQQ2ayonKp4MPo6pXCjqw1ULc9iohRqWV5EYqg=
github.com/ipfs/go-log/v2 v2.6.0/go.mod h1:p+Efr3qaY5YXpx9TX7MoLCSEZX5boSWj9wh86P5HJa8=
github.com/ipfs/go-merkledag v0.11.0 h1:DgzwK5hprESOzS4O1t/wi6JDpyVQdvm9Bs59N/jqfBY=
@@ -512,7 +511,6 @@ github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaO
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
-github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
@@ -872,7 +870,6 @@ go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
go.uber.org/zap/exp v0.3.0 h1:6JYzdifzYkGmTdRR59oYH+Ng7k49H9qVpWwNSsGJj3U=
go.uber.org/zap/exp v0.3.0/go.mod h1:5I384qq7XGxYyByIhHm6jg5CHkGY0nsTfbDLgDDlgJQ=
go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE=
-go4.org v0.0.0-20200411211856-f5505b9728dd/go.mod h1:CIiUVy99QCPfoE13bO4EZaz5GZMZXMSBGhxRdsvzbkg=
go4.org v0.0.0-20230225012048-214862532bf5 h1:nifaUDeh+rPaBCMPMQHZmvJf+QdpLFnuQPwx+LxVmtc=
go4.org v0.0.0-20230225012048-214862532bf5/go.mod h1:F57wTi5Lrj6WLyswp5EYV1ncrEbFGHD4hhz6S1ZYeaU=
golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw=
@@ -949,7 +946,6 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL
golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
@@ -1014,10 +1010,8 @@ golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
diff --git a/go.mod b/go.mod
index 61f1a2045..00121bc00 100644
--- a/go.mod
+++ b/go.mod
@@ -22,7 +22,7 @@ require (
github.com/ipfs-shipyard/nopfs v0.0.14
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0
github.com/ipfs/boxo v0.30.0
- github.com/ipfs/go-block-format v0.2.0
+ github.com/ipfs/go-block-format v0.2.1
github.com/ipfs/go-cid v0.5.0
github.com/ipfs/go-cidutil v0.1.0
github.com/ipfs/go-datastore v0.8.2
@@ -32,7 +32,7 @@ require (
github.com/ipfs/go-ds-leveldb v0.5.2
github.com/ipfs/go-ds-measure v0.2.2
github.com/ipfs/go-ds-pebble v0.5.0
- github.com/ipfs/go-fs-lock v0.0.7
+ github.com/ipfs/go-fs-lock v0.1.1
github.com/ipfs/go-ipfs-cmds v0.14.1
github.com/ipfs/go-ipld-cbor v0.2.0
github.com/ipfs/go-ipld-format v0.6.0
diff --git a/go.sum b/go.sum
index 585763c5f..4db342507 100644
--- a/go.sum
+++ b/go.sum
@@ -379,8 +379,8 @@ github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL
github.com/ipfs/go-bitswap v0.11.0 h1:j1WVvhDX1yhG32NTC9xfxnqycqYIlhzEzLXG/cU1HyQ=
github.com/ipfs/go-bitswap v0.11.0/go.mod h1:05aE8H3XOU+LXpTedeAS0OZpcO1WFsj5niYQH9a1Tmk=
github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk=
-github.com/ipfs/go-block-format v0.2.0 h1:ZqrkxBA2ICbDRbK8KJs/u0O3dlp6gmAuuXUJNiW1Ycs=
-github.com/ipfs/go-block-format v0.2.0/go.mod h1:+jpL11nFx5A/SPpsoBn6Bzkra/zaArfSmsknbPMYgzM=
+github.com/ipfs/go-block-format v0.2.1 h1:96kW71XGNNa+mZw/MTzJrCpMhBWCrd9kBLoKm9Iip/Q=
+github.com/ipfs/go-block-format v0.2.1/go.mod h1:frtvXHMQhM6zn7HvEQu+Qz5wSTj+04oEH/I+NjDgEjk=
github.com/ipfs/go-blockservice v0.5.2 h1:in9Bc+QcXwd1apOVM7Un9t8tixPKdaHQFdLSUM1Xgk8=
github.com/ipfs/go-blockservice v0.5.2/go.mod h1:VpMblFEqG67A/H2sHKAemeH9vlURVavlysbdUI632yk=
github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM=
@@ -408,8 +408,8 @@ github.com/ipfs/go-ds-measure v0.2.2 h1:4kwvBGbbSXNYe4ANlg7qTIYoZU6mNlqzQHdVqICk
github.com/ipfs/go-ds-measure v0.2.2/go.mod h1:b/87ak0jMgH9Ylt7oH0+XGy4P8jHx9KG09Qz+pOeTIs=
github.com/ipfs/go-ds-pebble v0.5.0 h1:lXffYCAKVD7nLLPqwJ9D8IxgO7Kz8woiX021tezdsIM=
github.com/ipfs/go-ds-pebble v0.5.0/go.mod h1:aiCRVcj3K60sxc6k5C+HO9C6rouqiSkjR/WKnbTcMfQ=
-github.com/ipfs/go-fs-lock v0.0.7 h1:6BR3dajORFrFTkb5EpCUFIAypsoxpGpDSVUdFwzgL9U=
-github.com/ipfs/go-fs-lock v0.0.7/go.mod h1:Js8ka+FNYmgQRLrRXzU3CB/+Csr1BwrRilEcvYrHhhc=
+github.com/ipfs/go-fs-lock v0.1.1 h1:TecsP/Uc7WqYYatasreZQiP9EGRy4ZnKoG4yXxR33nw=
+github.com/ipfs/go-fs-lock v0.1.1/go.mod h1:2goSXMCw7QfscHmSe09oXiR34DQeUdm+ei+dhonqly0=
github.com/ipfs/go-ipfs-blockstore v1.3.1 h1:cEI9ci7V0sRNivqaOr0elDsamxXFxJMMMy7PTTDQNsQ=
github.com/ipfs/go-ipfs-blockstore v1.3.1/go.mod h1:KgtZyc9fq+P2xJUiCAzbRdhhqJHvsw8u2Dlqy2MyRTE=
github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ=
@@ -449,7 +449,6 @@ github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8=
github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo=
github.com/ipfs/go-log/v2 v2.0.3/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0=
github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g=
-github.com/ipfs/go-log/v2 v2.3.0/go.mod h1:QqGoj30OTpnKaG/LKTGTxoP2mmQtjVMEnK72gynbe/g=
github.com/ipfs/go-log/v2 v2.6.0 h1:2Nu1KKQQ2ayonKp4MPo6pXCjqw1ULc9iohRqWV5EYqg=
github.com/ipfs/go-log/v2 v2.6.0/go.mod h1:p+Efr3qaY5YXpx9TX7MoLCSEZX5boSWj9wh86P5HJa8=
github.com/ipfs/go-merkledag v0.11.0 h1:DgzwK5hprESOzS4O1t/wi6JDpyVQdvm9Bs59N/jqfBY=
@@ -605,7 +604,6 @@ github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNx
github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=
-github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
@@ -1042,7 +1040,6 @@ go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
go.uber.org/zap/exp v0.3.0 h1:6JYzdifzYkGmTdRR59oYH+Ng7k49H9qVpWwNSsGJj3U=
go.uber.org/zap/exp v0.3.0/go.mod h1:5I384qq7XGxYyByIhHm6jg5CHkGY0nsTfbDLgDDlgJQ=
go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE=
-go4.org v0.0.0-20200411211856-f5505b9728dd/go.mod h1:CIiUVy99QCPfoE13bO4EZaz5GZMZXMSBGhxRdsvzbkg=
go4.org v0.0.0-20230225012048-214862532bf5 h1:nifaUDeh+rPaBCMPMQHZmvJf+QdpLFnuQPwx+LxVmtc=
go4.org v0.0.0-20230225012048-214862532bf5/go.mod h1:F57wTi5Lrj6WLyswp5EYV1ncrEbFGHD4hhz6S1ZYeaU=
golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw=
@@ -1215,7 +1212,6 @@ golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
diff --git a/repo/fsrepo/fsrepo.go b/repo/fsrepo/fsrepo.go
index e7577f9dc..609b988a6 100644
--- a/repo/fsrepo/fsrepo.go
+++ b/repo/fsrepo/fsrepo.go
@@ -10,6 +10,7 @@ import (
"path/filepath"
"strings"
"sync"
+ "time"
filestore "github.com/ipfs/boxo/filestore"
keystore "github.com/ipfs/boxo/keystore"
@@ -146,7 +147,23 @@ func open(repoPath string, userConfigFilePath string) (repo.Repo, error) {
return nil, err
}
- r.lockfile, err = lockfile.Lock(r.path, LockFile)
+ text := os.Getenv("IPFS_WAIT_REPO_LOCK")
+ if text != "" {
+ var lockWaitTime time.Duration
+ lockWaitTime, err = time.ParseDuration(text)
+ if err != nil {
+ log.Errorw("Cannot parse value of IPFS_WAIT_REPO_LOCK as duration, not waiting for repo lock", "err", err, "value", text)
+ r.lockfile, err = lockfile.Lock(r.path, LockFile)
+ } else if lockWaitTime <= 0 {
+ r.lockfile, err = lockfile.WaitLock(context.Background(), r.path, LockFile)
+ } else {
+ ctx, cancel := context.WithTimeout(context.Background(), lockWaitTime)
+ r.lockfile, err = lockfile.WaitLock(ctx, r.path, LockFile)
+ cancel()
+ }
+ } else {
+ r.lockfile, err = lockfile.Lock(r.path, LockFile)
+ }
if err != nil {
return nil, err
}
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index dc66b2708..530e7c421 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -131,10 +131,9 @@ require (
github.com/ipfs/bbloom v0.0.4 // indirect
github.com/ipfs/boxo v0.30.0 // indirect
github.com/ipfs/go-bitfield v1.1.0 // indirect
- github.com/ipfs/go-block-format v0.2.0 // indirect
+ github.com/ipfs/go-block-format v0.2.1 // indirect
github.com/ipfs/go-cid v0.5.0 // indirect
github.com/ipfs/go-datastore v0.8.2 // indirect
- github.com/ipfs/go-ipfs-util v0.0.3 // indirect
github.com/ipfs/go-ipld-format v0.6.0 // indirect
github.com/ipfs/go-ipld-legacy v0.2.1 // indirect
github.com/ipfs/go-metrics-interface v0.3.0 // indirect
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index adc5ae5d6..790426ebf 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -334,8 +334,8 @@ github.com/ipfs/boxo v0.30.0 h1:7afsoxPGGqfoH7Dum/wOTGUB9M5fb8HyKPMlLfBvIEQ=
github.com/ipfs/boxo v0.30.0/go.mod h1:BPqgGGyHB9rZZcPSzah2Dc9C+5Or3U1aQe7EH1H7370=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
-github.com/ipfs/go-block-format v0.2.0 h1:ZqrkxBA2ICbDRbK8KJs/u0O3dlp6gmAuuXUJNiW1Ycs=
-github.com/ipfs/go-block-format v0.2.0/go.mod h1:+jpL11nFx5A/SPpsoBn6Bzkra/zaArfSmsknbPMYgzM=
+github.com/ipfs/go-block-format v0.2.1 h1:96kW71XGNNa+mZw/MTzJrCpMhBWCrd9kBLoKm9Iip/Q=
+github.com/ipfs/go-block-format v0.2.1/go.mod h1:frtvXHMQhM6zn7HvEQu+Qz5wSTj+04oEH/I+NjDgEjk=
github.com/ipfs/go-cid v0.5.0 h1:goEKKhaGm0ul11IHA7I6p1GmKz8kEYniqFopaB5Otwg=
github.com/ipfs/go-cid v0.5.0/go.mod h1:0L7vmeNXpQpUS9vt+yEARkJ8rOg43DF3iPgn4GIN0mk=
github.com/ipfs/go-cidutil v0.1.0 h1:RW5hO7Vcf16dplUU60Hs0AKDkQAVPVplr7lk97CFL+Q=
@@ -348,8 +348,6 @@ github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1I
github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw=
github.com/ipfs/go-ipfs-pq v0.0.3 h1:YpoHVJB+jzK15mr/xsWC574tyDLkezVrDNeaalQBsTE=
github.com/ipfs/go-ipfs-pq v0.0.3/go.mod h1:btNw5hsHBpRcSSgZtiNm/SLj5gYIZ18AKtv3kERkRb4=
-github.com/ipfs/go-ipfs-util v0.0.3 h1:2RFdGez6bu2ZlZdI+rWfIdbQb1KudQp3VGwPtdNCmE0=
-github.com/ipfs/go-ipfs-util v0.0.3/go.mod h1:LHzG1a0Ig4G+iZ26UUOMjHd+lfM84LZCrn17xAKWBvs=
github.com/ipfs/go-ipld-format v0.6.0 h1:VEJlA2kQ3LqFSIm5Vu6eIlSxD/Ze90xtc4Meten1F5U=
github.com/ipfs/go-ipld-format v0.6.0/go.mod h1:g4QVMTn3marU3qXchwjpKPKgJv+zF+OlaKMyhJ4LHPg=
github.com/ipfs/go-ipld-legacy v0.2.1 h1:mDFtrBpmU7b//LzLSypVrXsD8QxkEWxu5qVxN99/+tk=
From 925a4d1b4c37ee46bc403d30f3a8451bcfc4b012 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Wed, 7 May 2025 16:39:40 +0200
Subject: [PATCH 229/499] chore: bump version to 0.36.0-dev
---
version.go | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/version.go b/version.go
index bca3b4238..85e0ebd8d 100644
--- a/version.go
+++ b/version.go
@@ -11,7 +11,7 @@ import (
var CurrentCommit string
// CurrentVersionNumber is the current application's version literal.
-const CurrentVersionNumber = "0.35.0-dev"
+const CurrentVersionNumber = "0.36.0-dev"
const ApiVersion = "/kubo/" + CurrentVersionNumber + "/" //nolint
From 79ccbb06fe217cb29884231956c4e706775acf9f Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Wed, 7 May 2025 16:40:48 +0200
Subject: [PATCH 230/499] chore(version): 0.35.0-rc1
---
version.go | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/version.go b/version.go
index bca3b4238..df548748d 100644
--- a/version.go
+++ b/version.go
@@ -11,7 +11,7 @@ import (
var CurrentCommit string
// CurrentVersionNumber is the current application's version literal.
-const CurrentVersionNumber = "0.35.0-dev"
+const CurrentVersionNumber = "0.35.0-rc1"
const ApiVersion = "/kubo/" + CurrentVersionNumber + "/" //nolint
From 6e89271d4249fcf49cb07a8355053d82cfbf06de Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Wed, 7 May 2025 16:49:02 +0200
Subject: [PATCH 231/499] docs(changelog): go-libp2p-kad-dht
---
docs/changelogs/v0.35.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/docs/changelogs/v0.35.md b/docs/changelogs/v0.35.md
index 9314390ad..c8fd97014 100644
--- a/docs/changelogs/v0.35.md
+++ b/docs/changelogs/v0.35.md
@@ -261,6 +261,7 @@ If the lock cannot be acquired because someone else has the lock, and `IPFS_WAIT
- update `go-ds-pebble` to [v0.5.0](https://github.com/ipfs/go-ds-pebble/releases/tag/v0.5.0)
- update `pebble` to [v2.0.3](https://github.com/cockroachdb/pebble/releases/tag/v2.0.3)
- update `go-libp2p-pubsub` to [v0.13.1](https://github.com:/libp2p/go-libp2p-pubsub/releases/tag/v0.13.1)
+- update `go-libp2p-kad-dht` to [v0.32.0](https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.32.0) (incl. [v0.31.0](https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.31.0))
- update `go-log` to [v2.6.0](https://github.com/ipfs/go-log/releases/tag/v2.6.0)
### ๐ Changelog
From 8c2c5009d534a1c88818d11f0aaece435599af4a Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 7 May 2025 17:44:37 -0700
Subject: [PATCH 232/499] chore(deps): bump codecov/codecov-action from 5.4.0
to 5.4.2 (#10783)
Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 5.4.0 to 5.4.2.
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codecov/codecov-action/compare/0565863a31f2c772f9f0395002a31e3f06189574...ad3126e916f78f00edff4ed0317cf185271ccc2d)
---
updated-dependencies:
- dependency-name: codecov/codecov-action
dependency-version: 5.4.2
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
.github/workflows/gotest.yml | 2 +-
.github/workflows/sharness.yml | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/gotest.yml b/.github/workflows/gotest.yml
index 9d7c362f4..e0815bf90 100644
--- a/.github/workflows/gotest.yml
+++ b/.github/workflows/gotest.yml
@@ -45,7 +45,7 @@ jobs:
make -j "$PARALLEL" test/unit/gotest.junit.xml &&
[[ ! $(jq -s -c 'map(select(.Action == "fail")) | .[]' test/unit/gotest.json) ]]
- name: Upload coverage to Codecov
- uses: codecov/codecov-action@0565863a31f2c772f9f0395002a31e3f06189574 # v5.4.0
+ uses: codecov/codecov-action@ad3126e916f78f00edff4ed0317cf185271ccc2d # v5.4.2
if: failure() || success()
with:
name: unittests
diff --git a/.github/workflows/sharness.yml b/.github/workflows/sharness.yml
index 6e452010f..86f08b2c1 100644
--- a/.github/workflows/sharness.yml
+++ b/.github/workflows/sharness.yml
@@ -55,7 +55,7 @@ jobs:
# increasing parallelism beyond 10 doesn't speed up the tests much
PARALLEL: ${{ github.repository == 'ipfs/kubo' && 10 || 3 }}
- name: Upload coverage report
- uses: codecov/codecov-action@0565863a31f2c772f9f0395002a31e3f06189574 # v5.4.0
+ uses: codecov/codecov-action@ad3126e916f78f00edff4ed0317cf185271ccc2d # v5.4.2
if: failure() || success()
with:
name: sharness
From 6f37df77873163c41ab9e5b989f6db0d7314d3d6 Mon Sep 17 00:00:00 2001
From: web3-bot <81333946+web3-bot@users.noreply.github.com>
Date: Fri, 9 May 2025 21:53:37 +0200
Subject: [PATCH 233/499] ci: uci/copy-templates (#10787)
* chore: add or force update .github/workflows/stale.yml
* chore: add or force update .github/workflows/generated-pr.yml
---
.github/workflows/generated-pr.yml | 14 ++++++++++++++
.github/workflows/stale.yml | 5 +++--
2 files changed, 17 insertions(+), 2 deletions(-)
create mode 100644 .github/workflows/generated-pr.yml
diff --git a/.github/workflows/generated-pr.yml b/.github/workflows/generated-pr.yml
new file mode 100644
index 000000000..b8c5cc631
--- /dev/null
+++ b/.github/workflows/generated-pr.yml
@@ -0,0 +1,14 @@
+name: Close Generated PRs
+
+on:
+ schedule:
+ - cron: '0 0 * * *'
+ workflow_dispatch:
+
+permissions:
+ issues: write
+ pull-requests: write
+
+jobs:
+ stale:
+ uses: ipdxco/unified-github-workflows/.github/workflows/reusable-generated-pr.yml@v1
diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml
index 16d65d721..7c955c414 100644
--- a/.github/workflows/stale.yml
+++ b/.github/workflows/stale.yml
@@ -1,8 +1,9 @@
-name: Close and mark stale issue
+name: Close Stale Issues
on:
schedule:
- cron: '0 0 * * *'
+ workflow_dispatch:
permissions:
issues: write
@@ -10,4 +11,4 @@ permissions:
jobs:
stale:
- uses: pl-strflt/.github/.github/workflows/reusable-stale-issue.yml@v0.3
+ uses: ipdxco/unified-github-workflows/.github/workflows/reusable-stale-issue.yml@v1
From 2ab3f58c992104bac45fbc204d5475300d250355 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Thu, 15 May 2025 19:19:18 +0200
Subject: [PATCH 234/499] fix(config): wire up `Provider.Enabled` flag (#10804)
* fix(config): explicit Provider.Enabled flag
Adds missing config option described in
https://github.com/ipfs/kubo/issues/10803
* refactor: remove Experimental.StrategicProviding
removing experiment, replaced with Provider.Enabled
* test(cli): routing [re]provide
updated and added tests for manually triggering provide and reprovide
and making them respect global configuration flag to avoid
inconsistent behaviors
* docs: improve DelegatedRouters
* refactor: default DefaultProviderWorkerCount=16
- simplified default for both
- 16 is safer for non-accelerated DHT client
- acceletated DHT performs better without limit anyway - updated docs
---
cmd/ipfs/kubo/daemon.go | 17 +++++--
config/experiments.go | 2 +-
config/profile.go | 8 +--
config/provider.go | 4 +-
config/routing.go | 3 +-
core/commands/routing.go | 21 ++++++++
core/node/bitswap.go | 7 +--
core/node/groups.go | 12 +++--
core/node/provider.go | 4 +-
docs/changelogs/v0.35.md | 12 +++--
docs/config.md | 71 +++++++++++++++++++-------
docs/experimental-features.md | 22 +-------
test/cli/provider_test.go | 94 +++++++++++++++++++++++++++--------
13 files changed, 193 insertions(+), 84 deletions(-)
diff --git a/cmd/ipfs/kubo/daemon.go b/cmd/ipfs/kubo/daemon.go
index ea6ccfc1d..5cdf3fa1d 100644
--- a/cmd/ipfs/kubo/daemon.go
+++ b/cmd/ipfs/kubo/daemon.go
@@ -491,6 +491,11 @@ func daemonFunc(req *cmds.Request, re cmds.ResponseEmitter, env cmds.Environment
if cfg.Provider.Strategy.WithDefault("") != "" && cfg.Reprovider.Strategy.IsDefault() {
log.Fatal("Invalid config. Remove unused Provider.Strategy and set Reprovider.Strategy instead. Documentation: https://github.com/ipfs/kubo/blob/master/docs/config.md#reproviderstrategy")
}
+ if cfg.Experimental.StrategicProviding {
+ log.Error("Experimental.StrategicProviding was removed. Remove it from your config and set Provider.Enabled=false to remove this message. Documentation: https://github.com/ipfs/kubo/blob/master/docs/experimental-features.md#strategic-providing")
+ cfg.Experimental.StrategicProviding = false
+ cfg.Provider.Enabled = config.False
+ }
printLibp2pPorts(node)
@@ -625,17 +630,19 @@ take effect.
}()
if !offline {
- // Warn users who were victims of 'lowprofile' footgun (https://github.com/ipfs/kubo/pull/10524)
- if cfg.Experimental.StrategicProviding {
+ // Warn users when provide systems are disabled
+ if !cfg.Provider.Enabled.WithDefault(config.DefaultProviderEnabled) {
fmt.Print(`
-โ ๏ธ Reprovide system is disabled due to 'Experimental.StrategicProviding=true'
+
+โ ๏ธ Provide and Reprovide systems are disabled due to 'Provide.Enabled=false'
โ ๏ธ Local CIDs will not be announced to Amino DHT, making them impossible to retrieve without manual peering
-โ ๏ธ If this is not intentional, call 'ipfs config profile apply announce-on'
+โ ๏ธ If this is not intentional, call 'ipfs config profile apply announce-on' or set Provide.Enabled=true'
`)
} else if cfg.Reprovider.Interval.WithDefault(config.DefaultReproviderInterval) == 0 {
fmt.Print(`
-โ ๏ธ Reprovider system is disabled due to 'Reprovider.Interval=0'
+
+โ ๏ธ Provide and Reprovide systems are disabled due to 'Reprovider.Interval=0'
โ ๏ธ Local CIDs will not be announced to Amino DHT, making them impossible to retrieve without manual peering
โ ๏ธ If this is not intentional, call 'ipfs config profile apply announce-on', or set 'Reprovider.Interval=22h'
diff --git a/config/experiments.go b/config/experiments.go
index fab1f953c..6c43ac04f 100644
--- a/config/experiments.go
+++ b/config/experiments.go
@@ -6,7 +6,7 @@ type Experiments struct {
ShardingEnabled bool `json:",omitempty"` // deprecated by autosharding: https://github.com/ipfs/kubo/pull/8527
Libp2pStreamMounting bool
P2pHttpProxy bool //nolint
- StrategicProviding bool
+ StrategicProviding bool `json:",omitempty"` // removed, use Provider.Enabled instead
OptimisticProvide bool
OptimisticProvideJobsPoolSize int
GatewayOverLibp2p bool `json:",omitempty"`
diff --git a/config/profile.go b/config/profile.go
index 605af3555..ec2e5a0b7 100644
--- a/config/profile.go
+++ b/config/profile.go
@@ -270,7 +270,7 @@ fetching may be degraded.
},
},
"announce-off": {
- Description: `Disables Reprovide system (and announcing to Amino DHT).
+ Description: `Disables Provide and Reprovide systems (announcing to Amino DHT).
USE WITH CAUTION:
The main use case for this is setups with manual Peering.Peers config.
@@ -279,16 +279,16 @@ fetching may be degraded.
one hosting it, and other peers are not already connected to it.
`,
Transform: func(c *Config) error {
+ c.Provider.Enabled = False
c.Reprovider.Interval = NewOptionalDuration(0) // 0 disables periodic reprovide
- c.Experimental.StrategicProviding = true // this is not a typo (the name is counter-intuitive)
return nil
},
},
"announce-on": {
- Description: `Re-enables Reprovide system (reverts announce-off profile).`,
+ Description: `Re-enables Provide and Reprovide systems (reverts announce-off profile).`,
Transform: func(c *Config) error {
+ c.Provider.Enabled = True
c.Reprovider.Interval = NewOptionalDuration(DefaultReproviderInterval) // have to apply explicit default because nil would be ignored
- c.Experimental.StrategicProviding = false // this is not a typo (the name is counter-intuitive)
return nil
},
},
diff --git a/config/provider.go b/config/provider.go
index a1c448598..4a2243acb 100644
--- a/config/provider.go
+++ b/config/provider.go
@@ -1,12 +1,14 @@
package config
const (
- DefaultProviderWorkerCount = 64
+ DefaultProviderEnabled = true
+ DefaultProviderWorkerCount = 16
)
// Provider configuration describes how NEW CIDs are announced the moment they are created.
// For periodical reprovide configuration, see Reprovider.*
type Provider struct {
+ Enabled Flag `json:",omitempty"`
Strategy *OptionalString `json:",omitempty"` // Unused, you are likely looking for Reprovider.Strategy instead
WorkerCount *OptionalInteger `json:",omitempty"` // Number of concurrent provides allowed, 0 means unlimited
}
diff --git a/config/routing.go b/config/routing.go
index 3fe501ee4..aea60c3bd 100644
--- a/config/routing.go
+++ b/config/routing.go
@@ -48,10 +48,11 @@ type Routing struct {
IgnoreProviders []string `json:",omitempty"`
+ // Simplified configuration used by default when Routing.Type=auto|autoclient
DelegatedRouters []string `json:",omitempty"`
+ // Advanced configuration used when Routing.Type=custom
Routers Routers `json:",omitempty"`
-
Methods Methods `json:",omitempty"`
}
diff --git a/core/commands/routing.go b/core/commands/routing.go
index 3528a94f5..0804b1f44 100644
--- a/core/commands/routing.go
+++ b/core/commands/routing.go
@@ -9,6 +9,7 @@ import (
"strings"
"time"
+ "github.com/ipfs/kubo/config"
cmdenv "github.com/ipfs/kubo/core/commands/cmdenv"
dag "github.com/ipfs/boxo/ipld/merkledag"
@@ -158,6 +159,14 @@ var provideRefRoutingCmd = &cmds.Command{
if !nd.IsOnline {
return ErrNotOnline
}
+ // respect global config
+ cfg, err := nd.Repo.Config()
+ if err != nil {
+ return err
+ }
+ if !cfg.Provider.Enabled.WithDefault(config.DefaultProviderEnabled) {
+ return errors.New("invalid configuration: Provider.Enabled is set to 'false'")
+ }
if len(nd.PeerHost.Network().Conns()) == 0 {
return errors.New("cannot provide, no connected peers")
@@ -254,6 +263,18 @@ Trigger reprovider to announce our data to network.
return ErrNotOnline
}
+ // respect global config
+ cfg, err := nd.Repo.Config()
+ if err != nil {
+ return err
+ }
+ if !cfg.Provider.Enabled.WithDefault(config.DefaultProviderEnabled) {
+ return errors.New("invalid configuration: Provider.Enabled is set to 'false'")
+ }
+ if cfg.Reprovider.Interval.WithDefault(config.DefaultReproviderInterval) == 0 {
+ return errors.New("invalid configuration: Reprovider.Interval is set to '0'")
+ }
+
err = nd.Provider.Reprovide(req.Context)
if err != nil {
return err
diff --git a/core/node/bitswap.go b/core/node/bitswap.go
index a52b3e75d..e87464b8a 100644
--- a/core/node/bitswap.go
+++ b/core/node/bitswap.go
@@ -83,7 +83,7 @@ type bitswapIn struct {
// Bitswap creates the BitSwap server/client instance.
// If Bitswap.ServerEnabled is false, the node will act only as a client
// using an empty blockstore to prevent serving blocks to other peers.
-func Bitswap(serverEnabled bool) interface{} {
+func Bitswap(serverEnabled, libp2pEnabled, httpEnabled bool) interface{} {
return func(in bitswapIn, lc fx.Lifecycle) (*bitswap.Bitswap, error) {
var bitswapNetworks, bitswapLibp2p network.BitSwapNetwork
var bitswapBlockstore blockstore.Blockstore = in.Bs
@@ -93,7 +93,8 @@ func Bitswap(serverEnabled bool) interface{} {
bitswapLibp2p = bsnet.NewFromIpfsHost(in.Host)
}
- if httpCfg := in.Cfg.HTTPRetrieval; httpCfg.Enabled.WithDefault(config.DefaultHTTPRetrievalEnabled) {
+ if httpEnabled {
+ httpCfg := in.Cfg.HTTPRetrieval
maxBlockSize, err := humanize.ParseBytes(httpCfg.MaxBlockSize.WithDefault(config.DefaultHTTPRetrievalMaxBlockSize))
if err != nil {
return nil, err
@@ -136,7 +137,7 @@ func Bitswap(serverEnabled bool) interface{} {
return nil, err
}
- // Explicitly enable/disable server to ensure desired provide mode
+ // Explicitly enable/disable server
in.BitswapOpts = append(in.BitswapOpts, bitswap.WithServerEnabled(serverEnabled))
bs := bitswap.New(helpers.LifecycleCtx(in.Mctx, lc), bitswapNetworks, providerQueryMgr, bitswapBlockstore, in.BitswapOpts...)
diff --git a/core/node/groups.go b/core/node/groups.go
index e4682f6a6..3a952ccfe 100644
--- a/core/node/groups.go
+++ b/core/node/groups.go
@@ -337,16 +337,18 @@ func Online(bcfg *BuildCfg, cfg *config.Config, userResourceOverrides rcmgr.Part
isBitswapLibp2pEnabled := cfg.Bitswap.Libp2pEnabled.WithDefault(config.DefaultBitswapLibp2pEnabled)
isBitswapServerEnabled := cfg.Bitswap.ServerEnabled.WithDefault(config.DefaultBitswapServerEnabled)
+ isHTTPRetrievalEnabled := cfg.HTTPRetrieval.Enabled.WithDefault(config.DefaultHTTPRetrievalEnabled)
- // Don't provide from bitswap when the legacy noop experiment "strategic provider service" is active
- isBitswapServerEnabled = isBitswapServerEnabled && !cfg.Experimental.StrategicProviding
+ // Right now Provider and Reprovider systems are tied together - disabling Reprovider by setting interval to 0 disables Provider
+ // and vice versa: Provider.Enabled=false will disable both Provider of new CIDs and the Reprovider of old ones.
+ isProviderEnabled := cfg.Provider.Enabled.WithDefault(config.DefaultProviderEnabled) && cfg.Reprovider.Interval.WithDefault(config.DefaultReproviderInterval) != 0
return fx.Options(
fx.Provide(BitswapOptions(cfg)),
- fx.Provide(Bitswap(isBitswapServerEnabled)),
+ fx.Provide(Bitswap(isBitswapServerEnabled, isBitswapLibp2pEnabled, isHTTPRetrievalEnabled)),
fx.Provide(OnlineExchange(isBitswapLibp2pEnabled)),
// Replace our Exchange with a Providing exchange!
- fx.Decorate(ProvidingExchange(isBitswapServerEnabled)),
+ fx.Decorate(ProvidingExchange(isProviderEnabled && isBitswapServerEnabled)),
fx.Provide(DNSResolver),
fx.Provide(Namesys(ipnsCacheSize, cfg.Ipns.MaxCacheTTL.WithDefault(config.DefaultIpnsMaxCacheTTL))),
fx.Provide(Peering),
@@ -358,7 +360,7 @@ func Online(bcfg *BuildCfg, cfg *config.Config, userResourceOverrides rcmgr.Part
LibP2P(bcfg, cfg, userResourceOverrides),
OnlineProviders(
- cfg.Experimental.StrategicProviding,
+ isProviderEnabled,
cfg.Reprovider.Strategy.WithDefault(config.DefaultReproviderStrategy),
cfg.Reprovider.Interval.WithDefault(config.DefaultReproviderInterval),
cfg.Routing.AcceleratedDHTClient.WithDefault(config.DefaultAcceleratedDHTClient),
diff --git a/core/node/provider.go b/core/node/provider.go
index d0081eb0a..79fed2a4f 100644
--- a/core/node/provider.go
+++ b/core/node/provider.go
@@ -132,8 +132,8 @@ https://github.com/ipfs/kubo/blob/master/docs/config.md#routingaccelerateddhtcli
// ONLINE/OFFLINE
// OnlineProviders groups units managing provider routing records online
-func OnlineProviders(useStrategicProviding bool, reprovideStrategy string, reprovideInterval time.Duration, acceleratedDHTClient bool, provideWorkerCount int) fx.Option {
- if useStrategicProviding {
+func OnlineProviders(provide bool, reprovideStrategy string, reprovideInterval time.Duration, acceleratedDHTClient bool, provideWorkerCount int) fx.Option {
+ if !provide {
return OfflineProviders()
}
diff --git a/docs/changelogs/v0.35.md b/docs/changelogs/v0.35.md
index 9314390ad..6dac079b4 100644
--- a/docs/changelogs/v0.35.md
+++ b/docs/changelogs/v0.35.md
@@ -181,12 +181,16 @@ to delays in initial advertisements (provides).
Provides and Reprovides now have separate queues, allowing for immediate
provide of new CIDs and optimised batching of reprovides.
-This change introduces a new configuration option for limiting the number of
-concurrent provide operations:
-[`Provider.WorkerCount`](https://github.com/ipfs/kubo/blob/master/docs/config.md#providerworkercount).
+###### New `Provider` configuration options
+
+This change introduces a new configuration options:
+
+- [`Provider.Enabled`](https://github.com/ipfs/kubo/blob/master/docs/config.md#providerenabled) is a global flag for disabling both [Provider](https://github.com/ipfs/kubo/blob/master/docs/config.md#provider) and [Reprovider](https://github.com/ipfs/kubo/blob/master/docs/config.md#reprovider) systems (announcing new/old CIDs to amino DHT).
+- [`Provider.WorkerCount`](https://github.com/ipfs/kubo/blob/master/docs/config.md#providerworkercount) for limiting the number of concurrent provide operations, allows for fine-tuning the trade-off between announcement speed and system load when announcing new CIDs.
+- Removed `Experimental.StrategicProviding`. Superseded by `Provider.Enabled`, `Reprovider.Interval` and [`Reprovider.Strategy`](https://github.com/ipfs/kubo/blob/master/docs/config.md#reproviderstrategy).
> [!TIP]
-> Users who need to provide large volumes of content immediately should consider removing the cap on concurrent provide operations and also set `Routing.AcceleratedDHTClient` to `true`.
+> Users who need to provide large volumes of content immediately should consider setting `Routing.AcceleratedDHTClient` to `true`. If that is not enough, consider adjusting `Provider.WorkerCount` to a higher value.
###### Deprecated `ipfs stats provider`
diff --git a/docs/config.md b/docs/config.md
index 3da157d19..4b8d66ac0 100644
--- a/docs/config.md
+++ b/docs/config.md
@@ -110,6 +110,7 @@ config file at runtime.
- [`Pinning.RemoteServices: Policies.MFS.PinName`](#pinningremoteservices-policiesmfspinname)
- [`Pinning.RemoteServices: Policies.MFS.RepinInterval`](#pinningremoteservices-policiesmfsrepininterval)
- [`Provider`](#provider)
+ - [`Provider.Enabled`](#providerenabled)
- [`Provider.Strategy`](#providerstrategy)
- [`Provider.WorkerCount`](#providerworkercount)
- [`Pubsub`](#pubsub)
@@ -962,7 +963,7 @@ We are working on developing a modern replacement. To support our efforts, pleas
on specified hostnames that point at your Kubo instance.
It is useful when you want to run [Path gateway](https://specs.ipfs.tech/http-gateways/path-gateway/) on `example.com/ipfs/cid`,
-and [Subdomain gateway](https://specs.ipfs.tech/http-gateways/subdomain-gateway/) on `cid.ipfs.example.org`,
+and [Subdomain gateway](https://specs.ipfs.tech/http-gateways/subdomain-gateway/) on `cid.ipfs.example.org`,
or limit `verifiable.example.net` to response types defined in [Trustless Gateway](https://specs.ipfs.tech/http-gateways/trustless-gateway/) specification.
> [!CAUTION]
@@ -1000,7 +1001,7 @@ Type: `array[string]`
#### `Gateway.PublicGateways: UseSubdomains`
A boolean to configure whether the gateway at the hostname should be
-a [Subdomain Gateway](https://specs.ipfs.tech/http-gateways/subdomain-gateway/)
+a [Subdomain Gateway](https://specs.ipfs.tech/http-gateways/subdomain-gateway/)
and provide [Origin isolation](https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy)
between content roots.
@@ -1110,7 +1111,7 @@ $ ipfs config --json Gateway.PublicGateways '{"localhost": null }'
### `Gateway` recipes
-Below is a list of the most common public gateway setups.
+Below is a list of the most common gateway setups.
* Public [subdomain gateway](https://docs.ipfs.tech/how-to/address-ipfs-on-web/#subdomain-gateway) at `http://{cid}.ipfs.dweb.link` (each content root gets its own Origin)
```console
@@ -1121,6 +1122,7 @@ Below is a list of the most common public gateway setups.
}
}'
```
+ - **Performance:** consider running with `Routing.AcceleratedDHTClient=true` and either `Provider.Enabled=false` (avoid providing newly retrieved blocks) or `Provider.WorkerCount=0` (provide as fast as possible, at the cost of increased load)
- **Backward-compatible:** this feature enables automatic redirects from content paths to subdomains:
`http://dweb.link/ipfs/{cid}` โ `http://{cid}.ipfs.dweb.link`
@@ -1145,6 +1147,7 @@ Below is a list of the most common public gateway setups.
}
}'
```
+ - **Performance:** when running an open, recursive gateway consider running with `Routing.AcceleratedDHTClient=true` and either `Provider.Enabled=false` (avoid providing newly retrieved blocks) or `Provider.WorkerCount=0` (provide as fast as possible, at the cost of increased load)
* Public [DNSLink](https://dnslink.io/) gateway resolving every hostname passed in `Host` header.
```console
@@ -1503,15 +1506,28 @@ commands.
For periodical DHT reprovide settings, see [`Reprovide.*`](#reprovider).
+### `Provider.Enabled`
+
+Controls whether Kubo provider and reprovide systems are enabled.
+
+> [!CAUTION]
+> Disabling this, will disable BOTH `Provider` system for new CIDs
+> and the periodical reprovide ([`Reprovider.Interval`](#reprovider)) of old CIDs.
+
+Default: `true`
+
+Type: `flag`
+
### `Provider.Strategy`
Legacy, not used at the moment, see [`Reprovider.Strategy`](#reproviderstrategy) instead.
### `Provider.WorkerCount`
-Sets the maximum number of _concurrent_ DHT provide operations. DHT reprovides
-operations do **not** count against that limit. A value of `0` allows an
-unlimited number of provide workers.
+Sets the maximum number of _concurrent_ DHT provide operations (announcement of new CIDs).
+
+[`Reprovider`](#reprovider) operations do **not** count against this limit.
+A value of `0` allows an unlimited number of provide workers.
If the [accelerated DHT client](#routingaccelerateddhtclient) is enabled, each
provide operation opens ~20 connections in parallel. With the standard DHT
@@ -1520,13 +1536,17 @@ connections, with at most 10 active at once. Provides complete more quickly
when using the accelerated client. Be mindful of how many simultaneous
connections this setting can generate.
-For nodes without strict connection limits that need to provide large volumes
-of content immediately, we recommend enabling the `Routing.AcceleratedDHTClient` and
-setting `Provider.WorkerCount` to `0` (unlimited).
+> [!CAUTION]
+> For nodes without strict connection limits that need to provide large volumes
+> of content immediately, we recommend enabling the `Routing.AcceleratedDHTClient` and
+> setting `Provider.WorkerCount` to `0` (unlimited).
+>
+> At the same time, mind that raising this value too high may lead to increased load.
+> Proceed with caution, ensure proper hardware and networking are in place.
-Default: `64`
+Default: `16`
-Type: `integer` (non-negative; `0` means unlimited number of workers)
+Type: `optionalInteger` (non-negative; `0` means unlimited number of workers)
## `Pubsub`
@@ -1704,7 +1724,11 @@ system.
Note: disabling content reproviding will result in other nodes on the network
not being able to discover that you have the objects that you have. If you want
to have this disabled and keep the network aware of what you have, you must
-manually announce your content periodically.
+manually announce your content periodically or run your own routing system
+and convince users to add it to [`Routing.DelegatedRouters`](https://github.com/ipfs/kubo/blob/master/docs/config.md#routingdelegatedrouters).
+
+> [!CAUTION]
+> To maintain backward-compatibility, setting `Reprovider.Interval=0` will also disable Provider system (equivalent of `Provider.Enabled=false`)
Default: `22h` (`DefaultReproviderInterval`)
@@ -1868,12 +1892,13 @@ Type: `array[string]`
### `Routing.DelegatedRouters`
-This is an array of URL hostnames that support the [Delegated Routing V1 HTTP API](https://specs.ipfs.tech/routing/http-routing-v1/) which are used alongside the DHT when [`Routing.Type`](#routingtype) is set to `auto` or `autoclient`.
+An array of URL hostnames for delegated routers to be queried in addition to the Amino DHT when `Routing.Type` is set to `auto` (default) or `autoclient`.
+These endpoints must support the [Delegated Routing V1 HTTP API](https://specs.ipfs.tech/routing/http-routing-v1/).
> [!TIP]
> Delegated routing allows IPFS implementations to offload tasks like content routing, peer routing, and naming to a separate process or server while also benefiting from HTTP caching.
>
-> One can run their own delegated router either by implementing the [Delegated Routing V1 HTTP API](https://specs.ipfs.tech/routing/http-routing-v1/) themselves, or by using [Someguy](https://github.com/ipfs/someguy), a turn-key implementation that proxies requests to the Amino DHT and other delegated routing servers, such as the Network Indexer at `cid.contact`. Public utility instance of Someguy is hosted at [`https://delegated-ipfs.dev`](https://docs.ipfs.tech/concepts/public-utilities/#delegated-routing).
+> One can run their own delegated router either by implementing the [Delegated Routing V1 HTTP API](https://specs.ipfs.tech/routing/http-routing-v1/) themselves, or by using [Someguy](https://github.com/ipfs/someguy), a turn-key implementation that proxies requests to other routing systems. A public utility instance of Someguy is hosted at [`https://delegated-ipfs.dev`](https://docs.ipfs.tech/concepts/public-utilities/#delegated-routing).
Default: `["https://cid.contact"]` (empty or `nil` will also use this default; to disable delegated routing, set `Routing.Type` to `dht` or `dhtclient`)
@@ -1881,11 +1906,14 @@ Type: `array[string]`
### `Routing.Routers`
-**EXPERIMENTAL: `Routing.Routers` configuration may change in future release**
+Alternative configuration used when `Routing.Type=custom`.
-Map of additional Routers.
+> [!WARNING]
+> **EXPERIMENTAL: `Routing.Routers` configuration may change in future release**
+>
+> Consider this advanced low-level config: Most users can simply use `Routing.Type=auto` or `autoclient` and set up basic config in user-friendly [`Routing.DelegatedRouters`](https://github.com/ipfs/kubo/blob/master/docs/config.md#routingdelegatedrouters).
-Allows for extending the default routing (Amino DHT) with alternative Router
+Allows for replacing the default routing (Amino DHT) with alternative Router
implementations.
The map key is a name of a Router, and the value is its configuration.
@@ -1945,7 +1973,14 @@ Type: `object[string->string]`
### `Routing: Methods`
-`Methods:map` will define which routers will be executed per method. The key will be the name of the method: `"provide"`, `"find-providers"`, `"find-peers"`, `"put-ipns"`, `"get-ipns"`. All methods must be added to the list.
+`Methods:map` will define which routers will be executed per method used when `Routing.Type=custom`.
+
+> [!WARNING]
+> **EXPERIMENTAL: `Routing.Routers` configuration may change in future release**
+>
+> Consider this advanced low-level config: Most users can simply use `Routing.Type=auto` or `autoclient` and set up basic config in user-friendly [`Routing.DelegatedRouters`](https://github.com/ipfs/kubo/blob/master/docs/config.md#routingdelegatedrouters).
+
+The key will be the name of the method: `"provide"`, `"find-providers"`, `"find-peers"`, `"put-ipns"`, `"get-ipns"`. All methods must be added to the list.
The value will contain:
- `RouterName:string`: Name of the router. It should be one of the previously added to `Routing.Routers` list.
diff --git a/docs/experimental-features.md b/docs/experimental-features.md
index 7d0069fc6..fbee3d480 100644
--- a/docs/experimental-features.md
+++ b/docs/experimental-features.md
@@ -537,27 +537,9 @@ ipfs config --json Swarm.RelayClient.Enabled true
### State
-Experimental, disabled by default.
+`Experimental.StrategicProviding` was removed in Kubo v0.35.
-Replaces the existing provide mechanism with a robust, strategic provider system. Currently enabling this option will provide nothing.
-
-### How to enable
-
-Modify your ipfs config:
-
-```
-ipfs config --json Experimental.StrategicProviding true
-```
-
-### Road to being a real feature
-
-- [ ] needs real-world testing
-- [ ] needs adoption
-- [ ] needs to support all provider subsystem features
- - [X] provide nothing
- - [ ] provide roots
- - [ ] provide all
- - [ ] provide strategic
+Replaced by [`Provide.Enabled`](https://github.com/ipfs/kubo/blob/master/docs/config.md#providerenabled) and [`Reprovider.Strategy`](https://github.com/ipfs/kubo/blob/master/docs/config.md#reproviderstrategy).
## GraphSync
diff --git a/test/cli/provider_test.go b/test/cli/provider_test.go
index 81af78149..7e2bee411 100644
--- a/test/cli/provider_test.go
+++ b/test/cli/provider_test.go
@@ -7,6 +7,7 @@ import (
"github.com/ipfs/kubo/test/cli/harness"
"github.com/ipfs/kubo/test/cli/testutils"
+ "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
@@ -33,11 +34,11 @@ func TestProvider(t *testing.T) {
}
}
- t.Run("Basic Providing", func(t *testing.T) {
+ t.Run("Provider.Enabled=true announces new CIDs created by ipfs add", func(t *testing.T) {
t.Parallel()
nodes := initNodes(t, 2, func(n *harness.Node) {
- n.SetIPFSConfig("Experimental.StrategicProviding", false)
+ n.SetIPFSConfig("Provider.Enabled", true)
})
defer nodes.StopDaemons()
@@ -48,11 +49,11 @@ func TestProvider(t *testing.T) {
expectProviders(t, cid, nodes[0].PeerID().String(), nodes[1:]...)
})
- t.Run("Basic Strategic Providing", func(t *testing.T) {
+ t.Run("Provider.Enabled=false disables announcement of new CID from ipfs add", func(t *testing.T) {
t.Parallel()
nodes := initNodes(t, 2, func(n *harness.Node) {
- n.SetIPFSConfig("Experimental.StrategicProviding", true)
+ n.SetIPFSConfig("Provider.Enabled", false)
})
defer nodes.StopDaemons()
@@ -60,6 +61,75 @@ func TestProvider(t *testing.T) {
expectNoProviders(t, cid, nodes[1:]...)
})
+ t.Run("Provider.Enabled=false disables manual announcement via RPC command", func(t *testing.T) {
+ t.Parallel()
+
+ nodes := initNodes(t, 2, func(n *harness.Node) {
+ n.SetIPFSConfig("Provider.Enabled", false)
+ })
+ defer nodes.StopDaemons()
+
+ cid := nodes[0].IPFSAddStr(time.Now().String())
+ res := nodes[0].RunIPFS("routing", "provide", cid)
+ assert.Contains(t, res.Stderr.Trimmed(), "invalid configuration: Provider.Enabled is set to 'false'")
+ assert.Equal(t, 1, res.ExitCode())
+
+ expectNoProviders(t, cid, nodes[1:]...)
+ })
+
+ // Right now Provide and Reprovide are tied together
+ t.Run("Reprovide.Interval=0 disables announcement of new CID too", func(t *testing.T) {
+ t.Parallel()
+
+ nodes := initNodes(t, 2, func(n *harness.Node) {
+ n.SetIPFSConfig("Reprovider.Interval", "0")
+ })
+ defer nodes.StopDaemons()
+
+ cid := nodes[0].IPFSAddStr(time.Now().String())
+ expectNoProviders(t, cid, nodes[1:]...)
+ })
+
+ // It is a lesser evil - forces users to fix their config and have some sort of interval
+ t.Run("Manual Reprovider trigger does not work when periodic Reprovider is disabled", func(t *testing.T) {
+ t.Parallel()
+
+ nodes := initNodes(t, 2, func(n *harness.Node) {
+ n.SetIPFSConfig("Reprovider.Interval", "0")
+ })
+ defer nodes.StopDaemons()
+
+ cid := nodes[0].IPFSAddStr(time.Now().String(), "--offline")
+
+ expectNoProviders(t, cid, nodes[1:]...)
+
+ res := nodes[0].RunIPFS("routing", "reprovide")
+ assert.Contains(t, res.Stderr.Trimmed(), "invalid configuration: Reprovider.Interval is set to '0'")
+ assert.Equal(t, 1, res.ExitCode())
+
+ expectNoProviders(t, cid, nodes[1:]...)
+ })
+
+ // It is a lesser evil - forces users to fix their config and have some sort of interval
+ t.Run("Manual Reprovider trigger does not work when Provider system is disabled", func(t *testing.T) {
+ t.Parallel()
+
+ nodes := initNodes(t, 2, func(n *harness.Node) {
+ n.SetIPFSConfig("Provider.Enabled", false)
+ })
+ defer nodes.StopDaemons()
+
+ cid := nodes[0].IPFSAddStr(time.Now().String(), "--offline")
+
+ expectNoProviders(t, cid, nodes[1:]...)
+
+ res := nodes[0].RunIPFS("routing", "reprovide")
+ assert.Contains(t, res.Stderr.Trimmed(), "invalid configuration: Provider.Enabled is set to 'false'")
+ assert.Equal(t, 1, res.ExitCode())
+
+ expectNoProviders(t, cid, nodes[1:]...)
+ })
+
t.Run("Reprovides with 'all' strategy", func(t *testing.T) {
t.Parallel()
@@ -149,20 +219,4 @@ func TestProvider(t *testing.T) {
expectProviders(t, cidBarDir, nodes[0].PeerID().String(), nodes[1:]...)
})
- t.Run("Providing works without ticking", func(t *testing.T) {
- t.Parallel()
-
- nodes := initNodes(t, 2, func(n *harness.Node) {
- n.SetIPFSConfig("Reprovider.Interval", "0")
- })
- defer nodes.StopDaemons()
-
- cid := nodes[0].IPFSAddStr(time.Now().String(), "--offline")
-
- expectNoProviders(t, cid, nodes[1:]...)
-
- nodes[0].IPFS("routing", "reprovide")
-
- expectProviders(t, cid, nodes[0].PeerID().String(), nodes[1:]...)
- })
}
From 36b28a0af240c5da982f9527670b1fe343ca7be4 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Thu, 15 May 2025 19:19:18 +0200
Subject: [PATCH 235/499] fix(config): wire up `Provider.Enabled` flag (#10804)
* fix(config): explicit Provider.Enabled flag
Adds missing config option described in
https://github.com/ipfs/kubo/issues/10803
* refactor: remove Experimental.StrategicProviding
removing experiment, replaced with Provider.Enabled
* test(cli): routing [re]provide
updated and added tests for manually triggering provide and reprovide
and making them respect global configuration flag to avoid
inconsistent behaviors
* docs: improve DelegatedRouters
* refactor: default DefaultProviderWorkerCount=16
- simplified default for both
- 16 is safer for non-accelerated DHT client
- acceletated DHT performs better without limit anyway - updated docs
(cherry picked from commit 2ab3f58c992104bac45fbc204d5475300d250355)
---
cmd/ipfs/kubo/daemon.go | 17 +++++--
config/experiments.go | 2 +-
config/profile.go | 8 +--
config/provider.go | 4 +-
config/routing.go | 3 +-
core/commands/routing.go | 21 ++++++++
core/node/bitswap.go | 7 +--
core/node/groups.go | 12 +++--
core/node/provider.go | 4 +-
docs/changelogs/v0.35.md | 12 +++--
docs/config.md | 71 +++++++++++++++++++-------
docs/experimental-features.md | 22 +-------
test/cli/provider_test.go | 94 +++++++++++++++++++++++++++--------
13 files changed, 193 insertions(+), 84 deletions(-)
diff --git a/cmd/ipfs/kubo/daemon.go b/cmd/ipfs/kubo/daemon.go
index ea6ccfc1d..5cdf3fa1d 100644
--- a/cmd/ipfs/kubo/daemon.go
+++ b/cmd/ipfs/kubo/daemon.go
@@ -491,6 +491,11 @@ func daemonFunc(req *cmds.Request, re cmds.ResponseEmitter, env cmds.Environment
if cfg.Provider.Strategy.WithDefault("") != "" && cfg.Reprovider.Strategy.IsDefault() {
log.Fatal("Invalid config. Remove unused Provider.Strategy and set Reprovider.Strategy instead. Documentation: https://github.com/ipfs/kubo/blob/master/docs/config.md#reproviderstrategy")
}
+ if cfg.Experimental.StrategicProviding {
+ log.Error("Experimental.StrategicProviding was removed. Remove it from your config and set Provider.Enabled=false to remove this message. Documentation: https://github.com/ipfs/kubo/blob/master/docs/experimental-features.md#strategic-providing")
+ cfg.Experimental.StrategicProviding = false
+ cfg.Provider.Enabled = config.False
+ }
printLibp2pPorts(node)
@@ -625,17 +630,19 @@ take effect.
}()
if !offline {
- // Warn users who were victims of 'lowprofile' footgun (https://github.com/ipfs/kubo/pull/10524)
- if cfg.Experimental.StrategicProviding {
+ // Warn users when provide systems are disabled
+ if !cfg.Provider.Enabled.WithDefault(config.DefaultProviderEnabled) {
fmt.Print(`
-โ ๏ธ Reprovide system is disabled due to 'Experimental.StrategicProviding=true'
+
+โ ๏ธ Provide and Reprovide systems are disabled due to 'Provide.Enabled=false'
โ ๏ธ Local CIDs will not be announced to Amino DHT, making them impossible to retrieve without manual peering
-โ ๏ธ If this is not intentional, call 'ipfs config profile apply announce-on'
+โ ๏ธ If this is not intentional, call 'ipfs config profile apply announce-on' or set Provide.Enabled=true'
`)
} else if cfg.Reprovider.Interval.WithDefault(config.DefaultReproviderInterval) == 0 {
fmt.Print(`
-โ ๏ธ Reprovider system is disabled due to 'Reprovider.Interval=0'
+
+โ ๏ธ Provide and Reprovide systems are disabled due to 'Reprovider.Interval=0'
โ ๏ธ Local CIDs will not be announced to Amino DHT, making them impossible to retrieve without manual peering
โ ๏ธ If this is not intentional, call 'ipfs config profile apply announce-on', or set 'Reprovider.Interval=22h'
diff --git a/config/experiments.go b/config/experiments.go
index fab1f953c..6c43ac04f 100644
--- a/config/experiments.go
+++ b/config/experiments.go
@@ -6,7 +6,7 @@ type Experiments struct {
ShardingEnabled bool `json:",omitempty"` // deprecated by autosharding: https://github.com/ipfs/kubo/pull/8527
Libp2pStreamMounting bool
P2pHttpProxy bool //nolint
- StrategicProviding bool
+ StrategicProviding bool `json:",omitempty"` // removed, use Provider.Enabled instead
OptimisticProvide bool
OptimisticProvideJobsPoolSize int
GatewayOverLibp2p bool `json:",omitempty"`
diff --git a/config/profile.go b/config/profile.go
index 605af3555..ec2e5a0b7 100644
--- a/config/profile.go
+++ b/config/profile.go
@@ -270,7 +270,7 @@ fetching may be degraded.
},
},
"announce-off": {
- Description: `Disables Reprovide system (and announcing to Amino DHT).
+ Description: `Disables Provide and Reprovide systems (announcing to Amino DHT).
USE WITH CAUTION:
The main use case for this is setups with manual Peering.Peers config.
@@ -279,16 +279,16 @@ fetching may be degraded.
one hosting it, and other peers are not already connected to it.
`,
Transform: func(c *Config) error {
+ c.Provider.Enabled = False
c.Reprovider.Interval = NewOptionalDuration(0) // 0 disables periodic reprovide
- c.Experimental.StrategicProviding = true // this is not a typo (the name is counter-intuitive)
return nil
},
},
"announce-on": {
- Description: `Re-enables Reprovide system (reverts announce-off profile).`,
+ Description: `Re-enables Provide and Reprovide systems (reverts announce-off profile).`,
Transform: func(c *Config) error {
+ c.Provider.Enabled = True
c.Reprovider.Interval = NewOptionalDuration(DefaultReproviderInterval) // have to apply explicit default because nil would be ignored
- c.Experimental.StrategicProviding = false // this is not a typo (the name is counter-intuitive)
return nil
},
},
diff --git a/config/provider.go b/config/provider.go
index a1c448598..4a2243acb 100644
--- a/config/provider.go
+++ b/config/provider.go
@@ -1,12 +1,14 @@
package config
const (
- DefaultProviderWorkerCount = 64
+ DefaultProviderEnabled = true
+ DefaultProviderWorkerCount = 16
)
// Provider configuration describes how NEW CIDs are announced the moment they are created.
// For periodical reprovide configuration, see Reprovider.*
type Provider struct {
+ Enabled Flag `json:",omitempty"`
Strategy *OptionalString `json:",omitempty"` // Unused, you are likely looking for Reprovider.Strategy instead
WorkerCount *OptionalInteger `json:",omitempty"` // Number of concurrent provides allowed, 0 means unlimited
}
diff --git a/config/routing.go b/config/routing.go
index 3fe501ee4..aea60c3bd 100644
--- a/config/routing.go
+++ b/config/routing.go
@@ -48,10 +48,11 @@ type Routing struct {
IgnoreProviders []string `json:",omitempty"`
+ // Simplified configuration used by default when Routing.Type=auto|autoclient
DelegatedRouters []string `json:",omitempty"`
+ // Advanced configuration used when Routing.Type=custom
Routers Routers `json:",omitempty"`
-
Methods Methods `json:",omitempty"`
}
diff --git a/core/commands/routing.go b/core/commands/routing.go
index 3528a94f5..0804b1f44 100644
--- a/core/commands/routing.go
+++ b/core/commands/routing.go
@@ -9,6 +9,7 @@ import (
"strings"
"time"
+ "github.com/ipfs/kubo/config"
cmdenv "github.com/ipfs/kubo/core/commands/cmdenv"
dag "github.com/ipfs/boxo/ipld/merkledag"
@@ -158,6 +159,14 @@ var provideRefRoutingCmd = &cmds.Command{
if !nd.IsOnline {
return ErrNotOnline
}
+ // respect global config
+ cfg, err := nd.Repo.Config()
+ if err != nil {
+ return err
+ }
+ if !cfg.Provider.Enabled.WithDefault(config.DefaultProviderEnabled) {
+ return errors.New("invalid configuration: Provider.Enabled is set to 'false'")
+ }
if len(nd.PeerHost.Network().Conns()) == 0 {
return errors.New("cannot provide, no connected peers")
@@ -254,6 +263,18 @@ Trigger reprovider to announce our data to network.
return ErrNotOnline
}
+ // respect global config
+ cfg, err := nd.Repo.Config()
+ if err != nil {
+ return err
+ }
+ if !cfg.Provider.Enabled.WithDefault(config.DefaultProviderEnabled) {
+ return errors.New("invalid configuration: Provider.Enabled is set to 'false'")
+ }
+ if cfg.Reprovider.Interval.WithDefault(config.DefaultReproviderInterval) == 0 {
+ return errors.New("invalid configuration: Reprovider.Interval is set to '0'")
+ }
+
err = nd.Provider.Reprovide(req.Context)
if err != nil {
return err
diff --git a/core/node/bitswap.go b/core/node/bitswap.go
index a52b3e75d..e87464b8a 100644
--- a/core/node/bitswap.go
+++ b/core/node/bitswap.go
@@ -83,7 +83,7 @@ type bitswapIn struct {
// Bitswap creates the BitSwap server/client instance.
// If Bitswap.ServerEnabled is false, the node will act only as a client
// using an empty blockstore to prevent serving blocks to other peers.
-func Bitswap(serverEnabled bool) interface{} {
+func Bitswap(serverEnabled, libp2pEnabled, httpEnabled bool) interface{} {
return func(in bitswapIn, lc fx.Lifecycle) (*bitswap.Bitswap, error) {
var bitswapNetworks, bitswapLibp2p network.BitSwapNetwork
var bitswapBlockstore blockstore.Blockstore = in.Bs
@@ -93,7 +93,8 @@ func Bitswap(serverEnabled bool) interface{} {
bitswapLibp2p = bsnet.NewFromIpfsHost(in.Host)
}
- if httpCfg := in.Cfg.HTTPRetrieval; httpCfg.Enabled.WithDefault(config.DefaultHTTPRetrievalEnabled) {
+ if httpEnabled {
+ httpCfg := in.Cfg.HTTPRetrieval
maxBlockSize, err := humanize.ParseBytes(httpCfg.MaxBlockSize.WithDefault(config.DefaultHTTPRetrievalMaxBlockSize))
if err != nil {
return nil, err
@@ -136,7 +137,7 @@ func Bitswap(serverEnabled bool) interface{} {
return nil, err
}
- // Explicitly enable/disable server to ensure desired provide mode
+ // Explicitly enable/disable server
in.BitswapOpts = append(in.BitswapOpts, bitswap.WithServerEnabled(serverEnabled))
bs := bitswap.New(helpers.LifecycleCtx(in.Mctx, lc), bitswapNetworks, providerQueryMgr, bitswapBlockstore, in.BitswapOpts...)
diff --git a/core/node/groups.go b/core/node/groups.go
index e4682f6a6..3a952ccfe 100644
--- a/core/node/groups.go
+++ b/core/node/groups.go
@@ -337,16 +337,18 @@ func Online(bcfg *BuildCfg, cfg *config.Config, userResourceOverrides rcmgr.Part
isBitswapLibp2pEnabled := cfg.Bitswap.Libp2pEnabled.WithDefault(config.DefaultBitswapLibp2pEnabled)
isBitswapServerEnabled := cfg.Bitswap.ServerEnabled.WithDefault(config.DefaultBitswapServerEnabled)
+ isHTTPRetrievalEnabled := cfg.HTTPRetrieval.Enabled.WithDefault(config.DefaultHTTPRetrievalEnabled)
- // Don't provide from bitswap when the legacy noop experiment "strategic provider service" is active
- isBitswapServerEnabled = isBitswapServerEnabled && !cfg.Experimental.StrategicProviding
+ // Right now Provider and Reprovider systems are tied together - disabling Reprovider by setting interval to 0 disables Provider
+ // and vice versa: Provider.Enabled=false will disable both Provider of new CIDs and the Reprovider of old ones.
+ isProviderEnabled := cfg.Provider.Enabled.WithDefault(config.DefaultProviderEnabled) && cfg.Reprovider.Interval.WithDefault(config.DefaultReproviderInterval) != 0
return fx.Options(
fx.Provide(BitswapOptions(cfg)),
- fx.Provide(Bitswap(isBitswapServerEnabled)),
+ fx.Provide(Bitswap(isBitswapServerEnabled, isBitswapLibp2pEnabled, isHTTPRetrievalEnabled)),
fx.Provide(OnlineExchange(isBitswapLibp2pEnabled)),
// Replace our Exchange with a Providing exchange!
- fx.Decorate(ProvidingExchange(isBitswapServerEnabled)),
+ fx.Decorate(ProvidingExchange(isProviderEnabled && isBitswapServerEnabled)),
fx.Provide(DNSResolver),
fx.Provide(Namesys(ipnsCacheSize, cfg.Ipns.MaxCacheTTL.WithDefault(config.DefaultIpnsMaxCacheTTL))),
fx.Provide(Peering),
@@ -358,7 +360,7 @@ func Online(bcfg *BuildCfg, cfg *config.Config, userResourceOverrides rcmgr.Part
LibP2P(bcfg, cfg, userResourceOverrides),
OnlineProviders(
- cfg.Experimental.StrategicProviding,
+ isProviderEnabled,
cfg.Reprovider.Strategy.WithDefault(config.DefaultReproviderStrategy),
cfg.Reprovider.Interval.WithDefault(config.DefaultReproviderInterval),
cfg.Routing.AcceleratedDHTClient.WithDefault(config.DefaultAcceleratedDHTClient),
diff --git a/core/node/provider.go b/core/node/provider.go
index d0081eb0a..79fed2a4f 100644
--- a/core/node/provider.go
+++ b/core/node/provider.go
@@ -132,8 +132,8 @@ https://github.com/ipfs/kubo/blob/master/docs/config.md#routingaccelerateddhtcli
// ONLINE/OFFLINE
// OnlineProviders groups units managing provider routing records online
-func OnlineProviders(useStrategicProviding bool, reprovideStrategy string, reprovideInterval time.Duration, acceleratedDHTClient bool, provideWorkerCount int) fx.Option {
- if useStrategicProviding {
+func OnlineProviders(provide bool, reprovideStrategy string, reprovideInterval time.Duration, acceleratedDHTClient bool, provideWorkerCount int) fx.Option {
+ if !provide {
return OfflineProviders()
}
diff --git a/docs/changelogs/v0.35.md b/docs/changelogs/v0.35.md
index c8fd97014..023dcfd54 100644
--- a/docs/changelogs/v0.35.md
+++ b/docs/changelogs/v0.35.md
@@ -181,12 +181,16 @@ to delays in initial advertisements (provides).
Provides and Reprovides now have separate queues, allowing for immediate
provide of new CIDs and optimised batching of reprovides.
-This change introduces a new configuration option for limiting the number of
-concurrent provide operations:
-[`Provider.WorkerCount`](https://github.com/ipfs/kubo/blob/master/docs/config.md#providerworkercount).
+###### New `Provider` configuration options
+
+This change introduces a new configuration options:
+
+- [`Provider.Enabled`](https://github.com/ipfs/kubo/blob/master/docs/config.md#providerenabled) is a global flag for disabling both [Provider](https://github.com/ipfs/kubo/blob/master/docs/config.md#provider) and [Reprovider](https://github.com/ipfs/kubo/blob/master/docs/config.md#reprovider) systems (announcing new/old CIDs to amino DHT).
+- [`Provider.WorkerCount`](https://github.com/ipfs/kubo/blob/master/docs/config.md#providerworkercount) for limiting the number of concurrent provide operations, allows for fine-tuning the trade-off between announcement speed and system load when announcing new CIDs.
+- Removed `Experimental.StrategicProviding`. Superseded by `Provider.Enabled`, `Reprovider.Interval` and [`Reprovider.Strategy`](https://github.com/ipfs/kubo/blob/master/docs/config.md#reproviderstrategy).
> [!TIP]
-> Users who need to provide large volumes of content immediately should consider removing the cap on concurrent provide operations and also set `Routing.AcceleratedDHTClient` to `true`.
+> Users who need to provide large volumes of content immediately should consider setting `Routing.AcceleratedDHTClient` to `true`. If that is not enough, consider adjusting `Provider.WorkerCount` to a higher value.
###### Deprecated `ipfs stats provider`
diff --git a/docs/config.md b/docs/config.md
index 3da157d19..4b8d66ac0 100644
--- a/docs/config.md
+++ b/docs/config.md
@@ -110,6 +110,7 @@ config file at runtime.
- [`Pinning.RemoteServices: Policies.MFS.PinName`](#pinningremoteservices-policiesmfspinname)
- [`Pinning.RemoteServices: Policies.MFS.RepinInterval`](#pinningremoteservices-policiesmfsrepininterval)
- [`Provider`](#provider)
+ - [`Provider.Enabled`](#providerenabled)
- [`Provider.Strategy`](#providerstrategy)
- [`Provider.WorkerCount`](#providerworkercount)
- [`Pubsub`](#pubsub)
@@ -962,7 +963,7 @@ We are working on developing a modern replacement. To support our efforts, pleas
on specified hostnames that point at your Kubo instance.
It is useful when you want to run [Path gateway](https://specs.ipfs.tech/http-gateways/path-gateway/) on `example.com/ipfs/cid`,
-and [Subdomain gateway](https://specs.ipfs.tech/http-gateways/subdomain-gateway/) on `cid.ipfs.example.org`,
+and [Subdomain gateway](https://specs.ipfs.tech/http-gateways/subdomain-gateway/) on `cid.ipfs.example.org`,
or limit `verifiable.example.net` to response types defined in [Trustless Gateway](https://specs.ipfs.tech/http-gateways/trustless-gateway/) specification.
> [!CAUTION]
@@ -1000,7 +1001,7 @@ Type: `array[string]`
#### `Gateway.PublicGateways: UseSubdomains`
A boolean to configure whether the gateway at the hostname should be
-a [Subdomain Gateway](https://specs.ipfs.tech/http-gateways/subdomain-gateway/)
+a [Subdomain Gateway](https://specs.ipfs.tech/http-gateways/subdomain-gateway/)
and provide [Origin isolation](https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy)
between content roots.
@@ -1110,7 +1111,7 @@ $ ipfs config --json Gateway.PublicGateways '{"localhost": null }'
### `Gateway` recipes
-Below is a list of the most common public gateway setups.
+Below is a list of the most common gateway setups.
* Public [subdomain gateway](https://docs.ipfs.tech/how-to/address-ipfs-on-web/#subdomain-gateway) at `http://{cid}.ipfs.dweb.link` (each content root gets its own Origin)
```console
@@ -1121,6 +1122,7 @@ Below is a list of the most common public gateway setups.
}
}'
```
+ - **Performance:** consider running with `Routing.AcceleratedDHTClient=true` and either `Provider.Enabled=false` (avoid providing newly retrieved blocks) or `Provider.WorkerCount=0` (provide as fast as possible, at the cost of increased load)
- **Backward-compatible:** this feature enables automatic redirects from content paths to subdomains:
`http://dweb.link/ipfs/{cid}` โ `http://{cid}.ipfs.dweb.link`
@@ -1145,6 +1147,7 @@ Below is a list of the most common public gateway setups.
}
}'
```
+ - **Performance:** when running an open, recursive gateway consider running with `Routing.AcceleratedDHTClient=true` and either `Provider.Enabled=false` (avoid providing newly retrieved blocks) or `Provider.WorkerCount=0` (provide as fast as possible, at the cost of increased load)
* Public [DNSLink](https://dnslink.io/) gateway resolving every hostname passed in `Host` header.
```console
@@ -1503,15 +1506,28 @@ commands.
For periodical DHT reprovide settings, see [`Reprovide.*`](#reprovider).
+### `Provider.Enabled`
+
+Controls whether Kubo provider and reprovide systems are enabled.
+
+> [!CAUTION]
+> Disabling this, will disable BOTH `Provider` system for new CIDs
+> and the periodical reprovide ([`Reprovider.Interval`](#reprovider)) of old CIDs.
+
+Default: `true`
+
+Type: `flag`
+
### `Provider.Strategy`
Legacy, not used at the moment, see [`Reprovider.Strategy`](#reproviderstrategy) instead.
### `Provider.WorkerCount`
-Sets the maximum number of _concurrent_ DHT provide operations. DHT reprovides
-operations do **not** count against that limit. A value of `0` allows an
-unlimited number of provide workers.
+Sets the maximum number of _concurrent_ DHT provide operations (announcement of new CIDs).
+
+[`Reprovider`](#reprovider) operations do **not** count against this limit.
+A value of `0` allows an unlimited number of provide workers.
If the [accelerated DHT client](#routingaccelerateddhtclient) is enabled, each
provide operation opens ~20 connections in parallel. With the standard DHT
@@ -1520,13 +1536,17 @@ connections, with at most 10 active at once. Provides complete more quickly
when using the accelerated client. Be mindful of how many simultaneous
connections this setting can generate.
-For nodes without strict connection limits that need to provide large volumes
-of content immediately, we recommend enabling the `Routing.AcceleratedDHTClient` and
-setting `Provider.WorkerCount` to `0` (unlimited).
+> [!CAUTION]
+> For nodes without strict connection limits that need to provide large volumes
+> of content immediately, we recommend enabling the `Routing.AcceleratedDHTClient` and
+> setting `Provider.WorkerCount` to `0` (unlimited).
+>
+> At the same time, mind that raising this value too high may lead to increased load.
+> Proceed with caution, ensure proper hardware and networking are in place.
-Default: `64`
+Default: `16`
-Type: `integer` (non-negative; `0` means unlimited number of workers)
+Type: `optionalInteger` (non-negative; `0` means unlimited number of workers)
## `Pubsub`
@@ -1704,7 +1724,11 @@ system.
Note: disabling content reproviding will result in other nodes on the network
not being able to discover that you have the objects that you have. If you want
to have this disabled and keep the network aware of what you have, you must
-manually announce your content periodically.
+manually announce your content periodically or run your own routing system
+and convince users to add it to [`Routing.DelegatedRouters`](https://github.com/ipfs/kubo/blob/master/docs/config.md#routingdelegatedrouters).
+
+> [!CAUTION]
+> To maintain backward-compatibility, setting `Reprovider.Interval=0` will also disable Provider system (equivalent of `Provider.Enabled=false`)
Default: `22h` (`DefaultReproviderInterval`)
@@ -1868,12 +1892,13 @@ Type: `array[string]`
### `Routing.DelegatedRouters`
-This is an array of URL hostnames that support the [Delegated Routing V1 HTTP API](https://specs.ipfs.tech/routing/http-routing-v1/) which are used alongside the DHT when [`Routing.Type`](#routingtype) is set to `auto` or `autoclient`.
+An array of URL hostnames for delegated routers to be queried in addition to the Amino DHT when `Routing.Type` is set to `auto` (default) or `autoclient`.
+These endpoints must support the [Delegated Routing V1 HTTP API](https://specs.ipfs.tech/routing/http-routing-v1/).
> [!TIP]
> Delegated routing allows IPFS implementations to offload tasks like content routing, peer routing, and naming to a separate process or server while also benefiting from HTTP caching.
>
-> One can run their own delegated router either by implementing the [Delegated Routing V1 HTTP API](https://specs.ipfs.tech/routing/http-routing-v1/) themselves, or by using [Someguy](https://github.com/ipfs/someguy), a turn-key implementation that proxies requests to the Amino DHT and other delegated routing servers, such as the Network Indexer at `cid.contact`. Public utility instance of Someguy is hosted at [`https://delegated-ipfs.dev`](https://docs.ipfs.tech/concepts/public-utilities/#delegated-routing).
+> One can run their own delegated router either by implementing the [Delegated Routing V1 HTTP API](https://specs.ipfs.tech/routing/http-routing-v1/) themselves, or by using [Someguy](https://github.com/ipfs/someguy), a turn-key implementation that proxies requests to other routing systems. A public utility instance of Someguy is hosted at [`https://delegated-ipfs.dev`](https://docs.ipfs.tech/concepts/public-utilities/#delegated-routing).
Default: `["https://cid.contact"]` (empty or `nil` will also use this default; to disable delegated routing, set `Routing.Type` to `dht` or `dhtclient`)
@@ -1881,11 +1906,14 @@ Type: `array[string]`
### `Routing.Routers`
-**EXPERIMENTAL: `Routing.Routers` configuration may change in future release**
+Alternative configuration used when `Routing.Type=custom`.
-Map of additional Routers.
+> [!WARNING]
+> **EXPERIMENTAL: `Routing.Routers` configuration may change in future release**
+>
+> Consider this advanced low-level config: Most users can simply use `Routing.Type=auto` or `autoclient` and set up basic config in user-friendly [`Routing.DelegatedRouters`](https://github.com/ipfs/kubo/blob/master/docs/config.md#routingdelegatedrouters).
-Allows for extending the default routing (Amino DHT) with alternative Router
+Allows for replacing the default routing (Amino DHT) with alternative Router
implementations.
The map key is a name of a Router, and the value is its configuration.
@@ -1945,7 +1973,14 @@ Type: `object[string->string]`
### `Routing: Methods`
-`Methods:map` will define which routers will be executed per method. The key will be the name of the method: `"provide"`, `"find-providers"`, `"find-peers"`, `"put-ipns"`, `"get-ipns"`. All methods must be added to the list.
+`Methods:map` will define which routers will be executed per method used when `Routing.Type=custom`.
+
+> [!WARNING]
+> **EXPERIMENTAL: `Routing.Routers` configuration may change in future release**
+>
+> Consider this advanced low-level config: Most users can simply use `Routing.Type=auto` or `autoclient` and set up basic config in user-friendly [`Routing.DelegatedRouters`](https://github.com/ipfs/kubo/blob/master/docs/config.md#routingdelegatedrouters).
+
+The key will be the name of the method: `"provide"`, `"find-providers"`, `"find-peers"`, `"put-ipns"`, `"get-ipns"`. All methods must be added to the list.
The value will contain:
- `RouterName:string`: Name of the router. It should be one of the previously added to `Routing.Routers` list.
diff --git a/docs/experimental-features.md b/docs/experimental-features.md
index 7d0069fc6..fbee3d480 100644
--- a/docs/experimental-features.md
+++ b/docs/experimental-features.md
@@ -537,27 +537,9 @@ ipfs config --json Swarm.RelayClient.Enabled true
### State
-Experimental, disabled by default.
+`Experimental.StrategicProviding` was removed in Kubo v0.35.
-Replaces the existing provide mechanism with a robust, strategic provider system. Currently enabling this option will provide nothing.
-
-### How to enable
-
-Modify your ipfs config:
-
-```
-ipfs config --json Experimental.StrategicProviding true
-```
-
-### Road to being a real feature
-
-- [ ] needs real-world testing
-- [ ] needs adoption
-- [ ] needs to support all provider subsystem features
- - [X] provide nothing
- - [ ] provide roots
- - [ ] provide all
- - [ ] provide strategic
+Replaced by [`Provide.Enabled`](https://github.com/ipfs/kubo/blob/master/docs/config.md#providerenabled) and [`Reprovider.Strategy`](https://github.com/ipfs/kubo/blob/master/docs/config.md#reproviderstrategy).
## GraphSync
diff --git a/test/cli/provider_test.go b/test/cli/provider_test.go
index 81af78149..7e2bee411 100644
--- a/test/cli/provider_test.go
+++ b/test/cli/provider_test.go
@@ -7,6 +7,7 @@ import (
"github.com/ipfs/kubo/test/cli/harness"
"github.com/ipfs/kubo/test/cli/testutils"
+ "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
@@ -33,11 +34,11 @@ func TestProvider(t *testing.T) {
}
}
- t.Run("Basic Providing", func(t *testing.T) {
+ t.Run("Provider.Enabled=true announces new CIDs created by ipfs add", func(t *testing.T) {
t.Parallel()
nodes := initNodes(t, 2, func(n *harness.Node) {
- n.SetIPFSConfig("Experimental.StrategicProviding", false)
+ n.SetIPFSConfig("Provider.Enabled", true)
})
defer nodes.StopDaemons()
@@ -48,11 +49,11 @@ func TestProvider(t *testing.T) {
expectProviders(t, cid, nodes[0].PeerID().String(), nodes[1:]...)
})
- t.Run("Basic Strategic Providing", func(t *testing.T) {
+ t.Run("Provider.Enabled=false disables announcement of new CID from ipfs add", func(t *testing.T) {
t.Parallel()
nodes := initNodes(t, 2, func(n *harness.Node) {
- n.SetIPFSConfig("Experimental.StrategicProviding", true)
+ n.SetIPFSConfig("Provider.Enabled", false)
})
defer nodes.StopDaemons()
@@ -60,6 +61,75 @@ func TestProvider(t *testing.T) {
expectNoProviders(t, cid, nodes[1:]...)
})
+ t.Run("Provider.Enabled=false disables manual announcement via RPC command", func(t *testing.T) {
+ t.Parallel()
+
+ nodes := initNodes(t, 2, func(n *harness.Node) {
+ n.SetIPFSConfig("Provider.Enabled", false)
+ })
+ defer nodes.StopDaemons()
+
+ cid := nodes[0].IPFSAddStr(time.Now().String())
+ res := nodes[0].RunIPFS("routing", "provide", cid)
+ assert.Contains(t, res.Stderr.Trimmed(), "invalid configuration: Provider.Enabled is set to 'false'")
+ assert.Equal(t, 1, res.ExitCode())
+
+ expectNoProviders(t, cid, nodes[1:]...)
+ })
+
+ // Right now Provide and Reprovide are tied together
+ t.Run("Reprovide.Interval=0 disables announcement of new CID too", func(t *testing.T) {
+ t.Parallel()
+
+ nodes := initNodes(t, 2, func(n *harness.Node) {
+ n.SetIPFSConfig("Reprovider.Interval", "0")
+ })
+ defer nodes.StopDaemons()
+
+ cid := nodes[0].IPFSAddStr(time.Now().String())
+ expectNoProviders(t, cid, nodes[1:]...)
+ })
+
+ // It is a lesser evil - forces users to fix their config and have some sort of interval
+ t.Run("Manual Reprovider trigger does not work when periodic Reprovider is disabled", func(t *testing.T) {
+ t.Parallel()
+
+ nodes := initNodes(t, 2, func(n *harness.Node) {
+ n.SetIPFSConfig("Reprovider.Interval", "0")
+ })
+ defer nodes.StopDaemons()
+
+ cid := nodes[0].IPFSAddStr(time.Now().String(), "--offline")
+
+ expectNoProviders(t, cid, nodes[1:]...)
+
+ res := nodes[0].RunIPFS("routing", "reprovide")
+ assert.Contains(t, res.Stderr.Trimmed(), "invalid configuration: Reprovider.Interval is set to '0'")
+ assert.Equal(t, 1, res.ExitCode())
+
+ expectNoProviders(t, cid, nodes[1:]...)
+ })
+
+ // It is a lesser evil - forces users to fix their config and have some sort of interval
+ t.Run("Manual Reprovider trigger does not work when Provider system is disabled", func(t *testing.T) {
+ t.Parallel()
+
+ nodes := initNodes(t, 2, func(n *harness.Node) {
+ n.SetIPFSConfig("Provider.Enabled", false)
+ })
+ defer nodes.StopDaemons()
+
+ cid := nodes[0].IPFSAddStr(time.Now().String(), "--offline")
+
+ expectNoProviders(t, cid, nodes[1:]...)
+
+ res := nodes[0].RunIPFS("routing", "reprovide")
+ assert.Contains(t, res.Stderr.Trimmed(), "invalid configuration: Provider.Enabled is set to 'false'")
+ assert.Equal(t, 1, res.ExitCode())
+
+ expectNoProviders(t, cid, nodes[1:]...)
+ })
+
t.Run("Reprovides with 'all' strategy", func(t *testing.T) {
t.Parallel()
@@ -149,20 +219,4 @@ func TestProvider(t *testing.T) {
expectProviders(t, cidBarDir, nodes[0].PeerID().String(), nodes[1:]...)
})
- t.Run("Providing works without ticking", func(t *testing.T) {
- t.Parallel()
-
- nodes := initNodes(t, 2, func(n *harness.Node) {
- n.SetIPFSConfig("Reprovider.Interval", "0")
- })
- defer nodes.StopDaemons()
-
- cid := nodes[0].IPFSAddStr(time.Now().String(), "--offline")
-
- expectNoProviders(t, cid, nodes[1:]...)
-
- nodes[0].IPFS("routing", "reprovide")
-
- expectProviders(t, cid, nodes[0].PeerID().String(), nodes[1:]...)
- })
}
From f84fb2849bb64df667dd65c1912a0e691001ea06 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Thu, 15 May 2025 23:43:43 +0200
Subject: [PATCH 236/499] fix(fuse): ipns error handling and friendly errors
(#10807)
* fix(fusei/ux): check if paths exist, print err
* fix(fuse): ipns 'could not resolve'
error type changed when code got extracted to boxo, but it was not
caught because of FUSE tests do not cover IPNS in online mode
Closes #8095
Closes #2167
Closes #3013
* docs: clarify opt-in
---
cmd/ipfs/kubo/daemon.go | 29 +++++++++++++++++++++++++++++
docs/config.md | 5 ++++-
fuse/ipns/ipns_unix.go | 3 ++-
3 files changed, 35 insertions(+), 2 deletions(-)
diff --git a/cmd/ipfs/kubo/daemon.go b/cmd/ipfs/kubo/daemon.go
index 5cdf3fa1d..94b633f79 100644
--- a/cmd/ipfs/kubo/daemon.go
+++ b/cmd/ipfs/kubo/daemon.go
@@ -1065,16 +1065,25 @@ func mountFuse(req *cmds.Request, cctx *oldcmds.Context) error {
if !found {
fsdir = cfg.Mounts.IPFS
}
+ if err := checkFusePath("Mounts.IPFS", fsdir); err != nil {
+ return err
+ }
nsdir, found := req.Options[ipnsMountKwd].(string)
if !found {
nsdir = cfg.Mounts.IPNS
}
+ if err := checkFusePath("Mounts.IPNS", nsdir); err != nil {
+ return err
+ }
mfsdir, found := req.Options[mfsMountKwd].(string)
if !found {
mfsdir = cfg.Mounts.MFS
}
+ if err := checkFusePath("Mounts.MFS", mfsdir); err != nil {
+ return err
+ }
node, err := cctx.ConstructNode()
if err != nil {
@@ -1091,6 +1100,26 @@ func mountFuse(req *cmds.Request, cctx *oldcmds.Context) error {
return nil
}
+func checkFusePath(name, path string) error {
+ if path == "" {
+ return fmt.Errorf("%s path cannot be empty", name)
+ }
+
+ fileInfo, err := os.Stat(path)
+ if err != nil {
+ if os.IsNotExist(err) {
+ return fmt.Errorf("%s path (%q) does not exist: %w", name, path, err)
+ }
+ return fmt.Errorf("error while inspecting %s path (%q): %w", name, path, err)
+ }
+
+ if !fileInfo.IsDir() {
+ return fmt.Errorf("%s path (%q) is not a directory", name, path)
+ }
+
+ return nil
+}
+
func maybeRunGC(req *cmds.Request, node *core.IpfsNode) (<-chan error, error) {
enableGC, _ := req.Options[enableGCKwd].(bool)
if !enableGC {
diff --git a/docs/config.md b/docs/config.md
index 4b8d66ac0..e40ac5887 100644
--- a/docs/config.md
+++ b/docs/config.md
@@ -1373,7 +1373,10 @@ Default: `cache`
## `Mounts`
> [!CAUTION]
-> **EXPERIMENTAL:** read about current limitations at [fuse.md](./fuse.md).
+> **EXPERIMENTAL:**
+> This feature is disabled by default, requires an explicit opt-in with `ipfs mount` or `ipfs daemon --mount`.
+>
+> Read about current limitations at [fuse.md](./fuse.md).
FUSE mount point configuration options.
diff --git a/fuse/ipns/ipns_unix.go b/fuse/ipns/ipns_unix.go
index 23704cabd..ea2e75301 100644
--- a/fuse/ipns/ipns_unix.go
+++ b/fuse/ipns/ipns_unix.go
@@ -16,6 +16,7 @@ import (
dag "github.com/ipfs/boxo/ipld/merkledag"
ft "github.com/ipfs/boxo/ipld/unixfs"
+ "github.com/ipfs/boxo/namesys"
"github.com/ipfs/boxo/path"
fuse "bazil.org/fuse"
@@ -95,7 +96,7 @@ func loadRoot(ctx context.Context, ipfs iface.CoreAPI, key iface.Key) (*mfs.Root
node, err := ipfs.ResolveNode(ctx, key.Path())
switch err {
case nil:
- case iface.ErrResolveFailed:
+ case namesys.ErrResolveFailed:
node = ft.EmptyDirNode()
default:
log.Errorf("looking up %s: %s", key.Path(), err)
From 8bdbcbf9c2af56862218c4e58eb78507eca32dcf Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Thu, 15 May 2025 23:43:43 +0200
Subject: [PATCH 237/499] fix(fuse): ipns error handling and friendly errors
(#10807)
* fix(fusei/ux): check if paths exist, print err
* fix(fuse): ipns 'could not resolve'
error type changed when code got extracted to boxo, but it was not
caught because of FUSE tests do not cover IPNS in online mode
Closes #8095
Closes #2167
Closes #3013
* docs: clarify opt-in
(cherry picked from commit f84fb2849bb64df667dd65c1912a0e691001ea06)
---
cmd/ipfs/kubo/daemon.go | 29 +++++++++++++++++++++++++++++
docs/config.md | 5 ++++-
fuse/ipns/ipns_unix.go | 3 ++-
3 files changed, 35 insertions(+), 2 deletions(-)
diff --git a/cmd/ipfs/kubo/daemon.go b/cmd/ipfs/kubo/daemon.go
index 5cdf3fa1d..94b633f79 100644
--- a/cmd/ipfs/kubo/daemon.go
+++ b/cmd/ipfs/kubo/daemon.go
@@ -1065,16 +1065,25 @@ func mountFuse(req *cmds.Request, cctx *oldcmds.Context) error {
if !found {
fsdir = cfg.Mounts.IPFS
}
+ if err := checkFusePath("Mounts.IPFS", fsdir); err != nil {
+ return err
+ }
nsdir, found := req.Options[ipnsMountKwd].(string)
if !found {
nsdir = cfg.Mounts.IPNS
}
+ if err := checkFusePath("Mounts.IPNS", nsdir); err != nil {
+ return err
+ }
mfsdir, found := req.Options[mfsMountKwd].(string)
if !found {
mfsdir = cfg.Mounts.MFS
}
+ if err := checkFusePath("Mounts.MFS", mfsdir); err != nil {
+ return err
+ }
node, err := cctx.ConstructNode()
if err != nil {
@@ -1091,6 +1100,26 @@ func mountFuse(req *cmds.Request, cctx *oldcmds.Context) error {
return nil
}
+func checkFusePath(name, path string) error {
+ if path == "" {
+ return fmt.Errorf("%s path cannot be empty", name)
+ }
+
+ fileInfo, err := os.Stat(path)
+ if err != nil {
+ if os.IsNotExist(err) {
+ return fmt.Errorf("%s path (%q) does not exist: %w", name, path, err)
+ }
+ return fmt.Errorf("error while inspecting %s path (%q): %w", name, path, err)
+ }
+
+ if !fileInfo.IsDir() {
+ return fmt.Errorf("%s path (%q) is not a directory", name, path)
+ }
+
+ return nil
+}
+
func maybeRunGC(req *cmds.Request, node *core.IpfsNode) (<-chan error, error) {
enableGC, _ := req.Options[enableGCKwd].(bool)
if !enableGC {
diff --git a/docs/config.md b/docs/config.md
index 4b8d66ac0..e40ac5887 100644
--- a/docs/config.md
+++ b/docs/config.md
@@ -1373,7 +1373,10 @@ Default: `cache`
## `Mounts`
> [!CAUTION]
-> **EXPERIMENTAL:** read about current limitations at [fuse.md](./fuse.md).
+> **EXPERIMENTAL:**
+> This feature is disabled by default, requires an explicit opt-in with `ipfs mount` or `ipfs daemon --mount`.
+>
+> Read about current limitations at [fuse.md](./fuse.md).
FUSE mount point configuration options.
diff --git a/fuse/ipns/ipns_unix.go b/fuse/ipns/ipns_unix.go
index 23704cabd..ea2e75301 100644
--- a/fuse/ipns/ipns_unix.go
+++ b/fuse/ipns/ipns_unix.go
@@ -16,6 +16,7 @@ import (
dag "github.com/ipfs/boxo/ipld/merkledag"
ft "github.com/ipfs/boxo/ipld/unixfs"
+ "github.com/ipfs/boxo/namesys"
"github.com/ipfs/boxo/path"
fuse "bazil.org/fuse"
@@ -95,7 +96,7 @@ func loadRoot(ctx context.Context, ipfs iface.CoreAPI, key iface.Key) (*mfs.Root
node, err := ipfs.ResolveNode(ctx, key.Path())
switch err {
case nil:
- case iface.ErrResolveFailed:
+ case namesys.ErrResolveFailed:
node = ft.EmptyDirNode()
default:
log.Errorf("looking up %s: %s", key.Path(), err)
From 623902ebf27a63e493b93877b9ade50c660f939d Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Thu, 15 May 2025 23:47:38 +0200
Subject: [PATCH 238/499] chore(version): 0.35.0-rc2
---
version.go | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/version.go b/version.go
index df548748d..1b9b7e056 100644
--- a/version.go
+++ b/version.go
@@ -11,7 +11,7 @@ import (
var CurrentCommit string
// CurrentVersionNumber is the current application's version literal.
-const CurrentVersionNumber = "0.35.0-rc1"
+const CurrentVersionNumber = "0.35.0-rc2"
const ApiVersion = "/kubo/" + CurrentVersionNumber + "/" //nolint
From 20d9660a64f3e02bbed858edac83b25f51098b5a Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Mon, 19 May 2025 13:04:05 -0700
Subject: [PATCH 239/499] chore: use go-log/v2 (#10801)
* chore: update to go-log/v2
go-log v2 has been out for quite a while now and it is time to deprecate v1.
Replace all use of go-log with go-log/v2
Makes /api/v0/log/tail useful over HTTP
Updates dependencies that have moved to go-lov/v2
Removes support for ContextWithLoggable as this is not needed for tracing-like functionality
- Replaces: PR #8765
- Closes issue #8753
- Closes issue #9245
- Closes issue #10809
Other fixes:
* update go-ipfs-cmds
* update http logs test
* fix test
* Read/send one line of log data at a time
* Update -log-level docs
---
cmd/ipfs/kubo/pinmfs.go | 6 +-
cmd/ipfs/kubo/start.go | 16 +----
cmd/ipfs/util/ulimit.go | 2 +-
commands/context.go | 2 +-
core/commands/cmdenv/env.go | 2 +-
core/commands/files.go | 2 +-
core/commands/log.go | 42 +++++++++---
core/commands/name/ipns.go | 2 +-
core/commands/pin/remotepin.go | 2 +-
core/commands/root.go | 2 +-
core/core.go | 2 +-
core/corehttp/corehttp.go | 2 +-
core/corehttp/logs.go | 95 ++++++++++++++------------
core/corerepo/gc.go | 2 +-
core/coreunix/add.go | 2 +-
core/node/groups.go | 2 +-
core/node/libp2p/addrs.go | 2 +-
core/node/libp2p/libp2p.go | 2 +-
docs/changelogs/v0.36.md | 34 +++++++++
docs/examples/kubo-as-a-library/go.mod | 20 +++---
docs/examples/kubo-as-a-library/go.sum | 44 ++++++------
fuse/ipns/ipns_unix.go | 2 +-
fuse/mount/mount.go | 2 +-
fuse/node/mount_unix.go | 2 +-
fuse/readonly/readonly_unix.go | 2 +-
gc/gc.go | 2 +-
go.mod | 30 ++++----
go.sum | 64 ++++++++---------
p2p/p2p.go | 2 +-
plugin/loader/loader.go | 2 +-
plugin/plugins/fxtest/fxtest.go | 2 +-
plugin/plugins/peerlog/peerlog.go | 2 +-
profile/profile.go | 2 +-
repo/fsrepo/fsrepo.go | 2 +-
routing/delegated.go | 2 +-
test/cli/gateway_test.go | 70 ++++++++++++-------
test/dependencies/go.mod | 22 +++---
test/dependencies/go.sum | 44 ++++++------
test/integration/addcat_test.go | 2 +-
39 files changed, 303 insertions(+), 238 deletions(-)
create mode 100644 docs/changelogs/v0.36.md
diff --git a/cmd/ipfs/kubo/pinmfs.go b/cmd/ipfs/kubo/pinmfs.go
index 96ab4d861..a210f1b63 100644
--- a/cmd/ipfs/kubo/pinmfs.go
+++ b/cmd/ipfs/kubo/pinmfs.go
@@ -6,16 +6,14 @@ import (
"os"
"time"
- "github.com/libp2p/go-libp2p/core/host"
- peer "github.com/libp2p/go-libp2p/core/peer"
-
pinclient "github.com/ipfs/boxo/pinning/remote/client"
cid "github.com/ipfs/go-cid"
ipld "github.com/ipfs/go-ipld-format"
logging "github.com/ipfs/go-log/v2"
-
config "github.com/ipfs/kubo/config"
"github.com/ipfs/kubo/core"
+ "github.com/libp2p/go-libp2p/core/host"
+ peer "github.com/libp2p/go-libp2p/core/peer"
)
// mfslog is the logger for remote mfs pinning.
diff --git a/cmd/ipfs/kubo/start.go b/cmd/ipfs/kubo/start.go
index 5d8447a10..19a88f37c 100644
--- a/cmd/ipfs/kubo/start.go
+++ b/cmd/ipfs/kubo/start.go
@@ -16,12 +16,11 @@ import (
"time"
"github.com/blang/semver/v4"
- "github.com/google/uuid"
u "github.com/ipfs/boxo/util"
cmds "github.com/ipfs/go-ipfs-cmds"
"github.com/ipfs/go-ipfs-cmds/cli"
cmdhttp "github.com/ipfs/go-ipfs-cmds/http"
- logging "github.com/ipfs/go-log"
+ logging "github.com/ipfs/go-log/v2"
ipfs "github.com/ipfs/kubo"
"github.com/ipfs/kubo/client/rpc/auth"
"github.com/ipfs/kubo/cmd/ipfs/util"
@@ -89,16 +88,6 @@ func printErr(err error) int {
return 1
}
-func newUUID(key string) logging.Metadata {
- ids := "#UUID-ERROR#"
- if id, err := uuid.NewRandom(); err == nil {
- ids = id.String()
- }
- return logging.Metadata{
- key: ids,
- }
-}
-
func BuildDefaultEnv(ctx context.Context, req *cmds.Request) (cmds.Environment, error) {
return BuildEnv(nil)(ctx, req)
}
@@ -157,8 +146,7 @@ func BuildEnv(pl PluginPreloader) func(ctx context.Context, req *cmds.Request) (
// - output the response
// - if anything fails, print error, maybe with help.
func Start(buildEnv func(ctx context.Context, req *cmds.Request) (cmds.Environment, error)) (exitCode int) {
- ctx := logging.ContextWithLoggable(context.Background(), newUUID("session"))
-
+ ctx := context.Background()
tp, err := tracing.NewTracerProvider(ctx)
if err != nil {
return printErr(err)
diff --git a/cmd/ipfs/util/ulimit.go b/cmd/ipfs/util/ulimit.go
index 188444d67..9f58007c9 100644
--- a/cmd/ipfs/util/ulimit.go
+++ b/cmd/ipfs/util/ulimit.go
@@ -6,7 +6,7 @@ import (
"strconv"
"syscall"
- logging "github.com/ipfs/go-log"
+ logging "github.com/ipfs/go-log/v2"
)
var log = logging.Logger("ulimit")
diff --git a/commands/context.go b/commands/context.go
index cc95d55f4..ca425acbf 100644
--- a/commands/context.go
+++ b/commands/context.go
@@ -11,7 +11,7 @@ import (
loader "github.com/ipfs/kubo/plugin/loader"
cmds "github.com/ipfs/go-ipfs-cmds"
- logging "github.com/ipfs/go-log"
+ logging "github.com/ipfs/go-log/v2"
config "github.com/ipfs/kubo/config"
coreiface "github.com/ipfs/kubo/core/coreiface"
options "github.com/ipfs/kubo/core/coreiface/options"
diff --git a/core/commands/cmdenv/env.go b/core/commands/cmdenv/env.go
index fb538dc12..06bccb0ef 100644
--- a/core/commands/cmdenv/env.go
+++ b/core/commands/cmdenv/env.go
@@ -9,7 +9,7 @@ import (
"github.com/ipfs/kubo/core"
cmds "github.com/ipfs/go-ipfs-cmds"
- logging "github.com/ipfs/go-log"
+ logging "github.com/ipfs/go-log/v2"
coreiface "github.com/ipfs/kubo/core/coreiface"
options "github.com/ipfs/kubo/core/coreiface/options"
)
diff --git a/core/commands/files.go b/core/commands/files.go
index 5c32312ff..eb10a9bc7 100644
--- a/core/commands/files.go
+++ b/core/commands/files.go
@@ -28,7 +28,7 @@ import (
cidenc "github.com/ipfs/go-cidutil/cidenc"
cmds "github.com/ipfs/go-ipfs-cmds"
ipld "github.com/ipfs/go-ipld-format"
- logging "github.com/ipfs/go-log"
+ logging "github.com/ipfs/go-log/v2"
iface "github.com/ipfs/kubo/core/coreiface"
mh "github.com/multiformats/go-multihash"
)
diff --git a/core/commands/log.go b/core/commands/log.go
index a9af0c2f3..81427aa13 100644
--- a/core/commands/log.go
+++ b/core/commands/log.go
@@ -5,8 +5,7 @@ import (
"io"
cmds "github.com/ipfs/go-ipfs-cmds"
- logging "github.com/ipfs/go-log"
- lwriter "github.com/ipfs/go-log/writer"
+ logging "github.com/ipfs/go-log/v2"
)
// Golang os.Args overrides * and replaces the character argument with
@@ -104,25 +103,46 @@ subsystems of a running daemon.
Type: stringList{},
}
+const logLevelOption = "log-level"
+
var logTailCmd = &cmds.Command{
Status: cmds.Experimental,
Helptext: cmds.HelpText{
- Tagline: "Read the event log.",
+ Tagline: "Read and outpt log messages.",
ShortDescription: `
-Outputs event log messages (not other log messages) as they are generated.
+Outputs log messages as they are generated.
-Currently broken. Follow https://github.com/ipfs/kubo/issues/9245 for updates.
+NOTE: --log-level requires the server to be logging at least at this level
+
+Example:
+
+ GOLOG_LOG_LEVEL="error,bitswap=debug" ipfs daemon
+ ipfs log tail --log-level info
+
+This will only return 'info' logs from bitswap and skip 'debug'.
`,
},
+ Options: []cmds.Option{
+ cmds.StringOption(logLevelOption, "Log level to listen to.").WithDefault(""),
+ },
Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
- ctx := req.Context
- r, w := io.Pipe()
+ var pipeReader *logging.PipeReader
+ logLevelString, _ := req.Options[logLevelOption].(string)
+ if logLevelString != "" {
+ logLevel, err := logging.LevelFromString(logLevelString)
+ if err != nil {
+ return fmt.Errorf("setting log level %s: %w", logLevelString, err)
+ }
+ pipeReader = logging.NewPipeReader(logging.PipeLevel(logLevel))
+ } else {
+ pipeReader = logging.NewPipeReader()
+ }
+
go func() {
- defer w.Close()
- <-ctx.Done()
+ <-req.Context.Done()
+ pipeReader.Close()
}()
- lwriter.WriterGroup.AddWriter(w)
- return res.Emit(r)
+ return res.Emit(pipeReader)
},
}
diff --git a/core/commands/name/ipns.go b/core/commands/name/ipns.go
index 92cbb59a3..e9d5c4426 100644
--- a/core/commands/name/ipns.go
+++ b/core/commands/name/ipns.go
@@ -10,7 +10,7 @@ import (
"github.com/ipfs/boxo/namesys"
"github.com/ipfs/boxo/path"
cmds "github.com/ipfs/go-ipfs-cmds"
- logging "github.com/ipfs/go-log"
+ logging "github.com/ipfs/go-log/v2"
cmdenv "github.com/ipfs/kubo/core/commands/cmdenv"
options "github.com/ipfs/kubo/core/coreiface/options"
)
diff --git a/core/commands/pin/remotepin.go b/core/commands/pin/remotepin.go
index 8f6dafc22..068d15d0b 100644
--- a/core/commands/pin/remotepin.go
+++ b/core/commands/pin/remotepin.go
@@ -18,7 +18,7 @@ import (
pinclient "github.com/ipfs/boxo/pinning/remote/client"
cid "github.com/ipfs/go-cid"
cmds "github.com/ipfs/go-ipfs-cmds"
- logging "github.com/ipfs/go-log"
+ logging "github.com/ipfs/go-log/v2"
config "github.com/ipfs/kubo/config"
"github.com/ipfs/kubo/core/commands/cmdenv"
"github.com/ipfs/kubo/core/commands/cmdutils"
diff --git a/core/commands/root.go b/core/commands/root.go
index d062e75b4..80c2309df 100644
--- a/core/commands/root.go
+++ b/core/commands/root.go
@@ -10,7 +10,7 @@ import (
"github.com/ipfs/kubo/core/commands/pin"
cmds "github.com/ipfs/go-ipfs-cmds"
- logging "github.com/ipfs/go-log"
+ logging "github.com/ipfs/go-log/v2"
)
var log = logging.Logger("core/commands")
diff --git a/core/core.go b/core/core.go
index 3440895e7..186da1f09 100644
--- a/core/core.go
+++ b/core/core.go
@@ -28,7 +28,7 @@ import (
pathresolver "github.com/ipfs/boxo/path/resolver"
provider "github.com/ipfs/boxo/provider"
ipld "github.com/ipfs/go-ipld-format"
- logging "github.com/ipfs/go-log"
+ logging "github.com/ipfs/go-log/v2"
goprocess "github.com/jbenet/goprocess"
ddht "github.com/libp2p/go-libp2p-kad-dht/dual"
pubsub "github.com/libp2p/go-libp2p-pubsub"
diff --git a/core/corehttp/corehttp.go b/core/corehttp/corehttp.go
index 6a9f43b51..595a0aa5f 100644
--- a/core/corehttp/corehttp.go
+++ b/core/corehttp/corehttp.go
@@ -11,7 +11,7 @@ import (
"net/http"
"time"
- logging "github.com/ipfs/go-log"
+ logging "github.com/ipfs/go-log/v2"
core "github.com/ipfs/kubo/core"
"github.com/jbenet/goprocess"
periodicproc "github.com/jbenet/goprocess/periodic"
diff --git a/core/corehttp/logs.go b/core/corehttp/logs.go
index 944e62c5b..fbdc94f6f 100644
--- a/core/corehttp/logs.go
+++ b/core/corehttp/logs.go
@@ -1,57 +1,68 @@
package corehttp
import (
- "io"
+ "bufio"
+ "fmt"
"net"
"net/http"
- lwriter "github.com/ipfs/go-log/writer"
+ logging "github.com/ipfs/go-log/v2"
core "github.com/ipfs/kubo/core"
)
-type writeErrNotifier struct {
- w io.Writer
- errs chan error
-}
-
-func newWriteErrNotifier(w io.Writer) (io.WriteCloser, <-chan error) {
- ch := make(chan error, 1)
- return &writeErrNotifier{
- w: w,
- errs: ch,
- }, ch
-}
-
-func (w *writeErrNotifier) Write(b []byte) (int, error) {
- n, err := w.w.Write(b)
- if err != nil {
- select {
- case w.errs <- err:
- default:
- }
- }
- if f, ok := w.w.(http.Flusher); ok {
- f.Flush()
- }
- return n, err
-}
-
-func (w *writeErrNotifier) Close() error {
- select {
- case w.errs <- io.EOF:
- default:
- }
- return nil
-}
-
func LogOption() ServeOption {
return func(n *core.IpfsNode, _ net.Listener, mux *http.ServeMux) (*http.ServeMux, error) {
mux.HandleFunc("/logs", func(w http.ResponseWriter, r *http.Request) {
- w.WriteHeader(200)
- wnf, errs := newWriteErrNotifier(w)
- lwriter.WriterGroup.AddWriter(wnf)
- log.Event(n.Context(), "log API client connected") //nolint deprecated
- <-errs
+ // The log data comes from an io.Reader, and we need to constantly
+ // read from it and then write to the HTTP response.
+ pipeReader := logging.NewPipeReader()
+ done := make(chan struct{})
+
+ // Close the pipe reader if the request context is canceled. This
+ // is necessary to avoiding blocking on reading from the pipe
+ // reader when the client terminates the request.
+ go func() {
+ select {
+ case <-r.Context().Done(): // Client canceled request
+ case <-n.Context().Done(): // Node shutdown
+ case <-done: // log reader goroutine exitex
+ }
+ pipeReader.Close()
+ }()
+
+ errs := make(chan error, 1)
+
+ go func() {
+ defer close(errs)
+ defer close(done)
+
+ rdr := bufio.NewReader(pipeReader)
+ for {
+ // Read a line of log data and send it to the client.
+ line, err := rdr.ReadString('\n')
+ if err != nil {
+ errs <- fmt.Errorf("error reading log message: %s", err)
+ return
+ }
+ _, err = w.Write([]byte(line))
+ if err != nil {
+ // Failed to write to client, probably disconnected.
+ return
+ }
+ if f, ok := w.(http.Flusher); ok {
+ f.Flush()
+ }
+ if r.Context().Err() != nil {
+ return
+ }
+ }
+ }()
+ log.Info("log API client connected")
+ err := <-errs
+ if err != nil {
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ return
+ }
})
return mux, nil
}
diff --git a/core/corerepo/gc.go b/core/corerepo/gc.go
index cf89587d6..bf285e3d9 100644
--- a/core/corerepo/gc.go
+++ b/core/corerepo/gc.go
@@ -13,7 +13,7 @@ import (
"github.com/dustin/go-humanize"
"github.com/ipfs/boxo/mfs"
"github.com/ipfs/go-cid"
- logging "github.com/ipfs/go-log"
+ logging "github.com/ipfs/go-log/v2"
)
var log = logging.Logger("corerepo")
diff --git a/core/coreunix/add.go b/core/coreunix/add.go
index d9dc555d2..eb6f25e0f 100644
--- a/core/coreunix/add.go
+++ b/core/coreunix/add.go
@@ -25,7 +25,7 @@ import (
pin "github.com/ipfs/boxo/pinning/pinner"
"github.com/ipfs/go-cid"
ipld "github.com/ipfs/go-ipld-format"
- logging "github.com/ipfs/go-log"
+ logging "github.com/ipfs/go-log/v2"
coreiface "github.com/ipfs/kubo/core/coreiface"
"github.com/ipfs/kubo/tracing"
diff --git a/core/node/groups.go b/core/node/groups.go
index 3a952ccfe..1794b74c3 100644
--- a/core/node/groups.go
+++ b/core/node/groups.go
@@ -13,7 +13,7 @@ import (
offline "github.com/ipfs/boxo/exchange/offline"
uio "github.com/ipfs/boxo/ipld/unixfs/io"
util "github.com/ipfs/boxo/util"
- "github.com/ipfs/go-log"
+ "github.com/ipfs/go-log/v2"
"github.com/ipfs/kubo/config"
"github.com/ipfs/kubo/core/node/libp2p"
"github.com/ipfs/kubo/p2p"
diff --git a/core/node/libp2p/addrs.go b/core/node/libp2p/addrs.go
index 8cc5287ec..91fae17c5 100644
--- a/core/node/libp2p/addrs.go
+++ b/core/node/libp2p/addrs.go
@@ -7,7 +7,7 @@ import (
"path/filepath"
"time"
- logging "github.com/ipfs/go-log"
+ logging "github.com/ipfs/go-log/v2"
version "github.com/ipfs/kubo"
"github.com/ipfs/kubo/config"
p2pforge "github.com/ipshipyard/p2p-forge/client"
diff --git a/core/node/libp2p/libp2p.go b/core/node/libp2p/libp2p.go
index e6977b061..1adced34f 100644
--- a/core/node/libp2p/libp2p.go
+++ b/core/node/libp2p/libp2p.go
@@ -8,7 +8,7 @@ import (
version "github.com/ipfs/kubo"
config "github.com/ipfs/kubo/config"
- logging "github.com/ipfs/go-log"
+ logging "github.com/ipfs/go-log/v2"
"github.com/libp2p/go-libp2p"
"github.com/libp2p/go-libp2p/core/crypto"
"github.com/libp2p/go-libp2p/core/peer"
diff --git a/docs/changelogs/v0.36.md b/docs/changelogs/v0.36.md
new file mode 100644
index 000000000..5cb9b66b5
--- /dev/null
+++ b/docs/changelogs/v0.36.md
@@ -0,0 +1,34 @@
+# Kubo changelog v0.36
+
+
+
+This release was brought to you by the [Shipyard](http://ipshipyard.com/) team.
+
+- [v0.36.0](#v0340)
+
+## v0.36.0
+
+- [Overview](#overview)
+- [๐ฆ Highlights](#-highlights)
+ - [Update go-log to v2](#update-go-log-to-v2)
+ - [๐ฆ๏ธ Important dependency updates](#-important-dependency-updates)
+- [๐ Changelog](#-changelog)
+- [๐จโ๐ฉโ๐งโ๐ฆ Contributors](#-contributors)
+
+### Overview
+
+### ๐ฆ Highlights
+
+#### Update go-log to v2
+
+go-log v2 has been out for quite a while now and it is time to deprecate v1.
+
+- Replace all use of `go-log` with `go-log/v2`
+- Makes `/api/v0/log/tail` useful over HTTP
+- Fixes `ipfs log tail`
+- Removes support for `ContextWithLoggable` as this is not needed for tracing-like functionality
+
+#### ๐ฆ๏ธ Important dependency updates
+
+### ๐ Changelog
+### ๐จโ๐ฉโ๐งโ๐ฆ Contributors
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index c4b559744..2fa9770c9 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -97,7 +97,7 @@ require (
github.com/ipfs/go-ipfs-redirects-file v0.1.2 // indirect
github.com/ipfs/go-ipfs-util v0.0.3 // indirect
github.com/ipfs/go-ipld-cbor v0.2.0 // indirect
- github.com/ipfs/go-ipld-format v0.6.0 // indirect
+ github.com/ipfs/go-ipld-format v0.6.1 // indirect
github.com/ipfs/go-ipld-git v0.1.1 // indirect
github.com/ipfs/go-ipld-legacy v0.2.1 // indirect
github.com/ipfs/go-log v1.0.5 // indirect
@@ -108,8 +108,8 @@ require (
github.com/ipfs/go-unixfsnode v1.10.0 // indirect
github.com/ipfs/go-verifcid v0.0.3 // indirect
github.com/ipld/go-car v0.6.2 // indirect
- github.com/ipld/go-car/v2 v2.14.2 // indirect
- github.com/ipld/go-codec-dagpb v1.6.0 // indirect
+ github.com/ipld/go-car/v2 v2.14.3 // indirect
+ github.com/ipld/go-codec-dagpb v1.7.0 // indirect
github.com/ipld/go-ipld-prime v0.21.0 // indirect
github.com/ipshipyard/p2p-forge v0.4.0 // indirect
github.com/jackpal/go-nat-pmp v1.0.2 // indirect
@@ -225,14 +225,14 @@ require (
go.uber.org/zap v1.27.0 // indirect
go.uber.org/zap/exp v0.3.0 // indirect
go4.org v0.0.0-20230225012048-214862532bf5 // indirect
- golang.org/x/crypto v0.37.0 // indirect
- golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect
+ golang.org/x/crypto v0.38.0 // indirect
+ golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect
golang.org/x/mod v0.24.0 // indirect
- golang.org/x/net v0.39.0 // indirect
- golang.org/x/sync v0.13.0 // indirect
+ golang.org/x/net v0.40.0 // indirect
+ golang.org/x/sync v0.14.0 // indirect
golang.org/x/sys v0.33.0 // indirect
- golang.org/x/text v0.24.0 // indirect
- golang.org/x/tools v0.32.0 // indirect
+ golang.org/x/text v0.25.0 // indirect
+ golang.org/x/tools v0.33.0 // indirect
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
gonum.org/v1/gonum v0.16.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20241007155032-5fefd90f89a9 // indirect
@@ -240,5 +240,5 @@ require (
google.golang.org/grpc v1.67.1 // indirect
google.golang.org/protobuf v1.36.6 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
- lukechampine.com/blake3 v1.4.0 // indirect
+ lukechampine.com/blake3 v1.4.1 // indirect
)
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index 29c11e008..4c89767e1 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -371,8 +371,8 @@ github.com/ipfs/go-ipfs-util v0.0.3 h1:2RFdGez6bu2ZlZdI+rWfIdbQb1KudQp3VGwPtdNCm
github.com/ipfs/go-ipfs-util v0.0.3/go.mod h1:LHzG1a0Ig4G+iZ26UUOMjHd+lfM84LZCrn17xAKWBvs=
github.com/ipfs/go-ipld-cbor v0.2.0 h1:VHIW3HVIjcMd8m4ZLZbrYpwjzqlVUfjLM7oK4T5/YF0=
github.com/ipfs/go-ipld-cbor v0.2.0/go.mod h1:Cp8T7w1NKcu4AQJLqK0tWpd1nkgTxEVB5C6kVpLW6/0=
-github.com/ipfs/go-ipld-format v0.6.0 h1:VEJlA2kQ3LqFSIm5Vu6eIlSxD/Ze90xtc4Meten1F5U=
-github.com/ipfs/go-ipld-format v0.6.0/go.mod h1:g4QVMTn3marU3qXchwjpKPKgJv+zF+OlaKMyhJ4LHPg=
+github.com/ipfs/go-ipld-format v0.6.1 h1:lQLmBM/HHbrXvjIkrydRXkn+gc0DE5xO5fqelsCKYOQ=
+github.com/ipfs/go-ipld-format v0.6.1/go.mod h1:8TOH1Hj+LFyqM2PjSqI2/ZnyO0KlfhHbJLkbxFa61hs=
github.com/ipfs/go-ipld-git v0.1.1 h1:TWGnZjS0htmEmlMFEkA3ogrNCqWjIxwr16x1OsdhG+Y=
github.com/ipfs/go-ipld-git v0.1.1/go.mod h1:+VyMqF5lMcJh4rwEppV0e6g4nCCHXThLYYDpKUkJubI=
github.com/ipfs/go-ipld-legacy v0.2.1 h1:mDFtrBpmU7b//LzLSypVrXsD8QxkEWxu5qVxN99/+tk=
@@ -389,18 +389,18 @@ github.com/ipfs/go-metrics-interface v0.3.0 h1:YwG7/Cy4R94mYDUuwsBfeziJCVm9pBMJ6
github.com/ipfs/go-metrics-interface v0.3.0/go.mod h1:OxxQjZDGocXVdyTPocns6cOLwHieqej/jos7H4POwoY=
github.com/ipfs/go-peertaskqueue v0.8.2 h1:PaHFRaVFdxQk1Qo3OKiHPYjmmusQy7gKQUaL8JDszAU=
github.com/ipfs/go-peertaskqueue v0.8.2/go.mod h1:L6QPvou0346c2qPJNiJa6BvOibxDfaiPlqHInmzg0FA=
-github.com/ipfs/go-test v0.2.1 h1:/D/a8xZ2JzkYqcVcV/7HYlCnc7bv/pKHQiX5TdClkPE=
-github.com/ipfs/go-test v0.2.1/go.mod h1:dzu+KB9cmWjuJnXFDYJwC25T3j1GcN57byN+ixmK39M=
+github.com/ipfs/go-test v0.2.2 h1:1yjYyfbdt1w93lVzde6JZ2einh3DIV40at4rVoyEcE8=
+github.com/ipfs/go-test v0.2.2/go.mod h1:cmLisgVwkdRCnKu/CFZOk2DdhOcwghr5GsHeqwexoRA=
github.com/ipfs/go-unixfsnode v1.10.0 h1:cZPUUcYjXw2kMOgx4THw2uouw/8TBpmzZpWtPINdLvk=
github.com/ipfs/go-unixfsnode v1.10.0/go.mod h1:hVbWqN38WOk7FHao2y0mQAwUHDq58m7plGd+W6GSq2M=
github.com/ipfs/go-verifcid v0.0.3 h1:gmRKccqhWDocCRkC+a59g5QW7uJw5bpX9HWBevXa0zs=
github.com/ipfs/go-verifcid v0.0.3/go.mod h1:gcCtGniVzelKrbk9ooUSX/pM3xlH73fZZJDzQJRvOUw=
github.com/ipld/go-car v0.6.2 h1:Hlnl3Awgnq8icK+ze3iRghk805lu8YNq3wlREDTF2qc=
github.com/ipld/go-car v0.6.2/go.mod h1:oEGXdwp6bmxJCZ+rARSkDliTeYnVzv3++eXajZ+Bmr8=
-github.com/ipld/go-car/v2 v2.14.2 h1:9ERr7KXpCC7If0rChZLhYDlyr6Bes6yRKPJnCO3hdHY=
-github.com/ipld/go-car/v2 v2.14.2/go.mod h1:0iPB/825lTZLU2zPK5bVTk/R3V2612E1VI279OGSXWA=
-github.com/ipld/go-codec-dagpb v1.6.0 h1:9nYazfyu9B1p3NAgfVdpRco3Fs2nFC72DqVsMj6rOcc=
-github.com/ipld/go-codec-dagpb v1.6.0/go.mod h1:ANzFhfP2uMJxRBr8CE+WQWs5UsNa0pYtmKZ+agnUw9s=
+github.com/ipld/go-car/v2 v2.14.3 h1:1Mhl82/ny8MVP+w1M4LXbj4j99oK3gnuZG2GmG1IhC8=
+github.com/ipld/go-car/v2 v2.14.3/go.mod h1:/vpSvPngOX8UnvmdFJ3o/mDgXa9LuyXsn7wxOzHDYQE=
+github.com/ipld/go-codec-dagpb v1.7.0 h1:hpuvQjCSVSLnTnHXn+QAMR0mLmb1gA6wl10LExo2Ts0=
+github.com/ipld/go-codec-dagpb v1.7.0/go.mod h1:rD3Zg+zub9ZnxcLwfol/OTQRVjaLzXypgy4UqHQvilM=
github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8=
github.com/ipld/go-ipld-prime v0.21.0 h1:n4JmcpOlPDIxBcY037SVfpd1G+Sj1nKZah0m6QH9C2E=
github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOanyMctpPjsvxQ=
@@ -892,8 +892,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
-golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE=
-golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc=
+golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8=
+golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -902,8 +902,8 @@ golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE
golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
-golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM=
-golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8=
+golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=
+golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -963,8 +963,8 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
-golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY=
-golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E=
+golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY=
+golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -983,8 +983,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610=
-golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
+golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=
+golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1054,8 +1054,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
-golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0=
-golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU=
+golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4=
+golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA=
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -1098,8 +1098,8 @@ golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4f
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
-golang.org/x/tools v0.32.0 h1:Q7N1vhpkQv7ybVzLFtTjvQya2ewbwNDZzUgfXGqtMWU=
-golang.org/x/tools v0.32.0/go.mod h1:ZxrU41P/wAbZD8EDa6dDCa6XfpkhJ7HFMjHJXfBDu8s=
+golang.org/x/tools v0.33.0 h1:4qz2S3zmRxbGIhDIAgjxvFutSvH5EfnsYrRBj0UI0bc=
+golang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -1204,8 +1204,8 @@ honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWh
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
-lukechampine.com/blake3 v1.4.0 h1:xDbKOZCVbnZsfzM6mHSYcGRHZ3YrLDzqz8XnV4uaD5w=
-lukechampine.com/blake3 v1.4.0/go.mod h1:MQJNQCTnR+kwOP/JEZSxj3MaQjp80FOFSNMMHXcSeX0=
+lukechampine.com/blake3 v1.4.1 h1:I3Smz7gso8w4/TunLKec6K2fn+kyKtDxr/xcQEN84Wg=
+lukechampine.com/blake3 v1.4.1/go.mod h1:QFosUxmjB8mnrWFSNwKmvxHpfY72bmD2tQ0kBMM3kwo=
pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw=
pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04=
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
diff --git a/fuse/ipns/ipns_unix.go b/fuse/ipns/ipns_unix.go
index ea2e75301..de475dd89 100644
--- a/fuse/ipns/ipns_unix.go
+++ b/fuse/ipns/ipns_unix.go
@@ -23,7 +23,7 @@ import (
fs "bazil.org/fuse/fs"
mfs "github.com/ipfs/boxo/mfs"
cid "github.com/ipfs/go-cid"
- logging "github.com/ipfs/go-log"
+ logging "github.com/ipfs/go-log/v2"
iface "github.com/ipfs/kubo/core/coreiface"
options "github.com/ipfs/kubo/core/coreiface/options"
)
diff --git a/fuse/mount/mount.go b/fuse/mount/mount.go
index a52374dd8..b9008bc46 100644
--- a/fuse/mount/mount.go
+++ b/fuse/mount/mount.go
@@ -8,7 +8,7 @@ import (
"runtime"
"time"
- logging "github.com/ipfs/go-log"
+ logging "github.com/ipfs/go-log/v2"
goprocess "github.com/jbenet/goprocess"
)
diff --git a/fuse/node/mount_unix.go b/fuse/node/mount_unix.go
index 9846d7a42..c628a85f4 100644
--- a/fuse/node/mount_unix.go
+++ b/fuse/node/mount_unix.go
@@ -15,7 +15,7 @@ import (
mount "github.com/ipfs/kubo/fuse/mount"
rofs "github.com/ipfs/kubo/fuse/readonly"
- logging "github.com/ipfs/go-log"
+ logging "github.com/ipfs/go-log/v2"
)
var log = logging.Logger("node")
diff --git a/fuse/readonly/readonly_unix.go b/fuse/readonly/readonly_unix.go
index 32be8b123..573e80e23 100644
--- a/fuse/readonly/readonly_unix.go
+++ b/fuse/readonly/readonly_unix.go
@@ -19,7 +19,7 @@ import (
"github.com/ipfs/boxo/path"
"github.com/ipfs/go-cid"
ipld "github.com/ipfs/go-ipld-format"
- logging "github.com/ipfs/go-log"
+ logging "github.com/ipfs/go-log/v2"
core "github.com/ipfs/kubo/core"
ipldprime "github.com/ipld/go-ipld-prime"
cidlink "github.com/ipld/go-ipld-prime/linking/cid"
diff --git a/gc/gc.go b/gc/gc.go
index 51df59e54..37daa887c 100644
--- a/gc/gc.go
+++ b/gc/gc.go
@@ -16,7 +16,7 @@ import (
cid "github.com/ipfs/go-cid"
dstore "github.com/ipfs/go-datastore"
ipld "github.com/ipfs/go-ipld-format"
- logging "github.com/ipfs/go-log"
+ logging "github.com/ipfs/go-log/v2"
)
var log = logging.Logger("gc")
diff --git a/go.mod b/go.mod
index 00121bc00..35e327e6c 100644
--- a/go.mod
+++ b/go.mod
@@ -33,20 +33,19 @@ require (
github.com/ipfs/go-ds-measure v0.2.2
github.com/ipfs/go-ds-pebble v0.5.0
github.com/ipfs/go-fs-lock v0.1.1
- github.com/ipfs/go-ipfs-cmds v0.14.1
+ github.com/ipfs/go-ipfs-cmds v0.15.0
github.com/ipfs/go-ipld-cbor v0.2.0
- github.com/ipfs/go-ipld-format v0.6.0
+ github.com/ipfs/go-ipld-format v0.6.1
github.com/ipfs/go-ipld-git v0.1.1
github.com/ipfs/go-ipld-legacy v0.2.1
- github.com/ipfs/go-log v1.0.5
github.com/ipfs/go-log/v2 v2.6.0
github.com/ipfs/go-metrics-interface v0.3.0
github.com/ipfs/go-metrics-prometheus v0.1.0
- github.com/ipfs/go-test v0.2.1
+ github.com/ipfs/go-test v0.2.2
github.com/ipfs/go-unixfsnode v1.10.0
github.com/ipld/go-car v0.6.2
- github.com/ipld/go-car/v2 v2.14.2
- github.com/ipld/go-codec-dagpb v1.6.0
+ github.com/ipld/go-car/v2 v2.14.3
+ github.com/ipld/go-codec-dagpb v1.7.0
github.com/ipld/go-ipld-prime v0.21.0
github.com/ipshipyard/p2p-forge v0.4.0
github.com/jbenet/go-temp-err-catcher v0.1.0
@@ -62,7 +61,7 @@ require (
github.com/libp2p/go-libp2p-record v0.3.1
github.com/libp2p/go-libp2p-routing-helpers v0.7.5
github.com/libp2p/go-libp2p-testing v0.12.0
- github.com/libp2p/go-socket-activation v0.1.0
+ github.com/libp2p/go-socket-activation v0.1.1
github.com/multiformats/go-multiaddr v0.15.0
github.com/multiformats/go-multiaddr-dns v0.4.1
github.com/multiformats/go-multibase v0.2.0
@@ -87,10 +86,10 @@ require (
go.uber.org/fx v1.23.0
go.uber.org/multierr v1.11.0
go.uber.org/zap v1.27.0
- golang.org/x/crypto v0.37.0
- golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0
+ golang.org/x/crypto v0.38.0
+ golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6
golang.org/x/mod v0.24.0
- golang.org/x/sync v0.13.0
+ golang.org/x/sync v0.14.0
golang.org/x/sys v0.33.0
google.golang.org/protobuf v1.36.6
)
@@ -160,6 +159,7 @@ require (
github.com/ipfs/go-ipfs-pq v0.0.3 // indirect
github.com/ipfs/go-ipfs-redirects-file v0.1.2 // indirect
github.com/ipfs/go-ipfs-util v0.0.3 // indirect
+ github.com/ipfs/go-log v1.0.5 // indirect
github.com/ipfs/go-merkledag v0.11.0 // indirect
github.com/ipfs/go-peertaskqueue v0.8.2 // indirect
github.com/ipfs/go-verifcid v0.0.3 // indirect
@@ -265,11 +265,11 @@ require (
go.uber.org/mock v0.5.0 // indirect
go.uber.org/zap/exp v0.3.0 // indirect
go4.org v0.0.0-20230225012048-214862532bf5 // indirect
- golang.org/x/net v0.39.0 // indirect
+ golang.org/x/net v0.40.0 // indirect
golang.org/x/oauth2 v0.25.0 // indirect
- golang.org/x/term v0.31.0 // indirect
- golang.org/x/text v0.24.0 // indirect
- golang.org/x/tools v0.32.0 // indirect
+ golang.org/x/term v0.32.0 // indirect
+ golang.org/x/text v0.25.0 // indirect
+ golang.org/x/tools v0.33.0 // indirect
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
gonum.org/v1/gonum v0.16.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20241007155032-5fefd90f89a9 // indirect
@@ -277,5 +277,5 @@ require (
google.golang.org/grpc v1.67.1 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
- lukechampine.com/blake3 v1.4.0 // indirect
+ lukechampine.com/blake3 v1.4.1 // indirect
)
diff --git a/go.sum b/go.sum
index 4db342507..f1bf3fa02 100644
--- a/go.sum
+++ b/go.sum
@@ -137,7 +137,6 @@ github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8Nz
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
-github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk=
github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk=
github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs=
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
@@ -414,8 +413,8 @@ github.com/ipfs/go-ipfs-blockstore v1.3.1 h1:cEI9ci7V0sRNivqaOr0elDsamxXFxJMMMy7
github.com/ipfs/go-ipfs-blockstore v1.3.1/go.mod h1:KgtZyc9fq+P2xJUiCAzbRdhhqJHvsw8u2Dlqy2MyRTE=
github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ=
github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk=
-github.com/ipfs/go-ipfs-cmds v0.14.1 h1:TA8vBixPwXL3k7VtcbX3r4FQgw2m+jMOWlslUOlM9Rs=
-github.com/ipfs/go-ipfs-cmds v0.14.1/go.mod h1:SCYxNUVPeVR05cE8DJ6wyH2+aQ8vPgjxxkxQWOXobzo=
+github.com/ipfs/go-ipfs-cmds v0.15.0 h1:nQDgKadrzyiFyYoZMARMIoVoSwe3gGTAfGvrWLeAQbQ=
+github.com/ipfs/go-ipfs-cmds v0.15.0/go.mod h1:VABf/mv/wqvYX6hLG6Z+40eNAEw3FQO0bSm370Or3Wk=
github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw=
github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1IeRQ=
github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw=
@@ -437,17 +436,15 @@ github.com/ipfs/go-ipfs-util v0.0.3 h1:2RFdGez6bu2ZlZdI+rWfIdbQb1KudQp3VGwPtdNCm
github.com/ipfs/go-ipfs-util v0.0.3/go.mod h1:LHzG1a0Ig4G+iZ26UUOMjHd+lfM84LZCrn17xAKWBvs=
github.com/ipfs/go-ipld-cbor v0.2.0 h1:VHIW3HVIjcMd8m4ZLZbrYpwjzqlVUfjLM7oK4T5/YF0=
github.com/ipfs/go-ipld-cbor v0.2.0/go.mod h1:Cp8T7w1NKcu4AQJLqK0tWpd1nkgTxEVB5C6kVpLW6/0=
-github.com/ipfs/go-ipld-format v0.6.0 h1:VEJlA2kQ3LqFSIm5Vu6eIlSxD/Ze90xtc4Meten1F5U=
-github.com/ipfs/go-ipld-format v0.6.0/go.mod h1:g4QVMTn3marU3qXchwjpKPKgJv+zF+OlaKMyhJ4LHPg=
+github.com/ipfs/go-ipld-format v0.6.1 h1:lQLmBM/HHbrXvjIkrydRXkn+gc0DE5xO5fqelsCKYOQ=
+github.com/ipfs/go-ipld-format v0.6.1/go.mod h1:8TOH1Hj+LFyqM2PjSqI2/ZnyO0KlfhHbJLkbxFa61hs=
github.com/ipfs/go-ipld-git v0.1.1 h1:TWGnZjS0htmEmlMFEkA3ogrNCqWjIxwr16x1OsdhG+Y=
github.com/ipfs/go-ipld-git v0.1.1/go.mod h1:+VyMqF5lMcJh4rwEppV0e6g4nCCHXThLYYDpKUkJubI=
github.com/ipfs/go-ipld-legacy v0.2.1 h1:mDFtrBpmU7b//LzLSypVrXsD8QxkEWxu5qVxN99/+tk=
github.com/ipfs/go-ipld-legacy v0.2.1/go.mod h1:782MOUghNzMO2DER0FlBR94mllfdCJCkTtDtPM51otM=
github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM=
-github.com/ipfs/go-log v1.0.3/go.mod h1:OsLySYkwIbiSUR/yBTdv1qPtcE4FW3WPWk/ewz9Ru+A=
github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8=
github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo=
-github.com/ipfs/go-log/v2 v2.0.3/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0=
github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g=
github.com/ipfs/go-log/v2 v2.6.0 h1:2Nu1KKQQ2ayonKp4MPo6pXCjqw1ULc9iohRqWV5EYqg=
github.com/ipfs/go-log/v2 v2.6.0/go.mod h1:p+Efr3qaY5YXpx9TX7MoLCSEZX5boSWj9wh86P5HJa8=
@@ -459,18 +456,18 @@ github.com/ipfs/go-metrics-prometheus v0.1.0 h1:bApWOHkrH3VTBHzTHrZSfq4n4weOZDzZ
github.com/ipfs/go-metrics-prometheus v0.1.0/go.mod h1:2GtL525C/4yxtvSXpRJ4dnE45mCX9AS0XRa03vHx7G0=
github.com/ipfs/go-peertaskqueue v0.8.2 h1:PaHFRaVFdxQk1Qo3OKiHPYjmmusQy7gKQUaL8JDszAU=
github.com/ipfs/go-peertaskqueue v0.8.2/go.mod h1:L6QPvou0346c2qPJNiJa6BvOibxDfaiPlqHInmzg0FA=
-github.com/ipfs/go-test v0.2.1 h1:/D/a8xZ2JzkYqcVcV/7HYlCnc7bv/pKHQiX5TdClkPE=
-github.com/ipfs/go-test v0.2.1/go.mod h1:dzu+KB9cmWjuJnXFDYJwC25T3j1GcN57byN+ixmK39M=
+github.com/ipfs/go-test v0.2.2 h1:1yjYyfbdt1w93lVzde6JZ2einh3DIV40at4rVoyEcE8=
+github.com/ipfs/go-test v0.2.2/go.mod h1:cmLisgVwkdRCnKu/CFZOk2DdhOcwghr5GsHeqwexoRA=
github.com/ipfs/go-unixfsnode v1.10.0 h1:cZPUUcYjXw2kMOgx4THw2uouw/8TBpmzZpWtPINdLvk=
github.com/ipfs/go-unixfsnode v1.10.0/go.mod h1:hVbWqN38WOk7FHao2y0mQAwUHDq58m7plGd+W6GSq2M=
github.com/ipfs/go-verifcid v0.0.3 h1:gmRKccqhWDocCRkC+a59g5QW7uJw5bpX9HWBevXa0zs=
github.com/ipfs/go-verifcid v0.0.3/go.mod h1:gcCtGniVzelKrbk9ooUSX/pM3xlH73fZZJDzQJRvOUw=
github.com/ipld/go-car v0.6.2 h1:Hlnl3Awgnq8icK+ze3iRghk805lu8YNq3wlREDTF2qc=
github.com/ipld/go-car v0.6.2/go.mod h1:oEGXdwp6bmxJCZ+rARSkDliTeYnVzv3++eXajZ+Bmr8=
-github.com/ipld/go-car/v2 v2.14.2 h1:9ERr7KXpCC7If0rChZLhYDlyr6Bes6yRKPJnCO3hdHY=
-github.com/ipld/go-car/v2 v2.14.2/go.mod h1:0iPB/825lTZLU2zPK5bVTk/R3V2612E1VI279OGSXWA=
-github.com/ipld/go-codec-dagpb v1.6.0 h1:9nYazfyu9B1p3NAgfVdpRco3Fs2nFC72DqVsMj6rOcc=
-github.com/ipld/go-codec-dagpb v1.6.0/go.mod h1:ANzFhfP2uMJxRBr8CE+WQWs5UsNa0pYtmKZ+agnUw9s=
+github.com/ipld/go-car/v2 v2.14.3 h1:1Mhl82/ny8MVP+w1M4LXbj4j99oK3gnuZG2GmG1IhC8=
+github.com/ipld/go-car/v2 v2.14.3/go.mod h1:/vpSvPngOX8UnvmdFJ3o/mDgXa9LuyXsn7wxOzHDYQE=
+github.com/ipld/go-codec-dagpb v1.7.0 h1:hpuvQjCSVSLnTnHXn+QAMR0mLmb1gA6wl10LExo2Ts0=
+github.com/ipld/go-codec-dagpb v1.7.0/go.mod h1:rD3Zg+zub9ZnxcLwfol/OTQRVjaLzXypgy4UqHQvilM=
github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8=
github.com/ipld/go-ipld-prime v0.21.0 h1:n4JmcpOlPDIxBcY037SVfpd1G+Sj1nKZah0m6QH9C2E=
github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOanyMctpPjsvxQ=
@@ -583,8 +580,8 @@ github.com/libp2p/go-openssl v0.0.3/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO
github.com/libp2p/go-openssl v0.0.4/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc=
github.com/libp2p/go-reuseport v0.4.0 h1:nR5KU7hD0WxXCJbmw7r2rhRYruNRl2koHw8fQscQm2s=
github.com/libp2p/go-reuseport v0.4.0/go.mod h1:ZtI03j/wO5hZVDFo2jKywN6bYKWLOy8Se6DrI2E1cLU=
-github.com/libp2p/go-socket-activation v0.1.0 h1:OImQPhtbGlCNaF/KSTl6pBBy+chA5eBt5i9uMJNtEdY=
-github.com/libp2p/go-socket-activation v0.1.0/go.mod h1:gzda2dNkMG5Ti2OfWNNwW0FDIbj0g/aJJU320FcLfhk=
+github.com/libp2p/go-socket-activation v0.1.1 h1:wkLBj6RqKffjt7BI794ewoSt241UV52NKYvIbpzhn4Q=
+github.com/libp2p/go-socket-activation v0.1.1/go.mod h1:NBfVUPXTRL/FU6UmSOM+1O7/vJkpS523sQiriw0Qln8=
github.com/libp2p/go-yamux/v5 v5.0.0 h1:2djUh96d3Jiac/JpGkKs4TO49YhsfLopAoryfPmf+Po=
github.com/libp2p/go-yamux/v5 v5.0.0/go.mod h1:en+3cdX51U0ZslwRdRLrvQsdayFt3TSUKvBGErzpWbU=
github.com/libp2p/zeroconf/v2 v2.2.0 h1:Cup06Jv6u81HLhIj1KasuNM/RHHrJ8T7wOTS4+Tv53Q=
@@ -653,7 +650,6 @@ github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a
github.com/multiformats/go-multiaddr v0.1.0/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44=
github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo=
github.com/multiformats/go-multiaddr v0.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4=
-github.com/multiformats/go-multiaddr v0.4.0/go.mod h1:YcpyLH8ZPudLxQlemYBPhSm0/oCXAT8Z4mzFpyoPyRc=
github.com/multiformats/go-multiaddr v0.15.0 h1:zB/HeaI/apcZiTDwhY5YqMvNVl/oQYvs3XySU+qeAVo=
github.com/multiformats/go-multiaddr v0.15.0/go.mod h1:JSVUmXDjsVFiW7RjIFMP7+Ev+h1DTbiJgVeTV/tcmP0=
github.com/multiformats/go-multiaddr-dns v0.4.1 h1:whi/uCLbDS3mSEUMb1MsoT4uzUeZB0N32yzufqS0i5M=
@@ -712,7 +708,6 @@ github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/
github.com/opencontainers/runtime-spec v1.2.0 h1:z97+pHb3uELt/yiAWD691HNHQIF07bE7dzrbT927iTk=
github.com/opencontainers/runtime-spec v1.2.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
-github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs=
github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8=
@@ -1014,7 +1009,6 @@ go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt
go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc=
go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0=
go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8=
-go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
@@ -1027,13 +1021,11 @@ go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU=
go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM=
-go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
-go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ=
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
@@ -1062,8 +1054,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
-golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE=
-golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc=
+golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8=
+golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -1074,8 +1066,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
-golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM=
-golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8=
+golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=
+golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -1152,8 +1144,8 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
-golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY=
-golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E=
+golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY=
+golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -1180,8 +1172,8 @@ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610=
-golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
+golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=
+golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1262,8 +1254,8 @@ golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU=
golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY=
-golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o=
-golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw=
+golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg=
+golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -1275,8 +1267,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
-golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0=
-golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU=
+golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4=
+golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA=
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -1336,8 +1328,8 @@ golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4f
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
-golang.org/x/tools v0.32.0 h1:Q7N1vhpkQv7ybVzLFtTjvQya2ewbwNDZzUgfXGqtMWU=
-golang.org/x/tools v0.32.0/go.mod h1:ZxrU41P/wAbZD8EDa6dDCa6XfpkhJ7HFMjHJXfBDu8s=
+golang.org/x/tools v0.33.0 h1:4qz2S3zmRxbGIhDIAgjxvFutSvH5EfnsYrRBj0UI0bc=
+golang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -1477,8 +1469,8 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
-lukechampine.com/blake3 v1.4.0 h1:xDbKOZCVbnZsfzM6mHSYcGRHZ3YrLDzqz8XnV4uaD5w=
-lukechampine.com/blake3 v1.4.0/go.mod h1:MQJNQCTnR+kwOP/JEZSxj3MaQjp80FOFSNMMHXcSeX0=
+lukechampine.com/blake3 v1.4.1 h1:I3Smz7gso8w4/TunLKec6K2fn+kyKtDxr/xcQEN84Wg=
+lukechampine.com/blake3 v1.4.1/go.mod h1:QFosUxmjB8mnrWFSNwKmvxHpfY72bmD2tQ0kBMM3kwo=
pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw=
pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04=
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
diff --git a/p2p/p2p.go b/p2p/p2p.go
index 1d0989421..1d14dfb80 100644
--- a/p2p/p2p.go
+++ b/p2p/p2p.go
@@ -1,7 +1,7 @@
package p2p
import (
- logging "github.com/ipfs/go-log"
+ logging "github.com/ipfs/go-log/v2"
p2phost "github.com/libp2p/go-libp2p/core/host"
"github.com/libp2p/go-libp2p/core/peer"
pstore "github.com/libp2p/go-libp2p/core/peerstore"
diff --git a/plugin/loader/loader.go b/plugin/loader/loader.go
index 4ea3ac226..624907614 100644
--- a/plugin/loader/loader.go
+++ b/plugin/loader/loader.go
@@ -18,7 +18,7 @@ import (
plugin "github.com/ipfs/kubo/plugin"
fsrepo "github.com/ipfs/kubo/repo/fsrepo"
- logging "github.com/ipfs/go-log"
+ logging "github.com/ipfs/go-log/v2"
opentracing "github.com/opentracing/opentracing-go"
)
diff --git a/plugin/plugins/fxtest/fxtest.go b/plugin/plugins/fxtest/fxtest.go
index 175dc6ec6..4205e3eb8 100644
--- a/plugin/plugins/fxtest/fxtest.go
+++ b/plugin/plugins/fxtest/fxtest.go
@@ -3,7 +3,7 @@ package fxtest
import (
"os"
- logging "github.com/ipfs/go-log"
+ logging "github.com/ipfs/go-log/v2"
"github.com/ipfs/kubo/core"
"github.com/ipfs/kubo/plugin"
"go.uber.org/fx"
diff --git a/plugin/plugins/peerlog/peerlog.go b/plugin/plugins/peerlog/peerlog.go
index 5aa11a6eb..822a636c8 100644
--- a/plugin/plugins/peerlog/peerlog.go
+++ b/plugin/plugins/peerlog/peerlog.go
@@ -5,7 +5,7 @@ import (
"sync/atomic"
"time"
- logging "github.com/ipfs/go-log"
+ logging "github.com/ipfs/go-log/v2"
core "github.com/ipfs/kubo/core"
plugin "github.com/ipfs/kubo/plugin"
event "github.com/libp2p/go-libp2p/core/event"
diff --git a/profile/profile.go b/profile/profile.go
index be1e5adbb..32df334e3 100644
--- a/profile/profile.go
+++ b/profile/profile.go
@@ -14,7 +14,7 @@ import (
"sync"
"time"
- "github.com/ipfs/go-log"
+ "github.com/ipfs/go-log/v2"
version "github.com/ipfs/kubo"
)
diff --git a/repo/fsrepo/fsrepo.go b/repo/fsrepo/fsrepo.go
index 609b988a6..7c3093b7a 100644
--- a/repo/fsrepo/fsrepo.go
+++ b/repo/fsrepo/fsrepo.go
@@ -22,7 +22,7 @@ import (
ds "github.com/ipfs/go-datastore"
measure "github.com/ipfs/go-ds-measure"
lockfile "github.com/ipfs/go-fs-lock"
- logging "github.com/ipfs/go-log"
+ logging "github.com/ipfs/go-log/v2"
config "github.com/ipfs/kubo/config"
serialize "github.com/ipfs/kubo/config/serialize"
"github.com/ipfs/kubo/misc/fsutil"
diff --git a/routing/delegated.go b/routing/delegated.go
index 420f30c83..fb89e8150 100644
--- a/routing/delegated.go
+++ b/routing/delegated.go
@@ -10,7 +10,7 @@ import (
drclient "github.com/ipfs/boxo/routing/http/client"
"github.com/ipfs/boxo/routing/http/contentrouter"
"github.com/ipfs/go-datastore"
- logging "github.com/ipfs/go-log"
+ logging "github.com/ipfs/go-log/v2"
version "github.com/ipfs/kubo"
"github.com/ipfs/kubo/config"
dht "github.com/libp2p/go-libp2p-kad-dht"
diff --git a/test/cli/gateway_test.go b/test/cli/gateway_test.go
index 0a10782f9..2d500c655 100644
--- a/test/cli/gateway_test.go
+++ b/test/cli/gateway_test.go
@@ -1,6 +1,7 @@
package cli
import (
+ "bufio"
"context"
"encoding/json"
"fmt"
@@ -11,6 +12,7 @@ import (
"strconv"
"strings"
"testing"
+ "time"
"github.com/ipfs/kubo/config"
"github.com/ipfs/kubo/test/cli/harness"
@@ -238,30 +240,6 @@ func TestGateway(t *testing.T) {
assert.Contains(t, []int{302, 301}, resp.StatusCode)
})
- t.Run("GET /logs returns logs", func(t *testing.T) {
- t.Parallel()
- apiClient := node.APIClient()
- reqURL := apiClient.BuildURL("/logs")
-
- ctx, cancel := context.WithCancel(context.Background())
- defer cancel()
-
- req, err := http.NewRequestWithContext(ctx, http.MethodGet, reqURL, nil)
- require.NoError(t, err)
-
- resp, err := apiClient.Client.Do(req)
- require.NoError(t, err)
- defer resp.Body.Close()
-
- // read the first line of the output and parse its JSON
- dec := json.NewDecoder(resp.Body)
- event := struct{ Event string }{}
- err = dec.Decode(&event)
- require.NoError(t, err)
-
- assert.Equal(t, "log API client connected", event.Event)
- })
-
t.Run("POST /api/v0/version succeeds", func(t *testing.T) {
t.Parallel()
resp := node.APIClient().Post("/api/v0/version", nil)
@@ -558,3 +536,47 @@ func TestGateway(t *testing.T) {
})
})
}
+
+// TestLogs tests that GET /logs returns log messages. This test is separate
+// because it requires setting the server's log level to "info" which may
+// change the output expected by other tests.
+func TestLogs(t *testing.T) {
+ h := harness.NewT(t)
+
+ t.Setenv("GOLOG_LOG_LEVEL", "info")
+
+ node := h.NewNode().Init().StartDaemon("--offline")
+ cid := node.IPFSAddStr("Hello Worlds!")
+
+ peerID, err := peer.ToCid(node.PeerID()).StringOfBase(multibase.Base36)
+ assert.NoError(t, err)
+
+ client := node.GatewayClient()
+ client.TemplateData = map[string]string{
+ "CID": cid,
+ "PeerID": peerID,
+ }
+
+ apiClient := node.APIClient()
+ reqURL := apiClient.BuildURL("/logs")
+
+ ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
+ defer cancel()
+
+ req, err := http.NewRequestWithContext(ctx, http.MethodGet, reqURL, nil)
+ require.NoError(t, err)
+
+ resp, err := apiClient.Client.Do(req)
+ require.NoError(t, err)
+ defer resp.Body.Close()
+
+ var found bool
+ scanner := bufio.NewScanner(resp.Body)
+ for scanner.Scan() {
+ if strings.Contains(scanner.Text(), "log API client connected") {
+ found = true
+ break
+ }
+ }
+ assert.True(t, found)
+}
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index 530e7c421..95a408150 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -9,7 +9,7 @@ require (
github.com/golangci/golangci-lint v1.60.2
github.com/ipfs/go-cidutil v0.1.0
github.com/ipfs/go-log/v2 v2.6.0
- github.com/ipfs/go-test v0.2.1
+ github.com/ipfs/go-test v0.2.2
github.com/ipfs/hang-fds v0.1.0
github.com/ipfs/iptb v1.4.1
github.com/ipfs/iptb-plugins v0.5.1
@@ -134,11 +134,11 @@ require (
github.com/ipfs/go-block-format v0.2.1 // indirect
github.com/ipfs/go-cid v0.5.0 // indirect
github.com/ipfs/go-datastore v0.8.2 // indirect
- github.com/ipfs/go-ipld-format v0.6.0 // indirect
+ github.com/ipfs/go-ipld-format v0.6.1 // indirect
github.com/ipfs/go-ipld-legacy v0.2.1 // indirect
github.com/ipfs/go-metrics-interface v0.3.0 // indirect
github.com/ipfs/kubo v0.31.0 // indirect
- github.com/ipld/go-codec-dagpb v1.6.0 // indirect
+ github.com/ipld/go-codec-dagpb v1.7.0 // indirect
github.com/ipld/go-ipld-prime v0.21.0 // indirect
github.com/ipshipyard/p2p-forge v0.4.0 // indirect
github.com/jackpal/go-nat-pmp v1.0.2 // indirect
@@ -310,23 +310,23 @@ require (
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.27.0 // indirect
go.uber.org/zap/exp v0.3.0 // indirect
- golang.org/x/crypto v0.37.0 // indirect
- golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect
+ golang.org/x/crypto v0.38.0 // indirect
+ golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect
golang.org/x/exp/typeparams v0.0.0-20240314144324-c7f7c6466f7f // indirect
golang.org/x/mod v0.24.0 // indirect
- golang.org/x/net v0.39.0 // indirect
- golang.org/x/sync v0.13.0 // indirect
+ golang.org/x/net v0.40.0 // indirect
+ golang.org/x/sync v0.14.0 // indirect
golang.org/x/sys v0.33.0 // indirect
- golang.org/x/term v0.31.0 // indirect
- golang.org/x/text v0.24.0 // indirect
- golang.org/x/tools v0.32.0 // indirect
+ golang.org/x/term v0.32.0 // indirect
+ golang.org/x/text v0.25.0 // indirect
+ golang.org/x/tools v0.33.0 // indirect
gonum.org/v1/gonum v0.16.0 // indirect
google.golang.org/protobuf v1.36.6 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
honnef.co/go/tools v0.5.1 // indirect
- lukechampine.com/blake3 v1.4.0 // indirect
+ lukechampine.com/blake3 v1.4.1 // indirect
mvdan.cc/gofumpt v0.7.0 // indirect
mvdan.cc/unparam v0.0.0-20240528143540-8a5130ca722f // indirect
)
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index 790426ebf..5e8d27d68 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -348,8 +348,8 @@ github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1I
github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw=
github.com/ipfs/go-ipfs-pq v0.0.3 h1:YpoHVJB+jzK15mr/xsWC574tyDLkezVrDNeaalQBsTE=
github.com/ipfs/go-ipfs-pq v0.0.3/go.mod h1:btNw5hsHBpRcSSgZtiNm/SLj5gYIZ18AKtv3kERkRb4=
-github.com/ipfs/go-ipld-format v0.6.0 h1:VEJlA2kQ3LqFSIm5Vu6eIlSxD/Ze90xtc4Meten1F5U=
-github.com/ipfs/go-ipld-format v0.6.0/go.mod h1:g4QVMTn3marU3qXchwjpKPKgJv+zF+OlaKMyhJ4LHPg=
+github.com/ipfs/go-ipld-format v0.6.1 h1:lQLmBM/HHbrXvjIkrydRXkn+gc0DE5xO5fqelsCKYOQ=
+github.com/ipfs/go-ipld-format v0.6.1/go.mod h1:8TOH1Hj+LFyqM2PjSqI2/ZnyO0KlfhHbJLkbxFa61hs=
github.com/ipfs/go-ipld-legacy v0.2.1 h1:mDFtrBpmU7b//LzLSypVrXsD8QxkEWxu5qVxN99/+tk=
github.com/ipfs/go-ipld-legacy v0.2.1/go.mod h1:782MOUghNzMO2DER0FlBR94mllfdCJCkTtDtPM51otM=
github.com/ipfs/go-log/v2 v2.6.0 h1:2Nu1KKQQ2ayonKp4MPo6pXCjqw1ULc9iohRqWV5EYqg=
@@ -358,16 +358,16 @@ github.com/ipfs/go-metrics-interface v0.3.0 h1:YwG7/Cy4R94mYDUuwsBfeziJCVm9pBMJ6
github.com/ipfs/go-metrics-interface v0.3.0/go.mod h1:OxxQjZDGocXVdyTPocns6cOLwHieqej/jos7H4POwoY=
github.com/ipfs/go-peertaskqueue v0.8.2 h1:PaHFRaVFdxQk1Qo3OKiHPYjmmusQy7gKQUaL8JDszAU=
github.com/ipfs/go-peertaskqueue v0.8.2/go.mod h1:L6QPvou0346c2qPJNiJa6BvOibxDfaiPlqHInmzg0FA=
-github.com/ipfs/go-test v0.2.1 h1:/D/a8xZ2JzkYqcVcV/7HYlCnc7bv/pKHQiX5TdClkPE=
-github.com/ipfs/go-test v0.2.1/go.mod h1:dzu+KB9cmWjuJnXFDYJwC25T3j1GcN57byN+ixmK39M=
+github.com/ipfs/go-test v0.2.2 h1:1yjYyfbdt1w93lVzde6JZ2einh3DIV40at4rVoyEcE8=
+github.com/ipfs/go-test v0.2.2/go.mod h1:cmLisgVwkdRCnKu/CFZOk2DdhOcwghr5GsHeqwexoRA=
github.com/ipfs/hang-fds v0.1.0 h1:deBiFlWHsVGzJ0ZMaqscEqRM1r2O1rFZ59UiQXb1Xko=
github.com/ipfs/hang-fds v0.1.0/go.mod h1:29VLWOn3ftAgNNgXg/al7b11UzuQ+w7AwtCGcTaWkbM=
github.com/ipfs/iptb v1.4.1 h1:faXd3TKGPswbHyZecqqg6UfbES7RDjTKQb+6VFPKDUo=
github.com/ipfs/iptb v1.4.1/go.mod h1:nTsBMtVYFEu0FjC5DgrErnABm3OG9ruXkFXGJoTV5OA=
github.com/ipfs/iptb-plugins v0.5.1 h1:11PNTNEt2+SFxjUcO5qpyCTXqDj6T8Tx9pU/G4ytCIQ=
github.com/ipfs/iptb-plugins v0.5.1/go.mod h1:mscJAjRnu4g16QK6oUBn9RGpcp8ueJmLfmPxIG/At78=
-github.com/ipld/go-codec-dagpb v1.6.0 h1:9nYazfyu9B1p3NAgfVdpRco3Fs2nFC72DqVsMj6rOcc=
-github.com/ipld/go-codec-dagpb v1.6.0/go.mod h1:ANzFhfP2uMJxRBr8CE+WQWs5UsNa0pYtmKZ+agnUw9s=
+github.com/ipld/go-codec-dagpb v1.7.0 h1:hpuvQjCSVSLnTnHXn+QAMR0mLmb1gA6wl10LExo2Ts0=
+github.com/ipld/go-codec-dagpb v1.7.0/go.mod h1:rD3Zg+zub9ZnxcLwfol/OTQRVjaLzXypgy4UqHQvilM=
github.com/ipld/go-ipld-prime v0.21.0 h1:n4JmcpOlPDIxBcY037SVfpd1G+Sj1nKZah0m6QH9C2E=
github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOanyMctpPjsvxQ=
github.com/ipshipyard/p2p-forge v0.4.0 h1:A40PW027nCZn0d/pw5ufMoxnAo9wZwrG+iuz18A8P5I=
@@ -881,11 +881,11 @@ golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
-golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE=
-golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc=
+golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8=
+golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM=
-golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8=
+golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=
+golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=
golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
golang.org/x/exp/typeparams v0.0.0-20240314144324-c7f7c6466f7f h1:phY1HzDcf18Aq9A8KkmRtY9WvOFIxN8wgfvy6Zm1DV8=
@@ -943,8 +943,8 @@ golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
-golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY=
-golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E=
+golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY=
+golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -964,8 +964,8 @@ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
-golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610=
-golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
+golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=
+golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1021,8 +1021,8 @@ golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY=
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58=
-golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o=
-golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw=
+golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg=
+golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
@@ -1037,8 +1037,8 @@ golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
-golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0=
-golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU=
+golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4=
+golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA=
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U=
@@ -1076,8 +1076,8 @@ golang.org/x/tools v0.11.0/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8
golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg=
golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc=
-golang.org/x/tools v0.32.0 h1:Q7N1vhpkQv7ybVzLFtTjvQya2ewbwNDZzUgfXGqtMWU=
-golang.org/x/tools v0.32.0/go.mod h1:ZxrU41P/wAbZD8EDa6dDCa6XfpkhJ7HFMjHJXfBDu8s=
+golang.org/x/tools v0.33.0 h1:4qz2S3zmRxbGIhDIAgjxvFutSvH5EfnsYrRBj0UI0bc=
+golang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -1125,8 +1125,8 @@ honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWh
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.5.1 h1:4bH5o3b5ZULQ4UrBmP+63W9r7qIkqJClEA9ko5YKx+I=
honnef.co/go/tools v0.5.1/go.mod h1:e9irvo83WDG9/irijV44wr3tbhcFeRnfpVlRqVwpzMs=
-lukechampine.com/blake3 v1.4.0 h1:xDbKOZCVbnZsfzM6mHSYcGRHZ3YrLDzqz8XnV4uaD5w=
-lukechampine.com/blake3 v1.4.0/go.mod h1:MQJNQCTnR+kwOP/JEZSxj3MaQjp80FOFSNMMHXcSeX0=
+lukechampine.com/blake3 v1.4.1 h1:I3Smz7gso8w4/TunLKec6K2fn+kyKtDxr/xcQEN84Wg=
+lukechampine.com/blake3 v1.4.1/go.mod h1:QFosUxmjB8mnrWFSNwKmvxHpfY72bmD2tQ0kBMM3kwo=
mvdan.cc/gofumpt v0.7.0 h1:bg91ttqXmi9y2xawvkuMXyvAA/1ZGJqYAEGjXuP0JXU=
mvdan.cc/gofumpt v0.7.0/go.mod h1:txVFJy/Sc/mvaycET54pV8SW8gWxTlUuGHVEcncmNUo=
mvdan.cc/unparam v0.0.0-20240528143540-8a5130ca722f h1:lMpcwN6GxNbWtbpI1+xzFLSW8XzX0u72NttUGVFjO3U=
diff --git a/test/integration/addcat_test.go b/test/integration/addcat_test.go
index 936b28c6d..22d8be9be 100644
--- a/test/integration/addcat_test.go
+++ b/test/integration/addcat_test.go
@@ -13,7 +13,7 @@ import (
"github.com/ipfs/boxo/bootstrap"
"github.com/ipfs/boxo/files"
- logging "github.com/ipfs/go-log"
+ logging "github.com/ipfs/go-log/v2"
"github.com/ipfs/go-test/random"
"github.com/ipfs/kubo/core"
"github.com/ipfs/kubo/core/coreapi"
From 1c11ad6996ad05b7059efd0d90f97bde88d979c2 Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Tue, 20 May 2025 05:25:49 -0700
Subject: [PATCH 240/499] Upgrade go-libp2p-kad-dht to v0.33.0 (#10811)
---
docs/changelogs/v0.36.md | 1 +
docs/examples/kubo-as-a-library/go.mod | 4 ++--
docs/examples/kubo-as-a-library/go.sum | 8 ++++----
go.mod | 4 ++--
go.sum | 8 ++++----
test/dependencies/go.mod | 4 ++--
test/dependencies/go.sum | 8 ++++----
7 files changed, 19 insertions(+), 18 deletions(-)
diff --git a/docs/changelogs/v0.36.md b/docs/changelogs/v0.36.md
index 5cb9b66b5..493cf1b46 100644
--- a/docs/changelogs/v0.36.md
+++ b/docs/changelogs/v0.36.md
@@ -29,6 +29,7 @@ go-log v2 has been out for quite a while now and it is time to deprecate v1.
- Removes support for `ContextWithLoggable` as this is not needed for tracing-like functionality
#### ๐ฆ๏ธ Important dependency updates
+- update `go-libp2p-kad-dht` to [v0.33.0](https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.33.0)
### ๐ Changelog
### ๐จโ๐ฉโ๐งโ๐ฆ Contributors
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index 2fa9770c9..dc02f0bf0 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -126,7 +126,7 @@ require (
github.com/libp2p/go-doh-resolver v0.5.0 // indirect
github.com/libp2p/go-flow-metrics v0.2.0 // indirect
github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect
- github.com/libp2p/go-libp2p-kad-dht v0.32.0 // indirect
+ github.com/libp2p/go-libp2p-kad-dht v0.33.0 // indirect
github.com/libp2p/go-libp2p-kbucket v0.7.0 // indirect
github.com/libp2p/go-libp2p-pubsub v0.13.1 // indirect
github.com/libp2p/go-libp2p-pubsub-router v0.6.0 // indirect
@@ -141,7 +141,7 @@ require (
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mholt/acmez/v3 v3.0.0 // indirect
- github.com/miekg/dns v1.1.65 // indirect
+ github.com/miekg/dns v1.1.66 // indirect
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect
github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect
github.com/minio/sha256-simd v1.0.1 // indirect
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index 4c89767e1..4174049f0 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -470,8 +470,8 @@ github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl9
github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8=
github.com/libp2p/go-libp2p-core v0.2.4/go.mod h1:STh4fdfa5vDYr0/SzYYeqnt+E6KfEV5VxfIrm0bcI0g=
github.com/libp2p/go-libp2p-core v0.3.0/go.mod h1:ACp3DmS3/N64c2jDzcV429ukDpicbL6+TrrxANBjPGw=
-github.com/libp2p/go-libp2p-kad-dht v0.32.0 h1:dpyq7o00od98vPQG0IZvNHpeLnKyuICN1nVzGnVMC9k=
-github.com/libp2p/go-libp2p-kad-dht v0.32.0/go.mod h1:vQU5oE9hMHXJhSQawbZapC9u0U9dc+tWC0DYasGmIAA=
+github.com/libp2p/go-libp2p-kad-dht v0.33.0 h1:lB6JFgLpsfEKTmcy27sPFulexEZMeN40zRsmIx8aFcw=
+github.com/libp2p/go-libp2p-kad-dht v0.33.0/go.mod h1:CdmNk4VeGJa9EXM9SLNyNVySEvduKvb+5rSC/H4pLAo=
github.com/libp2p/go-libp2p-kbucket v0.3.1/go.mod h1:oyjT5O7tS9CQurok++ERgc46YLwEpuGoFq9ubvoUOio=
github.com/libp2p/go-libp2p-kbucket v0.7.0 h1:vYDvRjkyJPeWunQXqcW2Z6E93Ywx7fX0jgzb/dGOKCs=
github.com/libp2p/go-libp2p-kbucket v0.7.0/go.mod h1:blOINGIj1yiPYlVEX0Rj9QwEkmVnz3EP8LK1dRKBC6g=
@@ -519,8 +519,8 @@ github.com/mholt/acmez/v3 v3.0.0 h1:r1NcjuWR0VaKP2BTjDK9LRFBw/WvURx3jlaEUl9Ht8E=
github.com/mholt/acmez/v3 v3.0.0/go.mod h1:L1wOU06KKvq7tswuMDwKdcHeKpFFgkppZy/y0DFxagQ=
github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4=
github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4=
-github.com/miekg/dns v1.1.65 h1:0+tIPHzUW0GCge7IiK3guGP57VAw7hoPDfApjkMD1Fc=
-github.com/miekg/dns v1.1.65/go.mod h1:Dzw9769uoKVaLuODMDZz9M6ynFU6Em65csPuoi8G0ck=
+github.com/miekg/dns v1.1.66 h1:FeZXOS3VCVsKnEAd+wBkjMC3D2K+ww66Cq3VnCINuJE=
+github.com/miekg/dns v1.1.66/go.mod h1:jGFzBsSNbJw6z1HYut1RKBKHA9PBdxeHrZG8J+gC2WE=
github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8=
github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms=
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc=
diff --git a/go.mod b/go.mod
index 35e327e6c..e82be865c 100644
--- a/go.mod
+++ b/go.mod
@@ -54,7 +54,7 @@ require (
github.com/libp2p/go-doh-resolver v0.5.0
github.com/libp2p/go-libp2p v0.41.1
github.com/libp2p/go-libp2p-http v0.5.0
- github.com/libp2p/go-libp2p-kad-dht v0.32.0
+ github.com/libp2p/go-libp2p-kad-dht v0.33.0
github.com/libp2p/go-libp2p-kbucket v0.7.0
github.com/libp2p/go-libp2p-pubsub v0.13.1
github.com/libp2p/go-libp2p-pubsub-router v0.6.0
@@ -187,7 +187,7 @@ require (
github.com/mattn/go-runewidth v0.0.15 // indirect
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect
github.com/mholt/acmez/v3 v3.0.0 // indirect
- github.com/miekg/dns v1.1.65 // indirect
+ github.com/miekg/dns v1.1.66 // indirect
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect
github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect
github.com/minio/sha256-simd v1.0.1 // indirect
diff --git a/go.sum b/go.sum
index f1bf3fa02..4727ae1ec 100644
--- a/go.sum
+++ b/go.sum
@@ -553,8 +553,8 @@ github.com/libp2p/go-libp2p-gostream v0.6.0 h1:QfAiWeQRce6pqnYfmIVWJFXNdDyfiR/qk
github.com/libp2p/go-libp2p-gostream v0.6.0/go.mod h1:Nywu0gYZwfj7Jc91PQvbGU8dIpqbQQkjWgDuOrFaRdA=
github.com/libp2p/go-libp2p-http v0.5.0 h1:+x0AbLaUuLBArHubbbNRTsgWz0RjNTy6DJLOxQ3/QBc=
github.com/libp2p/go-libp2p-http v0.5.0/go.mod h1:glh87nZ35XCQyFsdzZps6+F4HYI6DctVFY5u1fehwSg=
-github.com/libp2p/go-libp2p-kad-dht v0.32.0 h1:dpyq7o00od98vPQG0IZvNHpeLnKyuICN1nVzGnVMC9k=
-github.com/libp2p/go-libp2p-kad-dht v0.32.0/go.mod h1:vQU5oE9hMHXJhSQawbZapC9u0U9dc+tWC0DYasGmIAA=
+github.com/libp2p/go-libp2p-kad-dht v0.33.0 h1:lB6JFgLpsfEKTmcy27sPFulexEZMeN40zRsmIx8aFcw=
+github.com/libp2p/go-libp2p-kad-dht v0.33.0/go.mod h1:CdmNk4VeGJa9EXM9SLNyNVySEvduKvb+5rSC/H4pLAo=
github.com/libp2p/go-libp2p-kbucket v0.3.1/go.mod h1:oyjT5O7tS9CQurok++ERgc46YLwEpuGoFq9ubvoUOio=
github.com/libp2p/go-libp2p-kbucket v0.7.0 h1:vYDvRjkyJPeWunQXqcW2Z6E93Ywx7fX0jgzb/dGOKCs=
github.com/libp2p/go-libp2p-kbucket v0.7.0/go.mod h1:blOINGIj1yiPYlVEX0Rj9QwEkmVnz3EP8LK1dRKBC6g=
@@ -614,8 +614,8 @@ github.com/mholt/acmez/v3 v3.0.0 h1:r1NcjuWR0VaKP2BTjDK9LRFBw/WvURx3jlaEUl9Ht8E=
github.com/mholt/acmez/v3 v3.0.0/go.mod h1:L1wOU06KKvq7tswuMDwKdcHeKpFFgkppZy/y0DFxagQ=
github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4=
github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4=
-github.com/miekg/dns v1.1.65 h1:0+tIPHzUW0GCge7IiK3guGP57VAw7hoPDfApjkMD1Fc=
-github.com/miekg/dns v1.1.65/go.mod h1:Dzw9769uoKVaLuODMDZz9M6ynFU6Em65csPuoi8G0ck=
+github.com/miekg/dns v1.1.66 h1:FeZXOS3VCVsKnEAd+wBkjMC3D2K+ww66Cq3VnCINuJE=
+github.com/miekg/dns v1.1.66/go.mod h1:jGFzBsSNbJw6z1HYut1RKBKHA9PBdxeHrZG8J+gC2WE=
github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8=
github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms=
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc=
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index 95a408150..6814118a4 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -169,7 +169,7 @@ require (
github.com/libp2p/go-flow-metrics v0.2.0 // indirect
github.com/libp2p/go-libp2p v0.41.1 // indirect
github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect
- github.com/libp2p/go-libp2p-kad-dht v0.32.0 // indirect
+ github.com/libp2p/go-libp2p-kad-dht v0.33.0 // indirect
github.com/libp2p/go-libp2p-kbucket v0.7.0 // indirect
github.com/libp2p/go-libp2p-record v0.3.1 // indirect
github.com/libp2p/go-libp2p-routing-helpers v0.7.5 // indirect
@@ -188,7 +188,7 @@ require (
github.com/mattn/go-shellwords v1.0.12 // indirect
github.com/mgechev/revive v1.3.9 // indirect
github.com/mholt/acmez/v3 v3.0.0 // indirect
- github.com/miekg/dns v1.1.65 // indirect
+ github.com/miekg/dns v1.1.66 // indirect
github.com/minio/sha256-simd v1.0.1 // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index 5e8d27d68..402fe445a 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -440,8 +440,8 @@ github.com/libp2p/go-libp2p v0.41.1 h1:8ecNQVT5ev/jqALTvisSJeVNvXYJyK4NhQx1nNRXQ
github.com/libp2p/go-libp2p v0.41.1/go.mod h1:DcGTovJzQl/I7HMrby5ZRjeD0kQkGiy+9w6aEkSZpRI=
github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94=
github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8=
-github.com/libp2p/go-libp2p-kad-dht v0.32.0 h1:dpyq7o00od98vPQG0IZvNHpeLnKyuICN1nVzGnVMC9k=
-github.com/libp2p/go-libp2p-kad-dht v0.32.0/go.mod h1:vQU5oE9hMHXJhSQawbZapC9u0U9dc+tWC0DYasGmIAA=
+github.com/libp2p/go-libp2p-kad-dht v0.33.0 h1:lB6JFgLpsfEKTmcy27sPFulexEZMeN40zRsmIx8aFcw=
+github.com/libp2p/go-libp2p-kad-dht v0.33.0/go.mod h1:CdmNk4VeGJa9EXM9SLNyNVySEvduKvb+5rSC/H4pLAo=
github.com/libp2p/go-libp2p-kbucket v0.7.0 h1:vYDvRjkyJPeWunQXqcW2Z6E93Ywx7fX0jgzb/dGOKCs=
github.com/libp2p/go-libp2p-kbucket v0.7.0/go.mod h1:blOINGIj1yiPYlVEX0Rj9QwEkmVnz3EP8LK1dRKBC6g=
github.com/libp2p/go-libp2p-record v0.3.1 h1:cly48Xi5GjNw5Wq+7gmjfBiG9HCzQVkiZOUZ8kUl+Fg=
@@ -494,8 +494,8 @@ github.com/mgechev/revive v1.3.9/go.mod h1:+uxEIr5UH0TjXWHTno3xh4u7eg6jDpXKzQccA
github.com/mholt/acmez/v3 v3.0.0 h1:r1NcjuWR0VaKP2BTjDK9LRFBw/WvURx3jlaEUl9Ht8E=
github.com/mholt/acmez/v3 v3.0.0/go.mod h1:L1wOU06KKvq7tswuMDwKdcHeKpFFgkppZy/y0DFxagQ=
github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4=
-github.com/miekg/dns v1.1.65 h1:0+tIPHzUW0GCge7IiK3guGP57VAw7hoPDfApjkMD1Fc=
-github.com/miekg/dns v1.1.65/go.mod h1:Dzw9769uoKVaLuODMDZz9M6ynFU6Em65csPuoi8G0ck=
+github.com/miekg/dns v1.1.66 h1:FeZXOS3VCVsKnEAd+wBkjMC3D2K+ww66Cq3VnCINuJE=
+github.com/miekg/dns v1.1.66/go.mod h1:jGFzBsSNbJw6z1HYut1RKBKHA9PBdxeHrZG8J+gC2WE=
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc=
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b/go.mod h1:lxPUiZwKoFL8DUUmalo2yJJUCxbPKtm8OKfqr2/FTNU=
github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc h1:PTfri+PuQmWDqERdnNMiD9ZejrlswWrCpBEZgWOiTrc=
From 3290afcef8dba34296f26dfdc77554fd62dd3e8c Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Wed, 21 May 2025 00:29:57 +0200
Subject: [PATCH 241/499] fix: p2p-forge v0.5.1 ignoring /p2p-circuit (#10813)
https://github.com/ipshipyard/p2p-forge/pull/68
---
docs/changelogs/v0.35.md | 1 +
docs/examples/kubo-as-a-library/go.mod | 2 +-
docs/examples/kubo-as-a-library/go.sum | 4 ++--
go.mod | 2 +-
go.sum | 4 ++--
test/dependencies/go.mod | 2 +-
test/dependencies/go.sum | 4 ++--
7 files changed, 10 insertions(+), 9 deletions(-)
diff --git a/docs/changelogs/v0.35.md b/docs/changelogs/v0.35.md
index 6dac079b4..86705c31b 100644
--- a/docs/changelogs/v0.35.md
+++ b/docs/changelogs/v0.35.md
@@ -266,6 +266,7 @@ If the lock cannot be acquired because someone else has the lock, and `IPFS_WAIT
- update `pebble` to [v2.0.3](https://github.com/cockroachdb/pebble/releases/tag/v2.0.3)
- update `go-libp2p-pubsub` to [v0.13.1](https://github.com:/libp2p/go-libp2p-pubsub/releases/tag/v0.13.1)
- update `go-log` to [v2.6.0](https://github.com/ipfs/go-log/releases/tag/v2.6.0)
+- update `p2p-forge/client` to [v0.5.1](https://github.com/ipshipyard/p2p-forge/releases/tag/v0.5.1)
### ๐ Changelog
### ๐จโ๐ฉโ๐งโ๐ฆ Contributors
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index dc02f0bf0..2a13fc64f 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -111,7 +111,7 @@ require (
github.com/ipld/go-car/v2 v2.14.3 // indirect
github.com/ipld/go-codec-dagpb v1.7.0 // indirect
github.com/ipld/go-ipld-prime v0.21.0 // indirect
- github.com/ipshipyard/p2p-forge v0.4.0 // indirect
+ github.com/ipshipyard/p2p-forge v0.5.1 // indirect
github.com/jackpal/go-nat-pmp v1.0.2 // indirect
github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect
github.com/jbenet/goprocess v0.1.4 // indirect
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index 4174049f0..7b536d253 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -406,8 +406,8 @@ github.com/ipld/go-ipld-prime v0.21.0 h1:n4JmcpOlPDIxBcY037SVfpd1G+Sj1nKZah0m6QH
github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOanyMctpPjsvxQ=
github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd h1:gMlw/MhNr2Wtp5RwGdsW23cs+yCuj9k2ON7i9MiJlRo=
github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd/go.mod h1:wZ8hH8UxeryOs4kJEJaiui/s00hDSbE37OKsL47g+Sw=
-github.com/ipshipyard/p2p-forge v0.4.0 h1:A40PW027nCZn0d/pw5ufMoxnAo9wZwrG+iuz18A8P5I=
-github.com/ipshipyard/p2p-forge v0.4.0/go.mod h1:hVGPP24xrRezP2+z6q8udEW36w89M+jWuWBz9meLggY=
+github.com/ipshipyard/p2p-forge v0.5.1 h1:9MCpAlk+wNhy7W/yOYKgi9KlXPnyb0abmDpsRPHUDxQ=
+github.com/ipshipyard/p2p-forge v0.5.1/go.mod h1:GNDXM2CR8KRS8mJGw7ARIRVlrG9NH8MdewgNVfIIByA=
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA=
diff --git a/go.mod b/go.mod
index e82be865c..b23e734a3 100644
--- a/go.mod
+++ b/go.mod
@@ -47,7 +47,7 @@ require (
github.com/ipld/go-car/v2 v2.14.3
github.com/ipld/go-codec-dagpb v1.7.0
github.com/ipld/go-ipld-prime v0.21.0
- github.com/ipshipyard/p2p-forge v0.4.0
+ github.com/ipshipyard/p2p-forge v0.5.1
github.com/jbenet/go-temp-err-catcher v0.1.0
github.com/jbenet/goprocess v0.1.4
github.com/julienschmidt/httprouter v1.3.0
diff --git a/go.sum b/go.sum
index 4727ae1ec..e4080d1a4 100644
--- a/go.sum
+++ b/go.sum
@@ -473,8 +473,8 @@ github.com/ipld/go-ipld-prime v0.21.0 h1:n4JmcpOlPDIxBcY037SVfpd1G+Sj1nKZah0m6QH
github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOanyMctpPjsvxQ=
github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd h1:gMlw/MhNr2Wtp5RwGdsW23cs+yCuj9k2ON7i9MiJlRo=
github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd/go.mod h1:wZ8hH8UxeryOs4kJEJaiui/s00hDSbE37OKsL47g+Sw=
-github.com/ipshipyard/p2p-forge v0.4.0 h1:A40PW027nCZn0d/pw5ufMoxnAo9wZwrG+iuz18A8P5I=
-github.com/ipshipyard/p2p-forge v0.4.0/go.mod h1:hVGPP24xrRezP2+z6q8udEW36w89M+jWuWBz9meLggY=
+github.com/ipshipyard/p2p-forge v0.5.1 h1:9MCpAlk+wNhy7W/yOYKgi9KlXPnyb0abmDpsRPHUDxQ=
+github.com/ipshipyard/p2p-forge v0.5.1/go.mod h1:GNDXM2CR8KRS8mJGw7ARIRVlrG9NH8MdewgNVfIIByA=
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
github.com/jbenet/go-cienv v0.1.0 h1:Vc/s0QbQtoxX8MwwSLWWh+xNNZvM3Lw7NsTcHrvvhMc=
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index 6814118a4..bbd891ab4 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -140,7 +140,7 @@ require (
github.com/ipfs/kubo v0.31.0 // indirect
github.com/ipld/go-codec-dagpb v1.7.0 // indirect
github.com/ipld/go-ipld-prime v0.21.0 // indirect
- github.com/ipshipyard/p2p-forge v0.4.0 // indirect
+ github.com/ipshipyard/p2p-forge v0.5.1 // indirect
github.com/jackpal/go-nat-pmp v1.0.2 // indirect
github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect
github.com/jgautheron/goconst v1.7.1 // indirect
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index 402fe445a..22e953d6f 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -370,8 +370,8 @@ github.com/ipld/go-codec-dagpb v1.7.0 h1:hpuvQjCSVSLnTnHXn+QAMR0mLmb1gA6wl10LExo
github.com/ipld/go-codec-dagpb v1.7.0/go.mod h1:rD3Zg+zub9ZnxcLwfol/OTQRVjaLzXypgy4UqHQvilM=
github.com/ipld/go-ipld-prime v0.21.0 h1:n4JmcpOlPDIxBcY037SVfpd1G+Sj1nKZah0m6QH9C2E=
github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOanyMctpPjsvxQ=
-github.com/ipshipyard/p2p-forge v0.4.0 h1:A40PW027nCZn0d/pw5ufMoxnAo9wZwrG+iuz18A8P5I=
-github.com/ipshipyard/p2p-forge v0.4.0/go.mod h1:hVGPP24xrRezP2+z6q8udEW36w89M+jWuWBz9meLggY=
+github.com/ipshipyard/p2p-forge v0.5.1 h1:9MCpAlk+wNhy7W/yOYKgi9KlXPnyb0abmDpsRPHUDxQ=
+github.com/ipshipyard/p2p-forge v0.5.1/go.mod h1:GNDXM2CR8KRS8mJGw7ARIRVlrG9NH8MdewgNVfIIByA=
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
github.com/jbenet/go-temp-err-catcher v0.1.0 h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABoLk/+KKHggpk=
From 91a146d5fb86b2fa19b69dccb6644ce3cb26d47c Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Wed, 21 May 2025 00:29:57 +0200
Subject: [PATCH 242/499] fix: p2p-forge v0.5.1 ignoring /p2p-circuit (#10813)
https://github.com/ipshipyard/p2p-forge/pull/68
(cherry picked from commit 3290afcef8dba34296f26dfdc77554fd62dd3e8c)
---
docs/changelogs/v0.35.md | 1 +
docs/examples/kubo-as-a-library/go.mod | 2 +-
docs/examples/kubo-as-a-library/go.sum | 4 ++--
go.mod | 2 +-
go.sum | 4 ++--
test/dependencies/go.mod | 2 +-
test/dependencies/go.sum | 4 ++--
7 files changed, 10 insertions(+), 9 deletions(-)
diff --git a/docs/changelogs/v0.35.md b/docs/changelogs/v0.35.md
index 023dcfd54..759f1ae9e 100644
--- a/docs/changelogs/v0.35.md
+++ b/docs/changelogs/v0.35.md
@@ -267,6 +267,7 @@ If the lock cannot be acquired because someone else has the lock, and `IPFS_WAIT
- update `go-libp2p-pubsub` to [v0.13.1](https://github.com:/libp2p/go-libp2p-pubsub/releases/tag/v0.13.1)
- update `go-libp2p-kad-dht` to [v0.32.0](https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.32.0) (incl. [v0.31.0](https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.31.0))
- update `go-log` to [v2.6.0](https://github.com/ipfs/go-log/releases/tag/v2.6.0)
+- update `p2p-forge/client` to [v0.5.1](https://github.com/ipshipyard/p2p-forge/releases/tag/v0.5.1)
### ๐ Changelog
### ๐จโ๐ฉโ๐งโ๐ฆ Contributors
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index c4b559744..8524c1385 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -111,7 +111,7 @@ require (
github.com/ipld/go-car/v2 v2.14.2 // indirect
github.com/ipld/go-codec-dagpb v1.6.0 // indirect
github.com/ipld/go-ipld-prime v0.21.0 // indirect
- github.com/ipshipyard/p2p-forge v0.4.0 // indirect
+ github.com/ipshipyard/p2p-forge v0.5.1 // indirect
github.com/jackpal/go-nat-pmp v1.0.2 // indirect
github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect
github.com/jbenet/goprocess v0.1.4 // indirect
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index 29c11e008..02ba33ac4 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -406,8 +406,8 @@ github.com/ipld/go-ipld-prime v0.21.0 h1:n4JmcpOlPDIxBcY037SVfpd1G+Sj1nKZah0m6QH
github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOanyMctpPjsvxQ=
github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd h1:gMlw/MhNr2Wtp5RwGdsW23cs+yCuj9k2ON7i9MiJlRo=
github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd/go.mod h1:wZ8hH8UxeryOs4kJEJaiui/s00hDSbE37OKsL47g+Sw=
-github.com/ipshipyard/p2p-forge v0.4.0 h1:A40PW027nCZn0d/pw5ufMoxnAo9wZwrG+iuz18A8P5I=
-github.com/ipshipyard/p2p-forge v0.4.0/go.mod h1:hVGPP24xrRezP2+z6q8udEW36w89M+jWuWBz9meLggY=
+github.com/ipshipyard/p2p-forge v0.5.1 h1:9MCpAlk+wNhy7W/yOYKgi9KlXPnyb0abmDpsRPHUDxQ=
+github.com/ipshipyard/p2p-forge v0.5.1/go.mod h1:GNDXM2CR8KRS8mJGw7ARIRVlrG9NH8MdewgNVfIIByA=
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA=
diff --git a/go.mod b/go.mod
index 00121bc00..7b70363f9 100644
--- a/go.mod
+++ b/go.mod
@@ -48,7 +48,7 @@ require (
github.com/ipld/go-car/v2 v2.14.2
github.com/ipld/go-codec-dagpb v1.6.0
github.com/ipld/go-ipld-prime v0.21.0
- github.com/ipshipyard/p2p-forge v0.4.0
+ github.com/ipshipyard/p2p-forge v0.5.1
github.com/jbenet/go-temp-err-catcher v0.1.0
github.com/jbenet/goprocess v0.1.4
github.com/julienschmidt/httprouter v1.3.0
diff --git a/go.sum b/go.sum
index 4db342507..bd0e43274 100644
--- a/go.sum
+++ b/go.sum
@@ -476,8 +476,8 @@ github.com/ipld/go-ipld-prime v0.21.0 h1:n4JmcpOlPDIxBcY037SVfpd1G+Sj1nKZah0m6QH
github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOanyMctpPjsvxQ=
github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd h1:gMlw/MhNr2Wtp5RwGdsW23cs+yCuj9k2ON7i9MiJlRo=
github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd/go.mod h1:wZ8hH8UxeryOs4kJEJaiui/s00hDSbE37OKsL47g+Sw=
-github.com/ipshipyard/p2p-forge v0.4.0 h1:A40PW027nCZn0d/pw5ufMoxnAo9wZwrG+iuz18A8P5I=
-github.com/ipshipyard/p2p-forge v0.4.0/go.mod h1:hVGPP24xrRezP2+z6q8udEW36w89M+jWuWBz9meLggY=
+github.com/ipshipyard/p2p-forge v0.5.1 h1:9MCpAlk+wNhy7W/yOYKgi9KlXPnyb0abmDpsRPHUDxQ=
+github.com/ipshipyard/p2p-forge v0.5.1/go.mod h1:GNDXM2CR8KRS8mJGw7ARIRVlrG9NH8MdewgNVfIIByA=
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
github.com/jbenet/go-cienv v0.1.0 h1:Vc/s0QbQtoxX8MwwSLWWh+xNNZvM3Lw7NsTcHrvvhMc=
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index 530e7c421..dde8ee6af 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -140,7 +140,7 @@ require (
github.com/ipfs/kubo v0.31.0 // indirect
github.com/ipld/go-codec-dagpb v1.6.0 // indirect
github.com/ipld/go-ipld-prime v0.21.0 // indirect
- github.com/ipshipyard/p2p-forge v0.4.0 // indirect
+ github.com/ipshipyard/p2p-forge v0.5.1 // indirect
github.com/jackpal/go-nat-pmp v1.0.2 // indirect
github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect
github.com/jgautheron/goconst v1.7.1 // indirect
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index 790426ebf..8c9bbdd34 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -370,8 +370,8 @@ github.com/ipld/go-codec-dagpb v1.6.0 h1:9nYazfyu9B1p3NAgfVdpRco3Fs2nFC72DqVsMj6
github.com/ipld/go-codec-dagpb v1.6.0/go.mod h1:ANzFhfP2uMJxRBr8CE+WQWs5UsNa0pYtmKZ+agnUw9s=
github.com/ipld/go-ipld-prime v0.21.0 h1:n4JmcpOlPDIxBcY037SVfpd1G+Sj1nKZah0m6QH9C2E=
github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOanyMctpPjsvxQ=
-github.com/ipshipyard/p2p-forge v0.4.0 h1:A40PW027nCZn0d/pw5ufMoxnAo9wZwrG+iuz18A8P5I=
-github.com/ipshipyard/p2p-forge v0.4.0/go.mod h1:hVGPP24xrRezP2+z6q8udEW36w89M+jWuWBz9meLggY=
+github.com/ipshipyard/p2p-forge v0.5.1 h1:9MCpAlk+wNhy7W/yOYKgi9KlXPnyb0abmDpsRPHUDxQ=
+github.com/ipshipyard/p2p-forge v0.5.1/go.mod h1:GNDXM2CR8KRS8mJGw7ARIRVlrG9NH8MdewgNVfIIByA=
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
github.com/jbenet/go-temp-err-catcher v0.1.0 h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABoLk/+KKHggpk=
From 46b2e60c9f542a94b9922a90b9a329d19c39509a Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Wed, 21 May 2025 17:26:25 +0200
Subject: [PATCH 243/499] fix: go-libp2p-kad-dht v0.33.1 (#10814)
https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.33.1
---
docs/changelogs/v0.35.md | 1 +
docs/examples/kubo-as-a-library/go.mod | 2 +-
docs/examples/kubo-as-a-library/go.sum | 4 ++--
go.mod | 2 +-
go.sum | 4 ++--
test/dependencies/go.mod | 2 +-
test/dependencies/go.sum | 4 ++--
7 files changed, 10 insertions(+), 9 deletions(-)
diff --git a/docs/changelogs/v0.35.md b/docs/changelogs/v0.35.md
index 86705c31b..9186b2608 100644
--- a/docs/changelogs/v0.35.md
+++ b/docs/changelogs/v0.35.md
@@ -265,6 +265,7 @@ If the lock cannot be acquired because someone else has the lock, and `IPFS_WAIT
- update `go-ds-pebble` to [v0.5.0](https://github.com/ipfs/go-ds-pebble/releases/tag/v0.5.0)
- update `pebble` to [v2.0.3](https://github.com/cockroachdb/pebble/releases/tag/v2.0.3)
- update `go-libp2p-pubsub` to [v0.13.1](https://github.com:/libp2p/go-libp2p-pubsub/releases/tag/v0.13.1)
+- update `go-libp2p-kad-dht` to [v0.33.1](https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.33.1) (incl. [v0.33.0](https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.33.0), [v0.32.0](https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.32.0), [v0.31.0](https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.31.0))
- update `go-log` to [v2.6.0](https://github.com/ipfs/go-log/releases/tag/v2.6.0)
- update `p2p-forge/client` to [v0.5.1](https://github.com/ipshipyard/p2p-forge/releases/tag/v0.5.1)
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index 2a13fc64f..3d19eb446 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -126,7 +126,7 @@ require (
github.com/libp2p/go-doh-resolver v0.5.0 // indirect
github.com/libp2p/go-flow-metrics v0.2.0 // indirect
github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect
- github.com/libp2p/go-libp2p-kad-dht v0.33.0 // indirect
+ github.com/libp2p/go-libp2p-kad-dht v0.33.1 // indirect
github.com/libp2p/go-libp2p-kbucket v0.7.0 // indirect
github.com/libp2p/go-libp2p-pubsub v0.13.1 // indirect
github.com/libp2p/go-libp2p-pubsub-router v0.6.0 // indirect
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index 7b536d253..d7a0f5127 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -470,8 +470,8 @@ github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl9
github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8=
github.com/libp2p/go-libp2p-core v0.2.4/go.mod h1:STh4fdfa5vDYr0/SzYYeqnt+E6KfEV5VxfIrm0bcI0g=
github.com/libp2p/go-libp2p-core v0.3.0/go.mod h1:ACp3DmS3/N64c2jDzcV429ukDpicbL6+TrrxANBjPGw=
-github.com/libp2p/go-libp2p-kad-dht v0.33.0 h1:lB6JFgLpsfEKTmcy27sPFulexEZMeN40zRsmIx8aFcw=
-github.com/libp2p/go-libp2p-kad-dht v0.33.0/go.mod h1:CdmNk4VeGJa9EXM9SLNyNVySEvduKvb+5rSC/H4pLAo=
+github.com/libp2p/go-libp2p-kad-dht v0.33.1 h1:hKFhHMf7WH69LDjaxsJUWOU6qZm71uO47M/a5ijkiP0=
+github.com/libp2p/go-libp2p-kad-dht v0.33.1/go.mod h1:CdmNk4VeGJa9EXM9SLNyNVySEvduKvb+5rSC/H4pLAo=
github.com/libp2p/go-libp2p-kbucket v0.3.1/go.mod h1:oyjT5O7tS9CQurok++ERgc46YLwEpuGoFq9ubvoUOio=
github.com/libp2p/go-libp2p-kbucket v0.7.0 h1:vYDvRjkyJPeWunQXqcW2Z6E93Ywx7fX0jgzb/dGOKCs=
github.com/libp2p/go-libp2p-kbucket v0.7.0/go.mod h1:blOINGIj1yiPYlVEX0Rj9QwEkmVnz3EP8LK1dRKBC6g=
diff --git a/go.mod b/go.mod
index b23e734a3..e0c447e4d 100644
--- a/go.mod
+++ b/go.mod
@@ -54,7 +54,7 @@ require (
github.com/libp2p/go-doh-resolver v0.5.0
github.com/libp2p/go-libp2p v0.41.1
github.com/libp2p/go-libp2p-http v0.5.0
- github.com/libp2p/go-libp2p-kad-dht v0.33.0
+ github.com/libp2p/go-libp2p-kad-dht v0.33.1
github.com/libp2p/go-libp2p-kbucket v0.7.0
github.com/libp2p/go-libp2p-pubsub v0.13.1
github.com/libp2p/go-libp2p-pubsub-router v0.6.0
diff --git a/go.sum b/go.sum
index e4080d1a4..5aad5df9f 100644
--- a/go.sum
+++ b/go.sum
@@ -553,8 +553,8 @@ github.com/libp2p/go-libp2p-gostream v0.6.0 h1:QfAiWeQRce6pqnYfmIVWJFXNdDyfiR/qk
github.com/libp2p/go-libp2p-gostream v0.6.0/go.mod h1:Nywu0gYZwfj7Jc91PQvbGU8dIpqbQQkjWgDuOrFaRdA=
github.com/libp2p/go-libp2p-http v0.5.0 h1:+x0AbLaUuLBArHubbbNRTsgWz0RjNTy6DJLOxQ3/QBc=
github.com/libp2p/go-libp2p-http v0.5.0/go.mod h1:glh87nZ35XCQyFsdzZps6+F4HYI6DctVFY5u1fehwSg=
-github.com/libp2p/go-libp2p-kad-dht v0.33.0 h1:lB6JFgLpsfEKTmcy27sPFulexEZMeN40zRsmIx8aFcw=
-github.com/libp2p/go-libp2p-kad-dht v0.33.0/go.mod h1:CdmNk4VeGJa9EXM9SLNyNVySEvduKvb+5rSC/H4pLAo=
+github.com/libp2p/go-libp2p-kad-dht v0.33.1 h1:hKFhHMf7WH69LDjaxsJUWOU6qZm71uO47M/a5ijkiP0=
+github.com/libp2p/go-libp2p-kad-dht v0.33.1/go.mod h1:CdmNk4VeGJa9EXM9SLNyNVySEvduKvb+5rSC/H4pLAo=
github.com/libp2p/go-libp2p-kbucket v0.3.1/go.mod h1:oyjT5O7tS9CQurok++ERgc46YLwEpuGoFq9ubvoUOio=
github.com/libp2p/go-libp2p-kbucket v0.7.0 h1:vYDvRjkyJPeWunQXqcW2Z6E93Ywx7fX0jgzb/dGOKCs=
github.com/libp2p/go-libp2p-kbucket v0.7.0/go.mod h1:blOINGIj1yiPYlVEX0Rj9QwEkmVnz3EP8LK1dRKBC6g=
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index bbd891ab4..4da19941d 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -169,7 +169,7 @@ require (
github.com/libp2p/go-flow-metrics v0.2.0 // indirect
github.com/libp2p/go-libp2p v0.41.1 // indirect
github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect
- github.com/libp2p/go-libp2p-kad-dht v0.33.0 // indirect
+ github.com/libp2p/go-libp2p-kad-dht v0.33.1 // indirect
github.com/libp2p/go-libp2p-kbucket v0.7.0 // indirect
github.com/libp2p/go-libp2p-record v0.3.1 // indirect
github.com/libp2p/go-libp2p-routing-helpers v0.7.5 // indirect
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index 22e953d6f..bc4f7a9b2 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -440,8 +440,8 @@ github.com/libp2p/go-libp2p v0.41.1 h1:8ecNQVT5ev/jqALTvisSJeVNvXYJyK4NhQx1nNRXQ
github.com/libp2p/go-libp2p v0.41.1/go.mod h1:DcGTovJzQl/I7HMrby5ZRjeD0kQkGiy+9w6aEkSZpRI=
github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94=
github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8=
-github.com/libp2p/go-libp2p-kad-dht v0.33.0 h1:lB6JFgLpsfEKTmcy27sPFulexEZMeN40zRsmIx8aFcw=
-github.com/libp2p/go-libp2p-kad-dht v0.33.0/go.mod h1:CdmNk4VeGJa9EXM9SLNyNVySEvduKvb+5rSC/H4pLAo=
+github.com/libp2p/go-libp2p-kad-dht v0.33.1 h1:hKFhHMf7WH69LDjaxsJUWOU6qZm71uO47M/a5ijkiP0=
+github.com/libp2p/go-libp2p-kad-dht v0.33.1/go.mod h1:CdmNk4VeGJa9EXM9SLNyNVySEvduKvb+5rSC/H4pLAo=
github.com/libp2p/go-libp2p-kbucket v0.7.0 h1:vYDvRjkyJPeWunQXqcW2Z6E93Ywx7fX0jgzb/dGOKCs=
github.com/libp2p/go-libp2p-kbucket v0.7.0/go.mod h1:blOINGIj1yiPYlVEX0Rj9QwEkmVnz3EP8LK1dRKBC6g=
github.com/libp2p/go-libp2p-record v0.3.1 h1:cly48Xi5GjNw5Wq+7gmjfBiG9HCzQVkiZOUZ8kUl+Fg=
From b47f0b30a8a32d6f623ef7a875f76a052eda8d6b Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Wed, 21 May 2025 17:26:25 +0200
Subject: [PATCH 244/499] fix: go-libp2p-kad-dht v0.33.1 (#10814)
https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.33.1
(cherry picked from commit 46b2e60c9f542a94b9922a90b9a329d19c39509a)
---
docs/changelogs/v0.35.md | 2 +-
docs/examples/kubo-as-a-library/go.mod | 18 ++++++------
docs/examples/kubo-as-a-library/go.sum | 36 +++++++++++------------
go.mod | 20 ++++++-------
go.sum | 40 +++++++++++++-------------
test/dependencies/go.mod | 20 ++++++-------
test/dependencies/go.sum | 40 +++++++++++++-------------
7 files changed, 88 insertions(+), 88 deletions(-)
diff --git a/docs/changelogs/v0.35.md b/docs/changelogs/v0.35.md
index 759f1ae9e..9186b2608 100644
--- a/docs/changelogs/v0.35.md
+++ b/docs/changelogs/v0.35.md
@@ -265,7 +265,7 @@ If the lock cannot be acquired because someone else has the lock, and `IPFS_WAIT
- update `go-ds-pebble` to [v0.5.0](https://github.com/ipfs/go-ds-pebble/releases/tag/v0.5.0)
- update `pebble` to [v2.0.3](https://github.com/cockroachdb/pebble/releases/tag/v2.0.3)
- update `go-libp2p-pubsub` to [v0.13.1](https://github.com:/libp2p/go-libp2p-pubsub/releases/tag/v0.13.1)
-- update `go-libp2p-kad-dht` to [v0.32.0](https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.32.0) (incl. [v0.31.0](https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.31.0))
+- update `go-libp2p-kad-dht` to [v0.33.1](https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.33.1) (incl. [v0.33.0](https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.33.0), [v0.32.0](https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.32.0), [v0.31.0](https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.31.0))
- update `go-log` to [v2.6.0](https://github.com/ipfs/go-log/releases/tag/v2.6.0)
- update `p2p-forge/client` to [v0.5.1](https://github.com/ipshipyard/p2p-forge/releases/tag/v0.5.1)
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index 8524c1385..c5334ab2a 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -126,7 +126,7 @@ require (
github.com/libp2p/go-doh-resolver v0.5.0 // indirect
github.com/libp2p/go-flow-metrics v0.2.0 // indirect
github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect
- github.com/libp2p/go-libp2p-kad-dht v0.32.0 // indirect
+ github.com/libp2p/go-libp2p-kad-dht v0.33.1 // indirect
github.com/libp2p/go-libp2p-kbucket v0.7.0 // indirect
github.com/libp2p/go-libp2p-pubsub v0.13.1 // indirect
github.com/libp2p/go-libp2p-pubsub-router v0.6.0 // indirect
@@ -141,7 +141,7 @@ require (
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mholt/acmez/v3 v3.0.0 // indirect
- github.com/miekg/dns v1.1.65 // indirect
+ github.com/miekg/dns v1.1.66 // indirect
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect
github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect
github.com/minio/sha256-simd v1.0.1 // indirect
@@ -225,14 +225,14 @@ require (
go.uber.org/zap v1.27.0 // indirect
go.uber.org/zap/exp v0.3.0 // indirect
go4.org v0.0.0-20230225012048-214862532bf5 // indirect
- golang.org/x/crypto v0.37.0 // indirect
- golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect
+ golang.org/x/crypto v0.38.0 // indirect
+ golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect
golang.org/x/mod v0.24.0 // indirect
- golang.org/x/net v0.39.0 // indirect
- golang.org/x/sync v0.13.0 // indirect
+ golang.org/x/net v0.40.0 // indirect
+ golang.org/x/sync v0.14.0 // indirect
golang.org/x/sys v0.33.0 // indirect
- golang.org/x/text v0.24.0 // indirect
- golang.org/x/tools v0.32.0 // indirect
+ golang.org/x/text v0.25.0 // indirect
+ golang.org/x/tools v0.33.0 // indirect
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
gonum.org/v1/gonum v0.16.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20241007155032-5fefd90f89a9 // indirect
@@ -240,5 +240,5 @@ require (
google.golang.org/grpc v1.67.1 // indirect
google.golang.org/protobuf v1.36.6 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
- lukechampine.com/blake3 v1.4.0 // indirect
+ lukechampine.com/blake3 v1.4.1 // indirect
)
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index 02ba33ac4..0a3f3a329 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -470,8 +470,8 @@ github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl9
github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8=
github.com/libp2p/go-libp2p-core v0.2.4/go.mod h1:STh4fdfa5vDYr0/SzYYeqnt+E6KfEV5VxfIrm0bcI0g=
github.com/libp2p/go-libp2p-core v0.3.0/go.mod h1:ACp3DmS3/N64c2jDzcV429ukDpicbL6+TrrxANBjPGw=
-github.com/libp2p/go-libp2p-kad-dht v0.32.0 h1:dpyq7o00od98vPQG0IZvNHpeLnKyuICN1nVzGnVMC9k=
-github.com/libp2p/go-libp2p-kad-dht v0.32.0/go.mod h1:vQU5oE9hMHXJhSQawbZapC9u0U9dc+tWC0DYasGmIAA=
+github.com/libp2p/go-libp2p-kad-dht v0.33.1 h1:hKFhHMf7WH69LDjaxsJUWOU6qZm71uO47M/a5ijkiP0=
+github.com/libp2p/go-libp2p-kad-dht v0.33.1/go.mod h1:CdmNk4VeGJa9EXM9SLNyNVySEvduKvb+5rSC/H4pLAo=
github.com/libp2p/go-libp2p-kbucket v0.3.1/go.mod h1:oyjT5O7tS9CQurok++ERgc46YLwEpuGoFq9ubvoUOio=
github.com/libp2p/go-libp2p-kbucket v0.7.0 h1:vYDvRjkyJPeWunQXqcW2Z6E93Ywx7fX0jgzb/dGOKCs=
github.com/libp2p/go-libp2p-kbucket v0.7.0/go.mod h1:blOINGIj1yiPYlVEX0Rj9QwEkmVnz3EP8LK1dRKBC6g=
@@ -519,8 +519,8 @@ github.com/mholt/acmez/v3 v3.0.0 h1:r1NcjuWR0VaKP2BTjDK9LRFBw/WvURx3jlaEUl9Ht8E=
github.com/mholt/acmez/v3 v3.0.0/go.mod h1:L1wOU06KKvq7tswuMDwKdcHeKpFFgkppZy/y0DFxagQ=
github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4=
github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4=
-github.com/miekg/dns v1.1.65 h1:0+tIPHzUW0GCge7IiK3guGP57VAw7hoPDfApjkMD1Fc=
-github.com/miekg/dns v1.1.65/go.mod h1:Dzw9769uoKVaLuODMDZz9M6ynFU6Em65csPuoi8G0ck=
+github.com/miekg/dns v1.1.66 h1:FeZXOS3VCVsKnEAd+wBkjMC3D2K+ww66Cq3VnCINuJE=
+github.com/miekg/dns v1.1.66/go.mod h1:jGFzBsSNbJw6z1HYut1RKBKHA9PBdxeHrZG8J+gC2WE=
github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8=
github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms=
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc=
@@ -892,8 +892,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
-golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE=
-golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc=
+golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8=
+golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -902,8 +902,8 @@ golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE
golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
-golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM=
-golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8=
+golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=
+golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -963,8 +963,8 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
-golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY=
-golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E=
+golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY=
+golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -983,8 +983,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610=
-golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
+golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=
+golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1054,8 +1054,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
-golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0=
-golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU=
+golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4=
+golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA=
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -1098,8 +1098,8 @@ golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4f
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
-golang.org/x/tools v0.32.0 h1:Q7N1vhpkQv7ybVzLFtTjvQya2ewbwNDZzUgfXGqtMWU=
-golang.org/x/tools v0.32.0/go.mod h1:ZxrU41P/wAbZD8EDa6dDCa6XfpkhJ7HFMjHJXfBDu8s=
+golang.org/x/tools v0.33.0 h1:4qz2S3zmRxbGIhDIAgjxvFutSvH5EfnsYrRBj0UI0bc=
+golang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -1204,8 +1204,8 @@ honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWh
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
-lukechampine.com/blake3 v1.4.0 h1:xDbKOZCVbnZsfzM6mHSYcGRHZ3YrLDzqz8XnV4uaD5w=
-lukechampine.com/blake3 v1.4.0/go.mod h1:MQJNQCTnR+kwOP/JEZSxj3MaQjp80FOFSNMMHXcSeX0=
+lukechampine.com/blake3 v1.4.1 h1:I3Smz7gso8w4/TunLKec6K2fn+kyKtDxr/xcQEN84Wg=
+lukechampine.com/blake3 v1.4.1/go.mod h1:QFosUxmjB8mnrWFSNwKmvxHpfY72bmD2tQ0kBMM3kwo=
pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw=
pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04=
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
diff --git a/go.mod b/go.mod
index 7b70363f9..74ecb4bf7 100644
--- a/go.mod
+++ b/go.mod
@@ -55,7 +55,7 @@ require (
github.com/libp2p/go-doh-resolver v0.5.0
github.com/libp2p/go-libp2p v0.41.1
github.com/libp2p/go-libp2p-http v0.5.0
- github.com/libp2p/go-libp2p-kad-dht v0.32.0
+ github.com/libp2p/go-libp2p-kad-dht v0.33.1
github.com/libp2p/go-libp2p-kbucket v0.7.0
github.com/libp2p/go-libp2p-pubsub v0.13.1
github.com/libp2p/go-libp2p-pubsub-router v0.6.0
@@ -87,10 +87,10 @@ require (
go.uber.org/fx v1.23.0
go.uber.org/multierr v1.11.0
go.uber.org/zap v1.27.0
- golang.org/x/crypto v0.37.0
- golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0
+ golang.org/x/crypto v0.38.0
+ golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6
golang.org/x/mod v0.24.0
- golang.org/x/sync v0.13.0
+ golang.org/x/sync v0.14.0
golang.org/x/sys v0.33.0
google.golang.org/protobuf v1.36.6
)
@@ -187,7 +187,7 @@ require (
github.com/mattn/go-runewidth v0.0.15 // indirect
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect
github.com/mholt/acmez/v3 v3.0.0 // indirect
- github.com/miekg/dns v1.1.65 // indirect
+ github.com/miekg/dns v1.1.66 // indirect
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect
github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect
github.com/minio/sha256-simd v1.0.1 // indirect
@@ -265,11 +265,11 @@ require (
go.uber.org/mock v0.5.0 // indirect
go.uber.org/zap/exp v0.3.0 // indirect
go4.org v0.0.0-20230225012048-214862532bf5 // indirect
- golang.org/x/net v0.39.0 // indirect
+ golang.org/x/net v0.40.0 // indirect
golang.org/x/oauth2 v0.25.0 // indirect
- golang.org/x/term v0.31.0 // indirect
- golang.org/x/text v0.24.0 // indirect
- golang.org/x/tools v0.32.0 // indirect
+ golang.org/x/term v0.32.0 // indirect
+ golang.org/x/text v0.25.0 // indirect
+ golang.org/x/tools v0.33.0 // indirect
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
gonum.org/v1/gonum v0.16.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20241007155032-5fefd90f89a9 // indirect
@@ -277,5 +277,5 @@ require (
google.golang.org/grpc v1.67.1 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
- lukechampine.com/blake3 v1.4.0 // indirect
+ lukechampine.com/blake3 v1.4.1 // indirect
)
diff --git a/go.sum b/go.sum
index bd0e43274..6eafdb1dd 100644
--- a/go.sum
+++ b/go.sum
@@ -556,8 +556,8 @@ github.com/libp2p/go-libp2p-gostream v0.6.0 h1:QfAiWeQRce6pqnYfmIVWJFXNdDyfiR/qk
github.com/libp2p/go-libp2p-gostream v0.6.0/go.mod h1:Nywu0gYZwfj7Jc91PQvbGU8dIpqbQQkjWgDuOrFaRdA=
github.com/libp2p/go-libp2p-http v0.5.0 h1:+x0AbLaUuLBArHubbbNRTsgWz0RjNTy6DJLOxQ3/QBc=
github.com/libp2p/go-libp2p-http v0.5.0/go.mod h1:glh87nZ35XCQyFsdzZps6+F4HYI6DctVFY5u1fehwSg=
-github.com/libp2p/go-libp2p-kad-dht v0.32.0 h1:dpyq7o00od98vPQG0IZvNHpeLnKyuICN1nVzGnVMC9k=
-github.com/libp2p/go-libp2p-kad-dht v0.32.0/go.mod h1:vQU5oE9hMHXJhSQawbZapC9u0U9dc+tWC0DYasGmIAA=
+github.com/libp2p/go-libp2p-kad-dht v0.33.1 h1:hKFhHMf7WH69LDjaxsJUWOU6qZm71uO47M/a5ijkiP0=
+github.com/libp2p/go-libp2p-kad-dht v0.33.1/go.mod h1:CdmNk4VeGJa9EXM9SLNyNVySEvduKvb+5rSC/H4pLAo=
github.com/libp2p/go-libp2p-kbucket v0.3.1/go.mod h1:oyjT5O7tS9CQurok++ERgc46YLwEpuGoFq9ubvoUOio=
github.com/libp2p/go-libp2p-kbucket v0.7.0 h1:vYDvRjkyJPeWunQXqcW2Z6E93Ywx7fX0jgzb/dGOKCs=
github.com/libp2p/go-libp2p-kbucket v0.7.0/go.mod h1:blOINGIj1yiPYlVEX0Rj9QwEkmVnz3EP8LK1dRKBC6g=
@@ -617,8 +617,8 @@ github.com/mholt/acmez/v3 v3.0.0 h1:r1NcjuWR0VaKP2BTjDK9LRFBw/WvURx3jlaEUl9Ht8E=
github.com/mholt/acmez/v3 v3.0.0/go.mod h1:L1wOU06KKvq7tswuMDwKdcHeKpFFgkppZy/y0DFxagQ=
github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4=
github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4=
-github.com/miekg/dns v1.1.65 h1:0+tIPHzUW0GCge7IiK3guGP57VAw7hoPDfApjkMD1Fc=
-github.com/miekg/dns v1.1.65/go.mod h1:Dzw9769uoKVaLuODMDZz9M6ynFU6Em65csPuoi8G0ck=
+github.com/miekg/dns v1.1.66 h1:FeZXOS3VCVsKnEAd+wBkjMC3D2K+ww66Cq3VnCINuJE=
+github.com/miekg/dns v1.1.66/go.mod h1:jGFzBsSNbJw6z1HYut1RKBKHA9PBdxeHrZG8J+gC2WE=
github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8=
github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms=
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc=
@@ -1062,8 +1062,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
-golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE=
-golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc=
+golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8=
+golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -1074,8 +1074,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
-golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM=
-golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8=
+golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=
+golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -1152,8 +1152,8 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
-golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY=
-golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E=
+golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY=
+golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -1180,8 +1180,8 @@ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610=
-golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
+golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=
+golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1262,8 +1262,8 @@ golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU=
golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY=
-golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o=
-golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw=
+golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg=
+golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -1275,8 +1275,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
-golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0=
-golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU=
+golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4=
+golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA=
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -1336,8 +1336,8 @@ golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4f
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
-golang.org/x/tools v0.32.0 h1:Q7N1vhpkQv7ybVzLFtTjvQya2ewbwNDZzUgfXGqtMWU=
-golang.org/x/tools v0.32.0/go.mod h1:ZxrU41P/wAbZD8EDa6dDCa6XfpkhJ7HFMjHJXfBDu8s=
+golang.org/x/tools v0.33.0 h1:4qz2S3zmRxbGIhDIAgjxvFutSvH5EfnsYrRBj0UI0bc=
+golang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -1477,8 +1477,8 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
-lukechampine.com/blake3 v1.4.0 h1:xDbKOZCVbnZsfzM6mHSYcGRHZ3YrLDzqz8XnV4uaD5w=
-lukechampine.com/blake3 v1.4.0/go.mod h1:MQJNQCTnR+kwOP/JEZSxj3MaQjp80FOFSNMMHXcSeX0=
+lukechampine.com/blake3 v1.4.1 h1:I3Smz7gso8w4/TunLKec6K2fn+kyKtDxr/xcQEN84Wg=
+lukechampine.com/blake3 v1.4.1/go.mod h1:QFosUxmjB8mnrWFSNwKmvxHpfY72bmD2tQ0kBMM3kwo=
pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw=
pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04=
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index dde8ee6af..a73c6d660 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -169,7 +169,7 @@ require (
github.com/libp2p/go-flow-metrics v0.2.0 // indirect
github.com/libp2p/go-libp2p v0.41.1 // indirect
github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect
- github.com/libp2p/go-libp2p-kad-dht v0.32.0 // indirect
+ github.com/libp2p/go-libp2p-kad-dht v0.33.1 // indirect
github.com/libp2p/go-libp2p-kbucket v0.7.0 // indirect
github.com/libp2p/go-libp2p-record v0.3.1 // indirect
github.com/libp2p/go-libp2p-routing-helpers v0.7.5 // indirect
@@ -188,7 +188,7 @@ require (
github.com/mattn/go-shellwords v1.0.12 // indirect
github.com/mgechev/revive v1.3.9 // indirect
github.com/mholt/acmez/v3 v3.0.0 // indirect
- github.com/miekg/dns v1.1.65 // indirect
+ github.com/miekg/dns v1.1.66 // indirect
github.com/minio/sha256-simd v1.0.1 // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
@@ -310,23 +310,23 @@ require (
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.27.0 // indirect
go.uber.org/zap/exp v0.3.0 // indirect
- golang.org/x/crypto v0.37.0 // indirect
- golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect
+ golang.org/x/crypto v0.38.0 // indirect
+ golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect
golang.org/x/exp/typeparams v0.0.0-20240314144324-c7f7c6466f7f // indirect
golang.org/x/mod v0.24.0 // indirect
- golang.org/x/net v0.39.0 // indirect
- golang.org/x/sync v0.13.0 // indirect
+ golang.org/x/net v0.40.0 // indirect
+ golang.org/x/sync v0.14.0 // indirect
golang.org/x/sys v0.33.0 // indirect
- golang.org/x/term v0.31.0 // indirect
- golang.org/x/text v0.24.0 // indirect
- golang.org/x/tools v0.32.0 // indirect
+ golang.org/x/term v0.32.0 // indirect
+ golang.org/x/text v0.25.0 // indirect
+ golang.org/x/tools v0.33.0 // indirect
gonum.org/v1/gonum v0.16.0 // indirect
google.golang.org/protobuf v1.36.6 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
honnef.co/go/tools v0.5.1 // indirect
- lukechampine.com/blake3 v1.4.0 // indirect
+ lukechampine.com/blake3 v1.4.1 // indirect
mvdan.cc/gofumpt v0.7.0 // indirect
mvdan.cc/unparam v0.0.0-20240528143540-8a5130ca722f // indirect
)
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index 8c9bbdd34..c1d2937e0 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -440,8 +440,8 @@ github.com/libp2p/go-libp2p v0.41.1 h1:8ecNQVT5ev/jqALTvisSJeVNvXYJyK4NhQx1nNRXQ
github.com/libp2p/go-libp2p v0.41.1/go.mod h1:DcGTovJzQl/I7HMrby5ZRjeD0kQkGiy+9w6aEkSZpRI=
github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94=
github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8=
-github.com/libp2p/go-libp2p-kad-dht v0.32.0 h1:dpyq7o00od98vPQG0IZvNHpeLnKyuICN1nVzGnVMC9k=
-github.com/libp2p/go-libp2p-kad-dht v0.32.0/go.mod h1:vQU5oE9hMHXJhSQawbZapC9u0U9dc+tWC0DYasGmIAA=
+github.com/libp2p/go-libp2p-kad-dht v0.33.1 h1:hKFhHMf7WH69LDjaxsJUWOU6qZm71uO47M/a5ijkiP0=
+github.com/libp2p/go-libp2p-kad-dht v0.33.1/go.mod h1:CdmNk4VeGJa9EXM9SLNyNVySEvduKvb+5rSC/H4pLAo=
github.com/libp2p/go-libp2p-kbucket v0.7.0 h1:vYDvRjkyJPeWunQXqcW2Z6E93Ywx7fX0jgzb/dGOKCs=
github.com/libp2p/go-libp2p-kbucket v0.7.0/go.mod h1:blOINGIj1yiPYlVEX0Rj9QwEkmVnz3EP8LK1dRKBC6g=
github.com/libp2p/go-libp2p-record v0.3.1 h1:cly48Xi5GjNw5Wq+7gmjfBiG9HCzQVkiZOUZ8kUl+Fg=
@@ -494,8 +494,8 @@ github.com/mgechev/revive v1.3.9/go.mod h1:+uxEIr5UH0TjXWHTno3xh4u7eg6jDpXKzQccA
github.com/mholt/acmez/v3 v3.0.0 h1:r1NcjuWR0VaKP2BTjDK9LRFBw/WvURx3jlaEUl9Ht8E=
github.com/mholt/acmez/v3 v3.0.0/go.mod h1:L1wOU06KKvq7tswuMDwKdcHeKpFFgkppZy/y0DFxagQ=
github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4=
-github.com/miekg/dns v1.1.65 h1:0+tIPHzUW0GCge7IiK3guGP57VAw7hoPDfApjkMD1Fc=
-github.com/miekg/dns v1.1.65/go.mod h1:Dzw9769uoKVaLuODMDZz9M6ynFU6Em65csPuoi8G0ck=
+github.com/miekg/dns v1.1.66 h1:FeZXOS3VCVsKnEAd+wBkjMC3D2K+ww66Cq3VnCINuJE=
+github.com/miekg/dns v1.1.66/go.mod h1:jGFzBsSNbJw6z1HYut1RKBKHA9PBdxeHrZG8J+gC2WE=
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc=
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b/go.mod h1:lxPUiZwKoFL8DUUmalo2yJJUCxbPKtm8OKfqr2/FTNU=
github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc h1:PTfri+PuQmWDqERdnNMiD9ZejrlswWrCpBEZgWOiTrc=
@@ -881,11 +881,11 @@ golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
-golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE=
-golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc=
+golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8=
+golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM=
-golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8=
+golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=
+golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=
golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
golang.org/x/exp/typeparams v0.0.0-20240314144324-c7f7c6466f7f h1:phY1HzDcf18Aq9A8KkmRtY9WvOFIxN8wgfvy6Zm1DV8=
@@ -943,8 +943,8 @@ golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
-golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY=
-golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E=
+golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY=
+golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -964,8 +964,8 @@ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
-golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610=
-golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
+golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=
+golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1021,8 +1021,8 @@ golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY=
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58=
-golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o=
-golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw=
+golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg=
+golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
@@ -1037,8 +1037,8 @@ golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
-golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0=
-golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU=
+golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4=
+golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA=
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U=
@@ -1076,8 +1076,8 @@ golang.org/x/tools v0.11.0/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8
golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg=
golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc=
-golang.org/x/tools v0.32.0 h1:Q7N1vhpkQv7ybVzLFtTjvQya2ewbwNDZzUgfXGqtMWU=
-golang.org/x/tools v0.32.0/go.mod h1:ZxrU41P/wAbZD8EDa6dDCa6XfpkhJ7HFMjHJXfBDu8s=
+golang.org/x/tools v0.33.0 h1:4qz2S3zmRxbGIhDIAgjxvFutSvH5EfnsYrRBj0UI0bc=
+golang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -1125,8 +1125,8 @@ honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWh
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.5.1 h1:4bH5o3b5ZULQ4UrBmP+63W9r7qIkqJClEA9ko5YKx+I=
honnef.co/go/tools v0.5.1/go.mod h1:e9irvo83WDG9/irijV44wr3tbhcFeRnfpVlRqVwpzMs=
-lukechampine.com/blake3 v1.4.0 h1:xDbKOZCVbnZsfzM6mHSYcGRHZ3YrLDzqz8XnV4uaD5w=
-lukechampine.com/blake3 v1.4.0/go.mod h1:MQJNQCTnR+kwOP/JEZSxj3MaQjp80FOFSNMMHXcSeX0=
+lukechampine.com/blake3 v1.4.1 h1:I3Smz7gso8w4/TunLKec6K2fn+kyKtDxr/xcQEN84Wg=
+lukechampine.com/blake3 v1.4.1/go.mod h1:QFosUxmjB8mnrWFSNwKmvxHpfY72bmD2tQ0kBMM3kwo=
mvdan.cc/gofumpt v0.7.0 h1:bg91ttqXmi9y2xawvkuMXyvAA/1ZGJqYAEGjXuP0JXU=
mvdan.cc/gofumpt v0.7.0/go.mod h1:txVFJy/Sc/mvaycET54pV8SW8gWxTlUuGHVEcncmNUo=
mvdan.cc/unparam v0.0.0-20240528143540-8a5130ca722f h1:lMpcwN6GxNbWtbpI1+xzFLSW8XzX0u72NttUGVFjO3U=
From 49e2690001a5b9320267015936cf15a708fd1c13 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Wed, 21 May 2025 17:57:27 +0200
Subject: [PATCH 245/499] chore(version): 0.35.0
---
docs/changelogs/v0.35.md | 140 +++++++++++++++++++++++++++++++++++++++
version.go | 2 +-
2 files changed, 141 insertions(+), 1 deletion(-)
diff --git a/docs/changelogs/v0.35.md b/docs/changelogs/v0.35.md
index 9186b2608..d94063e0c 100644
--- a/docs/changelogs/v0.35.md
+++ b/docs/changelogs/v0.35.md
@@ -270,4 +270,144 @@ If the lock cannot be acquired because someone else has the lock, and `IPFS_WAIT
- update `p2p-forge/client` to [v0.5.1](https://github.com/ipshipyard/p2p-forge/releases/tag/v0.5.1)
### ๐ Changelog
+
+Full Changelog
+
+- github.com/ipfs/kubo:
+ - chore(version): 0.35.0
+ - fix: go-libp2p-kad-dht v0.33.1 (#10814) ([ipfs/kubo#10814](https://github.com/ipfs/kubo/pull/10814))
+ - fix: p2p-forge v0.5.1 ignoring /p2p-circuit (#10813) ([ipfs/kubo#10813](https://github.com/ipfs/kubo/pull/10813))
+ - chore(version): 0.35.0-rc2
+ - fix(fuse): ipns error handling and friendly errors (#10807) ([ipfs/kubo#10807](https://github.com/ipfs/kubo/pull/10807))
+ - fix(config): wire up `Provider.Enabled` flag (#10804) ([ipfs/kubo#10804](https://github.com/ipfs/kubo/pull/10804))
+ - docs(changelog): go-libp2p-kad-dht
+ - chore(version): 0.35.0-rc1
+ - feat: IPFS_WAIT_REPO_LOCK (#10797) ([ipfs/kubo#10797](https://github.com/ipfs/kubo/pull/10797))
+ - logging: upgrade to go-log/v2 v2.6.0 (#10798) ([ipfs/kubo#10798](https://github.com/ipfs/kubo/pull/10798))
+ - chore: ensure /mfs is present in docker
+ - feat(fuse): Expose MFS as FUSE mount point (#10781) ([ipfs/kubo#10781](https://github.com/ipfs/kubo/pull/10781))
+ - feat: opt-in http retrieval client (#10772) ([ipfs/kubo#10772](https://github.com/ipfs/kubo/pull/10772))
+ - Update go-libp2p-pubsub to v0.13.1 (#10795) ([ipfs/kubo#10795](https://github.com/ipfs/kubo/pull/10795))
+ - feat(config): ability to disable Bitswap fully or just server (#10782) ([ipfs/kubo#10782](https://github.com/ipfs/kubo/pull/10782))
+ - refactor: make datastore metrics opt-in (#10788) ([ipfs/kubo#10788](https://github.com/ipfs/kubo/pull/10788))
+ - feat(pebble): support pinning `FormatMajorVersion` (#10789) ([ipfs/kubo#10789](https://github.com/ipfs/kubo/pull/10789))
+ - feat: `Provider.WorkerCount` and `stats reprovide` (#10779) ([ipfs/kubo#10779](https://github.com/ipfs/kubo/pull/10779))
+ - Upgrade to Boxo v0.30.0 (#10794) ([ipfs/kubo#10794](https://github.com/ipfs/kubo/pull/10794))
+ - docs: use latest fuse package (#10791) ([ipfs/kubo#10791](https://github.com/ipfs/kubo/pull/10791))
+ - remove duplicate workds (#10790) ([ipfs/kubo#10790](https://github.com/ipfs/kubo/pull/10790))
+ - feat(config): `ipfs add` and `Import` options for controling UnixFS DAG Width (#10774) ([ipfs/kubo#10774](https://github.com/ipfs/kubo/pull/10774))
+ - feat(config): expose ProviderSearchMaxResults (#10773) ([ipfs/kubo#10773](https://github.com/ipfs/kubo/pull/10773))
+ - feat: ipfs-webui v4.7.0 (#10780) ([ipfs/kubo#10780](https://github.com/ipfs/kubo/pull/10780))
+ - feat: partial DAG provides with Reprovider.Strategy=mfs|pinned+mfs (#10754) ([ipfs/kubo#10754](https://github.com/ipfs/kubo/pull/10754))
+ - chore: update url
+ - docs: known issues with file/urlstores (#10768) ([ipfs/kubo#10768](https://github.com/ipfs/kubo/pull/10768))
+ - fix: Add IPFS & IPNS path details to error (re. #10762) (#10770) ([ipfs/kubo#10770](https://github.com/ipfs/kubo/pull/10770))
+ - docs: Fix typo in v0.34 changelog (#10771) ([ipfs/kubo#10771](https://github.com/ipfs/kubo/pull/10771))
+ - Support WithIgnoreProviders() in provider query manager ([ipfs/kubo#10765](https://github.com/ipfs/kubo/pull/10765))
+ - Merge release v0.34.1 ([ipfs/kubo#10766](https://github.com/ipfs/kubo/pull/10766))
+ - fix: reprovides warning (#10761) ([ipfs/kubo#10761](https://github.com/ipfs/kubo/pull/10761))
+ - Merge release v0.34.0 ([ipfs/kubo#10759](https://github.com/ipfs/kubo/pull/10759))
+ - feat: ipfs-webui v4.6 (#10756) ([ipfs/kubo#10756](https://github.com/ipfs/kubo/pull/10756))
+ - docs(readme): update min. requirements + cleanup (#10750) ([ipfs/kubo#10750](https://github.com/ipfs/kubo/pull/10750))
+ - Upgrade to Boxo v0.29.1 (#10755) ([ipfs/kubo#10755](https://github.com/ipfs/kubo/pull/10755))
+ - Nonfunctional (#10753) ([ipfs/kubo#10753](https://github.com/ipfs/kubo/pull/10753))
+ - provider: buffer pin providers ([ipfs/kubo#10746](https://github.com/ipfs/kubo/pull/10746))
+ - chore: 0.35.0-dev
+- github.com/ipfs/boxo (v0.29.1 -> v0.30.0):
+ - Release v0.30.0 ([ipfs/boxo#915](https://github.com/ipfs/boxo/pull/915))
+ - feat(bitswap): add option to disable Bitswap server (#911) ([ipfs/boxo#911](https://github.com/ipfs/boxo/pull/911))
+ - provider: dedicated provide queue (#907) ([ipfs/boxo#907](https://github.com/ipfs/boxo/pull/907))
+ - provider: deduplicate cids in queue (#910) ([ipfs/boxo#910](https://github.com/ipfs/boxo/pull/910))
+ - feat(unixfs/mfs): support MaxLinks and MaxHAMTFanout (#906) ([ipfs/boxo#906](https://github.com/ipfs/boxo/pull/906))
+ - feat(ipld/unixfs): DagModifier: allow specifying MaxLinks per file (#898) ([ipfs/boxo#898](https://github.com/ipfs/boxo/pull/898))
+ - feat: NewDAGProvider to walk partial DAGs in offline mode (#905) ([ipfs/boxo#905](https://github.com/ipfs/boxo/pull/905))
+ - gateway: check for UseSubdomains with IP addresses (#903) ([ipfs/boxo#903](https://github.com/ipfs/boxo/pull/903))
+ - feat(gateway): add cid copy button to directory listings (#899) ([ipfs/boxo#899](https://github.com/ipfs/boxo/pull/899))
+ - Improve performance of data onboarding (#888) ([ipfs/boxo#888](https://github.com/ipfs/boxo/pull/888))
+ - bitswap: add requestsInFlight metric ([ipfs/boxo#904](https://github.com/ipfs/boxo/pull/904))
+ - provider: simplify reprovide (#890) ([ipfs/boxo#890](https://github.com/ipfs/boxo/pull/890))
+ - Upgrade to go-libp2p v0.41.1 ([ipfs/boxo#896](https://github.com/ipfs/boxo/pull/896))
+ - Update RELEASE.md ([ipfs/boxo#892](https://github.com/ipfs/boxo/pull/892))
+ - changelog: document bsnet import path change ([ipfs/boxo#891](https://github.com/ipfs/boxo/pull/891))
+ - fix(gateway): preserve query parameters on _redirects ([ipfs/boxo#886](https://github.com/ipfs/boxo/pull/886))
+ - bitswap/httpnet: Add WithDenylist option ([ipfs/boxo#877](https://github.com/ipfs/boxo/pull/877))
+- github.com/ipfs/go-block-format (v0.2.0 -> v0.2.1):
+ - Update version (#60) ([ipfs/go-block-format#60](https://github.com/ipfs/go-block-format/pull/60))
+ - Update go-ipfs-util to use boxo (#52) ([ipfs/go-block-format#52](https://github.com/ipfs/go-block-format/pull/52))
+- github.com/ipfs/go-ds-pebble (v0.4.4 -> v0.5.0):
+ - new version (#53) ([ipfs/go-ds-pebble#53](https://github.com/ipfs/go-ds-pebble/pull/53))
+ - Upgrade to pebble v2.0.3 (#45) ([ipfs/go-ds-pebble#45](https://github.com/ipfs/go-ds-pebble/pull/45))
+- github.com/ipfs/go-fs-lock (v0.0.7 -> v0.1.1):
+ - new version (#48) ([ipfs/go-fs-lock#48](https://github.com/ipfs/go-fs-lock/pull/48))
+ - Return original error when WaitLock times out (#47) ([ipfs/go-fs-lock#47](https://github.com/ipfs/go-fs-lock/pull/47))
+ - new version (#45) ([ipfs/go-fs-lock#45](https://github.com/ipfs/go-fs-lock/pull/45))
+ - Add WaitLock function (#44) ([ipfs/go-fs-lock#44](https://github.com/ipfs/go-fs-lock/pull/44))
+ - sync: update CI config files ([ipfs/go-fs-lock#30](https://github.com/ipfs/go-fs-lock/pull/30))
+ - sync: update CI config files (#27) ([ipfs/go-fs-lock#27](https://github.com/ipfs/go-fs-lock/pull/27))
+ - sync: update CI config files ([ipfs/go-fs-lock#25](https://github.com/ipfs/go-fs-lock/pull/25))
+- github.com/ipfs/go-log/v2 (v2.5.1 -> v2.6.0):
+ - new version (#155) ([ipfs/go-log#155](https://github.com/ipfs/go-log/pull/155))
+ - feat: only log to stderr or to stdout or both if configured (#154) ([ipfs/go-log#154](https://github.com/ipfs/go-log/pull/154))
+ - ci: uci/copy-templates ([ipfs/go-log#145](https://github.com/ipfs/go-log/pull/145))
+ - sync: update CI config files (#137) ([ipfs/go-log#137](https://github.com/ipfs/go-log/pull/137))
+- github.com/libp2p/go-libp2p-kad-dht (v0.30.2 -> v0.33.1):
+ - chore: release v0.33.1 (#1088) ([libp2p/go-libp2p-kad-dht#1088](https://github.com/libp2p/go-libp2p-kad-dht/pull/1088))
+ - fix(fullrt): mutex cleanup (#1087) ([libp2p/go-libp2p-kad-dht#1087](https://github.com/libp2p/go-libp2p-kad-dht/pull/1087))
+ - fix: use correct mutex for reading keyToPeerMap (#1086) ([libp2p/go-libp2p-kad-dht#1086](https://github.com/libp2p/go-libp2p-kad-dht/pull/1086))
+ - fix: fullrt kMapLk unlock (#1085) ([libp2p/go-libp2p-kad-dht#1085](https://github.com/libp2p/go-libp2p-kad-dht/pull/1085))
+ - chore: release v0.33.0 (#1083) ([libp2p/go-libp2p-kad-dht#1083](https://github.com/libp2p/go-libp2p-kad-dht/pull/1083))
+ - fix/updates to use context passed in New function for context cancellation (#1081) ([libp2p/go-libp2p-kad-dht#1081](https://github.com/libp2p/go-libp2p-kad-dht/pull/1081))
+ - chore: release v0.31.1 (#1079) ([libp2p/go-libp2p-kad-dht#1079](https://github.com/libp2p/go-libp2p-kad-dht/pull/1079))
+ - fix: netsize warning (#1077) ([libp2p/go-libp2p-kad-dht#1077](https://github.com/libp2p/go-libp2p-kad-dht/pull/1077))
+ - fix: use correct message type attribute in metrics (#1076) ([libp2p/go-libp2p-kad-dht#1076](https://github.com/libp2p/go-libp2p-kad-dht/pull/1076))
+ - chore: bump go-log to v2 (#1074) ([libp2p/go-libp2p-kad-dht#1074](https://github.com/libp2p/go-libp2p-kad-dht/pull/1074))
+ - release v0.31.0 (#1072) ([libp2p/go-libp2p-kad-dht#1072](https://github.com/libp2p/go-libp2p-kad-dht/pull/1072))
+ - query: ip diversity filter (#1070) ([libp2p/go-libp2p-kad-dht#1070](https://github.com/libp2p/go-libp2p-kad-dht/pull/1070))
+ - tests: fix flaky TestProvidesExpire (#1069) ([libp2p/go-libp2p-kad-dht#1069](https://github.com/libp2p/go-libp2p-kad-dht/pull/1069))
+ - refactor: replace fmt.Errorf with errors.New when not formatting is required (#1067) ([libp2p/go-libp2p-kad-dht#1067](https://github.com/libp2p/go-libp2p-kad-dht/pull/1067))
+ - fix: error on no valid provs (#1065) ([libp2p/go-libp2p-kad-dht#1065](https://github.com/libp2p/go-libp2p-kad-dht/pull/1065))
+ - cleanup: remove deprecated opt package (#1064) ([libp2p/go-libp2p-kad-dht#1064](https://github.com/libp2p/go-libp2p-kad-dht/pull/1064))
+ - cleanup: fullrt ([libp2p/go-libp2p-kad-dht#1062](https://github.com/libp2p/go-libp2p-kad-dht/pull/1062))
+ - fix: remove peerstore no-op (#1063) ([libp2p/go-libp2p-kad-dht#1063](https://github.com/libp2p/go-libp2p-kad-dht/pull/1063))
+ - tests: flaky TestSearchValue (dual) (#1060) ([libp2p/go-libp2p-kad-dht#1060](https://github.com/libp2p/go-libp2p-kad-dht/pull/1060))
+- github.com/libp2p/go-libp2p-kbucket (v0.6.5 -> v0.7.0):
+ - chore: release v0.7.0 (#143) ([libp2p/go-libp2p-kbucket#143](https://github.com/libp2p/go-libp2p-kbucket/pull/143))
+ - peerdiversity: export IPGroupKey (#141) ([libp2p/go-libp2p-kbucket#141](https://github.com/libp2p/go-libp2p-kbucket/pull/141))
+ - fix: flaky TestUsefulNewPeer (#140) ([libp2p/go-libp2p-kbucket#140](https://github.com/libp2p/go-libp2p-kbucket/pull/140))
+ - fix: flaky TestTableFindMultipleBuckets (#139) ([libp2p/go-libp2p-kbucket#139](https://github.com/libp2p/go-libp2p-kbucket/pull/139))
+- github.com/libp2p/go-libp2p-pubsub (v0.13.0 -> v0.13.1):
+ - feat: WithValidatorData publishing option (#603) ([libp2p/go-libp2p-pubsub#603](https://github.com/libp2p/go-libp2p-pubsub/pull/603))
+ - feat: avoid repeated checksum calculations (#599) ([libp2p/go-libp2p-pubsub#599](https://github.com/libp2p/go-libp2p-pubsub/pull/599))
+- github.com/libp2p/go-yamux/v4 (v4.0.1 -> v4.0.2):
+ - Release v4.0.2 (#124) ([libp2p/go-yamux#124](https://github.com/libp2p/go-yamux/pull/124))
+ - fix: remove noisy logs (#116) ([libp2p/go-yamux#116](https://github.com/libp2p/go-yamux/pull/116))
+ - check deadline before sending a message (#114) ([libp2p/go-yamux#114](https://github.com/libp2p/go-yamux/pull/114))
+ - only check KeepAliveInterval if keep-alives are enabled (#113) ([libp2p/go-yamux#113](https://github.com/libp2p/go-yamux/pull/113))
+ - ci: uci/copy-templates ([libp2p/go-yamux#109](https://github.com/libp2p/go-yamux/pull/109))
+
+
+
### ๐จโ๐ฉโ๐งโ๐ฆ Contributors
+
+| Contributor | Commits | Lines ยฑ | Files Changed |
+|-------------|---------|---------|---------------|
+| Hector Sanjuan | 16 | +2662/-590 | 71 |
+| Guillaume Michel | 27 | +1339/-714 | 69 |
+| Andrew Gillis | 22 | +1056/-377 | 54 |
+| Sergey Gorbunov | 1 | +962/-42 | 26 |
+| Marcin Rataj | 19 | +714/-133 | 47 |
+| IGP | 2 | +419/-35 | 11 |
+| GITSRC | 1 | +90/-1 | 3 |
+| guillaumemichel | 1 | +21/-43 | 1 |
+| blockchainluffy | 1 | +27/-26 | 8 |
+| web3-bot | 9 | +21/-22 | 13 |
+| VersaliX | 1 | +31/-2 | 4 |
+| gammazero | 5 | +18/-5 | 5 |
+| Hlib Kanunnikov | 1 | +14/-4 | 1 |
+| diogo464 | 1 | +6/-7 | 1 |
+| Asutorufa | 2 | +7/-1 | 2 |
+| Russell Dempsey | 1 | +6/-1 | 1 |
+| Steven Allen | 1 | +1/-5 | 1 |
+| Michael Vorburger | 2 | +3/-3 | 2 |
+| Aayush Rajasekaran | 1 | +2/-2 | 1 |
+| sukun | 1 | +1/-1 | 1 |
diff --git a/version.go b/version.go
index 1b9b7e056..26cb836b9 100644
--- a/version.go
+++ b/version.go
@@ -11,7 +11,7 @@ import (
var CurrentCommit string
// CurrentVersionNumber is the current application's version literal.
-const CurrentVersionNumber = "0.35.0-rc2"
+const CurrentVersionNumber = "0.35.0"
const ApiVersion = "/kubo/" + CurrentVersionNumber + "/" //nolint
From d271920341c76e0b95075e5ba9e844e31ee3308c Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Wed, 21 May 2025 20:11:10 +0200
Subject: [PATCH 246/499] chore: CHANGELOG.md for 0.36
---
CHANGELOG.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1513562ff..67a776ee1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,6 @@
# Kubo Changelogs
+- [v0.36](docs/changelogs/v0.36.md)
- [v0.35](docs/changelogs/v0.35.md)
- [v0.34](docs/changelogs/v0.34.md)
- [v0.33](docs/changelogs/v0.33.md)
From 5b8f088826c8b874bc05ea991f107365941c0ad1 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Wed, 21 May 2025 20:20:48 +0200
Subject: [PATCH 247/499] chore: spellcheck to avoid ai fix prs
---
docs/changelogs/v0.35.md | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/docs/changelogs/v0.35.md b/docs/changelogs/v0.35.md
index d94063e0c..1f955182c 100644
--- a/docs/changelogs/v0.35.md
+++ b/docs/changelogs/v0.35.md
@@ -294,8 +294,8 @@ If the lock cannot be acquired because someone else has the lock, and `IPFS_WAIT
- feat: `Provider.WorkerCount` and `stats reprovide` (#10779) ([ipfs/kubo#10779](https://github.com/ipfs/kubo/pull/10779))
- Upgrade to Boxo v0.30.0 (#10794) ([ipfs/kubo#10794](https://github.com/ipfs/kubo/pull/10794))
- docs: use latest fuse package (#10791) ([ipfs/kubo#10791](https://github.com/ipfs/kubo/pull/10791))
- - remove duplicate workds (#10790) ([ipfs/kubo#10790](https://github.com/ipfs/kubo/pull/10790))
- - feat(config): `ipfs add` and `Import` options for controling UnixFS DAG Width (#10774) ([ipfs/kubo#10774](https://github.com/ipfs/kubo/pull/10774))
+ - remove duplicate words (#10790) ([ipfs/kubo#10790](https://github.com/ipfs/kubo/pull/10790))
+ - feat(config): `ipfs add` and `Import` options for controlling UnixFS DAG Width (#10774) ([ipfs/kubo#10774](https://github.com/ipfs/kubo/pull/10774))
- feat(config): expose ProviderSearchMaxResults (#10773) ([ipfs/kubo#10773](https://github.com/ipfs/kubo/pull/10773))
- feat: ipfs-webui v4.7.0 (#10780) ([ipfs/kubo#10780](https://github.com/ipfs/kubo/pull/10780))
- feat: partial DAG provides with Reprovider.Strategy=mfs|pinned+mfs (#10754) ([ipfs/kubo#10754](https://github.com/ipfs/kubo/pull/10754))
@@ -382,7 +382,7 @@ If the lock cannot be acquired because someone else has the lock, and `IPFS_WAIT
- Release v4.0.2 (#124) ([libp2p/go-yamux#124](https://github.com/libp2p/go-yamux/pull/124))
- fix: remove noisy logs (#116) ([libp2p/go-yamux#116](https://github.com/libp2p/go-yamux/pull/116))
- check deadline before sending a message (#114) ([libp2p/go-yamux#114](https://github.com/libp2p/go-yamux/pull/114))
- - only check KeepAliveInterval if keep-alives are enabled (#113) ([libp2p/go-yamux#113](https://github.com/libp2p/go-yamux/pull/113))
+ - only check KeepAliveInterval if keep-alive are enabled (#113) ([libp2p/go-yamux#113](https://github.com/libp2p/go-yamux/pull/113))
- ci: uci/copy-templates ([libp2p/go-yamux#109](https://github.com/libp2p/go-yamux/pull/109))
From 4144fa1b9646e133305be1a7c853a4f630bf2654 Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Tue, 27 May 2025 18:48:34 -0700
Subject: [PATCH 248/499] Upgrade to Boxo v0.31.0 (#10819)
* Upgrade to Boxo v0.31.0
---
docs/changelogs/v0.36.md | 3 +++
docs/examples/kubo-as-a-library/go.mod | 13 ++--------
docs/examples/kubo-as-a-library/go.sum | 35 +++-----------------------
go.mod | 4 +--
go.sum | 8 +++---
test/dependencies/go.mod | 2 +-
test/dependencies/go.sum | 4 +--
7 files changed, 18 insertions(+), 51 deletions(-)
diff --git a/docs/changelogs/v0.36.md b/docs/changelogs/v0.36.md
index 493cf1b46..1a608d956 100644
--- a/docs/changelogs/v0.36.md
+++ b/docs/changelogs/v0.36.md
@@ -29,7 +29,10 @@ go-log v2 has been out for quite a while now and it is time to deprecate v1.
- Removes support for `ContextWithLoggable` as this is not needed for tracing-like functionality
#### ๐ฆ๏ธ Important dependency updates
+
- update `go-libp2p-kad-dht` to [v0.33.0](https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.33.0)
+- update `boxo` to [v0.31.0](https://github.com/ipfs/boxo/releases/tag/v0.31.0)
### ๐ Changelog
+
### ๐จโ๐ฉโ๐งโ๐ฆ Contributors
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index 3d19eb446..f6dddeddf 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -7,7 +7,7 @@ go 1.24
replace github.com/ipfs/kubo => ./../../..
require (
- github.com/ipfs/boxo v0.30.0
+ github.com/ipfs/boxo v0.31.0
github.com/ipfs/kubo v0.0.0-00010101000000-000000000000
github.com/libp2p/go-libp2p v0.41.1
github.com/multiformats/go-multiaddr v0.15.0
@@ -79,7 +79,6 @@ require (
github.com/ipfs/bbloom v0.0.4 // indirect
github.com/ipfs/go-bitfield v1.1.0 // indirect
github.com/ipfs/go-block-format v0.2.1 // indirect
- github.com/ipfs/go-blockservice v0.5.2 // indirect
github.com/ipfs/go-cid v0.5.0 // indirect
github.com/ipfs/go-cidutil v0.1.0 // indirect
github.com/ipfs/go-datastore v0.8.2 // indirect
@@ -89,25 +88,18 @@ require (
github.com/ipfs/go-ds-measure v0.2.2 // indirect
github.com/ipfs/go-ds-pebble v0.5.0 // indirect
github.com/ipfs/go-fs-lock v0.1.1 // indirect
- github.com/ipfs/go-ipfs-blockstore v1.3.1 // indirect
github.com/ipfs/go-ipfs-delay v0.0.1 // indirect
github.com/ipfs/go-ipfs-ds-help v1.1.1 // indirect
- github.com/ipfs/go-ipfs-exchange-interface v0.2.1 // indirect
github.com/ipfs/go-ipfs-pq v0.0.3 // indirect
github.com/ipfs/go-ipfs-redirects-file v0.1.2 // indirect
- github.com/ipfs/go-ipfs-util v0.0.3 // indirect
github.com/ipfs/go-ipld-cbor v0.2.0 // indirect
github.com/ipfs/go-ipld-format v0.6.1 // indirect
github.com/ipfs/go-ipld-git v0.1.1 // indirect
github.com/ipfs/go-ipld-legacy v0.2.1 // indirect
- github.com/ipfs/go-log v1.0.5 // indirect
github.com/ipfs/go-log/v2 v2.6.0 // indirect
- github.com/ipfs/go-merkledag v0.11.0 // indirect
github.com/ipfs/go-metrics-interface v0.3.0 // indirect
github.com/ipfs/go-peertaskqueue v0.8.2 // indirect
- github.com/ipfs/go-unixfsnode v1.10.0 // indirect
- github.com/ipfs/go-verifcid v0.0.3 // indirect
- github.com/ipld/go-car v0.6.2 // indirect
+ github.com/ipfs/go-unixfsnode v1.10.1 // indirect
github.com/ipld/go-car/v2 v2.14.3 // indirect
github.com/ipld/go-codec-dagpb v1.7.0 // indirect
github.com/ipld/go-ipld-prime v0.21.0 // indirect
@@ -217,7 +209,6 @@ require (
go.opentelemetry.io/otel/sdk v1.31.0 // indirect
go.opentelemetry.io/otel/trace v1.35.0 // indirect
go.opentelemetry.io/proto/otlp v1.3.1 // indirect
- go.uber.org/atomic v1.11.0 // indirect
go.uber.org/dig v1.18.0 // indirect
go.uber.org/fx v1.23.0 // indirect
go.uber.org/mock v0.5.0 // indirect
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index d7a0f5127..0ccf17c7d 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -308,17 +308,13 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcd
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.30.0 h1:7afsoxPGGqfoH7Dum/wOTGUB9M5fb8HyKPMlLfBvIEQ=
-github.com/ipfs/boxo v0.30.0/go.mod h1:BPqgGGyHB9rZZcPSzah2Dc9C+5Or3U1aQe7EH1H7370=
+github.com/ipfs/boxo v0.31.0 h1:h+zE4Pcf2rzlctQtLxhltPvflpojyLflXVWQfVR0pz0=
+github.com/ipfs/boxo v0.31.0/go.mod h1:gEkUkBiZWtEjHd1AiUxaWEYaQApPtbeGF45fdfCwLX0=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
-github.com/ipfs/go-bitswap v0.11.0 h1:j1WVvhDX1yhG32NTC9xfxnqycqYIlhzEzLXG/cU1HyQ=
-github.com/ipfs/go-bitswap v0.11.0/go.mod h1:05aE8H3XOU+LXpTedeAS0OZpcO1WFsj5niYQH9a1Tmk=
github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk=
github.com/ipfs/go-block-format v0.2.1 h1:96kW71XGNNa+mZw/MTzJrCpMhBWCrd9kBLoKm9Iip/Q=
github.com/ipfs/go-block-format v0.2.1/go.mod h1:frtvXHMQhM6zn7HvEQu+Qz5wSTj+04oEH/I+NjDgEjk=
-github.com/ipfs/go-blockservice v0.5.2 h1:in9Bc+QcXwd1apOVM7Un9t8tixPKdaHQFdLSUM1Xgk8=
-github.com/ipfs/go-blockservice v0.5.2/go.mod h1:VpMblFEqG67A/H2sHKAemeH9vlURVavlysbdUI632yk=
github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM=
github.com/ipfs/go-cid v0.0.4/go.mod h1:4LLaPOQwmk5z9LBgQnpkivrx8BJjUyGwTXCd5Xfj6+M=
github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I=
@@ -348,23 +344,15 @@ github.com/ipfs/go-fs-lock v0.1.1 h1:TecsP/Uc7WqYYatasreZQiP9EGRy4ZnKoG4yXxR33nw
github.com/ipfs/go-fs-lock v0.1.1/go.mod h1:2goSXMCw7QfscHmSe09oXiR34DQeUdm+ei+dhonqly0=
github.com/ipfs/go-ipfs-blockstore v1.3.1 h1:cEI9ci7V0sRNivqaOr0elDsamxXFxJMMMy7PTTDQNsQ=
github.com/ipfs/go-ipfs-blockstore v1.3.1/go.mod h1:KgtZyc9fq+P2xJUiCAzbRdhhqJHvsw8u2Dlqy2MyRTE=
-github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ=
-github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk=
github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw=
github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1IeRQ=
github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw=
github.com/ipfs/go-ipfs-ds-help v1.1.1 h1:B5UJOH52IbcfS56+Ul+sv8jnIV10lbjLF5eOO0C66Nw=
github.com/ipfs/go-ipfs-ds-help v1.1.1/go.mod h1:75vrVCkSdSFidJscs8n4W+77AtTpCIAdDGAwjitJMIo=
-github.com/ipfs/go-ipfs-exchange-interface v0.2.1 h1:jMzo2VhLKSHbVe+mHNzYgs95n0+t0Q69GQ5WhRDZV/s=
-github.com/ipfs/go-ipfs-exchange-interface v0.2.1/go.mod h1:MUsYn6rKbG6CTtsDp+lKJPmVt3ZrCViNyH3rfPGsZ2E=
-github.com/ipfs/go-ipfs-exchange-offline v0.3.0 h1:c/Dg8GDPzixGd0MC8Jh6mjOwU57uYokgWRFidfvEkuA=
-github.com/ipfs/go-ipfs-exchange-offline v0.3.0/go.mod h1:MOdJ9DChbb5u37M1IcbrRB02e++Z7521fMxqCNRrz9s=
github.com/ipfs/go-ipfs-pq v0.0.3 h1:YpoHVJB+jzK15mr/xsWC574tyDLkezVrDNeaalQBsTE=
github.com/ipfs/go-ipfs-pq v0.0.3/go.mod h1:btNw5hsHBpRcSSgZtiNm/SLj5gYIZ18AKtv3kERkRb4=
github.com/ipfs/go-ipfs-redirects-file v0.1.2 h1:QCK7VtL91FH17KROVVy5KrzDx2hu68QvB2FTWk08ZQk=
github.com/ipfs/go-ipfs-redirects-file v0.1.2/go.mod h1:yIiTlLcDEM/8lS6T3FlCEXZktPPqSOyuY6dEzVqw7Fw=
-github.com/ipfs/go-ipfs-routing v0.3.0 h1:9W/W3N+g+y4ZDeffSgqhgo7BsBSJwPMcyssET9OWevc=
-github.com/ipfs/go-ipfs-routing v0.3.0/go.mod h1:dKqtTFIql7e1zYsEuWLyuOU+E0WJWW8JjbTPLParDWo=
github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc=
github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ=
github.com/ipfs/go-ipfs-util v0.0.3 h1:2RFdGez6bu2ZlZdI+rWfIdbQb1KudQp3VGwPtdNCmE0=
@@ -380,23 +368,16 @@ github.com/ipfs/go-ipld-legacy v0.2.1/go.mod h1:782MOUghNzMO2DER0FlBR94mllfdCJCk
github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM=
github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8=
github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo=
-github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g=
github.com/ipfs/go-log/v2 v2.6.0 h1:2Nu1KKQQ2ayonKp4MPo6pXCjqw1ULc9iohRqWV5EYqg=
github.com/ipfs/go-log/v2 v2.6.0/go.mod h1:p+Efr3qaY5YXpx9TX7MoLCSEZX5boSWj9wh86P5HJa8=
-github.com/ipfs/go-merkledag v0.11.0 h1:DgzwK5hprESOzS4O1t/wi6JDpyVQdvm9Bs59N/jqfBY=
-github.com/ipfs/go-merkledag v0.11.0/go.mod h1:Q4f/1ezvBiJV0YCIXvt51W/9/kqJGH4I1LsA7+djsM4=
github.com/ipfs/go-metrics-interface v0.3.0 h1:YwG7/Cy4R94mYDUuwsBfeziJCVm9pBMJ6q/JR9V40TU=
github.com/ipfs/go-metrics-interface v0.3.0/go.mod h1:OxxQjZDGocXVdyTPocns6cOLwHieqej/jos7H4POwoY=
github.com/ipfs/go-peertaskqueue v0.8.2 h1:PaHFRaVFdxQk1Qo3OKiHPYjmmusQy7gKQUaL8JDszAU=
github.com/ipfs/go-peertaskqueue v0.8.2/go.mod h1:L6QPvou0346c2qPJNiJa6BvOibxDfaiPlqHInmzg0FA=
github.com/ipfs/go-test v0.2.2 h1:1yjYyfbdt1w93lVzde6JZ2einh3DIV40at4rVoyEcE8=
github.com/ipfs/go-test v0.2.2/go.mod h1:cmLisgVwkdRCnKu/CFZOk2DdhOcwghr5GsHeqwexoRA=
-github.com/ipfs/go-unixfsnode v1.10.0 h1:cZPUUcYjXw2kMOgx4THw2uouw/8TBpmzZpWtPINdLvk=
-github.com/ipfs/go-unixfsnode v1.10.0/go.mod h1:hVbWqN38WOk7FHao2y0mQAwUHDq58m7plGd+W6GSq2M=
-github.com/ipfs/go-verifcid v0.0.3 h1:gmRKccqhWDocCRkC+a59g5QW7uJw5bpX9HWBevXa0zs=
-github.com/ipfs/go-verifcid v0.0.3/go.mod h1:gcCtGniVzelKrbk9ooUSX/pM3xlH73fZZJDzQJRvOUw=
-github.com/ipld/go-car v0.6.2 h1:Hlnl3Awgnq8icK+ze3iRghk805lu8YNq3wlREDTF2qc=
-github.com/ipld/go-car v0.6.2/go.mod h1:oEGXdwp6bmxJCZ+rARSkDliTeYnVzv3++eXajZ+Bmr8=
+github.com/ipfs/go-unixfsnode v1.10.1 h1:hGKhzuH6NSzZ4y621wGuDspkjXRNG3B+HqhlyTjSwSM=
+github.com/ipfs/go-unixfsnode v1.10.1/go.mod h1:eguv/otvacjmfSbYvmamc9ssNAzLvRk0+YN30EYeOOY=
github.com/ipld/go-car/v2 v2.14.3 h1:1Mhl82/ny8MVP+w1M4LXbj4j99oK3gnuZG2GmG1IhC8=
github.com/ipld/go-car/v2 v2.14.3/go.mod h1:/vpSvPngOX8UnvmdFJ3o/mDgXa9LuyXsn7wxOzHDYQE=
github.com/ipld/go-codec-dagpb v1.7.0 h1:hpuvQjCSVSLnTnHXn+QAMR0mLmb1gA6wl10LExo2Ts0=
@@ -847,8 +828,6 @@ go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt
go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc=
go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0=
go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8=
-go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
-go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
go.uber.org/dig v1.18.0 h1:imUL1UiY0Mg4bqbFfsRQO5G4CGRBec/ZujWTvSVp3pw=
@@ -859,12 +838,8 @@ go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU=
go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM=
-go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
-go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
-go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
-go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ=
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
go.uber.org/zap/exp v0.3.0 h1:6JYzdifzYkGmTdRR59oYH+Ng7k49H9qVpWwNSsGJj3U=
@@ -1082,8 +1057,6 @@ golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgw
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
diff --git a/go.mod b/go.mod
index e0c447e4d..e3bd87338 100644
--- a/go.mod
+++ b/go.mod
@@ -21,7 +21,7 @@ require (
github.com/hashicorp/go-version v1.7.0
github.com/ipfs-shipyard/nopfs v0.0.14
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0
- github.com/ipfs/boxo v0.30.0
+ github.com/ipfs/boxo v0.31.0
github.com/ipfs/go-block-format v0.2.1
github.com/ipfs/go-cid v0.5.0
github.com/ipfs/go-cidutil v0.1.0
@@ -42,7 +42,7 @@ require (
github.com/ipfs/go-metrics-interface v0.3.0
github.com/ipfs/go-metrics-prometheus v0.1.0
github.com/ipfs/go-test v0.2.2
- github.com/ipfs/go-unixfsnode v1.10.0
+ github.com/ipfs/go-unixfsnode v1.10.1
github.com/ipld/go-car v0.6.2
github.com/ipld/go-car/v2 v2.14.3
github.com/ipld/go-codec-dagpb v1.7.0
diff --git a/go.sum b/go.sum
index 5aad5df9f..8ad813280 100644
--- a/go.sum
+++ b/go.sum
@@ -371,8 +371,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcd
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.30.0 h1:7afsoxPGGqfoH7Dum/wOTGUB9M5fb8HyKPMlLfBvIEQ=
-github.com/ipfs/boxo v0.30.0/go.mod h1:BPqgGGyHB9rZZcPSzah2Dc9C+5Or3U1aQe7EH1H7370=
+github.com/ipfs/boxo v0.31.0 h1:h+zE4Pcf2rzlctQtLxhltPvflpojyLflXVWQfVR0pz0=
+github.com/ipfs/boxo v0.31.0/go.mod h1:gEkUkBiZWtEjHd1AiUxaWEYaQApPtbeGF45fdfCwLX0=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-bitswap v0.11.0 h1:j1WVvhDX1yhG32NTC9xfxnqycqYIlhzEzLXG/cU1HyQ=
@@ -458,8 +458,8 @@ github.com/ipfs/go-peertaskqueue v0.8.2 h1:PaHFRaVFdxQk1Qo3OKiHPYjmmusQy7gKQUaL8
github.com/ipfs/go-peertaskqueue v0.8.2/go.mod h1:L6QPvou0346c2qPJNiJa6BvOibxDfaiPlqHInmzg0FA=
github.com/ipfs/go-test v0.2.2 h1:1yjYyfbdt1w93lVzde6JZ2einh3DIV40at4rVoyEcE8=
github.com/ipfs/go-test v0.2.2/go.mod h1:cmLisgVwkdRCnKu/CFZOk2DdhOcwghr5GsHeqwexoRA=
-github.com/ipfs/go-unixfsnode v1.10.0 h1:cZPUUcYjXw2kMOgx4THw2uouw/8TBpmzZpWtPINdLvk=
-github.com/ipfs/go-unixfsnode v1.10.0/go.mod h1:hVbWqN38WOk7FHao2y0mQAwUHDq58m7plGd+W6GSq2M=
+github.com/ipfs/go-unixfsnode v1.10.1 h1:hGKhzuH6NSzZ4y621wGuDspkjXRNG3B+HqhlyTjSwSM=
+github.com/ipfs/go-unixfsnode v1.10.1/go.mod h1:eguv/otvacjmfSbYvmamc9ssNAzLvRk0+YN30EYeOOY=
github.com/ipfs/go-verifcid v0.0.3 h1:gmRKccqhWDocCRkC+a59g5QW7uJw5bpX9HWBevXa0zs=
github.com/ipfs/go-verifcid v0.0.3/go.mod h1:gcCtGniVzelKrbk9ooUSX/pM3xlH73fZZJDzQJRvOUw=
github.com/ipld/go-car v0.6.2 h1:Hlnl3Awgnq8icK+ze3iRghk805lu8YNq3wlREDTF2qc=
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index 4da19941d..95c266512 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -129,7 +129,7 @@ require (
github.com/huin/goupnp v1.3.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/ipfs/bbloom v0.0.4 // indirect
- github.com/ipfs/boxo v0.30.0 // indirect
+ github.com/ipfs/boxo v0.31.0 // indirect
github.com/ipfs/go-bitfield v1.1.0 // indirect
github.com/ipfs/go-block-format v0.2.1 // indirect
github.com/ipfs/go-cid v0.5.0 // indirect
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index bc4f7a9b2..fde4b1f7f 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -330,8 +330,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.30.0 h1:7afsoxPGGqfoH7Dum/wOTGUB9M5fb8HyKPMlLfBvIEQ=
-github.com/ipfs/boxo v0.30.0/go.mod h1:BPqgGGyHB9rZZcPSzah2Dc9C+5Or3U1aQe7EH1H7370=
+github.com/ipfs/boxo v0.31.0 h1:h+zE4Pcf2rzlctQtLxhltPvflpojyLflXVWQfVR0pz0=
+github.com/ipfs/boxo v0.31.0/go.mod h1:gEkUkBiZWtEjHd1AiUxaWEYaQApPtbeGF45fdfCwLX0=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-block-format v0.2.1 h1:96kW71XGNNa+mZw/MTzJrCpMhBWCrd9kBLoKm9Iip/Q=
From cf096c2a85dc0f44e5a3b561a3181e9bb2e681ca Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Wed, 28 May 2025 21:45:15 +0200
Subject: [PATCH 249/499] fix(gateway): gateway-conformance v0.8 (#10818)
* fix: boxo master with boxo#922
* test: gateway-conformance v0.8
https://github.com/ipfs/gateway-conformance/releases/tag/v0.8.0
---
.github/workflows/gateway-conformance.yml | 8 ++++----
docs/changelogs/v0.36.md | 1 +
docs/examples/kubo-as-a-library/go.mod | 2 +-
docs/examples/kubo-as-a-library/go.sum | 4 ++--
go.mod | 2 +-
go.sum | 4 ++--
test/dependencies/go.mod | 2 +-
test/dependencies/go.sum | 4 ++--
8 files changed, 14 insertions(+), 13 deletions(-)
diff --git a/.github/workflows/gateway-conformance.yml b/.github/workflows/gateway-conformance.yml
index 96be54ec2..b305a8fc7 100644
--- a/.github/workflows/gateway-conformance.yml
+++ b/.github/workflows/gateway-conformance.yml
@@ -41,7 +41,7 @@ jobs:
steps:
# 1. Download the gateway-conformance fixtures
- name: Download gateway-conformance fixtures
- uses: ipfs/gateway-conformance/.github/actions/extract-fixtures@v0.7
+ uses: ipfs/gateway-conformance/.github/actions/extract-fixtures@v0.8
with:
output: fixtures
@@ -94,7 +94,7 @@ jobs:
# 6. Run the gateway-conformance tests
- name: Run gateway-conformance tests
- uses: ipfs/gateway-conformance/.github/actions/test@v0.7
+ uses: ipfs/gateway-conformance/.github/actions/test@v0.8
with:
gateway-url: http://127.0.0.1:8080
subdomain-url: http://localhost:8080
@@ -128,7 +128,7 @@ jobs:
steps:
# 1. Download the gateway-conformance fixtures
- name: Download gateway-conformance fixtures
- uses: ipfs/gateway-conformance/.github/actions/extract-fixtures@v0.7
+ uses: ipfs/gateway-conformance/.github/actions/extract-fixtures@v0.8
with:
output: fixtures
@@ -201,7 +201,7 @@ jobs:
# 9. Run the gateway-conformance tests over libp2p
- name: Run gateway-conformance tests over libp2p
- uses: ipfs/gateway-conformance/.github/actions/test@v0.7
+ uses: ipfs/gateway-conformance/.github/actions/test@v0.8
with:
gateway-url: http://127.0.0.1:8092
args: --specs "trustless-gateway,-trustless-ipns-gateway" -skip 'TestGatewayCar/GET_response_for_application/vnd.ipld.car/Header_Content-Length'
diff --git a/docs/changelogs/v0.36.md b/docs/changelogs/v0.36.md
index 1a608d956..0cb35085f 100644
--- a/docs/changelogs/v0.36.md
+++ b/docs/changelogs/v0.36.md
@@ -32,6 +32,7 @@ go-log v2 has been out for quite a while now and it is time to deprecate v1.
- update `go-libp2p-kad-dht` to [v0.33.0](https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.33.0)
- update `boxo` to [v0.31.0](https://github.com/ipfs/boxo/releases/tag/v0.31.0)
+- update `gateway-conformance` to [v0.8](https://github.com/ipfs/gateway-conformance/releases/tag/v0.8.0)
### ๐ Changelog
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index f6dddeddf..415c5d2b4 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -7,7 +7,7 @@ go 1.24
replace github.com/ipfs/kubo => ./../../..
require (
- github.com/ipfs/boxo v0.31.0
+ github.com/ipfs/boxo v0.31.1-0.20250528182950-f87feb50c39c
github.com/ipfs/kubo v0.0.0-00010101000000-000000000000
github.com/libp2p/go-libp2p v0.41.1
github.com/multiformats/go-multiaddr v0.15.0
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index 0ccf17c7d..87753b63e 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -308,8 +308,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcd
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.31.0 h1:h+zE4Pcf2rzlctQtLxhltPvflpojyLflXVWQfVR0pz0=
-github.com/ipfs/boxo v0.31.0/go.mod h1:gEkUkBiZWtEjHd1AiUxaWEYaQApPtbeGF45fdfCwLX0=
+github.com/ipfs/boxo v0.31.1-0.20250528182950-f87feb50c39c h1:0jAFJxC74Gy0VwDG6WwYJq0yZdXOFIIeCwUXXln0w6A=
+github.com/ipfs/boxo v0.31.1-0.20250528182950-f87feb50c39c/go.mod h1:gEkUkBiZWtEjHd1AiUxaWEYaQApPtbeGF45fdfCwLX0=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk=
diff --git a/go.mod b/go.mod
index e3bd87338..7323f337c 100644
--- a/go.mod
+++ b/go.mod
@@ -21,7 +21,7 @@ require (
github.com/hashicorp/go-version v1.7.0
github.com/ipfs-shipyard/nopfs v0.0.14
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0
- github.com/ipfs/boxo v0.31.0
+ github.com/ipfs/boxo v0.31.1-0.20250528182950-f87feb50c39c
github.com/ipfs/go-block-format v0.2.1
github.com/ipfs/go-cid v0.5.0
github.com/ipfs/go-cidutil v0.1.0
diff --git a/go.sum b/go.sum
index 8ad813280..9e30f10fa 100644
--- a/go.sum
+++ b/go.sum
@@ -371,8 +371,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcd
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.31.0 h1:h+zE4Pcf2rzlctQtLxhltPvflpojyLflXVWQfVR0pz0=
-github.com/ipfs/boxo v0.31.0/go.mod h1:gEkUkBiZWtEjHd1AiUxaWEYaQApPtbeGF45fdfCwLX0=
+github.com/ipfs/boxo v0.31.1-0.20250528182950-f87feb50c39c h1:0jAFJxC74Gy0VwDG6WwYJq0yZdXOFIIeCwUXXln0w6A=
+github.com/ipfs/boxo v0.31.1-0.20250528182950-f87feb50c39c/go.mod h1:gEkUkBiZWtEjHd1AiUxaWEYaQApPtbeGF45fdfCwLX0=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-bitswap v0.11.0 h1:j1WVvhDX1yhG32NTC9xfxnqycqYIlhzEzLXG/cU1HyQ=
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index 95c266512..d5a6e34fd 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -129,7 +129,7 @@ require (
github.com/huin/goupnp v1.3.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/ipfs/bbloom v0.0.4 // indirect
- github.com/ipfs/boxo v0.31.0 // indirect
+ github.com/ipfs/boxo v0.31.1-0.20250528182950-f87feb50c39c // indirect
github.com/ipfs/go-bitfield v1.1.0 // indirect
github.com/ipfs/go-block-format v0.2.1 // indirect
github.com/ipfs/go-cid v0.5.0 // indirect
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index fde4b1f7f..a2fa489a5 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -330,8 +330,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.31.0 h1:h+zE4Pcf2rzlctQtLxhltPvflpojyLflXVWQfVR0pz0=
-github.com/ipfs/boxo v0.31.0/go.mod h1:gEkUkBiZWtEjHd1AiUxaWEYaQApPtbeGF45fdfCwLX0=
+github.com/ipfs/boxo v0.31.1-0.20250528182950-f87feb50c39c h1:0jAFJxC74Gy0VwDG6WwYJq0yZdXOFIIeCwUXXln0w6A=
+github.com/ipfs/boxo v0.31.1-0.20250528182950-f87feb50c39c/go.mod h1:gEkUkBiZWtEjHd1AiUxaWEYaQApPtbeGF45fdfCwLX0=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-block-format v0.2.1 h1:96kW71XGNNa+mZw/MTzJrCpMhBWCrd9kBLoKm9Iip/Q=
From bb91273015694bae1840ff87bf003f3d3608238b Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Fri, 30 May 2025 15:14:37 -0700
Subject: [PATCH 250/499] Minor wording fixes in docs (#10822)
---
docs/add-code-flow.md | 4 ++--
docs/config.md | 6 +++---
docs/datastores.md | 12 ++++++------
docs/experimental-features.md | 2 +-
docs/implement-api-bindings.md | 8 ++++----
docs/releases.md | 8 ++++----
6 files changed, 20 insertions(+), 20 deletions(-)
diff --git a/docs/add-code-flow.md b/docs/add-code-flow.md
index 264731a3b..353d47166 100644
--- a/docs/add-code-flow.md
+++ b/docs/add-code-flow.md
@@ -55,7 +55,7 @@ Within the function, a new `Adder` is created with the configured `Blockstore` a
1. **[`adder.add(io.Reader)`](https://github.com/ipfs/go-ipfs/blob/v0.4.18/core/coreunix/add.go#L115)** - *Create and return the **root** __DAG__ node*
- This method converts the input data (`io.Reader`) to a __DAG__ tree, by splitting the data into _chunks_ using the `Chunker` and organizing them in to a __DAG__ (with a *trickle* or *balanced* layout. See [balanced](https://github.com/ipfs/go-unixfs/blob/6b769632e7eb8fe8f302e3f96bf5569232e7a3ee/importer/balanced/builder.go) for more info).
+ This method converts the input data (`io.Reader`) to a __DAG__ tree, by splitting the data into _chunks_ using the `Chunker` and organizing them into a __DAG__ (with a *trickle* or *balanced* layout. See [balanced](https://github.com/ipfs/go-unixfs/blob/6b769632e7eb8fe8f302e3f96bf5569232e7a3ee/importer/balanced/builder.go) for more info).
The method returns the **root** `ipld.Node` of the __DAG__.
@@ -70,7 +70,7 @@ Within the function, a new `Adder` is created with the configured `Blockstore` a
- **[MFS] [`PutNode(mfs.Root, path, ipld.Node)`](https://github.com/ipfs/go-mfs/blob/v0.1.18/ops.go#L86)** - *Insert node at path into given `MFS`*
- The `path` param is used to determine the `MFS Directory`, which is first looked up in the `MFS` using `lookupDir()` function. This is followed by adding the **root** __DAG__ node (`ipld.Node`) in to this `Directory` using `directory.AddChild()` method.
+ The `path` param is used to determine the `MFS Directory`, which is first looked up in the `MFS` using `lookupDir()` function. This is followed by adding the **root** __DAG__ node (`ipld.Node`) into this `Directory` using `directory.AddChild()` method.
- **[MFS] Add Child To `UnixFS`**
- **[`directory.AddChild(filename, ipld.Node)`](https://github.com/ipfs/go-mfs/blob/v0.1.18/dir.go#L350)** - *Add **root** __DAG__ node under this directory*
diff --git a/docs/config.md b/docs/config.md
index e40ac5887..a6e9c699f 100644
--- a/docs/config.md
+++ b/docs/config.md
@@ -846,7 +846,7 @@ Options for [ZeroConf](https://github.com/libp2p/zeroconf#readme) Multicast DNS-
#### `Discovery.MDNS.Enabled`
-A boolean value for whether or not Multicast DNS-SD should be active.
+A boolean value to activate or deactivate Multicast DNS-SD.
Default: `true`
@@ -934,7 +934,7 @@ Type: `object[string -> array[string]]`
### `Gateway.RootRedirect`
-A url to redirect requests for `/` to.
+A URL to redirect requests for `/` to.
Default: `""`
@@ -1410,7 +1410,7 @@ Type: `string` (filesystem path)
### `Mounts.FuseAllowOther`
-Sets the 'FUSE allow other'-option on the mount point.
+Sets the 'FUSE allow-other' option on the mount point.
## `Pinning`
diff --git a/docs/datastores.md b/docs/datastores.md
index f574bc6a5..9ba500a59 100644
--- a/docs/datastores.md
+++ b/docs/datastores.md
@@ -12,13 +12,13 @@ field in the ipfs configuration file.
## flatfs
-Stores each key value pair as a file on the filesystem.
+Stores each key-value pair as a file on the filesystem.
The shardFunc is prefixed with `/repo/flatfs/shard/v1` then followed by a descriptor of the sharding strategy. Some example values are:
- `/repo/flatfs/shard/v1/next-to-last/2`
- Shards on the two next to last characters of the key
- `/repo/flatfs/shard/v1/prefix/2`
- - Shards based on the two character prefix of the key
+ - Shards based on the two-character prefix of the key
```json
{
@@ -34,7 +34,7 @@ The shardFunc is prefixed with `/repo/flatfs/shard/v1` then followed by a descri
NOTE: flatfs must only be used as a block store (mounted at `/blocks`) as it only partially implements the datastore interface. You can mount flatfs for /blocks only using the mount datastore (described below).
## levelds
-Uses a leveldb database to store key value pairs.
+Uses a leveldb database to store key-value pairs.
```json
{
@@ -46,7 +46,7 @@ Uses a leveldb database to store key value pairs.
## pebbleds
-Uses [pebble](https://github.com/cockroachdb/pebble) as a key value store.
+Uses [pebble](https://github.com/cockroachdb/pebble) as a key-value store.
```json
{
@@ -90,7 +90,7 @@ When installing a new version of kubo when `"formatMajorVersion"` is configured,
## badgerds
-Uses [badger](https://github.com/dgraph-io/badger) as a key value store.
+Uses [badger](https://github.com/dgraph-io/badger) as a key-value store.
> [!CAUTION]
> This is based on very old badger 1.x, which has known bugs and is no longer supported by the upstream team.
@@ -99,7 +99,7 @@ Uses [badger](https://github.com/dgraph-io/badger) as a key value store.
* `syncWrites`: Flush every write to disk before continuing. Setting this to false is safe as kubo will automatically flush writes to disk before and after performing critical operations like pinning. However, you can set this to true to be extra-safe (at the cost of a 2-3x slowdown when adding files).
-* `truncate`: Truncate the DB if a partially written sector is found (defaults to true). There is no good reason to set this to false unless you want to manually recover partially written (and unpinned) blocks if kubo crashes half-way through adding a file.
+* `truncate`: Truncate the DB if a partially written sector is found (defaults to true). There is no good reason to set this to false unless you want to manually recover partially written (and unpinned) blocks if kubo crashes half-way through a write operation.
```json
{
diff --git a/docs/experimental-features.md b/docs/experimental-features.md
index fbee3d480..ef55691ba 100644
--- a/docs/experimental-features.md
+++ b/docs/experimental-features.md
@@ -398,7 +398,7 @@ We also support the use of protocol names of the form /x/$NAME/http where $NAME
### Road to being a real feature
- [ ] Needs p2p streams to graduate from experiments
-- [ ] Needs more people to use and report on how well it works / fits use cases
+- [ ] Needs more people to use and report on how well it works and fits use cases
- [ ] More documentation
- [ ] Need better integration with the subdomain gateway feature.
diff --git a/docs/implement-api-bindings.md b/docs/implement-api-bindings.md
index 3587ac21f..d0273d9e7 100644
--- a/docs/implement-api-bindings.md
+++ b/docs/implement-api-bindings.md
@@ -39,12 +39,12 @@ function calls. For example:
#### CLI API Transport
In the commandline, IPFS uses a traditional flag and arg-based mapping, where:
-- the first arguments selects the command, as in git - e.g. `ipfs dag get`
+- the first arguments select the command, as in git - e.g. `ipfs dag get`
- the flags specify options - e.g. `--enc=protobuf -q`
- the rest are positional arguments - e.g. `ipfs key rename `
- files are specified by filename, or through stdin
-(NOTE: When kubo runs the daemon, the CLI API is actually converted to HTTP
+(NOTE: When kubo runs the daemon, the CLI API is converted to HTTP
calls. otherwise, they execute in the same process)
#### HTTP API Transport
@@ -87,7 +87,7 @@ Despite all the generalization spoken about above, the IPFS API is actually very
simple. You can inspect all the requests made with `nc` and the `--api` option
(as of [this PR](https://github.com/ipfs/kubo/pull/1598), or `0.3.8`):
-```
+```sh
> nc -l 5002 &
> ipfs --api /ip4/127.0.0.1/tcp/5002 swarm addrs local --enc=json
POST /api/v0/version?enc=json&stream-channels=true HTTP/1.1
@@ -104,7 +104,7 @@ The only hard part is getting the file streaming right. It is (now) fairly easy
to stream files to kubo using multipart. Basically, we end up with HTTP
requests like this:
-```
+```sh
> nc -l 5002 &
> ipfs --api /ip4/127.0.0.1/tcp/5002 add -r ~/demo/basic/test
POST /api/v0/add?encoding=json&progress=true&r=true&stream-channels=true HTTP/1.1
diff --git a/docs/releases.md b/docs/releases.md
index d42feea7b..718c2da93 100644
--- a/docs/releases.md
+++ b/docs/releases.md
@@ -20,9 +20,9 @@
## Release Philosophy
-`kubo` aims to have release every six weeks, two releases per quarter. During these 6 week releases, we go through 4 different stages that gives us the opportunity to test the new version against our test environments (unit, interop, integration), QA in our current production environment, IPFS apps (e.g. Desktop and WebUI) and with our community and _early testers_[1] that have IPFS running in production.
+`kubo` aims to have a release every six weeks, two releases per quarter. During these 6 week releases, we go through 4 different stages that allow us to test the new version against our test environments (unit, interop, integration), QA in our current production environment, IPFS apps (e.g. Desktop and WebUI) and with our community and _early testers_[1] that have IPFS running in production.
-We might expand the six week release schedule in case of:
+We might expand the six-week release schedule in case of:
- No new updates to be added
- In case of a large community event that takes the core team availability away (e.g. IPFS Conf, Dev Meetings, IPFS Camp, etc.)
@@ -59,7 +59,7 @@ Test the release in as many non-production environments as possible. This is rel
### Stage 3 - Community Prod Testing
-At this stage, we consider the release to be "production ready" and will ask the community and our early testers to (partially) deploy the release to their production infrastructure.
+At this stage, we consider the release to be "production-ready" and will ask the community and our early testers to (partially) deploy the release to their production infrastructure.
**Goals:**
@@ -69,7 +69,7 @@ At this stage, we consider the release to be "production ready" and will ask the
### Stage 4 - Release
-At this stage, the release is "battle hardened" and ready for wide deployment.
+At this stage, the release is "battle-hardened" and ready for wide deployment.
## Release Cycle
From 8f87a6997e54e78c64a0a34436db3eb936c610c7 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Fri, 30 May 2025 15:21:03 -0700
Subject: [PATCH 251/499] chore(deps): bump codecov/codecov-action from 5.4.2
to 5.4.3 (#10810)
Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 5.4.2 to 5.4.3.
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codecov/codecov-action/compare/ad3126e916f78f00edff4ed0317cf185271ccc2d...18283e04ce6e62d37312384ff67231eb8fd56d24)
---
updated-dependencies:
- dependency-name: codecov/codecov-action
dependency-version: 5.4.3
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
.github/workflows/gotest.yml | 2 +-
.github/workflows/sharness.yml | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/gotest.yml b/.github/workflows/gotest.yml
index e0815bf90..a5eb4ac8d 100644
--- a/.github/workflows/gotest.yml
+++ b/.github/workflows/gotest.yml
@@ -45,7 +45,7 @@ jobs:
make -j "$PARALLEL" test/unit/gotest.junit.xml &&
[[ ! $(jq -s -c 'map(select(.Action == "fail")) | .[]' test/unit/gotest.json) ]]
- name: Upload coverage to Codecov
- uses: codecov/codecov-action@ad3126e916f78f00edff4ed0317cf185271ccc2d # v5.4.2
+ uses: codecov/codecov-action@18283e04ce6e62d37312384ff67231eb8fd56d24 # v5.4.3
if: failure() || success()
with:
name: unittests
diff --git a/.github/workflows/sharness.yml b/.github/workflows/sharness.yml
index 86f08b2c1..62725e9b4 100644
--- a/.github/workflows/sharness.yml
+++ b/.github/workflows/sharness.yml
@@ -55,7 +55,7 @@ jobs:
# increasing parallelism beyond 10 doesn't speed up the tests much
PARALLEL: ${{ github.repository == 'ipfs/kubo' && 10 || 3 }}
- name: Upload coverage report
- uses: codecov/codecov-action@ad3126e916f78f00edff4ed0317cf185271ccc2d # v5.4.2
+ uses: codecov/codecov-action@18283e04ce6e62d37312384ff67231eb8fd56d24 # v5.4.3
if: failure() || success()
with:
name: sharness
From e491ee98e90925aeedd6debe1fb3da8e757732dc Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Mon, 2 Jun 2025 10:01:26 -0700
Subject: [PATCH 252/499] Update fuse docs with FreeBSD specifics (#10820)
Closes #8846
---
docs/fuse.md | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git a/docs/fuse.md b/docs/fuse.md
index fde9307fd..b928b8860 100644
--- a/docs/fuse.md
+++ b/docs/fuse.md
@@ -48,6 +48,21 @@ go get github.com/jbenet/go-fuse-version/fuse-version
If you run into any problems installing FUSE or mounting IPFS, hop on IRC and
speak with us, or if you figure something new out, please add to this document!
+#### FreeBSD
+```sh
+sudo pkg install fusefs-ext2
+```
+
+Load the fuse kernel module:
+```sh
+sudo kldload fusefs
+```
+
+To load automatically on boot:
+```sh
+sudo echo fusefs_load="YES" >> /boot/loader.conf
+```
+
## Prepare mountpoints
By default ipfs uses `/ipfs`, `/ipns` and `/mfs` directories for mounting, this can be
@@ -107,6 +122,11 @@ ipfs config --json Mounts.FuseAllowOther true
ipfs daemon --mount
```
+If using FreeBSD, it is necessary to run `ipfs` as root:
+```sh
+sudo HOME=$HOME ipfs daemon --mount
+```
+
## MFS mountpoint
Kubo v0.35.0 and later supports mounting the MFS (Mutable File System) root as
From 78ef5e9eebb83daa8b6a55e867b10ab41d2d8851 Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Mon, 2 Jun 2025 16:12:14 -0700
Subject: [PATCH 253/499] wrap user-facing mfs.Lookup error (#10821)
To avoid the blank Error: file does not exist and specify which file we failed to find.
Error before: `Error: file does not exist`
Error after: `Error: /my-cat-pic.jpg: file does not exist`
Closes #8671
---
core/commands/files.go | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/core/commands/files.go b/core/commands/files.go
index eb10a9bc7..8645301ef 100644
--- a/core/commands/files.go
+++ b/core/commands/files.go
@@ -724,7 +724,7 @@ Examples:
fsn, err := mfs.Lookup(nd.FilesRoot, path)
if err != nil {
- return err
+ return fmt.Errorf("%s: %w", path, err)
}
fi, ok := fsn.(*mfs.File)
From d39cb7f57554e2a41506b6022fa27dd58cb6215d Mon Sep 17 00:00:00 2001
From: Ivan
Date: Thu, 5 Jun 2025 00:04:20 +0300
Subject: [PATCH 254/499] Ivan386/filestore fix (#7474)
* ipfs filestore fix []... - Verify objects in filestore and remove bad links
* Option --remove-bad-blocks for 'ipfs filestore verify'
* fix call to DeleteBlock
* action of --remove-bad-blocks in output only when option specified
* Add sharness test for removing bad blocks
---------
Co-authored-by: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
---
core/commands/filestore.go | 49 +++++++++++++++++++++-----
docs/changelogs/v0.36.md | 7 +++-
test/sharness/t0271-filestore-utils.sh | 43 ++++++++++++++++++++++
3 files changed, 90 insertions(+), 9 deletions(-)
diff --git a/core/commands/filestore.go b/core/commands/filestore.go
index 0c9dbee0a..92a20176e 100644
--- a/core/commands/filestore.go
+++ b/core/commands/filestore.go
@@ -27,7 +27,8 @@ var FileStoreCmd = &cmds.Command{
}
const (
- fileOrderOptionName = "file-order"
+ fileOrderOptionName = "file-order"
+ removeBadBlocksOptionName = "remove-bad-blocks"
)
var lsFileStore = &cmds.Command{
@@ -57,7 +58,7 @@ The output is:
}
args := req.Arguments
if len(args) > 0 {
- return listByArgs(req.Context, res, fs, args)
+ return listByArgs(req.Context, res, fs, args, false)
}
fileOrder, _ := req.Options[fileOrderOptionName].(bool)
@@ -108,7 +109,7 @@ otherwise verify all objects.
The output is:
-
+ []
Where is one of:
ok: the block can be reconstructed
@@ -118,6 +119,10 @@ error: there was some other problem reading the file
missing: could not be found in the filestore
ERROR: internal error, most likely due to a corrupt database
+Where is present only when removing bad blocks and is one of:
+remove: link to the block will be removed from datastore
+keep: keep link, nothing to do
+
For ERROR entries the error will also be printed to stderr.
`,
},
@@ -126,15 +131,18 @@ For ERROR entries the error will also be printed to stderr.
},
Options: []cmds.Option{
cmds.BoolOption(fileOrderOptionName, "verify the objects based on the order of the backing file"),
+ cmds.BoolOption(removeBadBlocksOptionName, "remove bad blocks. WARNING: This may remove pinned data. You should run 'ipfs pin verify' after running this command and correct any issues."),
},
Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
_, fs, err := getFilestore(env)
if err != nil {
return err
}
+
+ removeBadBlocks, _ := req.Options[removeBadBlocksOptionName].(bool)
args := req.Arguments
if len(args) > 0 {
- return listByArgs(req.Context, res, fs, args)
+ return listByArgs(req.Context, res, fs, args, removeBadBlocks)
}
fileOrder, _ := req.Options[fileOrderOptionName].(bool)
@@ -148,7 +156,14 @@ For ERROR entries the error will also be printed to stderr.
if r == nil {
break
}
- if err := res.Emit(r); err != nil {
+
+ if removeBadBlocks && (r.Status != filestore.StatusOk) && (r.Status != filestore.StatusOtherError) {
+ if err = fs.FileManager().DeleteBlock(req.Context, r.Key); err != nil {
+ return err
+ }
+ }
+
+ if err = res.Emit(r); err != nil {
return err
}
}
@@ -162,6 +177,8 @@ For ERROR entries the error will also be printed to stderr.
return err
}
+ req := res.Request()
+ removeBadBlocks, _ := req.Options[removeBadBlocksOptionName].(bool)
for {
v, err := res.Next()
if err != nil {
@@ -179,7 +196,16 @@ For ERROR entries the error will also be printed to stderr.
if list.Status == filestore.StatusOtherError {
fmt.Fprintf(os.Stderr, "%s\n", list.ErrorMsg)
}
- fmt.Fprintf(os.Stdout, "%s %s\n", list.Status.Format(), list.FormatLong(enc.Encode))
+
+ if removeBadBlocks {
+ action := "keep"
+ if removeBadBlocks && (list.Status != filestore.StatusOk) && (list.Status != filestore.StatusOtherError) {
+ action = "remove"
+ }
+ fmt.Fprintf(os.Stdout, "%s %s %s\n", list.Status.Format(), list.FormatLong(enc.Encode), action)
+ } else {
+ fmt.Fprintf(os.Stdout, "%s %s\n", list.Status.Format(), list.FormatLong(enc.Encode))
+ }
}
},
},
@@ -236,7 +262,7 @@ func getFilestore(env cmds.Environment) (*core.IpfsNode, *filestore.Filestore, e
return n, fs, err
}
-func listByArgs(ctx context.Context, res cmds.ResponseEmitter, fs *filestore.Filestore, args []string) error {
+func listByArgs(ctx context.Context, res cmds.ResponseEmitter, fs *filestore.Filestore, args []string, removeBadBlocks bool) error {
for _, arg := range args {
c, err := cid.Decode(arg)
if err != nil {
@@ -250,7 +276,14 @@ func listByArgs(ctx context.Context, res cmds.ResponseEmitter, fs *filestore.Fil
continue
}
r := filestore.Verify(ctx, fs, c)
- if err := res.Emit(r); err != nil {
+
+ if removeBadBlocks && (r.Status != filestore.StatusOk) && (r.Status != filestore.StatusOtherError) {
+ if err = fs.FileManager().DeleteBlock(ctx, r.Key); err != nil {
+ return err
+ }
+ }
+
+ if err = res.Emit(r); err != nil {
return err
}
}
diff --git a/docs/changelogs/v0.36.md b/docs/changelogs/v0.36.md
index 0cb35085f..09369bcea 100644
--- a/docs/changelogs/v0.36.md
+++ b/docs/changelogs/v0.36.md
@@ -10,7 +10,8 @@ This release was brought to you by the [Shipyard](http://ipshipyard.com/) team.
- [Overview](#overview)
- [๐ฆ Highlights](#-highlights)
- - [Update go-log to v2](#update-go-log-to-v2)
+ - [Update go-log to v2](#update-go-log-to-v2
+ - [Option for filestore command to remove bad blocks](#option-for-filestore-command-to-remove-bad-blocks)
- [๐ฆ๏ธ Important dependency updates](#-important-dependency-updates)
- [๐ Changelog](#-changelog)
- [๐จโ๐ฉโ๐งโ๐ฆ Contributors](#-contributors)
@@ -28,6 +29,10 @@ go-log v2 has been out for quite a while now and it is time to deprecate v1.
- Fixes `ipfs log tail`
- Removes support for `ContextWithLoggable` as this is not needed for tracing-like functionality
+#### Option for filestore command to remove bad blocks
+
+The `filestore` command has a new option, `--remove-bad-blocks`, to verify objects in the filestore and remove those that fail verification.
+
#### ๐ฆ๏ธ Important dependency updates
- update `go-libp2p-kad-dht` to [v0.33.0](https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.33.0)
diff --git a/test/sharness/t0271-filestore-utils.sh b/test/sharness/t0271-filestore-utils.sh
index 5fd335659..5f7111bdd 100755
--- a/test/sharness/t0271-filestore-utils.sh
+++ b/test/sharness/t0271-filestore-utils.sh
@@ -63,6 +63,20 @@ EOF
sort < verify_expect_file_order > verify_expect_key_order
+cat < verify_rm_expect
+ok bafkreic2wqrsyr3y3qgzbvufen2w25r3p3zljckqyxkpcagsxz3zdcosd4 10000 somedir/file2 0 keep
+ok bafkreidx7ivgllulfkzyoo4oa7dfrg4mjmudg2qgdivoooj4s7lh3m5nqu 1000 somedir/file1 0 keep
+changed bafkreiemzfmzws23c2po4m6deiueknqfty7r3voes3e3zujmobrooc2ngm 262144 somedir/file3 0 remove
+changed bafkreifjcthslybjizk36xffcsb32fsbguxz3ptkl7723wz4u3qikttmam 213568 somedir/file3 786432 remove
+changed bafkreigl2pjptgxz6cexcnua56zc5dwsyrc4ph2eulmcb634oes6gzvmuy 262144 somedir/file3 524288 remove
+changed bafkreihgm53yhxn427lnfdwhqgpawc62qejog7gega5kqb6uwbyhjm47hu 262144 somedir/file3 262144 remove
+EOF
+
+cat < verify_after_rm_expect
+ok bafkreic2wqrsyr3y3qgzbvufen2w25r3p3zljckqyxkpcagsxz3zdcosd4 10000 somedir/file2 0
+ok bafkreidx7ivgllulfkzyoo4oa7dfrg4mjmudg2qgdivoooj4s7lh3m5nqu 1000 somedir/file1 0
+EOF
+
IPFS_CMD="ipfs"
test_filestore_adds() {
@@ -155,6 +169,27 @@ test_filestore_verify() {
test_init_dataset
}
+test_filestore_rm_bad_blocks() {
+ test_filestore_state
+
+ test_expect_success "change first bit of file" '
+ dd if=/dev/zero of=somedir/file3 bs=1024 count=1
+ '
+
+ test_expect_success "'$IPFS_CMD filestore verify --remove-bad-blocks' shows changed file removed" '
+ $IPFS_CMD filestore verify --remove-bad-blocks > verify_rm_actual &&
+ test_cmp verify_rm_expect verify_rm_actual
+ '
+
+ test_expect_success "'$IPFS_CMD filestore verify' shows only files that were not removed" '
+ $IPFS_CMD filestore verify > verify_after &&
+ test_cmp verify_after_rm_expect verify_after
+ '
+
+ # reset the state for the next test
+ test_init_dataset
+}
+
test_filestore_dups() {
# make sure the filestore is in a clean state
test_filestore_state
@@ -179,6 +214,8 @@ test_filestore_verify
test_filestore_dups
+test_filestore_rm_bad_blocks
+
#
# With daemon
#
@@ -197,6 +234,8 @@ test_filestore_dups
test_kill_ipfs_daemon
+test_filestore_rm_bad_blocks
+
##
## base32
##
@@ -243,6 +282,8 @@ test_filestore_verify
test_filestore_dups
+test_filestore_rm_bad_blocks
+
#
# With daemon
#
@@ -263,6 +304,8 @@ test_kill_ipfs_daemon
test_done
+test_filestore_rm_bad_blocks
+
##
test_done
From 6b76ff0ca03bda69dc113e6f285a1f57a12577c4 Mon Sep 17 00:00:00 2001
From: Hector Sanjuan
Date: Fri, 6 Jun 2025 22:51:54 +0200
Subject: [PATCH 255/499] docs/env variables: Document LIBP2P_SWARM_FD_LIMIT
---
docs/environment-variables.md | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/docs/environment-variables.md b/docs/environment-variables.md
index 2b763721b..ed18f8f3b 100644
--- a/docs/environment-variables.md
+++ b/docs/environment-variables.md
@@ -23,6 +23,7 @@
- [`LIBP2P_MUX_PREFS`](#libp2p_mux_prefs)
- [`LIBP2P_RCMGR`](#libp2p_rcmgr)
- [`LIBP2P_DEBUG_RCMGR`](#libp2p_debug_rcmgr)
+ - [`LIBP2P_SWARM_FD_LIMIT`](#libp2p_swarm_fd_limit)
- [Tracing](#tracing)
# Variables
@@ -235,6 +236,14 @@ and outputs it to `rcmgr.json.gz`
Default: disabled (not set)
+## `LIBP2P_SWARM_FD_LIMIT`
+
+This variable controls the number of concurrent outbound dials (except dials to relay addresses which have their own limiting logic).
+
+Reducing it slows down connection ballooning but might affect performance negatively.
+
+Default: [160](https://github.com/libp2p/go-libp2p/blob/master/p2p/net/swarm/swarm_dial.go#L91) (not set)
+
# Tracing
For tracing configuration, please check: https://github.com/ipfs/boxo/blob/main/docs/tracing.md
From 4dd099074572540a867bd87a3c533394cff0dd54 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Mon, 9 Jun 2025 14:17:59 +0200
Subject: [PATCH 256/499] chore: triage label for feature requests
---
.github/ISSUE_TEMPLATE/enhancement.yml | 1 +
.github/ISSUE_TEMPLATE/feature.yml | 1 +
2 files changed, 2 insertions(+)
diff --git a/.github/ISSUE_TEMPLATE/enhancement.yml b/.github/ISSUE_TEMPLATE/enhancement.yml
index a0b241b55..d2f7a9205 100644
--- a/.github/ISSUE_TEMPLATE/enhancement.yml
+++ b/.github/ISSUE_TEMPLATE/enhancement.yml
@@ -2,6 +2,7 @@ name: Enhancement
description: Suggest an improvement to an existing kubo feature.
labels:
- kind/enhancement
+ - need/triage
body:
- type: markdown
attributes:
diff --git a/.github/ISSUE_TEMPLATE/feature.yml b/.github/ISSUE_TEMPLATE/feature.yml
index d368588b4..77445f29f 100644
--- a/.github/ISSUE_TEMPLATE/feature.yml
+++ b/.github/ISSUE_TEMPLATE/feature.yml
@@ -2,6 +2,7 @@ name: Feature
description: Suggest a new feature in Kubo.
labels:
- kind/feature
+ - need/triage
body:
- type: markdown
attributes:
From df2d1c77ae13f09f2dd941638cf44ecdda9938d8 Mon Sep 17 00:00:00 2001
From: Laurent Senta
Date: Mon, 9 Jun 2025 15:50:59 +0200
Subject: [PATCH 257/499] test: fix "invert" commands in sharness tests (#9652)
* test: fix the grep in t0046
* test: fix grep -v in t0140
* test: Addresses.NoAnnounce overides AppendAnnounce
* fix t0080-repo.sh
* fix t0060.sh
---------
Co-authored-by: Marcin Rataj
Co-authored-by: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
---
test/sharness/t0046-id-hash.sh | 6 ++++--
test/sharness/t0060-daemon.sh | 2 +-
test/sharness/t0080-repo.sh | 12 ++++++------
test/sharness/t0140-swarm.sh | 30 +++++++++++++++---------------
4 files changed, 26 insertions(+), 24 deletions(-)
diff --git a/test/sharness/t0046-id-hash.sh b/test/sharness/t0046-id-hash.sh
index 7dfc73d09..878b7228d 100755
--- a/test/sharness/t0046-id-hash.sh
+++ b/test/sharness/t0046-id-hash.sh
@@ -25,7 +25,8 @@ test_expect_success "ipfs add succeeds with identity hash" '
'
test_expect_success "content not actually added" '
- ipfs refs local | fgrep -q -v $HASH
+ ipfs refs local > locals &&
+ test_should_not_contain $HASH locals
'
test_expect_success "but can fetch it anyway" '
@@ -98,7 +99,8 @@ test_expect_success "ipfs add succeeds with identity hash and --nocopy" '
'
test_expect_success "content not actually added (filestore enabled)" '
- ipfs refs local | fgrep -q -v $HASH
+ ipfs refs local > locals &&
+ test_should_not_contain $HASH locals
'
test_expect_success "but can fetch it anyway (filestore enabled)" '
diff --git a/test/sharness/t0060-daemon.sh b/test/sharness/t0060-daemon.sh
index 5dbbd852f..a160a8988 100755
--- a/test/sharness/t0060-daemon.sh
+++ b/test/sharness/t0060-daemon.sh
@@ -195,7 +195,7 @@ TEST_ULIMIT_PRESET=1
test_launch_ipfs_daemon
test_expect_success "daemon raised its fd limit" '
- grep -v "setting file descriptor limit" actual_daemon > /dev/null
+ test_should_not_contain "setting file descriptor limit" actual_daemon
'
test_expect_success "daemon actually can handle 2048 file descriptors" '
diff --git a/test/sharness/t0080-repo.sh b/test/sharness/t0080-repo.sh
index 5031af830..1059e8b93 100755
--- a/test/sharness/t0080-repo.sh
+++ b/test/sharness/t0080-repo.sh
@@ -30,7 +30,7 @@ test_expect_success "'ipfs repo gc' succeeds" '
'
test_expect_success "'ipfs repo gc' looks good (patch root)" '
- grep -v "removed $HASH" gc_out_actual
+ test_should_not_contain "removed $HASH" gc_out_actual
'
test_expect_success "'ipfs repo gc' doesn't remove file" '
@@ -284,11 +284,11 @@ test_expect_success "'ipfs repo stat --size-only' succeeds" '
'
test_expect_success "repo stats came out correct for --size-only" '
- grep "RepoSize" repo-stats-size-only &&
- grep "StorageMax" repo-stats-size-only &&
- grep -v "RepoPath" repo-stats-size-only &&
- grep -v "NumObjects" repo-stats-size-only &&
- grep -v "Version" repo-stats-size-only
+ test_should_contain "RepoSize" repo-stats-size-only &&
+ test_should_contain "StorageMax" repo-stats-size-only &&
+ test_should_not_contain "RepoPath" repo-stats-size-only &&
+ test_should_not_contain "NumObjects" repo-stats-size-only &&
+ test_should_not_contain "Version" repo-stats-size-only
'
test_expect_success "'ipfs repo version' succeeds" '
diff --git a/test/sharness/t0140-swarm.sh b/test/sharness/t0140-swarm.sh
index d65831d3e..37bb44b64 100755
--- a/test/sharness/t0140-swarm.sh
+++ b/test/sharness/t0140-swarm.sh
@@ -58,9 +58,9 @@ test_launch_ipfs_daemon
test_expect_success 'Addresses.Announce affects addresses' '
ipfs swarm addrs local >actual &&
- grep "/ip4/1.2.3.4/tcp/1234" actual &&
+ test_should_contain "/ip4/1.2.3.4/tcp/1234" actual &&
ipfs id -f"" | xargs -n1 echo >actual &&
- grep "/ip4/1.2.3.4/tcp/1234" actual
+ test_should_contain "/ip4/1.2.3.4/tcp/1234" actual
'
test_kill_ipfs_daemon
@@ -81,18 +81,18 @@ test_launch_ipfs_daemon
test_expect_success 'Addresses.AppendAnnounce is applied on top of Announce' '
ipfs swarm addrs local >actual &&
- grep "/ip4/1.2.3.4/tcp/1234" actual &&
- grep "/dnsaddr/dynamic.example.com" actual &&
- grep "/ip4/10.20.30.40/tcp/4321" actual &&
+ test_should_contain "/ip4/1.2.3.4/tcp/1234" actual &&
+ test_should_contain "/dnsaddr/dynamic.example.com" actual &&
+ test_should_contain "/ip4/10.20.30.40/tcp/4321" actual &&
ipfs id -f"" | xargs -n1 echo | tee actual &&
- grep "/ip4/1.2.3.4/tcp/1234/p2p" actual &&
- grep "/dnsaddr/dynamic.example.com/p2p/" actual &&
- grep "/ip4/10.20.30.40/tcp/4321/p2p/" actual
+ test_should_contain "/ip4/1.2.3.4/tcp/1234/p2p" actual &&
+ test_should_contain "/dnsaddr/dynamic.example.com/p2p/" actual &&
+ test_should_contain "/ip4/10.20.30.40/tcp/4321/p2p/" actual
'
test_kill_ipfs_daemon
-noAnnounceCfg='["/ip4/1.2.3.4/tcp/1234"]'
+noAnnounceCfg='["/ip4/1.2.3.4/tcp/1234", "/ip4/10.20.30.40/tcp/4321"]'
test_expect_success "test_config_set succeeds" "
ipfs config --json Addresses.NoAnnounce '$noAnnounceCfg'
"
@@ -101,11 +101,11 @@ test_launch_ipfs_daemon
test_expect_success "Addresses.NoAnnounce affects addresses from Announce and AppendAnnounce" '
ipfs swarm addrs local >actual &&
- grep -v "/ip4/1.2.3.4/tcp/1234" actual &&
- grep -v "/ip4/10.20.30.40/tcp/4321" actual &&
+ test_should_not_contain "/ip4/1.2.3.4/tcp/1234" actual &&
+ test_should_not_contain "/ip4/10.20.30.40/tcp/4321" actual &&
ipfs id -f"" | xargs -n1 echo >actual &&
- grep -v "/ip4/1.2.3.4/tcp/1234" actual &&
- grep -v "//ip4/10.20.30.40/tcp/4321" actual
+ test_should_not_contain "/ip4/1.2.3.4/tcp/1234" actual &&
+ test_should_not_contain "/ip4/10.20.30.40/tcp/4321" actual
'
test_kill_ipfs_daemon
@@ -119,9 +119,9 @@ test_launch_ipfs_daemon
test_expect_success "Addresses.NoAnnounce with /ipcidr affects addresses" '
ipfs swarm addrs local >actual &&
- grep -v "/ip4/1.2.3.4/tcp/1234" actual &&
+ test_should_not_contain "/ip4/1.2.3.4/tcp/1234" actual &&
ipfs id -f"" | xargs -n1 echo >actual &&
- grep -v "/ip4/1.2.3.4/tcp/1234" actual
+ test_should_not_contain "/ip4/1.2.3.4/tcp/1234" actual
'
test_kill_ipfs_daemon
From c4c70cb53c8b8934415835091e7cda3e72242411 Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Tue, 10 Jun 2025 08:21:54 -0700
Subject: [PATCH 258/499] commands: add `--force` option to `files cp` command
(#10823)
* commands: add `--force` option to `files cp` command
Adds a `--force` option to allow the `ipfs files cp` command to overwrite existig files. Returns error is trying to overwrite directories.
Replaces #4079
Closes #2074
* Update test/sharness/t0250-files-api.sh
---
core/commands/files.go | 42 +++++++++++++++++++++++++++++---
docs/changelogs/v0.36.md | 7 +++++-
test/sharness/t0250-files-api.sh | 12 +++++++++
3 files changed, 57 insertions(+), 4 deletions(-)
diff --git a/core/commands/files.go b/core/commands/files.go
index 8645301ef..dfa94d2a6 100644
--- a/core/commands/files.go
+++ b/core/commands/files.go
@@ -440,10 +440,10 @@ being GC'ed.
cmds.StringArg("dest", true, false, "Destination within MFS."),
},
Options: []cmds.Option{
+ cmds.BoolOption(forceOptionName, "Force overwrite of existing files."),
cmds.BoolOption(filesParentsOptionName, "p", "Make parent directories as needed."),
},
Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
- mkParents, _ := req.Options[filesParentsOptionName].(bool)
nd, err := cmdenv.GetNode(env)
if err != nil {
return err
@@ -459,8 +459,6 @@ being GC'ed.
return err
}
- flush, _ := req.Options[filesFlushOptionName].(bool)
-
src, err := checkPath(req.Arguments[0])
if err != nil {
return err
@@ -500,6 +498,7 @@ being GC'ed.
return errFilesCpInvalidUnixFS
}
+ mkParents, _ := req.Options[filesParentsOptionName].(bool)
if mkParents {
err := ensureContainingDirectoryExists(nd.FilesRoot, dst, prefix)
if err != nil {
@@ -507,11 +506,19 @@ being GC'ed.
}
}
+ force, _ := req.Options[forceOptionName].(bool)
+ if force {
+ if err = unlinkNodeIfExists(nd, dst); err != nil {
+ return fmt.Errorf("cp: cannot unlink existing file: %s", err)
+ }
+ }
+
err = mfs.PutNode(nd.FilesRoot, dst, node)
if err != nil {
return fmt.Errorf("cp: cannot put node in path %s: %s", dst, err)
}
+ flush, _ := req.Options[filesFlushOptionName].(bool)
if flush {
if _, err := mfs.FlushPath(req.Context, nd.FilesRoot, dst); err != nil {
return fmt.Errorf("cp: cannot flush the created file %s: %s", dst, err)
@@ -546,6 +553,35 @@ func getNodeFromPath(ctx context.Context, node *core.IpfsNode, api iface.CoreAPI
}
}
+func unlinkNodeIfExists(node *core.IpfsNode, path string) error {
+ dir, name := gopath.Split(path)
+ parent, err := mfs.Lookup(node.FilesRoot, dir)
+ if err != nil {
+ if errors.Is(err, os.ErrNotExist) {
+ return nil
+ }
+ return err
+ }
+
+ pdir, ok := parent.(*mfs.Directory)
+ if !ok {
+ return fmt.Errorf("not a directory: %s", dir)
+ }
+
+ // Attempt to unlink if child is a file, ignore error since
+ // we are only concerned with unlinking an existing file.
+ child, err := pdir.Child(name)
+ if err != nil {
+ return nil // no child file, nothing to unlink
+ }
+
+ if child.Type() != mfs.TFile {
+ return fmt.Errorf("not a file: %s", path)
+ }
+
+ return pdir.Unlink(name)
+}
+
type filesLsOutput struct {
Entries []mfs.NodeListing
}
diff --git a/docs/changelogs/v0.36.md b/docs/changelogs/v0.36.md
index 09369bcea..a81276a96 100644
--- a/docs/changelogs/v0.36.md
+++ b/docs/changelogs/v0.36.md
@@ -10,7 +10,8 @@ This release was brought to you by the [Shipyard](http://ipshipyard.com/) team.
- [Overview](#overview)
- [๐ฆ Highlights](#-highlights)
- - [Update go-log to v2](#update-go-log-to-v2
+ - [Update go-log to v2](#update-go-log-to-v2)
+ - [Overwrite option for files cp command](#overwrite-option-for-files-cp-command)
- [Option for filestore command to remove bad blocks](#option-for-filestore-command-to-remove-bad-blocks)
- [๐ฆ๏ธ Important dependency updates](#-important-dependency-updates)
- [๐ Changelog](#-changelog)
@@ -29,6 +30,10 @@ go-log v2 has been out for quite a while now and it is time to deprecate v1.
- Fixes `ipfs log tail`
- Removes support for `ContextWithLoggable` as this is not needed for tracing-like functionality
+#### Overwrite option for files cp command
+
+The `ipfs files cp` command has a `--force` option to allow it to overwrite existing files. Attempting to overwrite an existing directory results in an error.
+
#### Option for filestore command to remove bad blocks
The `filestore` command has a new option, `--remove-bad-blocks`, to verify objects in the filestore and remove those that fail verification.
diff --git a/test/sharness/t0250-files-api.sh b/test/sharness/t0250-files-api.sh
index 63dacf7d4..b86ee56f5 100755
--- a/test/sharness/t0250-files-api.sh
+++ b/test/sharness/t0250-files-api.sh
@@ -674,6 +674,18 @@ test_files_api() {
ipfs files ls /adir | grep foobar
'
+ test_expect_success "test copy --force overwrites files" '
+ ipfs files cp /ipfs/$FILE1 /file1 &&
+ ipfs files cp /ipfs/$FILE2 /file2 &&
+ ipfs files cp --force /file1 /file2 &&
+ test "`ipfs files read /file1`" = "`ipfs files read /file2`"
+ '
+
+ test_expect_success "clean up" '
+ ipfs files rm /file1 &&
+ ipfs files rm /file2
+ '
+
test_expect_success "should fail to write file and create intermediate directories with no --parents flag set $EXTRA" '
echo "ipfs rocks" | test_must_fail ipfs files write --create /parents/foo/ipfs.txt
'
From d70f6421d44777a120532908e22c81770252e92e Mon Sep 17 00:00:00 2001
From: sukun
Date: Tue, 17 Jun 2025 03:59:50 +0530
Subject: [PATCH 259/499] feat: AutoTLS with AutoNATv2 client (#10835)
* update autotls; libp2p to use autonatv2
* chore: p2p-forge@main with autonat fix
https://github.com/ipshipyard/p2p-forge/pull/70
---------
Co-authored-by: Marcin Rataj
---
core/node/libp2p/rcmgr_logging.go | 5 ++
docs/changelogs/v0.36.md | 11 ++++
docs/config.md | 4 +-
docs/examples/kubo-as-a-library/go.mod | 27 ++++----
docs/examples/kubo-as-a-library/go.sum | 83 +++++++++---------------
go.mod | 31 ++++-----
go.sum | 88 ++++++++++----------------
test/dependencies/go.mod | 21 +++---
test/dependencies/go.sum | 63 +++++++-----------
test/integration/wan_lan_dht_test.go | 10 ++-
10 files changed, 143 insertions(+), 200 deletions(-)
diff --git a/core/node/libp2p/rcmgr_logging.go b/core/node/libp2p/rcmgr_logging.go
index 4a0b11102..28188b0fc 100644
--- a/core/node/libp2p/rcmgr_logging.go
+++ b/core/node/libp2p/rcmgr_logging.go
@@ -3,6 +3,7 @@ package libp2p
import (
"context"
"errors"
+ "net"
"sync"
"time"
@@ -164,6 +165,10 @@ func (n *loggingResourceManager) Stat() rcmgr.ResourceManagerStat {
return rapi.Stat()
}
+func (n *loggingResourceManager) VerifySourceAddress(addr net.Addr) bool {
+ return n.delegate.VerifySourceAddress(addr)
+}
+
func (s *loggingScope) ReserveMemory(size int, prio uint8) error {
err := s.delegate.ReserveMemory(size, prio)
s.countErrs(err)
diff --git a/docs/changelogs/v0.36.md b/docs/changelogs/v0.36.md
index a81276a96..6d5aad0b8 100644
--- a/docs/changelogs/v0.36.md
+++ b/docs/changelogs/v0.36.md
@@ -8,9 +8,12 @@ This release was brought to you by the [Shipyard](http://ipshipyard.com/) team.
## v0.36.0
+
- [Overview](#overview)
- [๐ฆ Highlights](#-highlights)
- [Update go-log to v2](#update-go-log-to-v2)
+ - [AutoNATv2 Client](#autonatv2-client)
+ - [Smarter AutoTLS registration](#smarter-autotls-registration)
- [Overwrite option for files cp command](#overwrite-option-for-files-cp-command)
- [Option for filestore command to remove bad blocks](#option-for-filestore-command-to-remove-bad-blocks)
- [๐ฆ๏ธ Important dependency updates](#-important-dependency-updates)
@@ -30,6 +33,14 @@ go-log v2 has been out for quite a while now and it is time to deprecate v1.
- Fixes `ipfs log tail`
- Removes support for `ContextWithLoggable` as this is not needed for tracing-like functionality
+#### AutoNATv2 Client
+
+This Kubo release starts utilizing [AutoNATv2](https://github.com/libp2p/specs/blob/master/autonat/autonat-v2.md) client functionality. go-libp2p v0.42 supports and depends on both AutoNATv1 and v2, and Autorelay feature continues to use v1. go-libp2p v0.43+ will discontinue internal use of AutoNATv1. We will maintain support for both v1 and v2 until then, though v1 will gradually be deprecated and ultimately removed.
+
+##### Smarter AutoTLS registration
+
+This update to libp2p and [AutoTLS](https://github.com/ipfs/kubo/blob/master/docs/config.md#autotls) tests AutoNATv2 changes. It aims to reduce false-positive scenarios where AutoTLS certificate registration occurred before a publicly dialable multiaddr was available. This should result in fewer error logs during node start, especially when IPv6 and/or IPv4 NATs with UPnP/PCP/NAT-PMP are at play.
+
#### Overwrite option for files cp command
The `ipfs files cp` command has a `--force` option to allow it to overwrite existing files. Attempting to overwrite an existing directory results in an error.
diff --git a/docs/config.md b/docs/config.md
index a6e9c699f..b176f9b5b 100644
--- a/docs/config.md
+++ b/docs/config.md
@@ -468,7 +468,7 @@ field can take one of two values:
* `enabled` - Enable the V1+V2 service (unless the node determines that it,
itself, isn't reachable by the public internet).
-* `legacy-v1` - Same as `enabled` but only V1 service is enabled. Used for testing
+* `legacy-v1` - **DEPRECATED** Same as `enabled` but only V1 service is enabled. Used for testing
during as few releases as we [transition to V2](https://github.com/ipfs/kubo/issues/10091), will be removed in the future.
* `disabled` - Disable the service.
@@ -477,7 +477,7 @@ Additional modes may be added in the future.
> [!IMPORTANT]
> We are in the progress of [rolling out AutoNAT V2](https://github.com/ipfs/kubo/issues/10091).
> Right now, by default, a publicly dialable Kubo provides both V1 and V2 service to other peers,
-> but only V1 is used by Kubo as a client. In a future release we will remove V1 and switch client to use V2.
+> and V1 is still used by Kubo for Autorelay feature. In a future release we will remove V1 and switch all features to use V2.
Default: `enabled`
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index 415c5d2b4..261343252 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -9,7 +9,7 @@ replace github.com/ipfs/kubo => ./../../..
require (
github.com/ipfs/boxo v0.31.1-0.20250528182950-f87feb50c39c
github.com/ipfs/kubo v0.0.0-00010101000000-000000000000
- github.com/libp2p/go-libp2p v0.41.1
+ github.com/libp2p/go-libp2p v0.42.0-alpha-2
github.com/multiformats/go-multiaddr v0.15.0
)
@@ -36,17 +36,13 @@ require (
github.com/cockroachdb/redact v1.1.5 // indirect
github.com/cockroachdb/swiss v0.0.0-20250327203710-2932b022f6df // indirect
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect
- github.com/containerd/cgroups v1.1.0 // indirect
- github.com/coreos/go-systemd/v22 v22.5.0 // indirect
github.com/crackcomm/go-gitignore v0.0.0-20241020182519-7843d2ba8fdf // indirect
github.com/cskr/pubsub v1.0.2 // indirect
github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 // indirect
github.com/dgraph-io/badger v1.6.2 // indirect
github.com/dgraph-io/ristretto v0.1.1 // indirect
- github.com/docker/go-units v0.5.0 // indirect
github.com/dustin/go-humanize v1.0.1 // indirect
- github.com/elastic/gosigar v0.14.3 // indirect
github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5 // indirect
github.com/felixge/httpsnoop v1.0.4 // indirect
github.com/filecoin-project/go-clock v0.1.0 // indirect
@@ -61,13 +57,12 @@ require (
github.com/go-logr/logr v1.4.2 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
- github.com/godbus/dbus/v5 v5.1.0 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/glog v1.2.4 // indirect
github.com/golang/protobuf v1.5.4 // indirect
github.com/golang/snappy v0.0.5-0.20231225225746-43d5d4cd4e0e // indirect
github.com/google/gopacket v1.1.19 // indirect
- github.com/google/pprof v0.0.0-20250208200701-d0013a598941 // indirect
+ github.com/google/pprof v0.0.0-20250501235452-c0086092b71a // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/gorilla/websocket v1.5.3 // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect
@@ -103,7 +98,7 @@ require (
github.com/ipld/go-car/v2 v2.14.3 // indirect
github.com/ipld/go-codec-dagpb v1.7.0 // indirect
github.com/ipld/go-ipld-prime v0.21.0 // indirect
- github.com/ipshipyard/p2p-forge v0.5.1 // indirect
+ github.com/ipshipyard/p2p-forge v0.5.2-0.20250616211529-2c25ee655b22 // indirect
github.com/jackpal/go-nat-pmp v1.0.2 // indirect
github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect
github.com/jbenet/goprocess v0.1.4 // indirect
@@ -148,8 +143,7 @@ require (
github.com/multiformats/go-multistream v0.6.0 // indirect
github.com/multiformats/go-varint v0.0.7 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
- github.com/onsi/ginkgo/v2 v2.22.2 // indirect
- github.com/opencontainers/runtime-spec v1.2.0 // indirect
+ github.com/onsi/ginkgo/v2 v2.23.4 // indirect
github.com/opentracing/opentracing-go v1.2.0 // indirect
github.com/openzipkin/zipkin-go v0.4.3 // indirect
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect
@@ -163,16 +157,16 @@ require (
github.com/pion/mdns/v2 v2.0.7 // indirect
github.com/pion/randutil v0.1.0 // indirect
github.com/pion/rtcp v1.2.15 // indirect
- github.com/pion/rtp v1.8.11 // indirect
+ github.com/pion/rtp v1.8.13 // indirect
github.com/pion/sctp v1.8.37 // indirect
- github.com/pion/sdp/v3 v3.0.10 // indirect
+ github.com/pion/sdp/v3 v3.0.11 // indirect
github.com/pion/srtp/v3 v3.0.4 // indirect
github.com/pion/stun v0.6.1 // indirect
github.com/pion/stun/v3 v3.0.0 // indirect
github.com/pion/transport/v2 v2.2.10 // indirect
github.com/pion/transport/v3 v3.0.7 // indirect
github.com/pion/turn/v4 v4.0.0 // indirect
- github.com/pion/webrtc/v4 v4.0.10 // indirect
+ github.com/pion/webrtc/v4 v4.0.14 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/polydawn/refmt v0.89.0 // indirect
github.com/prometheus/client_golang v1.22.0 // indirect
@@ -180,9 +174,8 @@ require (
github.com/prometheus/common v0.63.0 // indirect
github.com/prometheus/procfs v0.16.1 // indirect
github.com/quic-go/qpack v0.5.1 // indirect
- github.com/quic-go/quic-go v0.50.1 // indirect
+ github.com/quic-go/quic-go v0.52.0 // indirect
github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 // indirect
- github.com/raulk/go-watchdog v1.3.0 // indirect
github.com/rogpeppe/go-internal v1.13.1 // indirect
github.com/samber/lo v1.47.0 // indirect
github.com/spaolacci/murmur3 v1.1.0 // indirect
@@ -209,9 +202,10 @@ require (
go.opentelemetry.io/otel/sdk v1.31.0 // indirect
go.opentelemetry.io/otel/trace v1.35.0 // indirect
go.opentelemetry.io/proto/otlp v1.3.1 // indirect
+ go.uber.org/automaxprocs v1.6.0 // indirect
go.uber.org/dig v1.18.0 // indirect
go.uber.org/fx v1.23.0 // indirect
- go.uber.org/mock v0.5.0 // indirect
+ go.uber.org/mock v0.5.2 // indirect
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.27.0 // indirect
go.uber.org/zap/exp v0.3.0 // indirect
@@ -223,6 +217,7 @@ require (
golang.org/x/sync v0.14.0 // indirect
golang.org/x/sys v0.33.0 // indirect
golang.org/x/text v0.25.0 // indirect
+ golang.org/x/time v0.11.0 // indirect
golang.org/x/tools v0.33.0 // indirect
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
gonum.org/v1/gonum v0.16.0 // indirect
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index 87753b63e..083bbd42a 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -43,7 +43,6 @@ github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5 h1:iW0a5
github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5/go.mod h1:Y2QMoi1vgtOIfc+6DhrMOGkLoGzqSV2rKp4Sm+opsyA=
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
-github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o=
github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
@@ -78,7 +77,6 @@ github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
-github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/cockroachdb/crlib v0.0.0-20241015224233-894974b3ad94 h1:bvJv505UUfjzbaIPdNS4AEkHreDqQk6yuNpsdRHpwFA=
@@ -101,20 +99,13 @@ github.com/cockroachdb/swiss v0.0.0-20250327203710-2932b022f6df h1:GUJ4KuZtbOcIf
github.com/cockroachdb/swiss v0.0.0-20250327203710-2932b022f6df/go.mod h1:yBRu/cnL4ks9bgy4vAASdjIW+/xMlFwuHKqtmh3GZQg=
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo=
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ=
-github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE=
-github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM=
-github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw=
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
-github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk=
-github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs=
-github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
-github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/crackcomm/go-gitignore v0.0.0-20241020182519-7843d2ba8fdf h1:dwGgBWn84wUS1pVikGiruW+x5XM4amhjaZO20vCjay4=
github.com/crackcomm/go-gitignore v0.0.0-20241020182519-7843d2ba8fdf/go.mod h1:p1d6YEZWvFzEh4KLyvBcVSnrfNDDvK2zfK/4x2v/4pE=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
@@ -137,17 +128,12 @@ github.com/dgraph-io/badger v1.6.2/go.mod h1:JW2yswe3V058sS0kZ2h/AXeDSqFjxnZcRrV
github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E=
github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8=
github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA=
-github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA=
github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
-github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
-github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
-github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
+github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y=
+github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
-github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs=
-github.com/elastic/gosigar v0.14.3 h1:xwkKwPia+hSfg9GqrCUKYdId102m9qTJIIr7egmK/uo=
-github.com/elastic/gosigar v0.14.3/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs=
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
@@ -200,10 +186,6 @@ github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg78
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0=
-github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
-github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
-github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
-github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
@@ -250,7 +232,6 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
@@ -265,8 +246,8 @@ github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OI
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20250208200701-d0013a598941 h1:43XjGa6toxLpeksjcxs1jIoIyr+vUfOqY2c6HB4bpoc=
-github.com/google/pprof v0.0.0-20250208200701-d0013a598941/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
+github.com/google/pprof v0.0.0-20250501235452-c0086092b71a h1:rDA3FfmxwXR+BVKKdz55WwMJ1pD2hJQNW31d+l3mPk4=
+github.com/google/pprof v0.0.0-20250501235452-c0086092b71a/go.mod h1:5hDyRhoBCxViHszMt12TnOpEI4VVi+U8Gm9iphldiMA=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
@@ -387,8 +368,8 @@ github.com/ipld/go-ipld-prime v0.21.0 h1:n4JmcpOlPDIxBcY037SVfpd1G+Sj1nKZah0m6QH
github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOanyMctpPjsvxQ=
github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd h1:gMlw/MhNr2Wtp5RwGdsW23cs+yCuj9k2ON7i9MiJlRo=
github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd/go.mod h1:wZ8hH8UxeryOs4kJEJaiui/s00hDSbE37OKsL47g+Sw=
-github.com/ipshipyard/p2p-forge v0.5.1 h1:9MCpAlk+wNhy7W/yOYKgi9KlXPnyb0abmDpsRPHUDxQ=
-github.com/ipshipyard/p2p-forge v0.5.1/go.mod h1:GNDXM2CR8KRS8mJGw7ARIRVlrG9NH8MdewgNVfIIByA=
+github.com/ipshipyard/p2p-forge v0.5.2-0.20250616211529-2c25ee655b22 h1:J9UVOPm9gSOKM9BurRyHLRVpG5d5TPsYaSwZe1iTNqQ=
+github.com/ipshipyard/p2p-forge v0.5.2-0.20250616211529-2c25ee655b22/go.mod h1:eCkvoEuBwYJpPjMaBtVwLuIU9dzMWiO2hej3zfpbu+4=
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA=
@@ -445,8 +426,8 @@ github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZ
github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs=
github.com/libp2p/go-flow-metrics v0.2.0 h1:EIZzjmeOE6c8Dav0sNv35vhZxATIXWZg6j/C08XmmDw=
github.com/libp2p/go-flow-metrics v0.2.0/go.mod h1:st3qqfu8+pMfh+9Mzqb2GTiwrAGjIPszEjZmtksN8Jc=
-github.com/libp2p/go-libp2p v0.41.1 h1:8ecNQVT5ev/jqALTvisSJeVNvXYJyK4NhQx1nNRXQZE=
-github.com/libp2p/go-libp2p v0.41.1/go.mod h1:DcGTovJzQl/I7HMrby5ZRjeD0kQkGiy+9w6aEkSZpRI=
+github.com/libp2p/go-libp2p v0.42.0-alpha-2 h1:/YdRlrtb/kNge0MszF8mMgO9tEaPBvD1ZGubYaliaBY=
+github.com/libp2p/go-libp2p v0.42.0-alpha-2/go.mod h1:tp7K6LUZDruO2li9fK9cnQAGN8o3yTb8FwUd5AdKv+k=
github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94=
github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8=
github.com/libp2p/go-libp2p-core v0.2.4/go.mod h1:STh4fdfa5vDYr0/SzYYeqnt+E6KfEV5VxfIrm0bcI0g=
@@ -566,9 +547,8 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8m
github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo=
github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM=
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
+github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
-github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY=
-github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc=
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
@@ -576,18 +556,15 @@ github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vv
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
-github.com/onsi/ginkgo/v2 v2.22.2 h1:/3X8Panh8/WwhU/3Ssa6rCKqPLuAkVY2I0RoyDLySlU=
-github.com/onsi/ginkgo/v2 v2.22.2/go.mod h1:oeMosUL+8LtarXBHu/c0bx2D/K9zyQ6uX3cTyztHwsk=
+github.com/onsi/ginkgo/v2 v2.23.4 h1:ktYTpKJAVZnDT4VjxSbiBenUjmlL/5QkBEocaWXiQus=
+github.com/onsi/ginkgo/v2 v2.23.4/go.mod h1:Bt66ApGPBFzHyR+JO10Zbt0Gsp4uWxu5mIOTusL46e8=
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro=
-github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8=
-github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY=
-github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
-github.com/opencontainers/runtime-spec v1.2.0 h1:z97+pHb3uELt/yiAWD691HNHQIF07bE7dzrbT927iTk=
-github.com/opencontainers/runtime-spec v1.2.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
+github.com/onsi/gomega v1.36.3 h1:hID7cr8t3Wp26+cYnfcjR6HpJ00fdogN6dqZ1t6IylU=
+github.com/onsi/gomega v1.36.3/go.mod h1:8D9+Txp43QWKhM24yyOBEdpkzN8FvJyAwecBgsU4KU0=
github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs=
github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
@@ -621,12 +598,12 @@ github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA=
github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8=
github.com/pion/rtcp v1.2.15 h1:LZQi2JbdipLOj4eBjK4wlVoQWfrZbh3Q6eHtWtJBZBo=
github.com/pion/rtcp v1.2.15/go.mod h1:jlGuAjHMEXwMUHK78RgX0UmEJFV4zUKOFHR7OP+D3D0=
-github.com/pion/rtp v1.8.11 h1:17xjnY5WO5hgO6SD3/NTIUPvSFw/PbLsIJyz1r1yNIk=
-github.com/pion/rtp v1.8.11/go.mod h1:8uMBJj32Pa1wwx8Fuv/AsFhn8jsgw+3rUC2PfoBZ8p4=
+github.com/pion/rtp v1.8.13 h1:8uSUPpjSL4OlwZI8Ygqu7+h2p9NPFB+yAZ461Xn5sNg=
+github.com/pion/rtp v1.8.13/go.mod h1:8uMBJj32Pa1wwx8Fuv/AsFhn8jsgw+3rUC2PfoBZ8p4=
github.com/pion/sctp v1.8.37 h1:ZDmGPtRPX9mKCiVXtMbTWybFw3z/hVKAZgU81wcOrqs=
github.com/pion/sctp v1.8.37/go.mod h1:cNiLdchXra8fHQwmIoqw0MbLLMs+f7uQ+dGMG2gWebE=
-github.com/pion/sdp/v3 v3.0.10 h1:6MChLE/1xYB+CjumMw+gZ9ufp2DPApuVSnDT8t5MIgA=
-github.com/pion/sdp/v3 v3.0.10/go.mod h1:88GMahN5xnScv1hIMTqLdu/cOcUkj6a9ytbncwMCq2E=
+github.com/pion/sdp/v3 v3.0.11 h1:VhgVSopdsBKwhCFoyyPmT1fKMeV9nLMrEKxNOdy3IVI=
+github.com/pion/sdp/v3 v3.0.11/go.mod h1:88GMahN5xnScv1hIMTqLdu/cOcUkj6a9ytbncwMCq2E=
github.com/pion/srtp/v3 v3.0.4 h1:2Z6vDVxzrX3UHEgrUyIGM4rRouoC7v+NiF1IHtp9B5M=
github.com/pion/srtp/v3 v3.0.4/go.mod h1:1Jx3FwDoxpRaTh1oRV8A/6G1BnFL+QI82eK4ms8EEJQ=
github.com/pion/stun v0.6.1 h1:8lp6YejULeHBF8NmV8e2787BogQhduZugh5PdhDyyN4=
@@ -641,8 +618,8 @@ github.com/pion/transport/v3 v3.0.7 h1:iRbMH05BzSNwhILHoBoAPxoB9xQgOaJk+591KC9P1
github.com/pion/transport/v3 v3.0.7/go.mod h1:YleKiTZ4vqNxVwh77Z0zytYi7rXHl7j6uPLGhhz9rwo=
github.com/pion/turn/v4 v4.0.0 h1:qxplo3Rxa9Yg1xXDxxH8xaqcyGUtbHYw4QSCvmFWvhM=
github.com/pion/turn/v4 v4.0.0/go.mod h1:MuPDkm15nYSklKpN8vWJ9W2M0PlyQZqYt1McGuxG7mA=
-github.com/pion/webrtc/v4 v4.0.10 h1:Hq/JLjhqLxi+NmCtE8lnRPDr8H4LcNvwg8OxVcdv56Q=
-github.com/pion/webrtc/v4 v4.0.10/go.mod h1:ViHLVaNpiuvaH8pdiuQxuA9awuE6KVzAXx3vVWilOck=
+github.com/pion/webrtc/v4 v4.0.14 h1:nyds/sFRR+HvmWoBa6wrL46sSfpArE0qR883MBW96lg=
+github.com/pion/webrtc/v4 v4.0.14/go.mod h1:R3+qTnQTS03UzwDarYecgioNf7DYgTsldxnCXB821Kk=
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
@@ -653,6 +630,8 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH
github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o=
github.com/polydawn/refmt v0.89.0 h1:ADJTApkvkeBZsN0tBTx8QjpD9JkmxbKp0cxfr9qszm4=
github.com/polydawn/refmt v0.89.0/go.mod h1:/zvteZs/GwLtCgZ4BL6CBsk9IKIlexP43ObX9AxTqTw=
+github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g=
+github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U=
github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q=
github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0=
@@ -668,12 +647,10 @@ github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzM
github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is=
github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI=
github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg=
-github.com/quic-go/quic-go v0.50.1 h1:unsgjFIUqW8a2oopkY7YNONpV1gYND6Nt9hnt1PN94Q=
-github.com/quic-go/quic-go v0.50.1/go.mod h1:Vim6OmUvlYdwBhXP9ZVrtGmCMWa3wEqhq3NgYrI8b4E=
+github.com/quic-go/quic-go v0.52.0 h1:/SlHrCRElyaU6MaEPKqKr9z83sBg2v4FLLvWM+Z47pA=
+github.com/quic-go/quic-go v0.52.0/go.mod h1:MFlGGpcpJqRAfmYi6NC2cptDPSxRWTOGNuP4wqrWmzQ=
github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 h1:4WFk6u3sOT6pLa1kQ50ZVdm8BQFgJNA117cepZxtLIg=
github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66/go.mod h1:Vp72IJajgeOL6ddqrAhmp7IM9zbTcgkQxD/YdxrVwMw=
-github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk=
-github.com/raulk/go-watchdog v1.3.0/go.mod h1:fIvOnLbF0b0ZwkB9YU4mOW9Did//4vPZtDqv66NfsMU=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
@@ -708,7 +685,6 @@ github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeV
github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4=
github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw=
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
-github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/slok/go-http-metrics v0.13.0 h1:lQDyJJx9wKhmbliyUsZ2l6peGnXRHjsjoqPt5VYzcP8=
github.com/slok/go-http-metrics v0.13.0/go.mod h1:HIr7t/HbN2sJaunvnt9wKP9xoBBVZFo1/KiHU3b0w+4=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
@@ -759,7 +735,6 @@ github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9
github.com/ucarion/urlpath v0.0.0-20200424170820-7ccc79b76bbb h1:Ywfo8sUltxogBpFuMOFRrrSifO788kAFxmvVw31PtQQ=
github.com/ucarion/urlpath v0.0.0-20200424170820-7ccc79b76bbb/go.mod h1:ikPs9bRWicNw3S7XpJ8sK/smGwU9WcSVU3dy9qahYBM=
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
-github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU=
github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM=
@@ -830,14 +805,16 @@ go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeX
go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8=
go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
+go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
+go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8=
go.uber.org/dig v1.18.0 h1:imUL1UiY0Mg4bqbFfsRQO5G4CGRBec/ZujWTvSVp3pw=
go.uber.org/dig v1.18.0/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE=
go.uber.org/fx v1.23.0 h1:lIr/gYWQGfTwGcSXWXu4vP5Ws6iqnNEIY+F/aFzCKTg=
go.uber.org/fx v1.23.0/go.mod h1:o/D9n+2mLP6v1EG+qsdT1O8wKopYAsqZasju97SDFCU=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
-go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU=
-go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM=
+go.uber.org/mock v0.5.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko=
+go.uber.org/mock v0.5.2/go.mod h1:wLlUxC2vVTPTaE3UD51E0BGOAElKrILxhVSDYQLld5o=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
@@ -960,7 +937,6 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=
golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
-golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -985,7 +961,6 @@ golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -1034,8 +1009,8 @@ golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA=
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=
-golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
+golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0=
+golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
diff --git a/go.mod b/go.mod
index 7323f337c..59b420373 100644
--- a/go.mod
+++ b/go.mod
@@ -47,12 +47,12 @@ require (
github.com/ipld/go-car/v2 v2.14.3
github.com/ipld/go-codec-dagpb v1.7.0
github.com/ipld/go-ipld-prime v0.21.0
- github.com/ipshipyard/p2p-forge v0.5.1
+ github.com/ipshipyard/p2p-forge v0.5.2-0.20250616211529-2c25ee655b22
github.com/jbenet/go-temp-err-catcher v0.1.0
github.com/jbenet/goprocess v0.1.4
github.com/julienschmidt/httprouter v1.3.0
github.com/libp2p/go-doh-resolver v0.5.0
- github.com/libp2p/go-libp2p v0.41.1
+ github.com/libp2p/go-libp2p v0.42.0-alpha-2
github.com/libp2p/go-libp2p-http v0.5.0
github.com/libp2p/go-libp2p-kad-dht v0.33.1
github.com/libp2p/go-libp2p-kbucket v0.7.0
@@ -103,6 +103,7 @@ require (
github.com/benbjohnson/clock v1.3.5 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/caddyserver/zerossl v0.1.3 // indirect
+ github.com/cespare/xxhash v1.1.0 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/cockroachdb/crlib v0.0.0-20241015224233-894974b3ad94 // indirect
github.com/cockroachdb/errors v1.11.3 // indirect
@@ -111,16 +112,14 @@ require (
github.com/cockroachdb/redact v1.1.5 // indirect
github.com/cockroachdb/swiss v0.0.0-20250327203710-2932b022f6df // indirect
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect
- github.com/containerd/cgroups v1.1.0 // indirect
github.com/crackcomm/go-gitignore v0.0.0-20241020182519-7843d2ba8fdf // indirect
github.com/cskr/pubsub v1.0.2 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 // indirect
github.com/dgraph-io/badger v1.6.2 // indirect
- github.com/dgraph-io/ristretto v0.1.1 // indirect
- github.com/docker/go-units v0.5.0 // indirect
- github.com/elastic/gosigar v0.14.3 // indirect
+ github.com/dgraph-io/ristretto v0.0.2 // indirect
+ github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect
github.com/fatih/color v1.15.0 // indirect
github.com/felixge/httpsnoop v1.0.4 // indirect
github.com/flynn/noise v1.1.0 // indirect
@@ -135,14 +134,12 @@ require (
github.com/go-logr/logr v1.4.2 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
- github.com/godbus/dbus/v5 v5.1.0 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
- github.com/golang/glog v1.2.4 // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/golang/protobuf v1.5.4 // indirect
github.com/golang/snappy v0.0.5-0.20231225225746-43d5d4cd4e0e // indirect
github.com/google/gopacket v1.1.19 // indirect
- github.com/google/pprof v0.0.0-20250208200701-d0013a598941 // indirect
+ github.com/google/pprof v0.0.0-20250501235452-c0086092b71a // indirect
github.com/gorilla/mux v1.8.1 // indirect
github.com/gorilla/websocket v1.5.3 // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect
@@ -198,8 +195,7 @@ require (
github.com/multiformats/go-multistream v0.6.0 // indirect
github.com/multiformats/go-varint v0.0.7 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
- github.com/onsi/ginkgo/v2 v2.22.2 // indirect
- github.com/opencontainers/runtime-spec v1.2.0 // indirect
+ github.com/onsi/ginkgo/v2 v2.23.4 // indirect
github.com/openzipkin/zipkin-go v0.4.3 // indirect
github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 // indirect
github.com/pion/datachannel v1.5.10 // indirect
@@ -211,16 +207,16 @@ require (
github.com/pion/mdns/v2 v2.0.7 // indirect
github.com/pion/randutil v0.1.0 // indirect
github.com/pion/rtcp v1.2.15 // indirect
- github.com/pion/rtp v1.8.11 // indirect
+ github.com/pion/rtp v1.8.13 // indirect
github.com/pion/sctp v1.8.37 // indirect
- github.com/pion/sdp/v3 v3.0.10 // indirect
+ github.com/pion/sdp/v3 v3.0.11 // indirect
github.com/pion/srtp/v3 v3.0.4 // indirect
github.com/pion/stun v0.6.1 // indirect
github.com/pion/stun/v3 v3.0.0 // indirect
github.com/pion/transport/v2 v2.2.10 // indirect
github.com/pion/transport/v3 v3.0.7 // indirect
github.com/pion/turn/v4 v4.0.0 // indirect
- github.com/pion/webrtc/v4 v4.0.10 // indirect
+ github.com/pion/webrtc/v4 v4.0.14 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/polydawn/refmt v0.89.0 // indirect
@@ -229,9 +225,8 @@ require (
github.com/prometheus/procfs v0.16.1 // indirect
github.com/prometheus/statsd_exporter v0.27.1 // indirect
github.com/quic-go/qpack v0.5.1 // indirect
- github.com/quic-go/quic-go v0.50.1 // indirect
+ github.com/quic-go/quic-go v0.52.0 // indirect
github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 // indirect
- github.com/raulk/go-watchdog v1.3.0 // indirect
github.com/rivo/uniseg v0.4.4 // indirect
github.com/rogpeppe/go-internal v1.13.1 // indirect
github.com/rs/cors v1.11.1 // indirect
@@ -262,13 +257,15 @@ require (
go.opentelemetry.io/otel/metric v1.35.0 // indirect
go.opentelemetry.io/proto/otlp v1.3.1 // indirect
go.uber.org/atomic v1.11.0 // indirect
- go.uber.org/mock v0.5.0 // indirect
+ go.uber.org/automaxprocs v1.6.0 // indirect
+ go.uber.org/mock v0.5.2 // indirect
go.uber.org/zap/exp v0.3.0 // indirect
go4.org v0.0.0-20230225012048-214862532bf5 // indirect
golang.org/x/net v0.40.0 // indirect
golang.org/x/oauth2 v0.25.0 // indirect
golang.org/x/term v0.32.0 // indirect
golang.org/x/text v0.25.0 // indirect
+ golang.org/x/time v0.11.0 // indirect
golang.org/x/tools v0.33.0 // indirect
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
gonum.org/v1/gonum v0.16.0 // indirect
diff --git a/go.sum b/go.sum
index 9e30f10fa..c8dc404a7 100644
--- a/go.sum
+++ b/go.sum
@@ -51,6 +51,7 @@ github.com/DataDog/zstd v1.5.6-0.20230824185856-869dae002e5e h1:ZIWapoIRN1VqT8GR
github.com/DataDog/zstd v1.5.6-0.20230824185856-869dae002e5e/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw=
github.com/Jorropo/jsync v1.0.1 h1:6HgRolFZnsdfzRUj+ImB9og1JYOxQoReSywkHOGSaUU=
github.com/Jorropo/jsync v1.0.1/go.mod h1:jCOZj3vrBCri3bSU3ErUYvevKlnbssrXeCivybS5ABQ=
+github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE=
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
github.com/aclements/go-perfevent v0.0.0-20240301234650-f7843625020f h1:JjxwchlOepwsUWcQwD2mLUAGE9aCp0/ehy6yCHFBOvo=
github.com/aclements/go-perfevent v0.0.0-20240301234650-f7843625020f/go.mod h1:tMDTce/yLLN/SK8gMOxQfnyeMeCg8KGzp0D1cbECEeo=
@@ -67,7 +68,6 @@ github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5 h1:iW0a5
github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5/go.mod h1:Y2QMoi1vgtOIfc+6DhrMOGkLoGzqSV2rKp4Sm+opsyA=
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
-github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o=
github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
@@ -96,6 +96,7 @@ github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyY
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/ceramicnetwork/go-dag-jose v0.1.1 h1:7pObs22egc14vSS3AfCFfS1VmaL4lQUsAK7OGC3PlKk=
github.com/ceramicnetwork/go-dag-jose v0.1.1/go.mod h1:8ptnYwY2Z2y/s5oJnNBn/UCxLg6CpramNJ2ZXF/5aNY=
+github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
@@ -106,7 +107,6 @@ github.com/cheggaaa/pb v1.0.29/go.mod h1:W40334L7FMC5JKWldsTWbdGjLo0RxUKK73K+TuP
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
-github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/cockroachdb/crlib v0.0.0-20241015224233-894974b3ad94 h1:bvJv505UUfjzbaIPdNS4AEkHreDqQk6yuNpsdRHpwFA=
@@ -129,20 +129,15 @@ github.com/cockroachdb/swiss v0.0.0-20250327203710-2932b022f6df h1:GUJ4KuZtbOcIf
github.com/cockroachdb/swiss v0.0.0-20250327203710-2932b022f6df/go.mod h1:yBRu/cnL4ks9bgy4vAASdjIW+/xMlFwuHKqtmh3GZQg=
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo=
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ=
-github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE=
-github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM=
-github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw=
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
-github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk=
github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs=
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
-github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/crackcomm/go-gitignore v0.0.0-20241020182519-7843d2ba8fdf h1:dwGgBWn84wUS1pVikGiruW+x5XM4amhjaZO20vCjay4=
github.com/crackcomm/go-gitignore v0.0.0-20241020182519-7843d2ba8fdf/go.mod h1:p1d6YEZWvFzEh4KLyvBcVSnrfNDDvK2zfK/4x2v/4pE=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
@@ -162,20 +157,14 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0/go.mod h1:ZXNYxsqcloTdSy/rNShjY
github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4=
github.com/dgraph-io/badger v1.6.2 h1:mNw0qs90GVgGGWylh0umH5iag1j6n/PeJtNvL6KY/x8=
github.com/dgraph-io/badger v1.6.2/go.mod h1:JW2yswe3V058sS0kZ2h/AXeDSqFjxnZcRrVH//y2UQE=
+github.com/dgraph-io/ristretto v0.0.2 h1:a5WaUrDa0qm0YrAAS1tUykT5El3kt62KNZZeMxQn3po=
github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E=
-github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8=
-github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA=
-github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA=
github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
-github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
-github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
-github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
+github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y=
+github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
-github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs=
-github.com/elastic/gosigar v0.14.3 h1:xwkKwPia+hSfg9GqrCUKYdId102m9qTJIIr7egmK/uo=
-github.com/elastic/gosigar v0.14.3/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs=
github.com/elgris/jsondiff v0.0.0-20160530203242-765b5c24c302 h1:QV0ZrfBLpFc2KDk+a4LJefDczXnonRwrYrQJY/9L4dA=
github.com/elgris/jsondiff v0.0.0-20160530203242-765b5c24c302/go.mod h1:qBlWZqWeVx9BjvqBsnC/8RUlAYpIFmPvgROcw0n1scE=
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
@@ -247,10 +236,7 @@ github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg78
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0=
-github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
-github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
-github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
@@ -258,8 +244,6 @@ github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
-github.com/golang/glog v1.2.4 h1:CNNw5U8lSiiBk7druxtSHHTsRWcxKoac6kZKm2peBBc=
-github.com/golang/glog v1.2.4/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
@@ -304,7 +288,6 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
@@ -326,8 +309,8 @@ github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hf
github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20250208200701-d0013a598941 h1:43XjGa6toxLpeksjcxs1jIoIyr+vUfOqY2c6HB4bpoc=
-github.com/google/pprof v0.0.0-20250208200701-d0013a598941/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
+github.com/google/pprof v0.0.0-20250501235452-c0086092b71a h1:rDA3FfmxwXR+BVKKdz55WwMJ1pD2hJQNW31d+l3mPk4=
+github.com/google/pprof v0.0.0-20250501235452-c0086092b71a/go.mod h1:5hDyRhoBCxViHszMt12TnOpEI4VVi+U8Gm9iphldiMA=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
@@ -473,8 +456,8 @@ github.com/ipld/go-ipld-prime v0.21.0 h1:n4JmcpOlPDIxBcY037SVfpd1G+Sj1nKZah0m6QH
github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOanyMctpPjsvxQ=
github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd h1:gMlw/MhNr2Wtp5RwGdsW23cs+yCuj9k2ON7i9MiJlRo=
github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd/go.mod h1:wZ8hH8UxeryOs4kJEJaiui/s00hDSbE37OKsL47g+Sw=
-github.com/ipshipyard/p2p-forge v0.5.1 h1:9MCpAlk+wNhy7W/yOYKgi9KlXPnyb0abmDpsRPHUDxQ=
-github.com/ipshipyard/p2p-forge v0.5.1/go.mod h1:GNDXM2CR8KRS8mJGw7ARIRVlrG9NH8MdewgNVfIIByA=
+github.com/ipshipyard/p2p-forge v0.5.2-0.20250616211529-2c25ee655b22 h1:J9UVOPm9gSOKM9BurRyHLRVpG5d5TPsYaSwZe1iTNqQ=
+github.com/ipshipyard/p2p-forge v0.5.2-0.20250616211529-2c25ee655b22/go.mod h1:eCkvoEuBwYJpPjMaBtVwLuIU9dzMWiO2hej3zfpbu+4=
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
github.com/jbenet/go-cienv v0.1.0 h1:Vc/s0QbQtoxX8MwwSLWWh+xNNZvM3Lw7NsTcHrvvhMc=
@@ -543,8 +526,8 @@ github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZ
github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs=
github.com/libp2p/go-flow-metrics v0.2.0 h1:EIZzjmeOE6c8Dav0sNv35vhZxATIXWZg6j/C08XmmDw=
github.com/libp2p/go-flow-metrics v0.2.0/go.mod h1:st3qqfu8+pMfh+9Mzqb2GTiwrAGjIPszEjZmtksN8Jc=
-github.com/libp2p/go-libp2p v0.41.1 h1:8ecNQVT5ev/jqALTvisSJeVNvXYJyK4NhQx1nNRXQZE=
-github.com/libp2p/go-libp2p v0.41.1/go.mod h1:DcGTovJzQl/I7HMrby5ZRjeD0kQkGiy+9w6aEkSZpRI=
+github.com/libp2p/go-libp2p v0.42.0-alpha-2 h1:/YdRlrtb/kNge0MszF8mMgO9tEaPBvD1ZGubYaliaBY=
+github.com/libp2p/go-libp2p v0.42.0-alpha-2/go.mod h1:tp7K6LUZDruO2li9fK9cnQAGN8o3yTb8FwUd5AdKv+k=
github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94=
github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8=
github.com/libp2p/go-libp2p-core v0.2.4/go.mod h1:STh4fdfa5vDYr0/SzYYeqnt+E6KfEV5VxfIrm0bcI0g=
@@ -685,9 +668,8 @@ github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRW
github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo=
github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM=
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
+github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
-github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY=
-github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc=
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
@@ -695,18 +677,15 @@ github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vv
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
-github.com/onsi/ginkgo/v2 v2.22.2 h1:/3X8Panh8/WwhU/3Ssa6rCKqPLuAkVY2I0RoyDLySlU=
-github.com/onsi/ginkgo/v2 v2.22.2/go.mod h1:oeMosUL+8LtarXBHu/c0bx2D/K9zyQ6uX3cTyztHwsk=
+github.com/onsi/ginkgo/v2 v2.23.4 h1:ktYTpKJAVZnDT4VjxSbiBenUjmlL/5QkBEocaWXiQus=
+github.com/onsi/ginkgo/v2 v2.23.4/go.mod h1:Bt66ApGPBFzHyR+JO10Zbt0Gsp4uWxu5mIOTusL46e8=
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro=
-github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8=
-github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY=
-github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
-github.com/opencontainers/runtime-spec v1.2.0 h1:z97+pHb3uELt/yiAWD691HNHQIF07bE7dzrbT927iTk=
-github.com/opencontainers/runtime-spec v1.2.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
+github.com/onsi/gomega v1.36.3 h1:hID7cr8t3Wp26+cYnfcjR6HpJ00fdogN6dqZ1t6IylU=
+github.com/onsi/gomega v1.36.3/go.mod h1:8D9+Txp43QWKhM24yyOBEdpkzN8FvJyAwecBgsU4KU0=
github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs=
github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
@@ -740,12 +719,12 @@ github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA=
github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8=
github.com/pion/rtcp v1.2.15 h1:LZQi2JbdipLOj4eBjK4wlVoQWfrZbh3Q6eHtWtJBZBo=
github.com/pion/rtcp v1.2.15/go.mod h1:jlGuAjHMEXwMUHK78RgX0UmEJFV4zUKOFHR7OP+D3D0=
-github.com/pion/rtp v1.8.11 h1:17xjnY5WO5hgO6SD3/NTIUPvSFw/PbLsIJyz1r1yNIk=
-github.com/pion/rtp v1.8.11/go.mod h1:8uMBJj32Pa1wwx8Fuv/AsFhn8jsgw+3rUC2PfoBZ8p4=
+github.com/pion/rtp v1.8.13 h1:8uSUPpjSL4OlwZI8Ygqu7+h2p9NPFB+yAZ461Xn5sNg=
+github.com/pion/rtp v1.8.13/go.mod h1:8uMBJj32Pa1wwx8Fuv/AsFhn8jsgw+3rUC2PfoBZ8p4=
github.com/pion/sctp v1.8.37 h1:ZDmGPtRPX9mKCiVXtMbTWybFw3z/hVKAZgU81wcOrqs=
github.com/pion/sctp v1.8.37/go.mod h1:cNiLdchXra8fHQwmIoqw0MbLLMs+f7uQ+dGMG2gWebE=
-github.com/pion/sdp/v3 v3.0.10 h1:6MChLE/1xYB+CjumMw+gZ9ufp2DPApuVSnDT8t5MIgA=
-github.com/pion/sdp/v3 v3.0.10/go.mod h1:88GMahN5xnScv1hIMTqLdu/cOcUkj6a9ytbncwMCq2E=
+github.com/pion/sdp/v3 v3.0.11 h1:VhgVSopdsBKwhCFoyyPmT1fKMeV9nLMrEKxNOdy3IVI=
+github.com/pion/sdp/v3 v3.0.11/go.mod h1:88GMahN5xnScv1hIMTqLdu/cOcUkj6a9ytbncwMCq2E=
github.com/pion/srtp/v3 v3.0.4 h1:2Z6vDVxzrX3UHEgrUyIGM4rRouoC7v+NiF1IHtp9B5M=
github.com/pion/srtp/v3 v3.0.4/go.mod h1:1Jx3FwDoxpRaTh1oRV8A/6G1BnFL+QI82eK4ms8EEJQ=
github.com/pion/stun v0.6.1 h1:8lp6YejULeHBF8NmV8e2787BogQhduZugh5PdhDyyN4=
@@ -760,8 +739,8 @@ github.com/pion/transport/v3 v3.0.7 h1:iRbMH05BzSNwhILHoBoAPxoB9xQgOaJk+591KC9P1
github.com/pion/transport/v3 v3.0.7/go.mod h1:YleKiTZ4vqNxVwh77Z0zytYi7rXHl7j6uPLGhhz9rwo=
github.com/pion/turn/v4 v4.0.0 h1:qxplo3Rxa9Yg1xXDxxH8xaqcyGUtbHYw4QSCvmFWvhM=
github.com/pion/turn/v4 v4.0.0/go.mod h1:MuPDkm15nYSklKpN8vWJ9W2M0PlyQZqYt1McGuxG7mA=
-github.com/pion/webrtc/v4 v4.0.10 h1:Hq/JLjhqLxi+NmCtE8lnRPDr8H4LcNvwg8OxVcdv56Q=
-github.com/pion/webrtc/v4 v4.0.10/go.mod h1:ViHLVaNpiuvaH8pdiuQxuA9awuE6KVzAXx3vVWilOck=
+github.com/pion/webrtc/v4 v4.0.14 h1:nyds/sFRR+HvmWoBa6wrL46sSfpArE0qR883MBW96lg=
+github.com/pion/webrtc/v4 v4.0.14/go.mod h1:R3+qTnQTS03UzwDarYecgioNf7DYgTsldxnCXB821Kk=
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
@@ -773,6 +752,8 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH
github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o=
github.com/polydawn/refmt v0.89.0 h1:ADJTApkvkeBZsN0tBTx8QjpD9JkmxbKp0cxfr9qszm4=
github.com/polydawn/refmt v0.89.0/go.mod h1:/zvteZs/GwLtCgZ4BL6CBsk9IKIlexP43ObX9AxTqTw=
+github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g=
+github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U=
github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
@@ -812,12 +793,10 @@ github.com/prometheus/statsd_exporter v0.27.1 h1:tcRJOmwlA83HPfWzosAgr2+zEN5XDFv
github.com/prometheus/statsd_exporter v0.27.1/go.mod h1:vA6ryDfsN7py/3JApEst6nLTJboq66XsNcJGNmC88NQ=
github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI=
github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg=
-github.com/quic-go/quic-go v0.50.1 h1:unsgjFIUqW8a2oopkY7YNONpV1gYND6Nt9hnt1PN94Q=
-github.com/quic-go/quic-go v0.50.1/go.mod h1:Vim6OmUvlYdwBhXP9ZVrtGmCMWa3wEqhq3NgYrI8b4E=
+github.com/quic-go/quic-go v0.52.0 h1:/SlHrCRElyaU6MaEPKqKr9z83sBg2v4FLLvWM+Z47pA=
+github.com/quic-go/quic-go v0.52.0/go.mod h1:MFlGGpcpJqRAfmYi6NC2cptDPSxRWTOGNuP4wqrWmzQ=
github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 h1:4WFk6u3sOT6pLa1kQ50ZVdm8BQFgJNA117cepZxtLIg=
github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66/go.mod h1:Vp72IJajgeOL6ddqrAhmp7IM9zbTcgkQxD/YdxrVwMw=
-github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk=
-github.com/raulk/go-watchdog v1.3.0/go.mod h1:fIvOnLbF0b0ZwkB9YU4mOW9Did//4vPZtDqv66NfsMU=
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis=
github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
@@ -859,7 +838,6 @@ github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5k
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
-github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/slok/go-http-metrics v0.13.0 h1:lQDyJJx9wKhmbliyUsZ2l6peGnXRHjsjoqPt5VYzcP8=
github.com/slok/go-http-metrics v0.13.0/go.mod h1:HIr7t/HbN2sJaunvnt9wKP9xoBBVZFo1/KiHU3b0w+4=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
@@ -924,7 +902,6 @@ github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9
github.com/ucarion/urlpath v0.0.0-20200424170820-7ccc79b76bbb h1:Ywfo8sUltxogBpFuMOFRrrSifO788kAFxmvVw31PtQQ=
github.com/ucarion/urlpath v0.0.0-20200424170820-7ccc79b76bbb/go.mod h1:ikPs9bRWicNw3S7XpJ8sK/smGwU9WcSVU3dy9qahYBM=
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
-github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU=
github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM=
@@ -1013,14 +990,16 @@ go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
+go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
+go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8=
go.uber.org/dig v1.18.0 h1:imUL1UiY0Mg4bqbFfsRQO5G4CGRBec/ZujWTvSVp3pw=
go.uber.org/dig v1.18.0/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE=
go.uber.org/fx v1.23.0 h1:lIr/gYWQGfTwGcSXWXu4vP5Ws6iqnNEIY+F/aFzCKTg=
go.uber.org/fx v1.23.0/go.mod h1:o/D9n+2mLP6v1EG+qsdT1O8wKopYAsqZasju97SDFCU=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
-go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU=
-go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM=
+go.uber.org/mock v0.5.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko=
+go.uber.org/mock v0.5.2/go.mod h1:wLlUxC2vVTPTaE3UD51E0BGOAElKrILxhVSDYQLld5o=
go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
@@ -1174,7 +1153,6 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=
golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
-golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1205,7 +1183,6 @@ golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -1237,7 +1214,6 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@@ -1273,8 +1249,8 @@ golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxb
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U=
-golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
+golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0=
+golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index d5a6e34fd..89078bc51 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -113,7 +113,7 @@ require (
github.com/golangci/unconvert v0.0.0-20240309020433-c5143eacb3ed // indirect
github.com/google/go-cmp v0.7.0 // indirect
github.com/google/gopacket v1.1.19 // indirect
- github.com/google/pprof v0.0.0-20250208200701-d0013a598941 // indirect
+ github.com/google/pprof v0.0.0-20250501235452-c0086092b71a // indirect
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/gordonklaus/ineffassign v0.1.0 // indirect
@@ -140,7 +140,7 @@ require (
github.com/ipfs/kubo v0.31.0 // indirect
github.com/ipld/go-codec-dagpb v1.7.0 // indirect
github.com/ipld/go-ipld-prime v0.21.0 // indirect
- github.com/ipshipyard/p2p-forge v0.5.1 // indirect
+ github.com/ipshipyard/p2p-forge v0.5.2-0.20250616211529-2c25ee655b22 // indirect
github.com/jackpal/go-nat-pmp v1.0.2 // indirect
github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect
github.com/jgautheron/goconst v1.7.1 // indirect
@@ -167,7 +167,7 @@ require (
github.com/libp2p/go-buffer-pool v0.1.0 // indirect
github.com/libp2p/go-cidranger v1.1.0 // indirect
github.com/libp2p/go-flow-metrics v0.2.0 // indirect
- github.com/libp2p/go-libp2p v0.41.1 // indirect
+ github.com/libp2p/go-libp2p v0.42.0-alpha-2 // indirect
github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect
github.com/libp2p/go-libp2p-kad-dht v0.33.1 // indirect
github.com/libp2p/go-libp2p-kbucket v0.7.0 // indirect
@@ -208,7 +208,7 @@ require (
github.com/nishanths/predeclared v0.2.2 // indirect
github.com/nunnatsa/ginkgolinter v0.16.2 // indirect
github.com/olekukonko/tablewriter v0.0.5 // indirect
- github.com/onsi/ginkgo/v2 v2.22.2 // indirect
+ github.com/onsi/ginkgo/v2 v2.23.4 // indirect
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
github.com/pion/datachannel v1.5.10 // indirect
@@ -220,16 +220,16 @@ require (
github.com/pion/mdns/v2 v2.0.7 // indirect
github.com/pion/randutil v0.1.0 // indirect
github.com/pion/rtcp v1.2.15 // indirect
- github.com/pion/rtp v1.8.11 // indirect
+ github.com/pion/rtp v1.8.13 // indirect
github.com/pion/sctp v1.8.37 // indirect
- github.com/pion/sdp/v3 v3.0.10 // indirect
+ github.com/pion/sdp/v3 v3.0.11 // indirect
github.com/pion/srtp/v3 v3.0.4 // indirect
github.com/pion/stun v0.6.1 // indirect
github.com/pion/stun/v3 v3.0.0 // indirect
github.com/pion/transport/v2 v2.2.10 // indirect
github.com/pion/transport/v3 v3.0.7 // indirect
github.com/pion/turn/v4 v4.0.0 // indirect
- github.com/pion/webrtc/v4 v4.0.10 // indirect
+ github.com/pion/webrtc/v4 v4.0.14 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/polydawn/refmt v0.89.0 // indirect
@@ -244,7 +244,7 @@ require (
github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 // indirect
github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 // indirect
github.com/quic-go/qpack v0.5.1 // indirect
- github.com/quic-go/quic-go v0.50.1 // indirect
+ github.com/quic-go/quic-go v0.52.0 // indirect
github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 // indirect
github.com/rivo/uniseg v0.4.7 // indirect
github.com/rogpeppe/go-internal v1.13.1 // indirect
@@ -303,10 +303,10 @@ require (
go.opentelemetry.io/otel v1.35.0 // indirect
go.opentelemetry.io/otel/metric v1.35.0 // indirect
go.opentelemetry.io/otel/trace v1.35.0 // indirect
- go.uber.org/automaxprocs v1.5.3 // indirect
+ go.uber.org/automaxprocs v1.6.0 // indirect
go.uber.org/dig v1.18.0 // indirect
go.uber.org/fx v1.23.0 // indirect
- go.uber.org/mock v0.5.0 // indirect
+ go.uber.org/mock v0.5.2 // indirect
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.27.0 // indirect
go.uber.org/zap/exp v0.3.0 // indirect
@@ -319,6 +319,7 @@ require (
golang.org/x/sys v0.33.0 // indirect
golang.org/x/term v0.32.0 // indirect
golang.org/x/text v0.25.0 // indirect
+ golang.org/x/time v0.11.0 // indirect
golang.org/x/tools v0.33.0 // indirect
gonum.org/v1/gonum v0.16.0 // indirect
google.golang.org/protobuf v1.36.6 // indirect
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index a2fa489a5..6d79c2c08 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -120,12 +120,7 @@ github.com/cockroachdb/swiss v0.0.0-20250327203710-2932b022f6df h1:GUJ4KuZtbOcIf
github.com/cockroachdb/swiss v0.0.0-20250327203710-2932b022f6df/go.mod h1:yBRu/cnL4ks9bgy4vAASdjIW+/xMlFwuHKqtmh3GZQg=
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo=
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ=
-github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM=
-github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw=
-github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d h1:t5Wuyh53qYyg9eqn4BbnlIT+vmhyww0TatL+zT3uWgI=
github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
-github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs=
-github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/cpuguy83/go-md2man/v2 v2.0.5 h1:ZtcqGrnekaHpVLArFSe4HK5DoKx1T0rq2DwVB0alcyc=
@@ -153,11 +148,7 @@ github.com/denis-tingaikin/go-header v0.5.0 h1:SRdnP5ZKvcO9KKRP1KJrhFR3RrlGuD+42
github.com/denis-tingaikin/go-header v0.5.0/go.mod h1:mMenU5bWrok6Wl2UsZjy+1okegmwQ3UgWl4V1D8gjlY=
github.com/dnephin/pflag v1.0.7 h1:oxONGlWxhmUct0YzKTgrpQv9AUA1wtPBn7zuSjJqptk=
github.com/dnephin/pflag v1.0.7/go.mod h1:uxE91IoWURlOiTUIA8Mq5ZZkAv3dPUfZNaT80Zm7OQE=
-github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
-github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
-github.com/elastic/gosigar v0.14.3 h1:xwkKwPia+hSfg9GqrCUKYdId102m9qTJIIr7egmK/uo=
-github.com/elastic/gosigar v0.14.3/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs=
github.com/ettle/strcase v0.2.0 h1:fGNiVF21fHXpX1niBgk0aROov1LagYsOwV/xqKDKR/Q=
github.com/ettle/strcase v0.2.0/go.mod h1:DajmHElDSaX76ITe3/VHVyMin4LWSJN5Z909Wp+ED1A=
github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5 h1:BBso6MBKW8ncyZLv37o+KNyy0HrrHgfnOaGQC2qvN+A=
@@ -236,8 +227,6 @@ github.com/go-xmlfmt/xmlfmt v1.1.2/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6C
github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0=
github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
-github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
-github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E=
github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeHCoD0=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
@@ -284,8 +273,8 @@ github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF
github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo=
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
-github.com/google/pprof v0.0.0-20250208200701-d0013a598941 h1:43XjGa6toxLpeksjcxs1jIoIyr+vUfOqY2c6HB4bpoc=
-github.com/google/pprof v0.0.0-20250208200701-d0013a598941/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
+github.com/google/pprof v0.0.0-20250501235452-c0086092b71a h1:rDA3FfmxwXR+BVKKdz55WwMJ1pD2hJQNW31d+l3mPk4=
+github.com/google/pprof v0.0.0-20250501235452-c0086092b71a/go.mod h1:5hDyRhoBCxViHszMt12TnOpEI4VVi+U8Gm9iphldiMA=
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
@@ -370,8 +359,8 @@ github.com/ipld/go-codec-dagpb v1.7.0 h1:hpuvQjCSVSLnTnHXn+QAMR0mLmb1gA6wl10LExo
github.com/ipld/go-codec-dagpb v1.7.0/go.mod h1:rD3Zg+zub9ZnxcLwfol/OTQRVjaLzXypgy4UqHQvilM=
github.com/ipld/go-ipld-prime v0.21.0 h1:n4JmcpOlPDIxBcY037SVfpd1G+Sj1nKZah0m6QH9C2E=
github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOanyMctpPjsvxQ=
-github.com/ipshipyard/p2p-forge v0.5.1 h1:9MCpAlk+wNhy7W/yOYKgi9KlXPnyb0abmDpsRPHUDxQ=
-github.com/ipshipyard/p2p-forge v0.5.1/go.mod h1:GNDXM2CR8KRS8mJGw7ARIRVlrG9NH8MdewgNVfIIByA=
+github.com/ipshipyard/p2p-forge v0.5.2-0.20250616211529-2c25ee655b22 h1:J9UVOPm9gSOKM9BurRyHLRVpG5d5TPsYaSwZe1iTNqQ=
+github.com/ipshipyard/p2p-forge v0.5.2-0.20250616211529-2c25ee655b22/go.mod h1:eCkvoEuBwYJpPjMaBtVwLuIU9dzMWiO2hej3zfpbu+4=
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
github.com/jbenet/go-temp-err-catcher v0.1.0 h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABoLk/+KKHggpk=
@@ -436,8 +425,8 @@ github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38y
github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic=
github.com/libp2p/go-flow-metrics v0.2.0 h1:EIZzjmeOE6c8Dav0sNv35vhZxATIXWZg6j/C08XmmDw=
github.com/libp2p/go-flow-metrics v0.2.0/go.mod h1:st3qqfu8+pMfh+9Mzqb2GTiwrAGjIPszEjZmtksN8Jc=
-github.com/libp2p/go-libp2p v0.41.1 h1:8ecNQVT5ev/jqALTvisSJeVNvXYJyK4NhQx1nNRXQZE=
-github.com/libp2p/go-libp2p v0.41.1/go.mod h1:DcGTovJzQl/I7HMrby5ZRjeD0kQkGiy+9w6aEkSZpRI=
+github.com/libp2p/go-libp2p v0.42.0-alpha-2 h1:/YdRlrtb/kNge0MszF8mMgO9tEaPBvD1ZGubYaliaBY=
+github.com/libp2p/go-libp2p v0.42.0-alpha-2/go.mod h1:tp7K6LUZDruO2li9fK9cnQAGN8o3yTb8FwUd5AdKv+k=
github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94=
github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8=
github.com/libp2p/go-libp2p-kad-dht v0.33.1 h1:hKFhHMf7WH69LDjaxsJUWOU6qZm71uO47M/a5ijkiP0=
@@ -551,12 +540,10 @@ github.com/nunnatsa/ginkgolinter v0.16.2 h1:8iLqHIZvN4fTLDC0Ke9tbSZVcyVHoBs0HIbn
github.com/nunnatsa/ginkgolinter v0.16.2/go.mod h1:4tWRinDN1FeJgU+iJANW/kz7xKN5nYRAOfJDQUS9dOQ=
github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
-github.com/onsi/ginkgo/v2 v2.22.2 h1:/3X8Panh8/WwhU/3Ssa6rCKqPLuAkVY2I0RoyDLySlU=
-github.com/onsi/ginkgo/v2 v2.22.2/go.mod h1:oeMosUL+8LtarXBHu/c0bx2D/K9zyQ6uX3cTyztHwsk=
-github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8=
-github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY=
-github.com/opencontainers/runtime-spec v1.2.0 h1:z97+pHb3uELt/yiAWD691HNHQIF07bE7dzrbT927iTk=
-github.com/opencontainers/runtime-spec v1.2.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
+github.com/onsi/ginkgo/v2 v2.23.4 h1:ktYTpKJAVZnDT4VjxSbiBenUjmlL/5QkBEocaWXiQus=
+github.com/onsi/ginkgo/v2 v2.23.4/go.mod h1:Bt66ApGPBFzHyR+JO10Zbt0Gsp4uWxu5mIOTusL46e8=
+github.com/onsi/gomega v1.36.3 h1:hID7cr8t3Wp26+cYnfcjR6HpJ00fdogN6dqZ1t6IylU=
+github.com/onsi/gomega v1.36.3/go.mod h1:8D9+Txp43QWKhM24yyOBEdpkzN8FvJyAwecBgsU4KU0=
github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8=
github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw=
github.com/otiai10/copy v1.14.0 h1:dCI/t1iTdYGtkvCuBG2BgR6KZa83PTclw4U5n2wAllU=
@@ -591,12 +578,12 @@ github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA=
github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8=
github.com/pion/rtcp v1.2.15 h1:LZQi2JbdipLOj4eBjK4wlVoQWfrZbh3Q6eHtWtJBZBo=
github.com/pion/rtcp v1.2.15/go.mod h1:jlGuAjHMEXwMUHK78RgX0UmEJFV4zUKOFHR7OP+D3D0=
-github.com/pion/rtp v1.8.11 h1:17xjnY5WO5hgO6SD3/NTIUPvSFw/PbLsIJyz1r1yNIk=
-github.com/pion/rtp v1.8.11/go.mod h1:8uMBJj32Pa1wwx8Fuv/AsFhn8jsgw+3rUC2PfoBZ8p4=
+github.com/pion/rtp v1.8.13 h1:8uSUPpjSL4OlwZI8Ygqu7+h2p9NPFB+yAZ461Xn5sNg=
+github.com/pion/rtp v1.8.13/go.mod h1:8uMBJj32Pa1wwx8Fuv/AsFhn8jsgw+3rUC2PfoBZ8p4=
github.com/pion/sctp v1.8.37 h1:ZDmGPtRPX9mKCiVXtMbTWybFw3z/hVKAZgU81wcOrqs=
github.com/pion/sctp v1.8.37/go.mod h1:cNiLdchXra8fHQwmIoqw0MbLLMs+f7uQ+dGMG2gWebE=
-github.com/pion/sdp/v3 v3.0.10 h1:6MChLE/1xYB+CjumMw+gZ9ufp2DPApuVSnDT8t5MIgA=
-github.com/pion/sdp/v3 v3.0.10/go.mod h1:88GMahN5xnScv1hIMTqLdu/cOcUkj6a9ytbncwMCq2E=
+github.com/pion/sdp/v3 v3.0.11 h1:VhgVSopdsBKwhCFoyyPmT1fKMeV9nLMrEKxNOdy3IVI=
+github.com/pion/sdp/v3 v3.0.11/go.mod h1:88GMahN5xnScv1hIMTqLdu/cOcUkj6a9ytbncwMCq2E=
github.com/pion/srtp/v3 v3.0.4 h1:2Z6vDVxzrX3UHEgrUyIGM4rRouoC7v+NiF1IHtp9B5M=
github.com/pion/srtp/v3 v3.0.4/go.mod h1:1Jx3FwDoxpRaTh1oRV8A/6G1BnFL+QI82eK4ms8EEJQ=
github.com/pion/stun v0.6.1 h1:8lp6YejULeHBF8NmV8e2787BogQhduZugh5PdhDyyN4=
@@ -611,8 +598,8 @@ github.com/pion/transport/v3 v3.0.7 h1:iRbMH05BzSNwhILHoBoAPxoB9xQgOaJk+591KC9P1
github.com/pion/transport/v3 v3.0.7/go.mod h1:YleKiTZ4vqNxVwh77Z0zytYi7rXHl7j6uPLGhhz9rwo=
github.com/pion/turn/v4 v4.0.0 h1:qxplo3Rxa9Yg1xXDxxH8xaqcyGUtbHYw4QSCvmFWvhM=
github.com/pion/turn/v4 v4.0.0/go.mod h1:MuPDkm15nYSklKpN8vWJ9W2M0PlyQZqYt1McGuxG7mA=
-github.com/pion/webrtc/v4 v4.0.10 h1:Hq/JLjhqLxi+NmCtE8lnRPDr8H4LcNvwg8OxVcdv56Q=
-github.com/pion/webrtc/v4 v4.0.10/go.mod h1:ViHLVaNpiuvaH8pdiuQxuA9awuE6KVzAXx3vVWilOck=
+github.com/pion/webrtc/v4 v4.0.14 h1:nyds/sFRR+HvmWoBa6wrL46sSfpArE0qR883MBW96lg=
+github.com/pion/webrtc/v4 v4.0.14/go.mod h1:R3+qTnQTS03UzwDarYecgioNf7DYgTsldxnCXB821Kk=
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
@@ -650,12 +637,10 @@ github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 h1:M8mH9eK4OUR4l
github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ=
github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI=
github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg=
-github.com/quic-go/quic-go v0.50.1 h1:unsgjFIUqW8a2oopkY7YNONpV1gYND6Nt9hnt1PN94Q=
-github.com/quic-go/quic-go v0.50.1/go.mod h1:Vim6OmUvlYdwBhXP9ZVrtGmCMWa3wEqhq3NgYrI8b4E=
+github.com/quic-go/quic-go v0.52.0 h1:/SlHrCRElyaU6MaEPKqKr9z83sBg2v4FLLvWM+Z47pA=
+github.com/quic-go/quic-go v0.52.0/go.mod h1:MFlGGpcpJqRAfmYi6NC2cptDPSxRWTOGNuP4wqrWmzQ=
github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 h1:4WFk6u3sOT6pLa1kQ50ZVdm8BQFgJNA117cepZxtLIg=
github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66/go.mod h1:Vp72IJajgeOL6ddqrAhmp7IM9zbTcgkQxD/YdxrVwMw=
-github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk=
-github.com/raulk/go-watchdog v1.3.0/go.mod h1:fIvOnLbF0b0ZwkB9YU4mOW9Did//4vPZtDqv66NfsMU=
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
@@ -845,16 +830,16 @@ go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/
go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE=
go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs=
go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc=
-go.uber.org/automaxprocs v1.5.3 h1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8=
-go.uber.org/automaxprocs v1.5.3/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0=
+go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
+go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8=
go.uber.org/dig v1.18.0 h1:imUL1UiY0Mg4bqbFfsRQO5G4CGRBec/ZujWTvSVp3pw=
go.uber.org/dig v1.18.0/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE=
go.uber.org/fx v1.23.0 h1:lIr/gYWQGfTwGcSXWXu4vP5Ws6iqnNEIY+F/aFzCKTg=
go.uber.org/fx v1.23.0/go.mod h1:o/D9n+2mLP6v1EG+qsdT1O8wKopYAsqZasju97SDFCU=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
-go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU=
-go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM=
+go.uber.org/mock v0.5.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko=
+go.uber.org/mock v0.5.2/go.mod h1:wLlUxC2vVTPTaE3UD51E0BGOAElKrILxhVSDYQLld5o=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
@@ -1041,8 +1026,8 @@ golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4=
golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA=
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U=
-golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
+golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0=
+golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
diff --git a/test/integration/wan_lan_dht_test.go b/test/integration/wan_lan_dht_test.go
index 7c70aa98f..57f4bf1ac 100644
--- a/test/integration/wan_lan_dht_test.go
+++ b/test/integration/wan_lan_dht_test.go
@@ -17,7 +17,6 @@ import (
testutil "github.com/libp2p/go-libp2p-testing/net"
corenet "github.com/libp2p/go-libp2p/core/network"
- "github.com/libp2p/go-libp2p/core/peerstore"
mocknet "github.com/libp2p/go-libp2p/p2p/net/mock"
ma "github.com/multiformats/go-multiaddr"
@@ -105,7 +104,7 @@ func RunDHTConnectivity(conf testutil.LatencyConfig, numPeers int) error {
}
defer wanPeer.Close()
wanAddr := makeAddr(uint32(i), true)
- wanPeer.Peerstore.AddAddr(wanPeer.Identity, wanAddr, peerstore.PermanentAddrTTL)
+ _ = wanPeer.PeerHost.Network().Listen(wanAddr)
for _, p := range wanPeers {
_, _ = mn.LinkPeers(p.Identity, wanPeer.Identity)
_ = wanPeer.PeerHost.Connect(connectionContext, p.Peerstore.PeerInfo(p.Identity))
@@ -121,7 +120,7 @@ func RunDHTConnectivity(conf testutil.LatencyConfig, numPeers int) error {
}
defer lanPeer.Close()
lanAddr := makeAddr(uint32(i), false)
- lanPeer.Peerstore.AddAddr(lanPeer.Identity, lanAddr, peerstore.PermanentAddrTTL)
+ _ = lanPeer.PeerHost.Network().Listen(lanAddr)
for _, p := range lanPeers {
_, _ = mn.LinkPeers(p.Identity, lanPeer.Identity)
_ = lanPeer.PeerHost.Connect(connectionContext, p.Peerstore.PeerInfo(p.Identity))
@@ -132,10 +131,9 @@ func RunDHTConnectivity(conf testutil.LatencyConfig, numPeers int) error {
// Add interfaces / addresses to test peer.
wanAddr := makeAddr(0, true)
- testPeer.Peerstore.AddAddr(testPeer.Identity, wanAddr, peerstore.PermanentAddrTTL)
+ _ = testPeer.PeerHost.Network().Listen(wanAddr)
lanAddr := makeAddr(0, false)
- testPeer.Peerstore.AddAddr(testPeer.Identity, lanAddr, peerstore.PermanentAddrTTL)
-
+ _ = testPeer.PeerHost.Network().Listen(lanAddr)
// The test peer is connected to one lan peer.
for _, p := range lanPeers {
if _, err := mn.LinkPeers(testPeer.Identity, p.Identity); err != nil {
From b45ed8a3d7449a3c9f1e4d4f4e4da623b2a66ff9 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Tue, 17 Jun 2025 01:48:46 +0200
Subject: [PATCH 260/499] feat: HTTP retrieval enabled by default (#10836)
---
config/http_retrieval.go | 2 +-
docs/changelogs/v0.36.md | 7 +++++++
docs/config.md | 19 ++++++++++---------
.../t0119-prometheus-data/prometheus_metrics | 16 ++++++++++++++++
4 files changed, 34 insertions(+), 10 deletions(-)
diff --git a/config/http_retrieval.go b/config/http_retrieval.go
index a058e26c4..b7e9dbd5d 100644
--- a/config/http_retrieval.go
+++ b/config/http_retrieval.go
@@ -12,7 +12,7 @@ type HTTPRetrieval struct {
}
const (
- DefaultHTTPRetrievalEnabled = false // opt-in for now, until we figure out https://github.com/ipfs/specs/issues/496
+ DefaultHTTPRetrievalEnabled = true
DefaultHTTPRetrievalNumWorkers = 16
DefaultHTTPRetrievalTLSInsecureSkipVerify = false // only for testing with self-signed HTTPS certs
DefaultHTTPRetrievalMaxBlockSize = "2MiB" // matching bitswap: https://specs.ipfs.tech/bitswap-protocol/#block-sizes
diff --git a/docs/changelogs/v0.36.md b/docs/changelogs/v0.36.md
index 6d5aad0b8..505970c67 100644
--- a/docs/changelogs/v0.36.md
+++ b/docs/changelogs/v0.36.md
@@ -11,6 +11,7 @@ This release was brought to you by the [Shipyard](http://ipshipyard.com/) team.
- [Overview](#overview)
- [๐ฆ Highlights](#-highlights)
+ - [HTTP Retrieval client enabled by default](#http-retrieval-client-enabled-by-default)
- [Update go-log to v2](#update-go-log-to-v2)
- [AutoNATv2 Client](#autonatv2-client)
- [Smarter AutoTLS registration](#smarter-autotls-registration)
@@ -24,6 +25,12 @@ This release was brought to you by the [Shipyard](http://ipshipyard.com/) team.
### ๐ฆ Highlights
+#### HTTP Retrieval client enabled by default
+
+This release promotes the HTTP Retrieval client from an experimental feature to a standard feature that is enabled by default. When possible, Kubo will be retrieving blocks over plain HTTPS (HTTP/2) without any extra user configuration.
+
+See [`HTTPRetrieval`](https://github.com/ipfs/kubo/blob/master/docs/config.md#httpretrieval) for more details.
+
#### Update go-log to v2
go-log v2 has been out for quite a while now and it is time to deprecate v1.
diff --git a/docs/config.md b/docs/config.md
index b176f9b5b..b2563d372 100644
--- a/docs/config.md
+++ b/docs/config.md
@@ -2686,25 +2686,26 @@ Type: `object`
### `HTTPRetrieval.Enabled`
-> [!CAUTION]
-> This feature is **EXPERIMENTAL** and may change in future release. Enable with caution, and provide feedback via GitHub issues.
-
Controls whether HTTP-based block retrieval is enabled.
-When enabled, Kubo will be able to act on `/tls/http` (HTTP/2) providers ([Trustless HTTP Gateways](https://specs.ipfs.tech/http-gateways/trustless-gateway/)) returned by the [`Routing.DelegatedRouters`](#routingdelegatedrouters)
+When enabled, Kubo will act on `/tls/http` (HTTP/2) providers ([Trustless HTTP Gateways](https://specs.ipfs.tech/http-gateways/trustless-gateway/)) returned by the [`Routing.DelegatedRouters`](#routingdelegatedrouters)
to perform pure HTTP [block retrievals](https://specs.ipfs.tech/http-gateways/trustless-gateway/#block-responses-application-vnd-ipld-raw)
-in addition to [Bitswap over Libp2p](#bitswap).
+(`/ipfs/cid?format=raw`, `Accept: application/vnd.ipld.raw`)
+alongside [Bitswap over Libp2p](#bitswap).
-HTTP requests for `application/vnd.ipld.raw` will be issued instead of Bitswap if a peer has a `/tls/http` multiaddr
+HTTP requests for `application/vnd.ipld.raw` will be made instead of Bitswap when a peer has a `/tls/http` multiaddr
and the HTTPS server returns HTTP 200 for the [probe path](https://specs.ipfs.tech/http-gateways/trustless-gateway/#dedicated-probe-paths).
> [!IMPORTANT]
-> - Requires TLS and HTTP/2.
+> This feature is relatively new. Please report any issues via [Github](https://github.com/ipfs/kubo/issues/new).
+>
+> Important notes:
+> - TLS and HTTP/2 are required. For privacy reasons, and to maintain feature-parity with browsers, unencrypted `http://` providers are ignored and not used.
> - This feature works in the same way as Bitswap: connected HTTP-peers receive optimistic block requests even for content that they are not announcing.
-> - HTTP client does not follow redirects. Providers should keep announcements up to date.
+> - For performance reasons, and to avoid loops, the HTTP client does not follow redirects. Providers should keep announcements up to date.
> - IPFS ecosystem is working towards [supporting HTTP providers on Amino DHT](https://github.com/ipfs/specs/issues/496). Currently, HTTP providers are mostly limited to results from [`Routing.DelegatedRouters`](#routingdelegatedrouters) endpoints and requires `Routing.Type=auto|autoclient`.
-Default: `false`
+Default: `true`
Type: `flag`
diff --git a/test/sharness/t0119-prometheus-data/prometheus_metrics b/test/sharness/t0119-prometheus-data/prometheus_metrics
index d0900322b..6cf2c95f1 100644
--- a/test/sharness/t0119-prometheus-data/prometheus_metrics
+++ b/test/sharness/t0119-prometheus-data/prometheus_metrics
@@ -7,6 +7,22 @@ exchange_bitswap_wantlists_seconds_bucket
exchange_bitswap_wantlists_seconds_count
exchange_bitswap_wantlists_seconds_sum
exchange_bitswap_wantlists_total
+exchange_httpnet_request_duration_seconds_bucket
+exchange_httpnet_request_duration_seconds_count
+exchange_httpnet_request_duration_seconds_sum
+exchange_httpnet_request_sent_bytes
+exchange_httpnet_requests_body_failure
+exchange_httpnet_requests_failure
+exchange_httpnet_requests_in_flight
+exchange_httpnet_requests_total
+exchange_httpnet_response_bytes_bucket
+exchange_httpnet_response_bytes_count
+exchange_httpnet_response_bytes_sum
+exchange_httpnet_wantlists_items_total
+exchange_httpnet_wantlists_seconds_bucket
+exchange_httpnet_wantlists_seconds_count
+exchange_httpnet_wantlists_seconds_sum
+exchange_httpnet_wantlists_total
go_gc_duration_seconds
go_gc_duration_seconds_count
go_gc_duration_seconds_sum
From 20566bc815d3bcd32d70495c9d0f2372f32bce7f Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Tue, 17 Jun 2025 03:20:54 -0700
Subject: [PATCH 261/499] Upgrade to Boxo v0.32.0 (#10839)
Upgrade to Boxo v0.32.0
* fix codecs sharness test
* fix sharness for new metrics
---
docs/changelogs/v0.36.md | 2 +-
docs/examples/kubo-as-a-library/go.mod | 22 +++++-----
docs/examples/kubo-as-a-library/go.sum | 44 +++++++++----------
go.mod | 22 +++++-----
go.sum | 44 +++++++++----------
test/dependencies/go.mod | 22 +++++-----
test/dependencies/go.sum | 44 +++++++++----------
.../t0119-prometheus-data/prometheus_metrics | 5 +++
test/sharness/t0290-cid.sh | 5 ++-
9 files changed, 108 insertions(+), 102 deletions(-)
diff --git a/docs/changelogs/v0.36.md b/docs/changelogs/v0.36.md
index 505970c67..924e8dce1 100644
--- a/docs/changelogs/v0.36.md
+++ b/docs/changelogs/v0.36.md
@@ -59,7 +59,7 @@ The `filestore` command has a new option, `--remove-bad-blocks`, to verify objec
#### ๐ฆ๏ธ Important dependency updates
- update `go-libp2p-kad-dht` to [v0.33.0](https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.33.0)
-- update `boxo` to [v0.31.0](https://github.com/ipfs/boxo/releases/tag/v0.31.0)
+- update `boxo` to [v0.32.0](https://github.com/ipfs/boxo/releases/tag/v0.32.0)
- update `gateway-conformance` to [v0.8](https://github.com/ipfs/gateway-conformance/releases/tag/v0.8.0)
### ๐ Changelog
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index 261343252..a6b888485 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -7,10 +7,10 @@ go 1.24
replace github.com/ipfs/kubo => ./../../..
require (
- github.com/ipfs/boxo v0.31.1-0.20250528182950-f87feb50c39c
+ github.com/ipfs/boxo v0.32.0
github.com/ipfs/kubo v0.0.0-00010101000000-000000000000
github.com/libp2p/go-libp2p v0.42.0-alpha-2
- github.com/multiformats/go-multiaddr v0.15.0
+ github.com/multiformats/go-multiaddr v0.16.0
)
require (
@@ -138,9 +138,9 @@ require (
github.com/multiformats/go-multiaddr-dns v0.4.1 // indirect
github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect
github.com/multiformats/go-multibase v0.2.0 // indirect
- github.com/multiformats/go-multicodec v0.9.0 // indirect
+ github.com/multiformats/go-multicodec v0.9.1 // indirect
github.com/multiformats/go-multihash v0.2.3 // indirect
- github.com/multiformats/go-multistream v0.6.0 // indirect
+ github.com/multiformats/go-multistream v0.6.1 // indirect
github.com/multiformats/go-varint v0.0.7 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/onsi/ginkgo/v2 v2.23.4 // indirect
@@ -210,15 +210,15 @@ require (
go.uber.org/zap v1.27.0 // indirect
go.uber.org/zap/exp v0.3.0 // indirect
go4.org v0.0.0-20230225012048-214862532bf5 // indirect
- golang.org/x/crypto v0.38.0 // indirect
- golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect
- golang.org/x/mod v0.24.0 // indirect
- golang.org/x/net v0.40.0 // indirect
- golang.org/x/sync v0.14.0 // indirect
+ golang.org/x/crypto v0.39.0 // indirect
+ golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476 // indirect
+ golang.org/x/mod v0.25.0 // indirect
+ golang.org/x/net v0.41.0 // indirect
+ golang.org/x/sync v0.15.0 // indirect
golang.org/x/sys v0.33.0 // indirect
- golang.org/x/text v0.25.0 // indirect
+ golang.org/x/text v0.26.0 // indirect
golang.org/x/time v0.11.0 // indirect
- golang.org/x/tools v0.33.0 // indirect
+ golang.org/x/tools v0.34.0 // indirect
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
gonum.org/v1/gonum v0.16.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20241007155032-5fefd90f89a9 // indirect
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index 083bbd42a..1bfe46b1a 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -289,8 +289,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcd
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.31.1-0.20250528182950-f87feb50c39c h1:0jAFJxC74Gy0VwDG6WwYJq0yZdXOFIIeCwUXXln0w6A=
-github.com/ipfs/boxo v0.31.1-0.20250528182950-f87feb50c39c/go.mod h1:gEkUkBiZWtEjHd1AiUxaWEYaQApPtbeGF45fdfCwLX0=
+github.com/ipfs/boxo v0.32.0 h1:rBs3P53Wt9bFW9WJwVdkzLtzYCXAj2bMjM7+1nrazZw=
+github.com/ipfs/boxo v0.32.0/go.mod h1:VEtO3gOmr+sXGodalaTV9Vvsp3qVYegc4Rcu08Iw+wM=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk=
@@ -514,8 +514,8 @@ github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a
github.com/multiformats/go-multiaddr v0.1.0/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44=
github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo=
github.com/multiformats/go-multiaddr v0.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4=
-github.com/multiformats/go-multiaddr v0.15.0 h1:zB/HeaI/apcZiTDwhY5YqMvNVl/oQYvs3XySU+qeAVo=
-github.com/multiformats/go-multiaddr v0.15.0/go.mod h1:JSVUmXDjsVFiW7RjIFMP7+Ev+h1DTbiJgVeTV/tcmP0=
+github.com/multiformats/go-multiaddr v0.16.0 h1:oGWEVKioVQcdIOBlYM8BH1rZDWOGJSqr9/BKl6zQ4qc=
+github.com/multiformats/go-multiaddr v0.16.0/go.mod h1:JSVUmXDjsVFiW7RjIFMP7+Ev+h1DTbiJgVeTV/tcmP0=
github.com/multiformats/go-multiaddr-dns v0.4.1 h1:whi/uCLbDS3mSEUMb1MsoT4uzUeZB0N32yzufqS0i5M=
github.com/multiformats/go-multiaddr-dns v0.4.1/go.mod h1:7hfthtB4E4pQwirrz+J0CcDUfbWzTqEzVyYKKIKpgkc=
github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E=
@@ -525,8 +525,8 @@ github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/g
github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc=
github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g=
github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk=
-github.com/multiformats/go-multicodec v0.9.0 h1:pb/dlPnzee/Sxv/j4PmkDRxCOi3hXTz3IbPKOXWJkmg=
-github.com/multiformats/go-multicodec v0.9.0/go.mod h1:L3QTQvMIaVBkXOXXtVmYE+LI16i14xuaojr/H7Ai54k=
+github.com/multiformats/go-multicodec v0.9.1 h1:x/Fuxr7ZuR4jJV4Os5g444F7xC4XmyUaT/FWtE+9Zjo=
+github.com/multiformats/go-multicodec v0.9.1/go.mod h1:LLWNMtyV5ithSBUo3vFIMaeDy+h3EbkMTek1m+Fybbo=
github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U=
github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew=
github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew=
@@ -535,8 +535,8 @@ github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUj
github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg=
github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U=
github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM=
-github.com/multiformats/go-multistream v0.6.0 h1:ZaHKbsL404720283o4c/IHQXiS6gb8qAN5EIJ4PN5EA=
-github.com/multiformats/go-multistream v0.6.0/go.mod h1:MOyoG5otO24cHIg8kf9QW2/NozURlkP/rvi2FQJyCPg=
+github.com/multiformats/go-multistream v0.6.1 h1:4aoX5v6T+yWmc2raBHsTvzmFhOI8WVOer28DeBBEYdQ=
+github.com/multiformats/go-multistream v0.6.1/go.mod h1:ksQf6kqHAb6zIsyw7Zm+gAuVo57Qbq84E27YlYqavqw=
github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE=
github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE=
github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE=
@@ -844,8 +844,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
-golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8=
-golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw=
+golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM=
+golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -854,8 +854,8 @@ golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE
golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
-golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=
-golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=
+golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476 h1:bsqhLWFR6G6xiQcb+JoGqdKdRU6WzPWmK8E0jxTjzo4=
+golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -878,8 +878,8 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
-golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU=
-golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=
+golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w=
+golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -915,8 +915,8 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
-golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY=
-golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds=
+golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=
+golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -935,8 +935,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=
-golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
+golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8=
+golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1004,8 +1004,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
-golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4=
-golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA=
+golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M=
+golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA=
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -1046,8 +1046,8 @@ golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4f
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
-golang.org/x/tools v0.33.0 h1:4qz2S3zmRxbGIhDIAgjxvFutSvH5EfnsYrRBj0UI0bc=
-golang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI=
+golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo=
+golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
diff --git a/go.mod b/go.mod
index 59b420373..155063595 100644
--- a/go.mod
+++ b/go.mod
@@ -21,7 +21,7 @@ require (
github.com/hashicorp/go-version v1.7.0
github.com/ipfs-shipyard/nopfs v0.0.14
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0
- github.com/ipfs/boxo v0.31.1-0.20250528182950-f87feb50c39c
+ github.com/ipfs/boxo v0.32.0
github.com/ipfs/go-block-format v0.2.1
github.com/ipfs/go-cid v0.5.0
github.com/ipfs/go-cidutil v0.1.0
@@ -62,10 +62,10 @@ require (
github.com/libp2p/go-libp2p-routing-helpers v0.7.5
github.com/libp2p/go-libp2p-testing v0.12.0
github.com/libp2p/go-socket-activation v0.1.1
- github.com/multiformats/go-multiaddr v0.15.0
+ github.com/multiformats/go-multiaddr v0.16.0
github.com/multiformats/go-multiaddr-dns v0.4.1
github.com/multiformats/go-multibase v0.2.0
- github.com/multiformats/go-multicodec v0.9.0
+ github.com/multiformats/go-multicodec v0.9.1
github.com/multiformats/go-multihash v0.2.3
github.com/opentracing/opentracing-go v1.2.0
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58
@@ -86,10 +86,10 @@ require (
go.uber.org/fx v1.23.0
go.uber.org/multierr v1.11.0
go.uber.org/zap v1.27.0
- golang.org/x/crypto v0.38.0
- golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6
- golang.org/x/mod v0.24.0
- golang.org/x/sync v0.14.0
+ golang.org/x/crypto v0.39.0
+ golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476
+ golang.org/x/mod v0.25.0
+ golang.org/x/sync v0.15.0
golang.org/x/sys v0.33.0
google.golang.org/protobuf v1.36.6
)
@@ -192,7 +192,7 @@ require (
github.com/multiformats/go-base32 v0.1.0 // indirect
github.com/multiformats/go-base36 v0.2.0 // indirect
github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect
- github.com/multiformats/go-multistream v0.6.0 // indirect
+ github.com/multiformats/go-multistream v0.6.1 // indirect
github.com/multiformats/go-varint v0.0.7 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/onsi/ginkgo/v2 v2.23.4 // indirect
@@ -261,12 +261,12 @@ require (
go.uber.org/mock v0.5.2 // indirect
go.uber.org/zap/exp v0.3.0 // indirect
go4.org v0.0.0-20230225012048-214862532bf5 // indirect
- golang.org/x/net v0.40.0 // indirect
+ golang.org/x/net v0.41.0 // indirect
golang.org/x/oauth2 v0.25.0 // indirect
golang.org/x/term v0.32.0 // indirect
- golang.org/x/text v0.25.0 // indirect
+ golang.org/x/text v0.26.0 // indirect
golang.org/x/time v0.11.0 // indirect
- golang.org/x/tools v0.33.0 // indirect
+ golang.org/x/tools v0.34.0 // indirect
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
gonum.org/v1/gonum v0.16.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20241007155032-5fefd90f89a9 // indirect
diff --git a/go.sum b/go.sum
index c8dc404a7..34be1f680 100644
--- a/go.sum
+++ b/go.sum
@@ -354,8 +354,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcd
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.31.1-0.20250528182950-f87feb50c39c h1:0jAFJxC74Gy0VwDG6WwYJq0yZdXOFIIeCwUXXln0w6A=
-github.com/ipfs/boxo v0.31.1-0.20250528182950-f87feb50c39c/go.mod h1:gEkUkBiZWtEjHd1AiUxaWEYaQApPtbeGF45fdfCwLX0=
+github.com/ipfs/boxo v0.32.0 h1:rBs3P53Wt9bFW9WJwVdkzLtzYCXAj2bMjM7+1nrazZw=
+github.com/ipfs/boxo v0.32.0/go.mod h1:VEtO3gOmr+sXGodalaTV9Vvsp3qVYegc4Rcu08Iw+wM=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-bitswap v0.11.0 h1:j1WVvhDX1yhG32NTC9xfxnqycqYIlhzEzLXG/cU1HyQ=
@@ -633,8 +633,8 @@ github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a
github.com/multiformats/go-multiaddr v0.1.0/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44=
github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo=
github.com/multiformats/go-multiaddr v0.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4=
-github.com/multiformats/go-multiaddr v0.15.0 h1:zB/HeaI/apcZiTDwhY5YqMvNVl/oQYvs3XySU+qeAVo=
-github.com/multiformats/go-multiaddr v0.15.0/go.mod h1:JSVUmXDjsVFiW7RjIFMP7+Ev+h1DTbiJgVeTV/tcmP0=
+github.com/multiformats/go-multiaddr v0.16.0 h1:oGWEVKioVQcdIOBlYM8BH1rZDWOGJSqr9/BKl6zQ4qc=
+github.com/multiformats/go-multiaddr v0.16.0/go.mod h1:JSVUmXDjsVFiW7RjIFMP7+Ev+h1DTbiJgVeTV/tcmP0=
github.com/multiformats/go-multiaddr-dns v0.4.1 h1:whi/uCLbDS3mSEUMb1MsoT4uzUeZB0N32yzufqS0i5M=
github.com/multiformats/go-multiaddr-dns v0.4.1/go.mod h1:7hfthtB4E4pQwirrz+J0CcDUfbWzTqEzVyYKKIKpgkc=
github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E=
@@ -644,8 +644,8 @@ github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/g
github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc=
github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g=
github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk=
-github.com/multiformats/go-multicodec v0.9.0 h1:pb/dlPnzee/Sxv/j4PmkDRxCOi3hXTz3IbPKOXWJkmg=
-github.com/multiformats/go-multicodec v0.9.0/go.mod h1:L3QTQvMIaVBkXOXXtVmYE+LI16i14xuaojr/H7Ai54k=
+github.com/multiformats/go-multicodec v0.9.1 h1:x/Fuxr7ZuR4jJV4Os5g444F7xC4XmyUaT/FWtE+9Zjo=
+github.com/multiformats/go-multicodec v0.9.1/go.mod h1:LLWNMtyV5ithSBUo3vFIMaeDy+h3EbkMTek1m+Fybbo=
github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U=
github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew=
github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew=
@@ -654,8 +654,8 @@ github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUj
github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg=
github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U=
github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM=
-github.com/multiformats/go-multistream v0.6.0 h1:ZaHKbsL404720283o4c/IHQXiS6gb8qAN5EIJ4PN5EA=
-github.com/multiformats/go-multistream v0.6.0/go.mod h1:MOyoG5otO24cHIg8kf9QW2/NozURlkP/rvi2FQJyCPg=
+github.com/multiformats/go-multistream v0.6.1 h1:4aoX5v6T+yWmc2raBHsTvzmFhOI8WVOer28DeBBEYdQ=
+github.com/multiformats/go-multistream v0.6.1/go.mod h1:ksQf6kqHAb6zIsyw7Zm+gAuVo57Qbq84E27YlYqavqw=
github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE=
github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE=
github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE=
@@ -1033,8 +1033,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
-golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8=
-golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw=
+golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM=
+golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -1045,8 +1045,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
-golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=
-golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=
+golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476 h1:bsqhLWFR6G6xiQcb+JoGqdKdRU6WzPWmK8E0jxTjzo4=
+golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -1070,8 +1070,8 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
-golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU=
-golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=
+golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w=
+golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -1123,8 +1123,8 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
-golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY=
-golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds=
+golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=
+golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -1151,8 +1151,8 @@ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=
-golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
+golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8=
+golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1243,8 +1243,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
-golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4=
-golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA=
+golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M=
+golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA=
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -1304,8 +1304,8 @@ golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4f
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
-golang.org/x/tools v0.33.0 h1:4qz2S3zmRxbGIhDIAgjxvFutSvH5EfnsYrRBj0UI0bc=
-golang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI=
+golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo=
+golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index 89078bc51..40eaa7914 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -13,7 +13,7 @@ require (
github.com/ipfs/hang-fds v0.1.0
github.com/ipfs/iptb v1.4.1
github.com/ipfs/iptb-plugins v0.5.1
- github.com/multiformats/go-multiaddr v0.15.0
+ github.com/multiformats/go-multiaddr v0.16.0
github.com/multiformats/go-multihash v0.2.3
gotest.tools/gotestsum v1.12.0
)
@@ -129,7 +129,7 @@ require (
github.com/huin/goupnp v1.3.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/ipfs/bbloom v0.0.4 // indirect
- github.com/ipfs/boxo v0.31.1-0.20250528182950-f87feb50c39c // indirect
+ github.com/ipfs/boxo v0.32.0 // indirect
github.com/ipfs/go-bitfield v1.1.0 // indirect
github.com/ipfs/go-block-format v0.2.1 // indirect
github.com/ipfs/go-cid v0.5.0 // indirect
@@ -199,8 +199,8 @@ require (
github.com/multiformats/go-multiaddr-dns v0.4.1 // indirect
github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect
github.com/multiformats/go-multibase v0.2.0 // indirect
- github.com/multiformats/go-multicodec v0.9.0 // indirect
- github.com/multiformats/go-multistream v0.6.0 // indirect
+ github.com/multiformats/go-multicodec v0.9.1 // indirect
+ github.com/multiformats/go-multistream v0.6.1 // indirect
github.com/multiformats/go-varint v0.0.7 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/nakabonne/nestif v0.3.1 // indirect
@@ -310,17 +310,17 @@ require (
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.27.0 // indirect
go.uber.org/zap/exp v0.3.0 // indirect
- golang.org/x/crypto v0.38.0 // indirect
- golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect
+ golang.org/x/crypto v0.39.0 // indirect
+ golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476 // indirect
golang.org/x/exp/typeparams v0.0.0-20240314144324-c7f7c6466f7f // indirect
- golang.org/x/mod v0.24.0 // indirect
- golang.org/x/net v0.40.0 // indirect
- golang.org/x/sync v0.14.0 // indirect
+ golang.org/x/mod v0.25.0 // indirect
+ golang.org/x/net v0.41.0 // indirect
+ golang.org/x/sync v0.15.0 // indirect
golang.org/x/sys v0.33.0 // indirect
golang.org/x/term v0.32.0 // indirect
- golang.org/x/text v0.25.0 // indirect
+ golang.org/x/text v0.26.0 // indirect
golang.org/x/time v0.11.0 // indirect
- golang.org/x/tools v0.33.0 // indirect
+ golang.org/x/tools v0.34.0 // indirect
gonum.org/v1/gonum v0.16.0 // indirect
google.golang.org/protobuf v1.36.6 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index 6d79c2c08..cc37881a8 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -319,8 +319,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.31.1-0.20250528182950-f87feb50c39c h1:0jAFJxC74Gy0VwDG6WwYJq0yZdXOFIIeCwUXXln0w6A=
-github.com/ipfs/boxo v0.31.1-0.20250528182950-f87feb50c39c/go.mod h1:gEkUkBiZWtEjHd1AiUxaWEYaQApPtbeGF45fdfCwLX0=
+github.com/ipfs/boxo v0.32.0 h1:rBs3P53Wt9bFW9WJwVdkzLtzYCXAj2bMjM7+1nrazZw=
+github.com/ipfs/boxo v0.32.0/go.mod h1:VEtO3gOmr+sXGodalaTV9Vvsp3qVYegc4Rcu08Iw+wM=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-block-format v0.2.1 h1:96kW71XGNNa+mZw/MTzJrCpMhBWCrd9kBLoKm9Iip/Q=
@@ -509,21 +509,21 @@ github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYg
github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0=
github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4=
github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo=
-github.com/multiformats/go-multiaddr v0.15.0 h1:zB/HeaI/apcZiTDwhY5YqMvNVl/oQYvs3XySU+qeAVo=
-github.com/multiformats/go-multiaddr v0.15.0/go.mod h1:JSVUmXDjsVFiW7RjIFMP7+Ev+h1DTbiJgVeTV/tcmP0=
+github.com/multiformats/go-multiaddr v0.16.0 h1:oGWEVKioVQcdIOBlYM8BH1rZDWOGJSqr9/BKl6zQ4qc=
+github.com/multiformats/go-multiaddr v0.16.0/go.mod h1:JSVUmXDjsVFiW7RjIFMP7+Ev+h1DTbiJgVeTV/tcmP0=
github.com/multiformats/go-multiaddr-dns v0.4.1 h1:whi/uCLbDS3mSEUMb1MsoT4uzUeZB0N32yzufqS0i5M=
github.com/multiformats/go-multiaddr-dns v0.4.1/go.mod h1:7hfthtB4E4pQwirrz+J0CcDUfbWzTqEzVyYKKIKpgkc=
github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E=
github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo=
github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g=
github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk=
-github.com/multiformats/go-multicodec v0.9.0 h1:pb/dlPnzee/Sxv/j4PmkDRxCOi3hXTz3IbPKOXWJkmg=
-github.com/multiformats/go-multicodec v0.9.0/go.mod h1:L3QTQvMIaVBkXOXXtVmYE+LI16i14xuaojr/H7Ai54k=
+github.com/multiformats/go-multicodec v0.9.1 h1:x/Fuxr7ZuR4jJV4Os5g444F7xC4XmyUaT/FWtE+9Zjo=
+github.com/multiformats/go-multicodec v0.9.1/go.mod h1:LLWNMtyV5ithSBUo3vFIMaeDy+h3EbkMTek1m+Fybbo=
github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew=
github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U=
github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM=
-github.com/multiformats/go-multistream v0.6.0 h1:ZaHKbsL404720283o4c/IHQXiS6gb8qAN5EIJ4PN5EA=
-github.com/multiformats/go-multistream v0.6.0/go.mod h1:MOyoG5otO24cHIg8kf9QW2/NozURlkP/rvi2FQJyCPg=
+github.com/multiformats/go-multistream v0.6.1 h1:4aoX5v6T+yWmc2raBHsTvzmFhOI8WVOer28DeBBEYdQ=
+github.com/multiformats/go-multistream v0.6.1/go.mod h1:ksQf6kqHAb6zIsyw7Zm+gAuVo57Qbq84E27YlYqavqw=
github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8=
github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU=
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
@@ -866,11 +866,11 @@ golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
-golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8=
-golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw=
+golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM=
+golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=
-golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=
+golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476 h1:bsqhLWFR6G6xiQcb+JoGqdKdRU6WzPWmK8E0jxTjzo4=
+golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8=
golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
golang.org/x/exp/typeparams v0.0.0-20240314144324-c7f7c6466f7f h1:phY1HzDcf18Aq9A8KkmRtY9WvOFIxN8wgfvy6Zm1DV8=
@@ -895,8 +895,8 @@ golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
-golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU=
-golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=
+golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w=
+golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -928,8 +928,8 @@ golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
-golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY=
-golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds=
+golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=
+golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -949,8 +949,8 @@ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
-golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=
-golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
+golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8=
+golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1022,8 +1022,8 @@ golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
-golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4=
-golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA=
+golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M=
+golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA=
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0=
@@ -1061,8 +1061,8 @@ golang.org/x/tools v0.11.0/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8
golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg=
golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc=
-golang.org/x/tools v0.33.0 h1:4qz2S3zmRxbGIhDIAgjxvFutSvH5EfnsYrRBj0UI0bc=
-golang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI=
+golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo=
+golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
diff --git a/test/sharness/t0119-prometheus-data/prometheus_metrics b/test/sharness/t0119-prometheus-data/prometheus_metrics
index 6cf2c95f1..8bb728d8a 100644
--- a/test/sharness/t0119-prometheus-data/prometheus_metrics
+++ b/test/sharness/t0119-prometheus-data/prometheus_metrics
@@ -56,6 +56,8 @@ go_sched_gomaxprocs_threads
go_threads
ipfs_bitswap_active_block_tasks
ipfs_bitswap_active_tasks
+ipfs_bitswap_blocks_received
+ipfs_bitswap_haves_received
ipfs_bitswap_pending_block_tasks
ipfs_bitswap_pending_tasks
ipfs_bitswap_recv_all_blocks_bytes_bucket
@@ -71,6 +73,7 @@ ipfs_bitswap_sent_all_blocks_bytes_bucket
ipfs_bitswap_sent_all_blocks_bytes_count
ipfs_bitswap_sent_all_blocks_bytes_sum
ipfs_bitswap_want_blocks_total
+ipfs_bitswap_wanthaves_broadcast
ipfs_bitswap_wantlist_total
ipfs_bs_cache_boxo_blockstore_cache_hits
ipfs_bs_cache_boxo_blockstore_cache_total
@@ -235,3 +238,5 @@ process_resident_memory_bytes
process_start_time_seconds
process_virtual_memory_bytes
process_virtual_memory_max_bytes
+provider_reprovider_provide_count
+provider_reprovider_reprovide_count
diff --git a/test/sharness/t0290-cid.sh b/test/sharness/t0290-cid.sh
index 8fb36e30e..e0c31a330 100755
--- a/test/sharness/t0290-cid.sh
+++ b/test/sharness/t0290-cid.sh
@@ -113,6 +113,7 @@ cat < codecs_expect
120 git-raw
123 torrent-info
124 torrent-file
+ 128 blake3-hashseq
129 leofcoin-block
130 leofcoin-tx
131 leofcoin-pr
@@ -128,7 +129,7 @@ cat < codecs_expect
151 eth-account-snapshot
152 eth-storage-trie
153 eth-receipt-log-trie
- 154 eth-reciept-log
+ 154 eth-receipt-log
176 bitcoin-block
177 bitcoin-tx
178 bitcoin-witness-commitment
@@ -146,7 +147,7 @@ cat < codecs_expect
297 dag-json
496 swhid-1-snp
512 json
-46083 urdca-2015-canon
+46083 rdfc-1
46593 json-jcs
EOF
From 0cf1b22536d3ae103120285a0ab5e0a36055aeb9 Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Tue, 17 Jun 2025 04:35:21 -0700
Subject: [PATCH 262/499] bitswap/client: configurable broadcast reduction
(#10825)
* Configure bitswap braodcast reduction
Add new config items to `Internal.Bitswap` to allow configuration of bitswap broadcast reduction behavior. Broadcast reduction behavior is enabled by default, and uses settings that should be suitable for most installations of kubo.
* update sharness metrics test
* Explicit defaults for broadcast reduction configuration
* Update docs/config.md
---
config/internal.go | 47 ++++++++++++++
core/node/bitswap.go | 43 +++++++++++++
docs/changelogs/v0.36.md | 36 ++++++++++-
docs/config.md | 63 +++++++++++++++++++
.../t0119-prometheus-data/prometheus_metrics | 1 +
5 files changed, 188 insertions(+), 2 deletions(-)
diff --git a/config/internal.go b/config/internal.go
index f8300f540..267bb250f 100644
--- a/config/internal.go
+++ b/config/internal.go
@@ -16,4 +16,51 @@ type InternalBitswap struct {
ProviderSearchDelay OptionalDuration
ProviderSearchMaxResults OptionalInteger
WantHaveReplaceSize OptionalInteger
+ BroadcastControl *BitswapBroadcastControl
}
+
+type BitswapBroadcastControl struct {
+ // EnableEnables or disables broadcast control functionality. Setting this
+ // to false disables broadcast control functionality and restores the
+ // previous broadcast behavior of sending broadcasts to all peers. When
+ // disabled, all other BroadcastControl configuration items are ignored.
+ // Default is [DefaultBroadcastControlEnable].
+ Enable Flag `json:",omitempty"`
+ // MaxPeers sets a hard limit on the number of peers to send broadcasts to.
+ // A value of 0 means no broadcasts are sent. A value of -1 means there is
+ // no limit. Default is [DefaultBroadcastControlMaxPeers].
+ MaxPeers OptionalInteger `json:",omitempty"`
+ // LocalPeers enables or disables broadcast control for peers on the local
+ // network. If false, than always broadcast to peers on the local network.
+ // If true, apply broadcast control to local peers. Default is
+ // [DefaultBroadcastControlLocalPeers].
+ LocalPeers Flag `json:",omitempty"`
+ // PeeredPeers enables or disables broadcast reduction for peers configured
+ // for peering. If false, than always broadcast to peers configured for
+ // peering. If true, apply broadcast reduction to peered peers. Default is
+ // [DefaultBroadcastControlPeeredPeers].
+ PeeredPeers Flag `json:",omitempty"`
+ // MaxRandomPeers is the number of peers to broadcast to anyway, even
+ // though broadcast reduction logic has determined that they are not
+ // broadcast targets. Setting this to a non-zero value ensures at least
+ // this number of random peers receives a broadcast. This may be helpful in
+ // cases where peers that are not receiving broadcasts my have wanted
+ // blocks. Default is [DefaultBroadcastControlMaxRandomPeers].
+ MaxRandomPeers OptionalInteger `json:",omitempty"`
+ // SendToPendingPeers enables or disables sending broadcasts to any peers
+ // to which there is a pending message to send. When enabled, this sends
+ // broadcasts to many more peers, but does so in a way that does not
+ // increase the number of separate broadcast messages. There is still the
+ // increased cost of the recipients having to process and respond to the
+ // broadcasts. Default is [DefaultBroadcastControlSendToPendingPeers].
+ SendToPendingPeers Flag `json:",omitempty"`
+}
+
+const (
+ DefaultBroadcastControlEnable = true // Enabled
+ DefaultBroadcastControlMaxPeers = -1 // Unlimited
+ DefaultBroadcastControlLocalPeers = false // No control of local
+ DefaultBroadcastControlPeeredPeers = false // No control of peered
+ DefaultBroadcastControlMaxRandomPeers = 0 // No randoms
+ DefaultBroadcastControlSendToPendingPeers = false // Disabled
+)
diff --git a/core/node/bitswap.go b/core/node/bitswap.go
index e87464b8a..9da278305 100644
--- a/core/node/bitswap.go
+++ b/core/node/bitswap.go
@@ -117,9 +117,52 @@ func Bitswap(serverEnabled, libp2pEnabled, httpEnabled bool) interface{} {
// Kubo uses own, customized ProviderQueryManager
in.BitswapOpts = append(in.BitswapOpts, bitswap.WithClientOption(client.WithDefaultProviderQueryManager(false)))
var maxProviders int = DefaultMaxProviders
+
+ var bcDisposition string
if in.Cfg.Internal.Bitswap != nil {
maxProviders = int(in.Cfg.Internal.Bitswap.ProviderSearchMaxResults.WithDefault(DefaultMaxProviders))
+ if in.Cfg.Internal.Bitswap.BroadcastControl != nil {
+ bcCfg := in.Cfg.Internal.Bitswap.BroadcastControl
+ bcEnable := bcCfg.Enable.WithDefault(config.DefaultBroadcastControlEnable)
+ in.BitswapOpts = append(in.BitswapOpts, bitswap.WithClientOption(client.BroadcastControlEnable(bcEnable)))
+ if bcEnable {
+ bcDisposition = "enabled"
+ bcMaxPeers := int(bcCfg.MaxPeers.WithDefault(config.DefaultBroadcastControlMaxPeers))
+ in.BitswapOpts = append(in.BitswapOpts, bitswap.WithClientOption(client.BroadcastControlMaxPeers(bcMaxPeers)))
+
+ bcLocalPeers := bcCfg.LocalPeers.WithDefault(config.DefaultBroadcastControlLocalPeers)
+ in.BitswapOpts = append(in.BitswapOpts, bitswap.WithClientOption(client.BroadcastControlLocalPeers(bcLocalPeers)))
+
+ bcPeeredPeers := bcCfg.PeeredPeers.WithDefault(config.DefaultBroadcastControlPeeredPeers)
+ in.BitswapOpts = append(in.BitswapOpts, bitswap.WithClientOption(client.BroadcastControlPeeredPeers(bcPeeredPeers)))
+
+ bcMaxRandomPeers := int(bcCfg.MaxRandomPeers.WithDefault(config.DefaultBroadcastControlMaxRandomPeers))
+ in.BitswapOpts = append(in.BitswapOpts, bitswap.WithClientOption(client.BroadcastControlMaxRandomPeers(bcMaxRandomPeers)))
+
+ bcSendToPendingPeers := bcCfg.SendToPendingPeers.WithDefault(config.DefaultBroadcastControlSendToPendingPeers)
+ in.BitswapOpts = append(in.BitswapOpts, bitswap.WithClientOption(client.BroadcastControlSendToPendingPeers(bcSendToPendingPeers)))
+ } else {
+ bcDisposition = "disabled"
+ }
+ }
}
+
+ // If broadcast control is not configured, then configure with defaults.
+ if bcDisposition == "" {
+ in.BitswapOpts = append(in.BitswapOpts, bitswap.WithClientOption(client.BroadcastControlEnable(config.DefaultBroadcastControlEnable)))
+ if config.DefaultBroadcastControlEnable {
+ bcDisposition = "enabled"
+ in.BitswapOpts = append(in.BitswapOpts, bitswap.WithClientOption(client.BroadcastControlMaxPeers(config.DefaultBroadcastControlMaxPeers)))
+ in.BitswapOpts = append(in.BitswapOpts, bitswap.WithClientOption(client.BroadcastControlLocalPeers(config.DefaultBroadcastControlLocalPeers)))
+ in.BitswapOpts = append(in.BitswapOpts, bitswap.WithClientOption(client.BroadcastControlPeeredPeers(config.DefaultBroadcastControlPeeredPeers)))
+ in.BitswapOpts = append(in.BitswapOpts, bitswap.WithClientOption(client.BroadcastControlMaxRandomPeers(config.DefaultBroadcastControlMaxRandomPeers)))
+ in.BitswapOpts = append(in.BitswapOpts, bitswap.WithClientOption(client.BroadcastControlSendToPendingPeers(config.DefaultBroadcastControlSendToPendingPeers)))
+ } else {
+ bcDisposition = "enabled"
+ }
+ }
+ logger.Infof("bitswap client broadcast control %s", bcDisposition)
+
ignoredPeerIDs := make([]peer.ID, 0, len(in.Cfg.Routing.IgnoreProviders))
for _, str := range in.Cfg.Routing.IgnoreProviders {
pid, err := peer.Decode(str)
diff --git a/docs/changelogs/v0.36.md b/docs/changelogs/v0.36.md
index 924e8dce1..bbe2fdf96 100644
--- a/docs/changelogs/v0.36.md
+++ b/docs/changelogs/v0.36.md
@@ -8,7 +8,6 @@ This release was brought to you by the [Shipyard](http://ipshipyard.com/) team.
## v0.36.0
-
- [Overview](#overview)
- [๐ฆ Highlights](#-highlights)
- [HTTP Retrieval client enabled by default](#http-retrieval-client-enabled-by-default)
@@ -16,6 +15,11 @@ This release was brought to you by the [Shipyard](http://ipshipyard.com/) team.
- [AutoNATv2 Client](#autonatv2-client)
- [Smarter AutoTLS registration](#smarter-autotls-registration)
- [Overwrite option for files cp command](#overwrite-option-for-files-cp-command)
+ - [Update go-log to v2](#update-go-log-to-v2)
+ - [Bitswap Broadcast Reduction](#bitswap-broadcast-reduction)
+ - [Bitswap Broadcast Reduction](#bitswap-broadcast-reduction)
+ - [Update go-log to v2](#update-go-log-to-v2)
+ - [Overwrite option for files cp command](#overwrite-option-for-files-cp-command)
- [Option for filestore command to remove bad blocks](#option-for-filestore-command-to-remove-bad-blocks)
- [๐ฆ๏ธ Important dependency updates](#-important-dependency-updates)
- [๐ Changelog](#-changelog)
@@ -31,9 +35,27 @@ This release promotes the HTTP Retrieval client from an experimental feature to
See [`HTTPRetrieval`](https://github.com/ipfs/kubo/blob/master/docs/config.md#httpretrieval) for more details.
+### Bitswap Broadcast Reduction
+
+The Bitswap client now supports broadcast reduction logic, which is enabled by default. This feature significantly reduces the number of broadcast messages sent to peers, resulting in lower bandwidth usage during load spikes.
+
+The overall logic works by sending to non-local peers only if those peers have previously replied that they have wanted data blocks. To minimize impact on existing workloads, by default, broadcasts are still always sent to peers on the local network, or the ones defined in `Peering.Peers`.
+
+We've performed A/B testing on our internal Kubo staging gateway with organic CID requests to `ipfs.io`. While this may not translate 1:1 to your workload, the benefits were significant enough to enable this feature by default. Here are the key findings:
+
+- **Dramatic Resource Usage Reduction:** Internal testing demonstrated reduction in Bitswap broadcast messages by 80-98% and network bandwidth savings of 50-95%, with the greatest improvements occurring during high traffic and peer spikes. These efficiency gains lower operational costs of running Kubo under high load and improve the IPFS Mainnet (which is >80% Kubo-based) by reducing ambient traffic for all connected peers.
+- **Improved Memory Stability:** Memory stays stable even during major CID request spikes that increase peer count, preventing the out-of-memory (OOM) issues found in earlier Kubo versions.
+- **Data Retrieval Performance Remains Strong:** Our tests suggest that Kubo gateway hosts with broadcast reduction enabled achieve similar or better HTTP 200 success rates compared to version 0.35, while maintaining equivalent or higher want-have responses and unique blocks received.
+
+For more information about our A/B tests, see [kubo#10825](https://github.com/ipfs/kubo/pull/10825).
+
+To revert to the previous behavior for your own A/B testing, set `Internal.Bitswap.BroadcastControl.Enable` to `false` and monitor relevant metrics (`ipfs_bitswap_bcast_skips_total`, `ipfs_bitswap_haves_received`, `ipfs_bitswap_unique_blocks_received`, `ipfs_bitswap_wanthaves_broadcast`, HTTP 200 success rate).
+
+For a description of the configuration items, see the documentation of [`Internal.Bitswap.BroadcastControl`](https://github.com/ipfs/kubo/blob/master/docs/config.md#internalbitswapbroadcastcontrol).
+
#### Update go-log to v2
-go-log v2 has been out for quite a while now and it is time to deprecate v1.
+go-log v2 has been out for quite a while now and it is time to deprecate v1.
- Replace all use of `go-log` with `go-log/v2`
- Makes `/api/v0/log/tail` useful over HTTP
@@ -52,6 +74,16 @@ This update to libp2p and [AutoTLS](https://github.com/ipfs/kubo/blob/master/doc
The `ipfs files cp` command has a `--force` option to allow it to overwrite existing files. Attempting to overwrite an existing directory results in an error.
+#### Bitswap Broadcast Reduction
+
+The bitswap client now supports logic to reduce the amount of bitswap broadcast messages that are send to peers. This logic is enabled by default.
+
+The bitswap broadcast control logic can be enabled and disabled and configured in the `Internal.Bitswap.BroadcastControl` section of the ipfs config file. For a description of the configuration items, see the documentation of [`Internal.Bitswap.BroadcastControl`](https://github.com/ipfs/kubo/blob/master/docs/config.md#internalbitswapbroadcastcontrol).
+
+The overall logic works by sending to non-local peers only if those peers have previously replied that they have wanted data blocks. By default, broadcasts are always sent to peers on the local network.
+
+To revert to the previous behavior for A/B testing, set `Internal.Bitswap.BroadcastReductionEnabled` to `false` and monitor relevant metrics (`ipfs_bitswap_bcast_skips_total`, `ipfs_bitswap_haves_received`, `ipfs_bitswap_unique_blocks_received`, `ipfs_bitswap_wanthaves_broadcast`). Depending on your workload, the number of broadcasts should decrease, while the block receipt success rate should remain acceptable.
+
#### Option for filestore command to remove bad blocks
The `filestore` command has a new option, `--remove-bad-blocks`, to verify objects in the filestore and remove those that fail verification.
diff --git a/docs/config.md b/docs/config.md
index b2563d372..c3636da3d 100644
--- a/docs/config.md
+++ b/docs/config.md
@@ -84,6 +84,13 @@ config file at runtime.
- [`Internal.Bitswap.MaxOutstandingBytesPerPeer`](#internalbitswapmaxoutstandingbytesperpeer)
- [`Internal.Bitswap.ProviderSearchDelay`](#internalbitswapprovidersearchdelay)
- [`Internal.Bitswap.ProviderSearchMaxResults`](#internalbitswapprovidersearchmaxresults)
+ - [`Internal.Bitswap.BroadcastControl`](#internalbitswapbroadcastcontrol)
+ - [`Internal.Bitswap.BroadcastControl.Enable`](#internalbitswapbroadcastcontrolenable)
+ - [`Internal.Bitswap.BroadcastControl.MaxPeers`](#internalbitswapbroadcastcontrolmaxpeers)
+ - [`Internal.Bitswap.BroadcastControl.LocalPeers`](#internalbitswapbroadcastcontrollocalpeers)
+ - [`Internal.Bitswap.BroadcastControl.PeeredPeers`](#internalbitswapbroadcastcontrolpeeredpeers)
+ - [`Internal.Bitswap.BroadcastControl.MaxRandomPeers`](#internalbitswapbroadcastcontrolmaxrandompeers)
+ - [`Internal.Bitswap.BroadcastControl.SendToPendingPeers`](#internalbitswapbroadcastcontrolsendtopendingpeers)
- [`Internal.UnixFSShardingSizeThreshold`](#internalunixfsshardingsizethreshold)
- [`Ipns`](#ipns)
- [`Ipns.RepublishPeriod`](#ipnsrepublishperiod)
@@ -1282,6 +1289,62 @@ Setting to 0 means unlimited.
Type: `optionalInteger` (`null` means default which is 10)
+#### `Internal.Bitswap.BroadcastControl`
+
+`Internal.Bitswap.BroadcastControl` contains settings for the bitswap client's broadcast control functionality.
+
+Broadcast control tries to reduce the number of bitswap broadcast messages sent to peers by choosing a subset of of the peers to send to. Peers are chosen based on whether they have previously responded indicating they have wanted blocks, as well as other configurable criteria. The settings here change how peers are selected as broadcast targets. Broadcast control can also be completely disabled to return bitswap to its previous behavior before broadcast control was introduced.
+
+Enabling broadcast control should generally reduce the number of broadcasts significantly without significantly degrading the ability to discover which peers have wanted blocks. However, if block discovery on your network relies sufficiently on broadcasts to discover peers that have wanted blocks, then adjusting the broadcast control configuration or disabling it altogether, may be helpful.
+
+##### `Internal.Bitswap.BroadcastControl.Enable`
+
+Enables or disables broadcast control functionality. Setting this to `false` disables broadcast reduction logic and restores the previous (Kubo < 0.36) broadcast behavior of sending broadcasts to all peers. When disabled, all other `Bitswap.BroadcastControl` configuration items are ignored.
+
+Default: `true` (Enabled)
+
+Type: `flag`
+
+##### `Internal.Bitswap.BroadcastControl.MaxPeers`
+
+Sets a hard limit on the number of peers to send broadcasts to. A value of `0` means no broadcasts are sent. A value of `-1` means there is no limit.
+
+Default: `0` (no limit)
+
+Type: `optionalInteger` (non-negative, 0 means no limit)
+
+##### `Internal.Bitswap.BroadcastControl.LocalPeers`
+
+Enables or disables broadcast control for peers on the local network. Peers that have private or loopback addresses are considered to be on the local network. If this setting is `false`, than always broadcast to peers on the local network. If `true`, apply broadcast control to local peers.
+
+Default: `false` (Always broadcast to peers on local network)
+
+Type: `flag`
+
+##### `Internal.Bitswap.BroadcastControl.PeeredPeers`
+
+Enables or disables broadcast reduction for peers configured for peering. If `false`, than always broadcast to peers configured for peering. If `true`, apply broadcast reduction to peered peers.
+
+Default: `false` (Always broadcast to peers configured for peering)
+
+Type: `flag`
+
+##### `Internal.Bitswap.BroadcastControl.MaxRandomPeers`
+
+Sets the number of peers to broadcast to anyway, even though broadcast control logic has determined that they are not broadcast targets. Setting this to a non-zero value ensures at least this number of random peers receives a broadcast. This may be helpful in cases where peers that are not receiving broadcasts my have wanted blocks.
+
+Default: `0` (do not send broadcasts to peers not already targeted broadcast control)
+
+Type: `optionalInteger` (non-negative, 0 means do not broadcast to any random peers)
+
+##### `Internal.Bitswap.BroadcastControl.SendToPendingPeers`
+
+Enables or disables sending broadcasts to any peers to which there is a pending message to send. When enabled, this sends broadcasts to many more peers, but does so in a way that does not increase the number of separate broadcast messages. There is still the increased cost of the recipients having to process and respond to the broadcasts.
+
+Default: `false` (Do not send broadcasts to all peers for which there are pending messages)
+
+Type: `flag`
+
### `Internal.UnixFSShardingSizeThreshold`
**MOVED:** see [`Import.UnixFSHAMTDirectorySizeThreshold`](#importunixfshamtdirectorysizethreshold)
diff --git a/test/sharness/t0119-prometheus-data/prometheus_metrics b/test/sharness/t0119-prometheus-data/prometheus_metrics
index 8bb728d8a..fa257d9fc 100644
--- a/test/sharness/t0119-prometheus-data/prometheus_metrics
+++ b/test/sharness/t0119-prometheus-data/prometheus_metrics
@@ -56,6 +56,7 @@ go_sched_gomaxprocs_threads
go_threads
ipfs_bitswap_active_block_tasks
ipfs_bitswap_active_tasks
+ipfs_bitswap_bcast_skips_total
ipfs_bitswap_blocks_received
ipfs_bitswap_haves_received
ipfs_bitswap_pending_block_tasks
From eb6cc02c06abc1f081f72491dca6fb7595690038 Mon Sep 17 00:00:00 2001
From: Hector Sanjuan
Date: Tue, 17 Jun 2025 15:55:57 +0200
Subject: [PATCH 263/499] feat(config): connmgr: expose silence period (#10827)
---
config/init.go | 3 +++
config/swarm.go | 9 +++++----
core/node/groups.go | 4 +++-
core/node/libp2p/libp2p.go | 7 +++++--
docs/changelogs/v0.36.md | 4 ++++
docs/config.md | 17 ++++++++++++++---
6 files changed, 34 insertions(+), 10 deletions(-)
diff --git a/config/init.go b/config/init.go
index 40c24bd25..373d744d4 100644
--- a/config/init.go
+++ b/config/init.go
@@ -95,6 +95,9 @@ const DefaultConnMgrLowWater = 32
// grace period.
const DefaultConnMgrGracePeriod = time.Second * 20
+// DefaultConnMgrSilencePeriod controls how often the connection manager enforces the limits.
+const DefaultConnMgrSilencePeriod = time.Second * 10
+
// DefaultConnMgrType is the default value for the connection managers
// type.
const DefaultConnMgrType = "basic"
diff --git a/config/swarm.go b/config/swarm.go
index 4a04a0054..0faa4d25d 100644
--- a/config/swarm.go
+++ b/config/swarm.go
@@ -104,10 +104,11 @@ type Transports struct {
// ConnMgr defines configuration options for the libp2p connection manager.
type ConnMgr struct {
- Type *OptionalString `json:",omitempty"`
- LowWater *OptionalInteger `json:",omitempty"`
- HighWater *OptionalInteger `json:",omitempty"`
- GracePeriod *OptionalDuration `json:",omitempty"`
+ Type *OptionalString `json:",omitempty"`
+ LowWater *OptionalInteger `json:",omitempty"`
+ HighWater *OptionalInteger `json:",omitempty"`
+ GracePeriod *OptionalDuration `json:",omitempty"`
+ SilencePeriod *OptionalDuration `json:",omitempty"`
}
// ResourceMgr defines configuration options for the libp2p Network Resource Manager
diff --git a/core/node/groups.go b/core/node/groups.go
index 1794b74c3..9d53aeef5 100644
--- a/core/node/groups.go
+++ b/core/node/groups.go
@@ -49,7 +49,9 @@ func LibP2P(bcfg *BuildCfg, cfg *config.Config, userResourceOverrides rcmgr.Part
grace := cfg.Swarm.ConnMgr.GracePeriod.WithDefault(config.DefaultConnMgrGracePeriod)
low := int(cfg.Swarm.ConnMgr.LowWater.WithDefault(config.DefaultConnMgrLowWater))
high := int(cfg.Swarm.ConnMgr.HighWater.WithDefault(config.DefaultConnMgrHighWater))
- connmgr = fx.Provide(libp2p.ConnectionManager(low, high, grace))
+ silence := cfg.Swarm.ConnMgr.SilencePeriod.WithDefault(config.DefaultConnMgrSilencePeriod)
+ connmgr = fx.Provide(libp2p.ConnectionManager(low, high, grace, silence))
+
default:
return fx.Error(fmt.Errorf("unrecognized Swarm.ConnMgr.Type: %q", connMgrType))
}
diff --git a/core/node/libp2p/libp2p.go b/core/node/libp2p/libp2p.go
index 1adced34f..da6991b1f 100644
--- a/core/node/libp2p/libp2p.go
+++ b/core/node/libp2p/libp2p.go
@@ -25,9 +25,12 @@ type Libp2pOpts struct {
Opts []libp2p.Option `group:"libp2p"`
}
-func ConnectionManager(low, high int, grace time.Duration) func() (opts Libp2pOpts, err error) {
+func ConnectionManager(low, high int, grace, silence time.Duration) func() (opts Libp2pOpts, err error) {
return func() (opts Libp2pOpts, err error) {
- cm, err := connmgr.NewConnManager(low, high, connmgr.WithGracePeriod(grace))
+ cm, err := connmgr.NewConnManager(low, high,
+ connmgr.WithGracePeriod(grace),
+ connmgr.WithSilencePeriod(silence),
+ )
if err != nil {
return opts, err
}
diff --git a/docs/changelogs/v0.36.md b/docs/changelogs/v0.36.md
index bbe2fdf96..5287d8760 100644
--- a/docs/changelogs/v0.36.md
+++ b/docs/changelogs/v0.36.md
@@ -88,6 +88,10 @@ To revert to the previous behavior for A/B testing, set `Internal.Bitswap.Broadc
The `filestore` command has a new option, `--remove-bad-blocks`, to verify objects in the filestore and remove those that fail verification.
+#### ConnMgr.SilencePeriod configuration setting exposed
+
+This connection manager option controls how often connections are swept and potentially terminated. See the [ConnMgr documentation](https://github.com/ipfs/kubo/blob/master/docs/config.md#swarmconnmgrsilenceperiod).
+
#### ๐ฆ๏ธ Important dependency updates
- update `go-libp2p-kad-dht` to [v0.33.0](https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.33.0)
diff --git a/docs/config.md b/docs/config.md
index c3636da3d..64e555984 100644
--- a/docs/config.md
+++ b/docs/config.md
@@ -171,6 +171,7 @@ config file at runtime.
- [`Swarm.ConnMgr.LowWater`](#swarmconnmgrlowwater)
- [`Swarm.ConnMgr.HighWater`](#swarmconnmgrhighwater)
- [`Swarm.ConnMgr.GracePeriod`](#swarmconnmgrgraceperiod)
+ - [`Swarm.ConnMgr.SilencePeriod`](#swarmconnmgrsilenceperiod)
- [`Swarm.ResourceMgr`](#swarmresourcemgr)
- [`Swarm.ResourceMgr.Enabled`](#swarmresourcemgrenabled)
- [`Swarm.ResourceMgr.MaxMemory`](#swarmresourcemgrmaxmemory)
@@ -2357,8 +2358,9 @@ Type: `optionalString` (default when unset or empty)
The basic connection manager uses a "high water", a "low water", and internal
scoring to periodically close connections to free up resources. When a node
-using the basic connection manager reaches `HighWater` idle connections, it will
-close the least useful ones until it reaches `LowWater` idle connections.
+using the basic connection manager reaches `HighWater` idle connections, it
+will close the least useful ones until it reaches `LowWater` idle
+connections. The process of closing connections happens every `SilencePeriod`.
The connection manager considers a connection idle if:
@@ -2377,7 +2379,8 @@ The connection manager considers a connection idle if:
"Type": "basic",
"LowWater": 100,
"HighWater": 200,
- "GracePeriod": "30s"
+ "GracePeriod": "30s",
+ "SilencePeriod": "10s"
}
}
}
@@ -2411,6 +2414,14 @@ Default: `"20s"`
Type: `optionalDuration`
+##### `Swarm.ConnMgr.SilencePeriod`
+
+SilencePeriod is the time duration between connection manager runs, when connections that are idle are closed.
+
+Default: `"10s"`
+
+Type: `optionalDuration`
+
### `Swarm.ResourceMgr`
Learn more about Kubo's usage of libp2p Network Resource Manager
From 002d9816ff2475e6065ed4b9521ffe5ca28969f5 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Tue, 17 Jun 2025 17:37:05 +0200
Subject: [PATCH 264/499] chore: deduplicate 0.36 changelog
seems we ended up with rebroadcast section twice due to PR merge order
---
docs/changelogs/v0.36.md | 36 ++++++++++++------------------------
1 file changed, 12 insertions(+), 24 deletions(-)
diff --git a/docs/changelogs/v0.36.md b/docs/changelogs/v0.36.md
index 5287d8760..496ef50e3 100644
--- a/docs/changelogs/v0.36.md
+++ b/docs/changelogs/v0.36.md
@@ -1,8 +1,8 @@
# Kubo changelog v0.36
-
+
-This release was brought to you by the [Shipyard](http://ipshipyard.com/) team.
+This release was brought to you by the [Interplanetary Shipyard](https://ipshipyard.com/) team.
- [v0.36.0](#v0340)
@@ -10,17 +10,14 @@ This release was brought to you by the [Shipyard](http://ipshipyard.com/) team.
- [Overview](#overview)
- [๐ฆ Highlights](#-highlights)
- - [HTTP Retrieval client enabled by default](#http-retrieval-client-enabled-by-default)
+ - [HTTP Retrieval Client Now Enabled by Default](#http-retrieval-client-now-enabled-by-default)
+ - [Bitswap Broadcast Reduction](#bitswap-broadcast-reduction)
- [Update go-log to v2](#update-go-log-to-v2)
- - [AutoNATv2 Client](#autonatv2-client)
+ - [Kubo now uses AutoNATv2 as a client](#kubo-now-uses-autonatv2-as-a-client)
- [Smarter AutoTLS registration](#smarter-autotls-registration)
- [Overwrite option for files cp command](#overwrite-option-for-files-cp-command)
- - [Update go-log to v2](#update-go-log-to-v2)
- - [Bitswap Broadcast Reduction](#bitswap-broadcast-reduction)
- - [Bitswap Broadcast Reduction](#bitswap-broadcast-reduction)
- - [Update go-log to v2](#update-go-log-to-v2)
- - [Overwrite option for files cp command](#overwrite-option-for-files-cp-command)
- [Option for filestore command to remove bad blocks](#option-for-filestore-command-to-remove-bad-blocks)
+ - [`ConnMgr.SilencePeriod` configuration setting exposed](#connmgrsilenceperiod-configuration-setting-exposed)
- [๐ฆ๏ธ Important dependency updates](#-important-dependency-updates)
- [๐ Changelog](#-changelog)
- [๐จโ๐ฉโ๐งโ๐ฆ Contributors](#-contributors)
@@ -29,19 +26,19 @@ This release was brought to you by the [Shipyard](http://ipshipyard.com/) team.
### ๐ฆ Highlights
-#### HTTP Retrieval client enabled by default
+#### HTTP Retrieval Client Now Enabled by Default
This release promotes the HTTP Retrieval client from an experimental feature to a standard feature that is enabled by default. When possible, Kubo will be retrieving blocks over plain HTTPS (HTTP/2) without any extra user configuration.
See [`HTTPRetrieval`](https://github.com/ipfs/kubo/blob/master/docs/config.md#httpretrieval) for more details.
-### Bitswap Broadcast Reduction
+#### Bitswap Broadcast Reduction
The Bitswap client now supports broadcast reduction logic, which is enabled by default. This feature significantly reduces the number of broadcast messages sent to peers, resulting in lower bandwidth usage during load spikes.
The overall logic works by sending to non-local peers only if those peers have previously replied that they have wanted data blocks. To minimize impact on existing workloads, by default, broadcasts are still always sent to peers on the local network, or the ones defined in `Peering.Peers`.
-We've performed A/B testing on our internal Kubo staging gateway with organic CID requests to `ipfs.io`. While this may not translate 1:1 to your workload, the benefits were significant enough to enable this feature by default. Here are the key findings:
+At Shipyard, we conducted A/B testing on our internal Kubo staging gateway with organic CID requests to `ipfs.io`. While these results may not exactly match your specific workload, the benefits proved significant enough to make this feature default. Here are the key findings:
- **Dramatic Resource Usage Reduction:** Internal testing demonstrated reduction in Bitswap broadcast messages by 80-98% and network bandwidth savings of 50-95%, with the greatest improvements occurring during high traffic and peer spikes. These efficiency gains lower operational costs of running Kubo under high load and improve the IPFS Mainnet (which is >80% Kubo-based) by reducing ambient traffic for all connected peers.
- **Improved Memory Stability:** Memory stays stable even during major CID request spikes that increase peer count, preventing the out-of-memory (OOM) issues found in earlier Kubo versions.
@@ -62,7 +59,7 @@ go-log v2 has been out for quite a while now and it is time to deprecate v1.
- Fixes `ipfs log tail`
- Removes support for `ContextWithLoggable` as this is not needed for tracing-like functionality
-#### AutoNATv2 Client
+#### Kubo now uses AutoNATv2 as a client
This Kubo release starts utilizing [AutoNATv2](https://github.com/libp2p/specs/blob/master/autonat/autonat-v2.md) client functionality. go-libp2p v0.42 supports and depends on both AutoNATv1 and v2, and Autorelay feature continues to use v1. go-libp2p v0.43+ will discontinue internal use of AutoNATv1. We will maintain support for both v1 and v2 until then, though v1 will gradually be deprecated and ultimately removed.
@@ -74,21 +71,11 @@ This update to libp2p and [AutoTLS](https://github.com/ipfs/kubo/blob/master/doc
The `ipfs files cp` command has a `--force` option to allow it to overwrite existing files. Attempting to overwrite an existing directory results in an error.
-#### Bitswap Broadcast Reduction
-
-The bitswap client now supports logic to reduce the amount of bitswap broadcast messages that are send to peers. This logic is enabled by default.
-
-The bitswap broadcast control logic can be enabled and disabled and configured in the `Internal.Bitswap.BroadcastControl` section of the ipfs config file. For a description of the configuration items, see the documentation of [`Internal.Bitswap.BroadcastControl`](https://github.com/ipfs/kubo/blob/master/docs/config.md#internalbitswapbroadcastcontrol).
-
-The overall logic works by sending to non-local peers only if those peers have previously replied that they have wanted data blocks. By default, broadcasts are always sent to peers on the local network.
-
-To revert to the previous behavior for A/B testing, set `Internal.Bitswap.BroadcastReductionEnabled` to `false` and monitor relevant metrics (`ipfs_bitswap_bcast_skips_total`, `ipfs_bitswap_haves_received`, `ipfs_bitswap_unique_blocks_received`, `ipfs_bitswap_wanthaves_broadcast`). Depending on your workload, the number of broadcasts should decrease, while the block receipt success rate should remain acceptable.
-
#### Option for filestore command to remove bad blocks
The `filestore` command has a new option, `--remove-bad-blocks`, to verify objects in the filestore and remove those that fail verification.
-#### ConnMgr.SilencePeriod configuration setting exposed
+#### `ConnMgr.SilencePeriod` configuration setting exposed
This connection manager option controls how often connections are swept and potentially terminated. See the [ConnMgr documentation](https://github.com/ipfs/kubo/blob/master/docs/config.md#swarmconnmgrsilenceperiod).
@@ -97,6 +84,7 @@ This connection manager option controls how often connections are swept and pote
- update `go-libp2p-kad-dht` to [v0.33.0](https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.33.0)
- update `boxo` to [v0.32.0](https://github.com/ipfs/boxo/releases/tag/v0.32.0)
- update `gateway-conformance` to [v0.8](https://github.com/ipfs/gateway-conformance/releases/tag/v0.8.0)
+- update `p2p-forge/client` to **TODO**
### ๐ Changelog
From 127da7cf5f9fbb160affeda0781cd4d694cf3cc2 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Wed, 18 Jun 2025 16:49:54 +0200
Subject: [PATCH 265/499] chore: v0.36.0-rc1
---
docs/changelogs/v0.36.md | 14 +++++++++++---
version.go | 2 +-
2 files changed, 12 insertions(+), 4 deletions(-)
diff --git a/docs/changelogs/v0.36.md b/docs/changelogs/v0.36.md
index 496ef50e3..f8ea9f5fc 100644
--- a/docs/changelogs/v0.36.md
+++ b/docs/changelogs/v0.36.md
@@ -8,6 +8,8 @@ This release was brought to you by the [Interplanetary Shipyard](https://ipship
## v0.36.0
+[
](https://github.com/user-attachments/assets/0d830631-7b92-48ca-8ce9-b537e1479dfb)
+
- [Overview](#overview)
- [๐ฆ Highlights](#-highlights)
- [HTTP Retrieval Client Now Enabled by Default](#http-retrieval-client-now-enabled-by-default)
@@ -16,7 +18,8 @@ This release was brought to you by the [Interplanetary Shipyard](https://ipship
- [Kubo now uses AutoNATv2 as a client](#kubo-now-uses-autonatv2-as-a-client)
- [Smarter AutoTLS registration](#smarter-autotls-registration)
- [Overwrite option for files cp command](#overwrite-option-for-files-cp-command)
- - [Option for filestore command to remove bad blocks](#option-for-filestore-command-to-remove-bad-blocks)
+ - [Gateway now supports negative HTTP Range requests](#gateway-now-supports-negative-http-range-requests)
+ - [Option for `filestore` command to remove bad blocks](#option-for-filestore-command-to-remove-bad-blocks)
- [`ConnMgr.SilencePeriod` configuration setting exposed](#connmgrsilenceperiod-configuration-setting-exposed)
- [๐ฆ๏ธ Important dependency updates](#-important-dependency-updates)
- [๐ Changelog](#-changelog)
@@ -71,9 +74,14 @@ This update to libp2p and [AutoTLS](https://github.com/ipfs/kubo/blob/master/doc
The `ipfs files cp` command has a `--force` option to allow it to overwrite existing files. Attempting to overwrite an existing directory results in an error.
-#### Option for filestore command to remove bad blocks
+#### Gateway now supports negative HTTP Range requests
-The `filestore` command has a new option, `--remove-bad-blocks`, to verify objects in the filestore and remove those that fail verification.
+The latest update to `boxo/gateway` adds support for negative HTTP Range requests, achieving [gateway-conformance@v0.8](https://github.com/ipfs/gateway-conformance/releases/tag/v0.8.0) compatibility.
+This enables greater interoperability with generic HTTP-based tools. For example, [WebRecorder](https://webrecorder.net/archivewebpage/)'s https://replayweb.page/ can now directly load website snapshots from Kubo-backed URLs.
+
+#### Option for `filestore` command to remove bad blocks
+
+The [experimental `filestore`](https://github.com/ipfs/kubo/blob/master/docs/experimental-features.md#ipfs-filestore) command has a new option, `--remove-bad-blocks`, to verify objects in the filestore and remove those that fail verification.
#### `ConnMgr.SilencePeriod` configuration setting exposed
diff --git a/version.go b/version.go
index 85e0ebd8d..7eae0ffe4 100644
--- a/version.go
+++ b/version.go
@@ -11,7 +11,7 @@ import (
var CurrentCommit string
// CurrentVersionNumber is the current application's version literal.
-const CurrentVersionNumber = "0.36.0-dev"
+const CurrentVersionNumber = "0.36.0-rc1"
const ApiVersion = "/kubo/" + CurrentVersionNumber + "/" //nolint
From 92aa9936c7bd4b09b7203009cde02d2670b5f326 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Wed, 18 Jun 2025 19:15:58 +0200
Subject: [PATCH 266/499] chore: 0.37.0-dev
---
version.go | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/version.go b/version.go
index 85e0ebd8d..9c9bafa03 100644
--- a/version.go
+++ b/version.go
@@ -11,7 +11,7 @@ import (
var CurrentCommit string
// CurrentVersionNumber is the current application's version literal.
-const CurrentVersionNumber = "0.36.0-dev"
+const CurrentVersionNumber = "0.37.0-dev"
const ApiVersion = "/kubo/" + CurrentVersionNumber + "/" //nolint
From ace0b0b987f5abe6a4480d3f9e14f55bb233785e Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Mon, 23 Jun 2025 07:18:11 -0700
Subject: [PATCH 267/499] Replace use of go-car v1 with go-car/v2 (#10845)
* Replace use of go-car v1 with go-car/v2
The `dag export` commend needed to be updated to use go-car/v2. This removes the last dependency on go-car v1.
---
core/commands/dag/export.go | 96 +++++++++++++++++++++++++++----------
go.mod | 9 ----
go.sum | 27 -----------
3 files changed, 72 insertions(+), 60 deletions(-)
diff --git a/core/commands/dag/export.go b/core/commands/dag/export.go
index a729cf752..9f11c43de 100644
--- a/core/commands/dag/export.go
+++ b/core/commands/dag/export.go
@@ -9,15 +9,14 @@ import (
"time"
"github.com/cheggaaa/pb"
- blocks "github.com/ipfs/go-block-format"
cid "github.com/ipfs/go-cid"
+ cmds "github.com/ipfs/go-ipfs-cmds"
ipld "github.com/ipfs/go-ipld-format"
"github.com/ipfs/kubo/core/commands/cmdenv"
"github.com/ipfs/kubo/core/commands/cmdutils"
iface "github.com/ipfs/kubo/core/coreiface"
-
- cmds "github.com/ipfs/go-ipfs-cmds"
- gocar "github.com/ipld/go-car"
+ gocar "github.com/ipld/go-car/v2"
+ cidlink "github.com/ipld/go-ipld-prime/linking/cid"
selectorparse "github.com/ipld/go-ipld-prime/traversal/selector/parse"
)
@@ -51,14 +50,27 @@ func dagExport(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment
close(errCh)
}()
- store := dagStore{dag: api.Dag(), ctx: req.Context}
- dag := gocar.Dag{Root: c, Selector: selectorparse.CommonSelector_ExploreAllRecursively}
- // TraverseLinksOnlyOnce is safe for an exhaustive selector but won't be when we allow
- // arbitrary selectors here
- car := gocar.NewSelectiveCar(req.Context, store, []gocar.Dag{dag}, gocar.TraverseLinksOnlyOnce())
- if err := car.Write(pipeW); err != nil {
+ lsys := cidlink.DefaultLinkSystem()
+ lsys.SetReadStorage(&dagStore{dag: api.Dag(), ctx: req.Context})
+
+ // Uncomment the following to support CARv2 output.
+ /*
+ car, err := gocar.NewSelectiveWriter(req.Context, &lsys, c, selectorparse.CommonSelector_ExploreAllRecursively, gocar.AllowDuplicatePuts(false))
+ if err != nil {
+ errCh <- err
+ return
+ }
+ if _, err = car.WriteTo(pipeW); err != nil {
+ errCh <- err
+ return
+ }
+ */
+ _, err := gocar.TraverseV1(req.Context, &lsys, c, selectorparse.CommonSelector_ExploreAllRecursively, pipeW, gocar.AllowDuplicatePuts(false))
+ if err != nil {
errCh <- err
+ return
}
+
}()
if err := res.Emit(pipeR); err != nil {
@@ -69,7 +81,7 @@ func dagExport(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment
err = <-errCh
// minimal user friendliness
- if ipld.IsNotFound(err) {
+ if errors.Is(err, ipld.ErrNotFound{}) {
explicitOffline, _ := req.Options["offline"].(bool)
if explicitOffline {
err = fmt.Errorf("%s (currently offline, perhaps retry without the offline flag)", err)
@@ -112,16 +124,17 @@ func finishCLIExport(res cmds.Response, re cmds.ResponseEmitter) error {
var processedOneResponse bool
for {
v, err := res.Next()
- if err == io.EOF {
-
- // We only write the final bar update on success
- // On error it looks too weird
- bar.Finish()
-
- return re.Close()
- } else if err != nil {
+ if err != nil {
+ if errors.Is(err, io.EOF) {
+ // We only write the final bar update on success
+ // On error it looks too weird
+ bar.Finish()
+ return re.Close()
+ }
return re.CloseWithError(err)
- } else if processedOneResponse {
+ }
+
+ if processedOneResponse {
return re.CloseWithError(errors.New("unexpected multipart response during emit, please file a bugreport"))
}
@@ -133,18 +146,53 @@ func finishCLIExport(res cmds.Response, re cmds.ResponseEmitter) error {
processedOneResponse = true
- if err := re.Emit(bar.NewProxyReader(r)); err != nil {
+ if err = re.Emit(bar.NewProxyReader(r)); err != nil {
return err
}
}
}
-// FIXME(@Jorropo): https://github.com/ipld/go-car/issues/315
type dagStore struct {
dag iface.APIDagService
ctx context.Context
}
-func (ds dagStore) Get(_ context.Context, c cid.Cid) (blocks.Block, error) {
- return ds.dag.Get(ds.ctx, c)
+func (ds *dagStore) Get(ctx context.Context, key string) ([]byte, error) {
+ if ctx.Err() != nil {
+ return nil, ctx.Err()
+ }
+
+ c, err := cidFromBinString(key)
+ if err != nil {
+ return nil, err
+ }
+
+ block, err := ds.dag.Get(ds.ctx, c)
+ if err != nil {
+ return nil, err
+ }
+
+ return block.RawData(), nil
+}
+
+func (ds *dagStore) Has(ctx context.Context, key string) (bool, error) {
+ _, err := ds.Get(ctx, key)
+ if err != nil {
+ if errors.Is(err, ipld.ErrNotFound{}) {
+ return false, nil
+ }
+ return false, err
+ }
+ return true, nil
+}
+
+func cidFromBinString(key string) (cid.Cid, error) {
+ l, k, err := cid.CidFromBytes([]byte(key))
+ if err != nil {
+ return cid.Undef, fmt.Errorf("dagStore: key was not a cid: %w", err)
+ }
+ if l != len(key) {
+ return cid.Undef, fmt.Errorf("dagSore: key was not a cid: had %d bytes leftover", len(key)-l)
+ }
+ return k, nil
}
diff --git a/go.mod b/go.mod
index 155063595..4625dde43 100644
--- a/go.mod
+++ b/go.mod
@@ -43,7 +43,6 @@ require (
github.com/ipfs/go-metrics-prometheus v0.1.0
github.com/ipfs/go-test v0.2.2
github.com/ipfs/go-unixfsnode v1.10.1
- github.com/ipld/go-car v0.6.2
github.com/ipld/go-car/v2 v2.14.3
github.com/ipld/go-codec-dagpb v1.7.0
github.com/ipld/go-ipld-prime v0.21.0
@@ -148,18 +147,11 @@ require (
github.com/huin/goupnp v1.3.0 // indirect
github.com/ipfs/bbloom v0.0.4 // indirect
github.com/ipfs/go-bitfield v1.1.0 // indirect
- github.com/ipfs/go-blockservice v0.5.2 // indirect
- github.com/ipfs/go-ipfs-blockstore v1.3.1 // indirect
github.com/ipfs/go-ipfs-delay v0.0.1 // indirect
github.com/ipfs/go-ipfs-ds-help v1.1.1 // indirect
- github.com/ipfs/go-ipfs-exchange-interface v0.2.1 // indirect
github.com/ipfs/go-ipfs-pq v0.0.3 // indirect
github.com/ipfs/go-ipfs-redirects-file v0.1.2 // indirect
- github.com/ipfs/go-ipfs-util v0.0.3 // indirect
- github.com/ipfs/go-log v1.0.5 // indirect
- github.com/ipfs/go-merkledag v0.11.0 // indirect
github.com/ipfs/go-peertaskqueue v0.8.2 // indirect
- github.com/ipfs/go-verifcid v0.0.3 // indirect
github.com/jackpal/go-nat-pmp v1.0.2 // indirect
github.com/klauspost/compress v1.18.0 // indirect
github.com/klauspost/cpuid/v2 v2.2.10 // indirect
@@ -256,7 +248,6 @@ require (
go.opentelemetry.io/otel/exporters/zipkin v1.31.0 // indirect
go.opentelemetry.io/otel/metric v1.35.0 // indirect
go.opentelemetry.io/proto/otlp v1.3.1 // indirect
- go.uber.org/atomic v1.11.0 // indirect
go.uber.org/automaxprocs v1.6.0 // indirect
go.uber.org/mock v0.5.2 // indirect
go.uber.org/zap/exp v0.3.0 // indirect
diff --git a/go.sum b/go.sum
index 34be1f680..ea6070457 100644
--- a/go.sum
+++ b/go.sum
@@ -358,13 +358,9 @@ github.com/ipfs/boxo v0.32.0 h1:rBs3P53Wt9bFW9WJwVdkzLtzYCXAj2bMjM7+1nrazZw=
github.com/ipfs/boxo v0.32.0/go.mod h1:VEtO3gOmr+sXGodalaTV9Vvsp3qVYegc4Rcu08Iw+wM=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
-github.com/ipfs/go-bitswap v0.11.0 h1:j1WVvhDX1yhG32NTC9xfxnqycqYIlhzEzLXG/cU1HyQ=
-github.com/ipfs/go-bitswap v0.11.0/go.mod h1:05aE8H3XOU+LXpTedeAS0OZpcO1WFsj5niYQH9a1Tmk=
github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk=
github.com/ipfs/go-block-format v0.2.1 h1:96kW71XGNNa+mZw/MTzJrCpMhBWCrd9kBLoKm9Iip/Q=
github.com/ipfs/go-block-format v0.2.1/go.mod h1:frtvXHMQhM6zn7HvEQu+Qz5wSTj+04oEH/I+NjDgEjk=
-github.com/ipfs/go-blockservice v0.5.2 h1:in9Bc+QcXwd1apOVM7Un9t8tixPKdaHQFdLSUM1Xgk8=
-github.com/ipfs/go-blockservice v0.5.2/go.mod h1:VpMblFEqG67A/H2sHKAemeH9vlURVavlysbdUI632yk=
github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM=
github.com/ipfs/go-cid v0.0.4/go.mod h1:4LLaPOQwmk5z9LBgQnpkivrx8BJjUyGwTXCd5Xfj6+M=
github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I=
@@ -394,8 +390,6 @@ github.com/ipfs/go-fs-lock v0.1.1 h1:TecsP/Uc7WqYYatasreZQiP9EGRy4ZnKoG4yXxR33nw
github.com/ipfs/go-fs-lock v0.1.1/go.mod h1:2goSXMCw7QfscHmSe09oXiR34DQeUdm+ei+dhonqly0=
github.com/ipfs/go-ipfs-blockstore v1.3.1 h1:cEI9ci7V0sRNivqaOr0elDsamxXFxJMMMy7PTTDQNsQ=
github.com/ipfs/go-ipfs-blockstore v1.3.1/go.mod h1:KgtZyc9fq+P2xJUiCAzbRdhhqJHvsw8u2Dlqy2MyRTE=
-github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ=
-github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk=
github.com/ipfs/go-ipfs-cmds v0.15.0 h1:nQDgKadrzyiFyYoZMARMIoVoSwe3gGTAfGvrWLeAQbQ=
github.com/ipfs/go-ipfs-cmds v0.15.0/go.mod h1:VABf/mv/wqvYX6hLG6Z+40eNAEw3FQO0bSm370Or3Wk=
github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw=
@@ -403,16 +397,10 @@ github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1I
github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw=
github.com/ipfs/go-ipfs-ds-help v1.1.1 h1:B5UJOH52IbcfS56+Ul+sv8jnIV10lbjLF5eOO0C66Nw=
github.com/ipfs/go-ipfs-ds-help v1.1.1/go.mod h1:75vrVCkSdSFidJscs8n4W+77AtTpCIAdDGAwjitJMIo=
-github.com/ipfs/go-ipfs-exchange-interface v0.2.1 h1:jMzo2VhLKSHbVe+mHNzYgs95n0+t0Q69GQ5WhRDZV/s=
-github.com/ipfs/go-ipfs-exchange-interface v0.2.1/go.mod h1:MUsYn6rKbG6CTtsDp+lKJPmVt3ZrCViNyH3rfPGsZ2E=
-github.com/ipfs/go-ipfs-exchange-offline v0.3.0 h1:c/Dg8GDPzixGd0MC8Jh6mjOwU57uYokgWRFidfvEkuA=
-github.com/ipfs/go-ipfs-exchange-offline v0.3.0/go.mod h1:MOdJ9DChbb5u37M1IcbrRB02e++Z7521fMxqCNRrz9s=
github.com/ipfs/go-ipfs-pq v0.0.3 h1:YpoHVJB+jzK15mr/xsWC574tyDLkezVrDNeaalQBsTE=
github.com/ipfs/go-ipfs-pq v0.0.3/go.mod h1:btNw5hsHBpRcSSgZtiNm/SLj5gYIZ18AKtv3kERkRb4=
github.com/ipfs/go-ipfs-redirects-file v0.1.2 h1:QCK7VtL91FH17KROVVy5KrzDx2hu68QvB2FTWk08ZQk=
github.com/ipfs/go-ipfs-redirects-file v0.1.2/go.mod h1:yIiTlLcDEM/8lS6T3FlCEXZktPPqSOyuY6dEzVqw7Fw=
-github.com/ipfs/go-ipfs-routing v0.3.0 h1:9W/W3N+g+y4ZDeffSgqhgo7BsBSJwPMcyssET9OWevc=
-github.com/ipfs/go-ipfs-routing v0.3.0/go.mod h1:dKqtTFIql7e1zYsEuWLyuOU+E0WJWW8JjbTPLParDWo=
github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc=
github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ=
github.com/ipfs/go-ipfs-util v0.0.3 h1:2RFdGez6bu2ZlZdI+rWfIdbQb1KudQp3VGwPtdNCmE0=
@@ -428,11 +416,8 @@ github.com/ipfs/go-ipld-legacy v0.2.1/go.mod h1:782MOUghNzMO2DER0FlBR94mllfdCJCk
github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM=
github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8=
github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo=
-github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g=
github.com/ipfs/go-log/v2 v2.6.0 h1:2Nu1KKQQ2ayonKp4MPo6pXCjqw1ULc9iohRqWV5EYqg=
github.com/ipfs/go-log/v2 v2.6.0/go.mod h1:p+Efr3qaY5YXpx9TX7MoLCSEZX5boSWj9wh86P5HJa8=
-github.com/ipfs/go-merkledag v0.11.0 h1:DgzwK5hprESOzS4O1t/wi6JDpyVQdvm9Bs59N/jqfBY=
-github.com/ipfs/go-merkledag v0.11.0/go.mod h1:Q4f/1ezvBiJV0YCIXvt51W/9/kqJGH4I1LsA7+djsM4=
github.com/ipfs/go-metrics-interface v0.3.0 h1:YwG7/Cy4R94mYDUuwsBfeziJCVm9pBMJ6q/JR9V40TU=
github.com/ipfs/go-metrics-interface v0.3.0/go.mod h1:OxxQjZDGocXVdyTPocns6cOLwHieqej/jos7H4POwoY=
github.com/ipfs/go-metrics-prometheus v0.1.0 h1:bApWOHkrH3VTBHzTHrZSfq4n4weOZDzZFxUXv+HyKcA=
@@ -443,10 +428,6 @@ github.com/ipfs/go-test v0.2.2 h1:1yjYyfbdt1w93lVzde6JZ2einh3DIV40at4rVoyEcE8=
github.com/ipfs/go-test v0.2.2/go.mod h1:cmLisgVwkdRCnKu/CFZOk2DdhOcwghr5GsHeqwexoRA=
github.com/ipfs/go-unixfsnode v1.10.1 h1:hGKhzuH6NSzZ4y621wGuDspkjXRNG3B+HqhlyTjSwSM=
github.com/ipfs/go-unixfsnode v1.10.1/go.mod h1:eguv/otvacjmfSbYvmamc9ssNAzLvRk0+YN30EYeOOY=
-github.com/ipfs/go-verifcid v0.0.3 h1:gmRKccqhWDocCRkC+a59g5QW7uJw5bpX9HWBevXa0zs=
-github.com/ipfs/go-verifcid v0.0.3/go.mod h1:gcCtGniVzelKrbk9ooUSX/pM3xlH73fZZJDzQJRvOUw=
-github.com/ipld/go-car v0.6.2 h1:Hlnl3Awgnq8icK+ze3iRghk805lu8YNq3wlREDTF2qc=
-github.com/ipld/go-car v0.6.2/go.mod h1:oEGXdwp6bmxJCZ+rARSkDliTeYnVzv3++eXajZ+Bmr8=
github.com/ipld/go-car/v2 v2.14.3 h1:1Mhl82/ny8MVP+w1M4LXbj4j99oK3gnuZG2GmG1IhC8=
github.com/ipld/go-car/v2 v2.14.3/go.mod h1:/vpSvPngOX8UnvmdFJ3o/mDgXa9LuyXsn7wxOzHDYQE=
github.com/ipld/go-codec-dagpb v1.7.0 h1:hpuvQjCSVSLnTnHXn+QAMR0mLmb1gA6wl10LExo2Ts0=
@@ -986,8 +967,6 @@ go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt
go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc=
go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0=
go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8=
-go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
-go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
@@ -1000,12 +979,8 @@ go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
go.uber.org/mock v0.5.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko=
go.uber.org/mock v0.5.2/go.mod h1:wLlUxC2vVTPTaE3UD51E0BGOAElKrILxhVSDYQLld5o=
-go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
-go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
-go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
-go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ=
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
go.uber.org/zap/exp v0.3.0 h1:6JYzdifzYkGmTdRR59oYH+Ng7k49H9qVpWwNSsGJj3U=
@@ -1272,8 +1247,6 @@ golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgw
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
From be241769769ecd3bb29ddae7f2ff04f5157a9a03 Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Wed, 25 Jun 2025 01:26:26 -0700
Subject: [PATCH 268/499] docs: fix minor typos (#10849)
---
README.md | 2 +-
docs/changelogs/v0.10.md | 2 +-
docs/changelogs/v0.4.md | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index 2e6766877..f9953c3b7 100644
--- a/README.md
+++ b/README.md
@@ -224,7 +224,7 @@ $ ipfs get /ipns/dist.ipfs.tech/kubo/$VERSION/kubo_$VERSION_windows-amd64.zip
# pacman -S kubo
```
-[](https://aur.archlinux.org/packages/kubo/)
+[](https://archlinux.org/packages/kubo/)
#### Gentoo Linux
diff --git a/docs/changelogs/v0.10.md b/docs/changelogs/v0.10.md
index 8cfc29a7a..9a1d8b8af 100644
--- a/docs/changelogs/v0.10.md
+++ b/docs/changelogs/v0.10.md
@@ -101,7 +101,7 @@ See `ipfs swarm peering --help` for more details.
- github.com/ipfs/go-ipfs:
- fuse: load unixfs adls as their dagpb substrates
- enable the legacy mDNS implementation
- - test: add dag get --ouput-codec test
+ - test: add dag get --output-codec test
- change ipfs dag get flag name from format to output-codec
- test: check behavior of loading UnixFS sharded directories with missing shards
- remove dag put option shortcuts
diff --git a/docs/changelogs/v0.4.md b/docs/changelogs/v0.4.md
index 2862c8b77..3f2b9c358 100644
--- a/docs/changelogs/v0.4.md
+++ b/docs/changelogs/v0.4.md
@@ -1808,7 +1808,7 @@ The next steps are:
- make timecache duration configurable ([libp2p/go-libp2p-pubsub#148](https://github.com/libp2p/go-libp2p-pubsub/pull/148))
- godoc is not html either ([libp2p/go-libp2p-pubsub#147](https://github.com/libp2p/go-libp2p-pubsub/pull/147))
- godoc documentation is not markdown ([libp2p/go-libp2p-pubsub#146](https://github.com/libp2p/go-libp2p-pubsub/pull/146))
- - Add documentation for subscribe's non-instanteneous semantics ([libp2p/go-libp2p-pubsub#145](https://github.com/libp2p/go-libp2p-pubsub/pull/145))
+ - Add documentation for subscribe's non-instantaneous semantics ([libp2p/go-libp2p-pubsub#145](https://github.com/libp2p/go-libp2p-pubsub/pull/145))
- Some documentation ([libp2p/go-libp2p-pubsub#140](https://github.com/libp2p/go-libp2p-pubsub/pull/140))
- rework peer tracking logic to handle multiple connections ([libp2p/go-libp2p-pubsub#132](https://github.com/libp2p/go-libp2p-pubsub/pull/132))
- github.com/libp2p/go-libp2p-pubsub-router:
From 839023c79d7988f649e6411430f43f7785770cb3 Mon Sep 17 00:00:00 2001
From: sukun
Date: Thu, 26 Jun 2025 02:18:44 +0200
Subject: [PATCH 269/499] chore: p2p-forge v0.6.0 + go-libp2p 0.42.0 (#10840)
* update go-libp2p to v0.42
* chore: p2p-forge v0.6.0 + final go-libp2p 0.42.0
* docs: changelog
---------
Co-authored-by: Marcin Rataj
---
docs/changelogs/v0.36.md | 3 +-
docs/examples/kubo-as-a-library/go.mod | 38 ++++++------
docs/examples/kubo-as-a-library/go.sum | 76 ++++++++++++------------
go.mod | 40 ++++++-------
go.sum | 80 +++++++++++++-------------
test/dependencies/go.mod | 37 ++++++------
test/dependencies/go.sum | 76 ++++++++++++------------
7 files changed, 176 insertions(+), 174 deletions(-)
diff --git a/docs/changelogs/v0.36.md b/docs/changelogs/v0.36.md
index 496ef50e3..fd62f6ef2 100644
--- a/docs/changelogs/v0.36.md
+++ b/docs/changelogs/v0.36.md
@@ -81,10 +81,11 @@ This connection manager option controls how often connections are swept and pote
#### ๐ฆ๏ธ Important dependency updates
+- update `go-libp2p` to [v0.42.0](https://github.com/libp2p/go-libp2p/releases/tag/v0.42.0)
- update `go-libp2p-kad-dht` to [v0.33.0](https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.33.0)
- update `boxo` to [v0.32.0](https://github.com/ipfs/boxo/releases/tag/v0.32.0)
- update `gateway-conformance` to [v0.8](https://github.com/ipfs/gateway-conformance/releases/tag/v0.8.0)
-- update `p2p-forge/client` to **TODO**
+- update `p2p-forge/client` to [v0.6.0](https://github.com/ipshipyard/p2p-forge/releases/tag/v0.6.0)
### ๐ Changelog
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index a6b888485..e99c9706e 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -9,7 +9,7 @@ replace github.com/ipfs/kubo => ./../../..
require (
github.com/ipfs/boxo v0.32.0
github.com/ipfs/kubo v0.0.0-00010101000000-000000000000
- github.com/libp2p/go-libp2p v0.42.0-alpha-2
+ github.com/libp2p/go-libp2p v0.42.0
github.com/multiformats/go-multiaddr v0.16.0
)
@@ -62,7 +62,7 @@ require (
github.com/golang/protobuf v1.5.4 // indirect
github.com/golang/snappy v0.0.5-0.20231225225746-43d5d4cd4e0e // indirect
github.com/google/gopacket v1.1.19 // indirect
- github.com/google/pprof v0.0.0-20250501235452-c0086092b71a // indirect
+ github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/gorilla/websocket v1.5.3 // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect
@@ -98,20 +98,20 @@ require (
github.com/ipld/go-car/v2 v2.14.3 // indirect
github.com/ipld/go-codec-dagpb v1.7.0 // indirect
github.com/ipld/go-ipld-prime v0.21.0 // indirect
- github.com/ipshipyard/p2p-forge v0.5.2-0.20250616211529-2c25ee655b22 // indirect
+ github.com/ipshipyard/p2p-forge v0.6.0 // indirect
github.com/jackpal/go-nat-pmp v1.0.2 // indirect
github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect
github.com/jbenet/goprocess v0.1.4 // indirect
github.com/klauspost/compress v1.18.0 // indirect
github.com/klauspost/cpuid/v2 v2.2.10 // indirect
- github.com/koron/go-ssdp v0.0.5 // indirect
+ github.com/koron/go-ssdp v0.0.6 // indirect
github.com/kr/pretty v0.3.1 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/libdns/libdns v0.2.2 // indirect
github.com/libp2p/go-buffer-pool v0.1.0 // indirect
github.com/libp2p/go-cidranger v1.1.0 // indirect
github.com/libp2p/go-doh-resolver v0.5.0 // indirect
- github.com/libp2p/go-flow-metrics v0.2.0 // indirect
+ github.com/libp2p/go-flow-metrics v0.3.0 // indirect
github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect
github.com/libp2p/go-libp2p-kad-dht v0.33.1 // indirect
github.com/libp2p/go-libp2p-kbucket v0.7.0 // indirect
@@ -123,7 +123,7 @@ require (
github.com/libp2p/go-msgio v0.3.0 // indirect
github.com/libp2p/go-netroute v0.2.2 // indirect
github.com/libp2p/go-reuseport v0.4.0 // indirect
- github.com/libp2p/go-yamux/v5 v5.0.0 // indirect
+ github.com/libp2p/go-yamux/v5 v5.0.1 // indirect
github.com/libp2p/zeroconf/v2 v2.2.0 // indirect
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
@@ -150,28 +150,28 @@ require (
github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 // indirect
github.com/pion/datachannel v1.5.10 // indirect
github.com/pion/dtls/v2 v2.2.12 // indirect
- github.com/pion/dtls/v3 v3.0.4 // indirect
- github.com/pion/ice/v4 v4.0.8 // indirect
- github.com/pion/interceptor v0.1.37 // indirect
+ github.com/pion/dtls/v3 v3.0.6 // indirect
+ github.com/pion/ice/v4 v4.0.10 // indirect
+ github.com/pion/interceptor v0.1.40 // indirect
github.com/pion/logging v0.2.3 // indirect
github.com/pion/mdns/v2 v2.0.7 // indirect
github.com/pion/randutil v0.1.0 // indirect
github.com/pion/rtcp v1.2.15 // indirect
- github.com/pion/rtp v1.8.13 // indirect
- github.com/pion/sctp v1.8.37 // indirect
- github.com/pion/sdp/v3 v3.0.11 // indirect
- github.com/pion/srtp/v3 v3.0.4 // indirect
+ github.com/pion/rtp v1.8.19 // indirect
+ github.com/pion/sctp v1.8.39 // indirect
+ github.com/pion/sdp/v3 v3.0.13 // indirect
+ github.com/pion/srtp/v3 v3.0.6 // indirect
github.com/pion/stun v0.6.1 // indirect
github.com/pion/stun/v3 v3.0.0 // indirect
github.com/pion/transport/v2 v2.2.10 // indirect
github.com/pion/transport/v3 v3.0.7 // indirect
- github.com/pion/turn/v4 v4.0.0 // indirect
- github.com/pion/webrtc/v4 v4.0.14 // indirect
+ github.com/pion/turn/v4 v4.0.2 // indirect
+ github.com/pion/webrtc/v4 v4.1.2 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/polydawn/refmt v0.89.0 // indirect
github.com/prometheus/client_golang v1.22.0 // indirect
github.com/prometheus/client_model v0.6.2 // indirect
- github.com/prometheus/common v0.63.0 // indirect
+ github.com/prometheus/common v0.64.0 // indirect
github.com/prometheus/procfs v0.16.1 // indirect
github.com/quic-go/qpack v0.5.1 // indirect
github.com/quic-go/quic-go v0.52.0 // indirect
@@ -203,8 +203,8 @@ require (
go.opentelemetry.io/otel/trace v1.35.0 // indirect
go.opentelemetry.io/proto/otlp v1.3.1 // indirect
go.uber.org/automaxprocs v1.6.0 // indirect
- go.uber.org/dig v1.18.0 // indirect
- go.uber.org/fx v1.23.0 // indirect
+ go.uber.org/dig v1.19.0 // indirect
+ go.uber.org/fx v1.24.0 // indirect
go.uber.org/mock v0.5.2 // indirect
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.27.0 // indirect
@@ -217,7 +217,7 @@ require (
golang.org/x/sync v0.15.0 // indirect
golang.org/x/sys v0.33.0 // indirect
golang.org/x/text v0.26.0 // indirect
- golang.org/x/time v0.11.0 // indirect
+ golang.org/x/time v0.12.0 // indirect
golang.org/x/tools v0.34.0 // indirect
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
gonum.org/v1/gonum v0.16.0 // indirect
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index 1bfe46b1a..948ec2f14 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -246,8 +246,8 @@ github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OI
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20250501235452-c0086092b71a h1:rDA3FfmxwXR+BVKKdz55WwMJ1pD2hJQNW31d+l3mPk4=
-github.com/google/pprof v0.0.0-20250501235452-c0086092b71a/go.mod h1:5hDyRhoBCxViHszMt12TnOpEI4VVi+U8Gm9iphldiMA=
+github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a h1://KbezygeMJZCSHH+HgUZiTeSoiuFspbMg1ge+eFj18=
+github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a/go.mod h1:5hDyRhoBCxViHszMt12TnOpEI4VVi+U8Gm9iphldiMA=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
@@ -368,8 +368,8 @@ github.com/ipld/go-ipld-prime v0.21.0 h1:n4JmcpOlPDIxBcY037SVfpd1G+Sj1nKZah0m6QH
github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOanyMctpPjsvxQ=
github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd h1:gMlw/MhNr2Wtp5RwGdsW23cs+yCuj9k2ON7i9MiJlRo=
github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd/go.mod h1:wZ8hH8UxeryOs4kJEJaiui/s00hDSbE37OKsL47g+Sw=
-github.com/ipshipyard/p2p-forge v0.5.2-0.20250616211529-2c25ee655b22 h1:J9UVOPm9gSOKM9BurRyHLRVpG5d5TPsYaSwZe1iTNqQ=
-github.com/ipshipyard/p2p-forge v0.5.2-0.20250616211529-2c25ee655b22/go.mod h1:eCkvoEuBwYJpPjMaBtVwLuIU9dzMWiO2hej3zfpbu+4=
+github.com/ipshipyard/p2p-forge v0.6.0 h1:kNhYxgYGtqF3MLts/i0hw+7ygtgNB4Qv8h6fo7j6Iq4=
+github.com/ipshipyard/p2p-forge v0.6.0/go.mod h1:pj8Zcs+ex5OMq5a1bFLHqW0oL3qYO0v5eGLZmit0l7U=
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA=
@@ -400,8 +400,8 @@ github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa02
github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE=
github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
-github.com/koron/go-ssdp v0.0.5 h1:E1iSMxIs4WqxTbIBLtmNBeOOC+1sCIXQeqTWVnpmwhk=
-github.com/koron/go-ssdp v0.0.5/go.mod h1:Qm59B7hpKpDqfyRNWRNr00jGwLdXjDyZh6y7rH6VS0w=
+github.com/koron/go-ssdp v0.0.6 h1:Jb0h04599eq/CY7rB5YEqPS83HmRfHP2azkxMN2rFtU=
+github.com/koron/go-ssdp v0.0.6/go.mod h1:0R9LfRJGek1zWTjN3JUNlm5INCDYGpRDfAptnct63fI=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
@@ -424,10 +424,10 @@ github.com/libp2p/go-doh-resolver v0.5.0 h1:4h7plVVW+XTS+oUBw2+8KfoM1jF6w8XmO7+s
github.com/libp2p/go-doh-resolver v0.5.0/go.mod h1:aPDxfiD2hNURgd13+hfo29z9IC22fv30ee5iM31RzxU=
github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8=
github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs=
-github.com/libp2p/go-flow-metrics v0.2.0 h1:EIZzjmeOE6c8Dav0sNv35vhZxATIXWZg6j/C08XmmDw=
-github.com/libp2p/go-flow-metrics v0.2.0/go.mod h1:st3qqfu8+pMfh+9Mzqb2GTiwrAGjIPszEjZmtksN8Jc=
-github.com/libp2p/go-libp2p v0.42.0-alpha-2 h1:/YdRlrtb/kNge0MszF8mMgO9tEaPBvD1ZGubYaliaBY=
-github.com/libp2p/go-libp2p v0.42.0-alpha-2/go.mod h1:tp7K6LUZDruO2li9fK9cnQAGN8o3yTb8FwUd5AdKv+k=
+github.com/libp2p/go-flow-metrics v0.3.0 h1:q31zcHUvHnwDO0SHaukewPYgwOBSxtt830uJtUx6784=
+github.com/libp2p/go-flow-metrics v0.3.0/go.mod h1:nuhlreIwEguM1IvHAew3ij7A8BMlyHQJ279ao24eZZo=
+github.com/libp2p/go-libp2p v0.42.0 h1:A8foZk+ZEhZTv0Jb++7xUFlrFhBDv4j2Vh/uq4YX+KE=
+github.com/libp2p/go-libp2p v0.42.0/go.mod h1:4NGcjbD9OIvFiSRb0XueCO19zJ4kSPK5vkyyOUYmMro=
github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94=
github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8=
github.com/libp2p/go-libp2p-core v0.2.4/go.mod h1:STh4fdfa5vDYr0/SzYYeqnt+E6KfEV5VxfIrm0bcI0g=
@@ -459,8 +459,8 @@ github.com/libp2p/go-openssl v0.0.3/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO
github.com/libp2p/go-openssl v0.0.4/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc=
github.com/libp2p/go-reuseport v0.4.0 h1:nR5KU7hD0WxXCJbmw7r2rhRYruNRl2koHw8fQscQm2s=
github.com/libp2p/go-reuseport v0.4.0/go.mod h1:ZtI03j/wO5hZVDFo2jKywN6bYKWLOy8Se6DrI2E1cLU=
-github.com/libp2p/go-yamux/v5 v5.0.0 h1:2djUh96d3Jiac/JpGkKs4TO49YhsfLopAoryfPmf+Po=
-github.com/libp2p/go-yamux/v5 v5.0.0/go.mod h1:en+3cdX51U0ZslwRdRLrvQsdayFt3TSUKvBGErzpWbU=
+github.com/libp2p/go-yamux/v5 v5.0.1 h1:f0WoX/bEF2E8SbE4c/k1Mo+/9z0O4oC/hWEA+nfYRSg=
+github.com/libp2p/go-yamux/v5 v5.0.1/go.mod h1:en+3cdX51U0ZslwRdRLrvQsdayFt3TSUKvBGErzpWbU=
github.com/libp2p/zeroconf/v2 v2.2.0 h1:Cup06Jv6u81HLhIj1KasuNM/RHHrJ8T7wOTS4+Tv53Q=
github.com/libp2p/zeroconf/v2 v2.2.0/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0DmyYyNO1Xs=
github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI=
@@ -583,12 +583,12 @@ github.com/pion/datachannel v1.5.10/go.mod h1:p/jJfC9arb29W7WrxyKbepTU20CFgyx5oL
github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s=
github.com/pion/dtls/v2 v2.2.12 h1:KP7H5/c1EiVAAKUmXyCzPiQe5+bCJrpOeKg/L05dunk=
github.com/pion/dtls/v2 v2.2.12/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE=
-github.com/pion/dtls/v3 v3.0.4 h1:44CZekewMzfrn9pmGrj5BNnTMDCFwr+6sLH+cCuLM7U=
-github.com/pion/dtls/v3 v3.0.4/go.mod h1:R373CsjxWqNPf6MEkfdy3aSe9niZvL/JaKlGeFphtMg=
-github.com/pion/ice/v4 v4.0.8 h1:ajNx0idNG+S+v9Phu4LSn2cs8JEfTsA1/tEjkkAVpFY=
-github.com/pion/ice/v4 v4.0.8/go.mod h1:y3M18aPhIxLlcO/4dn9X8LzLLSma84cx6emMSu14FGw=
-github.com/pion/interceptor v0.1.37 h1:aRA8Zpab/wE7/c0O3fh1PqY0AJI3fCSEM5lRWJVorwI=
-github.com/pion/interceptor v0.1.37/go.mod h1:JzxbJ4umVTlZAf+/utHzNesY8tmRkM2lVmkS82TTj8Y=
+github.com/pion/dtls/v3 v3.0.6 h1:7Hkd8WhAJNbRgq9RgdNh1aaWlZlGpYTzdqjy9x9sK2E=
+github.com/pion/dtls/v3 v3.0.6/go.mod h1:iJxNQ3Uhn1NZWOMWlLxEEHAN5yX7GyPvvKw04v9bzYU=
+github.com/pion/ice/v4 v4.0.10 h1:P59w1iauC/wPk9PdY8Vjl4fOFL5B+USq1+xbDcN6gT4=
+github.com/pion/ice/v4 v4.0.10/go.mod h1:y3M18aPhIxLlcO/4dn9X8LzLLSma84cx6emMSu14FGw=
+github.com/pion/interceptor v0.1.40 h1:e0BjnPcGpr2CFQgKhrQisBU7V3GXK6wrfYrGYaU6Jq4=
+github.com/pion/interceptor v0.1.40/go.mod h1:Z6kqH7M/FYirg3frjGJ21VLSRJGBXB/KqaTIrdqnOic=
github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms=
github.com/pion/logging v0.2.3 h1:gHuf0zpoh1GW67Nr6Gj4cv5Z9ZscU7g/EaoC/Ke/igI=
github.com/pion/logging v0.2.3/go.mod h1:z8YfknkquMe1csOrxK5kc+5/ZPAzMxbKLX5aXpbpC90=
@@ -598,14 +598,14 @@ github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA=
github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8=
github.com/pion/rtcp v1.2.15 h1:LZQi2JbdipLOj4eBjK4wlVoQWfrZbh3Q6eHtWtJBZBo=
github.com/pion/rtcp v1.2.15/go.mod h1:jlGuAjHMEXwMUHK78RgX0UmEJFV4zUKOFHR7OP+D3D0=
-github.com/pion/rtp v1.8.13 h1:8uSUPpjSL4OlwZI8Ygqu7+h2p9NPFB+yAZ461Xn5sNg=
-github.com/pion/rtp v1.8.13/go.mod h1:8uMBJj32Pa1wwx8Fuv/AsFhn8jsgw+3rUC2PfoBZ8p4=
-github.com/pion/sctp v1.8.37 h1:ZDmGPtRPX9mKCiVXtMbTWybFw3z/hVKAZgU81wcOrqs=
-github.com/pion/sctp v1.8.37/go.mod h1:cNiLdchXra8fHQwmIoqw0MbLLMs+f7uQ+dGMG2gWebE=
-github.com/pion/sdp/v3 v3.0.11 h1:VhgVSopdsBKwhCFoyyPmT1fKMeV9nLMrEKxNOdy3IVI=
-github.com/pion/sdp/v3 v3.0.11/go.mod h1:88GMahN5xnScv1hIMTqLdu/cOcUkj6a9ytbncwMCq2E=
-github.com/pion/srtp/v3 v3.0.4 h1:2Z6vDVxzrX3UHEgrUyIGM4rRouoC7v+NiF1IHtp9B5M=
-github.com/pion/srtp/v3 v3.0.4/go.mod h1:1Jx3FwDoxpRaTh1oRV8A/6G1BnFL+QI82eK4ms8EEJQ=
+github.com/pion/rtp v1.8.19 h1:jhdO/3XhL/aKm/wARFVmvTfq0lC/CvN1xwYKmduly3c=
+github.com/pion/rtp v1.8.19/go.mod h1:bAu2UFKScgzyFqvUKmbvzSdPr+NGbZtv6UB2hesqXBk=
+github.com/pion/sctp v1.8.39 h1:PJma40vRHa3UTO3C4MyeJDQ+KIobVYRZQZ0Nt7SjQnE=
+github.com/pion/sctp v1.8.39/go.mod h1:cNiLdchXra8fHQwmIoqw0MbLLMs+f7uQ+dGMG2gWebE=
+github.com/pion/sdp/v3 v3.0.13 h1:uN3SS2b+QDZnWXgdr69SM8KB4EbcnPnPf2Laxhty/l4=
+github.com/pion/sdp/v3 v3.0.13/go.mod h1:88GMahN5xnScv1hIMTqLdu/cOcUkj6a9ytbncwMCq2E=
+github.com/pion/srtp/v3 v3.0.6 h1:E2gyj1f5X10sB/qILUGIkL4C2CqK269Xq167PbGCc/4=
+github.com/pion/srtp/v3 v3.0.6/go.mod h1:BxvziG3v/armJHAaJ87euvkhHqWe9I7iiOy50K2QkhY=
github.com/pion/stun v0.6.1 h1:8lp6YejULeHBF8NmV8e2787BogQhduZugh5PdhDyyN4=
github.com/pion/stun v0.6.1/go.mod h1:/hO7APkX4hZKu/D0f2lHzNyvdkTGtIy3NDmLR7kSz/8=
github.com/pion/stun/v3 v3.0.0 h1:4h1gwhWLWuZWOJIJR9s2ferRO+W3zA/b6ijOI6mKzUw=
@@ -616,10 +616,10 @@ github.com/pion/transport/v2 v2.2.10 h1:ucLBLE8nuxiHfvkFKnkDQRYWYfp8ejf4YBOPfaQp
github.com/pion/transport/v2 v2.2.10/go.mod h1:sq1kSLWs+cHW9E+2fJP95QudkzbK7wscs8yYgQToO5E=
github.com/pion/transport/v3 v3.0.7 h1:iRbMH05BzSNwhILHoBoAPxoB9xQgOaJk+591KC9P1o0=
github.com/pion/transport/v3 v3.0.7/go.mod h1:YleKiTZ4vqNxVwh77Z0zytYi7rXHl7j6uPLGhhz9rwo=
-github.com/pion/turn/v4 v4.0.0 h1:qxplo3Rxa9Yg1xXDxxH8xaqcyGUtbHYw4QSCvmFWvhM=
-github.com/pion/turn/v4 v4.0.0/go.mod h1:MuPDkm15nYSklKpN8vWJ9W2M0PlyQZqYt1McGuxG7mA=
-github.com/pion/webrtc/v4 v4.0.14 h1:nyds/sFRR+HvmWoBa6wrL46sSfpArE0qR883MBW96lg=
-github.com/pion/webrtc/v4 v4.0.14/go.mod h1:R3+qTnQTS03UzwDarYecgioNf7DYgTsldxnCXB821Kk=
+github.com/pion/turn/v4 v4.0.2 h1:ZqgQ3+MjP32ug30xAbD6Mn+/K4Sxi3SdNOTFf+7mpps=
+github.com/pion/turn/v4 v4.0.2/go.mod h1:pMMKP/ieNAG/fN5cZiN4SDuyKsXtNTr0ccN7IToA1zs=
+github.com/pion/webrtc/v4 v4.1.2 h1:mpuUo/EJ1zMNKGE79fAdYNFZBX790KE7kQQpLMjjR54=
+github.com/pion/webrtc/v4 v4.1.2/go.mod h1:xsCXiNAmMEjIdFxAYU0MbB3RwRieJsegSB2JZsGN+8U=
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
@@ -640,8 +640,8 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:
github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=
github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
-github.com/prometheus/common v0.63.0 h1:YR/EIY1o3mEFP/kZCD7iDMnLPlGyuU2Gb3HIcXnA98k=
-github.com/prometheus/common v0.63.0/go.mod h1:VVFF/fBIoToEnWRVkYoXEkq3R3paCoxG9PXP74SnV18=
+github.com/prometheus/common v0.64.0 h1:pdZeA+g617P7oGv1CzdTzyeShxAGrTBsolKNOLQPGO4=
+github.com/prometheus/common v0.64.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8=
github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg=
github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is=
@@ -807,10 +807,10 @@ go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8=
-go.uber.org/dig v1.18.0 h1:imUL1UiY0Mg4bqbFfsRQO5G4CGRBec/ZujWTvSVp3pw=
-go.uber.org/dig v1.18.0/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE=
-go.uber.org/fx v1.23.0 h1:lIr/gYWQGfTwGcSXWXu4vP5Ws6iqnNEIY+F/aFzCKTg=
-go.uber.org/fx v1.23.0/go.mod h1:o/D9n+2mLP6v1EG+qsdT1O8wKopYAsqZasju97SDFCU=
+go.uber.org/dig v1.19.0 h1:BACLhebsYdpQ7IROQ1AGPjrXcP5dF80U3gKoFzbaq/4=
+go.uber.org/dig v1.19.0/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE=
+go.uber.org/fx v1.24.0 h1:wE8mruvpg2kiiL1Vqd0CC+tr0/24XIB10Iwp2lLWzkg=
+go.uber.org/fx v1.24.0/go.mod h1:AmDeGyS+ZARGKM4tlH4FY2Jr63VjbEDJHtqXTGP5hbo=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
go.uber.org/mock v0.5.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko=
@@ -1009,8 +1009,8 @@ golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA=
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0=
-golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
+golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE=
+golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
diff --git a/go.mod b/go.mod
index 4625dde43..e343aa2aa 100644
--- a/go.mod
+++ b/go.mod
@@ -46,12 +46,12 @@ require (
github.com/ipld/go-car/v2 v2.14.3
github.com/ipld/go-codec-dagpb v1.7.0
github.com/ipld/go-ipld-prime v0.21.0
- github.com/ipshipyard/p2p-forge v0.5.2-0.20250616211529-2c25ee655b22
+ github.com/ipshipyard/p2p-forge v0.6.0
github.com/jbenet/go-temp-err-catcher v0.1.0
github.com/jbenet/goprocess v0.1.4
github.com/julienschmidt/httprouter v1.3.0
github.com/libp2p/go-doh-resolver v0.5.0
- github.com/libp2p/go-libp2p v0.42.0-alpha-2
+ github.com/libp2p/go-libp2p v0.42.0
github.com/libp2p/go-libp2p-http v0.5.0
github.com/libp2p/go-libp2p-kad-dht v0.33.1
github.com/libp2p/go-libp2p-kbucket v0.7.0
@@ -81,8 +81,8 @@ require (
go.opentelemetry.io/otel v1.35.0
go.opentelemetry.io/otel/sdk v1.31.0
go.opentelemetry.io/otel/trace v1.35.0
- go.uber.org/dig v1.18.0
- go.uber.org/fx v1.23.0
+ go.uber.org/dig v1.19.0
+ go.uber.org/fx v1.24.0
go.uber.org/multierr v1.11.0
go.uber.org/zap v1.27.0
golang.org/x/crypto v0.39.0
@@ -138,7 +138,7 @@ require (
github.com/golang/protobuf v1.5.4 // indirect
github.com/golang/snappy v0.0.5-0.20231225225746-43d5d4cd4e0e // indirect
github.com/google/gopacket v1.1.19 // indirect
- github.com/google/pprof v0.0.0-20250501235452-c0086092b71a // indirect
+ github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a // indirect
github.com/gorilla/mux v1.8.1 // indirect
github.com/gorilla/websocket v1.5.3 // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect
@@ -155,20 +155,20 @@ require (
github.com/jackpal/go-nat-pmp v1.0.2 // indirect
github.com/klauspost/compress v1.18.0 // indirect
github.com/klauspost/cpuid/v2 v2.2.10 // indirect
- github.com/koron/go-ssdp v0.0.5 // indirect
+ github.com/koron/go-ssdp v0.0.6 // indirect
github.com/kr/pretty v0.3.1 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/libdns/libdns v0.2.2 // indirect
github.com/libp2p/go-buffer-pool v0.1.0 // indirect
github.com/libp2p/go-cidranger v1.1.0 // indirect
- github.com/libp2p/go-flow-metrics v0.2.0 // indirect
+ github.com/libp2p/go-flow-metrics v0.3.0 // indirect
github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect
github.com/libp2p/go-libp2p-gostream v0.6.0 // indirect
github.com/libp2p/go-libp2p-xor v0.1.0 // indirect
github.com/libp2p/go-msgio v0.3.0 // indirect
github.com/libp2p/go-netroute v0.2.2 // indirect
github.com/libp2p/go-reuseport v0.4.0 // indirect
- github.com/libp2p/go-yamux/v5 v5.0.0 // indirect
+ github.com/libp2p/go-yamux/v5 v5.0.1 // indirect
github.com/libp2p/zeroconf/v2 v2.2.0 // indirect
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
@@ -192,28 +192,28 @@ require (
github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 // indirect
github.com/pion/datachannel v1.5.10 // indirect
github.com/pion/dtls/v2 v2.2.12 // indirect
- github.com/pion/dtls/v3 v3.0.4 // indirect
- github.com/pion/ice/v4 v4.0.8 // indirect
- github.com/pion/interceptor v0.1.37 // indirect
+ github.com/pion/dtls/v3 v3.0.6 // indirect
+ github.com/pion/ice/v4 v4.0.10 // indirect
+ github.com/pion/interceptor v0.1.40 // indirect
github.com/pion/logging v0.2.3 // indirect
github.com/pion/mdns/v2 v2.0.7 // indirect
github.com/pion/randutil v0.1.0 // indirect
github.com/pion/rtcp v1.2.15 // indirect
- github.com/pion/rtp v1.8.13 // indirect
- github.com/pion/sctp v1.8.37 // indirect
- github.com/pion/sdp/v3 v3.0.11 // indirect
- github.com/pion/srtp/v3 v3.0.4 // indirect
+ github.com/pion/rtp v1.8.19 // indirect
+ github.com/pion/sctp v1.8.39 // indirect
+ github.com/pion/sdp/v3 v3.0.13 // indirect
+ github.com/pion/srtp/v3 v3.0.6 // indirect
github.com/pion/stun v0.6.1 // indirect
github.com/pion/stun/v3 v3.0.0 // indirect
github.com/pion/transport/v2 v2.2.10 // indirect
github.com/pion/transport/v3 v3.0.7 // indirect
- github.com/pion/turn/v4 v4.0.0 // indirect
- github.com/pion/webrtc/v4 v4.0.14 // indirect
+ github.com/pion/turn/v4 v4.0.2 // indirect
+ github.com/pion/webrtc/v4 v4.1.2 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/polydawn/refmt v0.89.0 // indirect
github.com/prometheus/client_model v0.6.2 // indirect
- github.com/prometheus/common v0.63.0 // indirect
+ github.com/prometheus/common v0.64.0 // indirect
github.com/prometheus/procfs v0.16.1 // indirect
github.com/prometheus/statsd_exporter v0.27.1 // indirect
github.com/quic-go/qpack v0.5.1 // indirect
@@ -253,10 +253,10 @@ require (
go.uber.org/zap/exp v0.3.0 // indirect
go4.org v0.0.0-20230225012048-214862532bf5 // indirect
golang.org/x/net v0.41.0 // indirect
- golang.org/x/oauth2 v0.25.0 // indirect
+ golang.org/x/oauth2 v0.30.0 // indirect
golang.org/x/term v0.32.0 // indirect
golang.org/x/text v0.26.0 // indirect
- golang.org/x/time v0.11.0 // indirect
+ golang.org/x/time v0.12.0 // indirect
golang.org/x/tools v0.34.0 // indirect
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
gonum.org/v1/gonum v0.16.0 // indirect
diff --git a/go.sum b/go.sum
index ea6070457..8c403e49c 100644
--- a/go.sum
+++ b/go.sum
@@ -309,8 +309,8 @@ github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hf
github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20250501235452-c0086092b71a h1:rDA3FfmxwXR+BVKKdz55WwMJ1pD2hJQNW31d+l3mPk4=
-github.com/google/pprof v0.0.0-20250501235452-c0086092b71a/go.mod h1:5hDyRhoBCxViHszMt12TnOpEI4VVi+U8Gm9iphldiMA=
+github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a h1://KbezygeMJZCSHH+HgUZiTeSoiuFspbMg1ge+eFj18=
+github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a/go.mod h1:5hDyRhoBCxViHszMt12TnOpEI4VVi+U8Gm9iphldiMA=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
@@ -437,8 +437,8 @@ github.com/ipld/go-ipld-prime v0.21.0 h1:n4JmcpOlPDIxBcY037SVfpd1G+Sj1nKZah0m6QH
github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOanyMctpPjsvxQ=
github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd h1:gMlw/MhNr2Wtp5RwGdsW23cs+yCuj9k2ON7i9MiJlRo=
github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd/go.mod h1:wZ8hH8UxeryOs4kJEJaiui/s00hDSbE37OKsL47g+Sw=
-github.com/ipshipyard/p2p-forge v0.5.2-0.20250616211529-2c25ee655b22 h1:J9UVOPm9gSOKM9BurRyHLRVpG5d5TPsYaSwZe1iTNqQ=
-github.com/ipshipyard/p2p-forge v0.5.2-0.20250616211529-2c25ee655b22/go.mod h1:eCkvoEuBwYJpPjMaBtVwLuIU9dzMWiO2hej3zfpbu+4=
+github.com/ipshipyard/p2p-forge v0.6.0 h1:kNhYxgYGtqF3MLts/i0hw+7ygtgNB4Qv8h6fo7j6Iq4=
+github.com/ipshipyard/p2p-forge v0.6.0/go.mod h1:pj8Zcs+ex5OMq5a1bFLHqW0oL3qYO0v5eGLZmit0l7U=
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
github.com/jbenet/go-cienv v0.1.0 h1:Vc/s0QbQtoxX8MwwSLWWh+xNNZvM3Lw7NsTcHrvvhMc=
@@ -478,8 +478,8 @@ github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2
github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
-github.com/koron/go-ssdp v0.0.5 h1:E1iSMxIs4WqxTbIBLtmNBeOOC+1sCIXQeqTWVnpmwhk=
-github.com/koron/go-ssdp v0.0.5/go.mod h1:Qm59B7hpKpDqfyRNWRNr00jGwLdXjDyZh6y7rH6VS0w=
+github.com/koron/go-ssdp v0.0.6 h1:Jb0h04599eq/CY7rB5YEqPS83HmRfHP2azkxMN2rFtU=
+github.com/koron/go-ssdp v0.0.6/go.mod h1:0R9LfRJGek1zWTjN3JUNlm5INCDYGpRDfAptnct63fI=
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
@@ -505,10 +505,10 @@ github.com/libp2p/go-doh-resolver v0.5.0 h1:4h7plVVW+XTS+oUBw2+8KfoM1jF6w8XmO7+s
github.com/libp2p/go-doh-resolver v0.5.0/go.mod h1:aPDxfiD2hNURgd13+hfo29z9IC22fv30ee5iM31RzxU=
github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8=
github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs=
-github.com/libp2p/go-flow-metrics v0.2.0 h1:EIZzjmeOE6c8Dav0sNv35vhZxATIXWZg6j/C08XmmDw=
-github.com/libp2p/go-flow-metrics v0.2.0/go.mod h1:st3qqfu8+pMfh+9Mzqb2GTiwrAGjIPszEjZmtksN8Jc=
-github.com/libp2p/go-libp2p v0.42.0-alpha-2 h1:/YdRlrtb/kNge0MszF8mMgO9tEaPBvD1ZGubYaliaBY=
-github.com/libp2p/go-libp2p v0.42.0-alpha-2/go.mod h1:tp7K6LUZDruO2li9fK9cnQAGN8o3yTb8FwUd5AdKv+k=
+github.com/libp2p/go-flow-metrics v0.3.0 h1:q31zcHUvHnwDO0SHaukewPYgwOBSxtt830uJtUx6784=
+github.com/libp2p/go-flow-metrics v0.3.0/go.mod h1:nuhlreIwEguM1IvHAew3ij7A8BMlyHQJ279ao24eZZo=
+github.com/libp2p/go-libp2p v0.42.0 h1:A8foZk+ZEhZTv0Jb++7xUFlrFhBDv4j2Vh/uq4YX+KE=
+github.com/libp2p/go-libp2p v0.42.0/go.mod h1:4NGcjbD9OIvFiSRb0XueCO19zJ4kSPK5vkyyOUYmMro=
github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94=
github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8=
github.com/libp2p/go-libp2p-core v0.2.4/go.mod h1:STh4fdfa5vDYr0/SzYYeqnt+E6KfEV5VxfIrm0bcI0g=
@@ -546,8 +546,8 @@ github.com/libp2p/go-reuseport v0.4.0 h1:nR5KU7hD0WxXCJbmw7r2rhRYruNRl2koHw8fQsc
github.com/libp2p/go-reuseport v0.4.0/go.mod h1:ZtI03j/wO5hZVDFo2jKywN6bYKWLOy8Se6DrI2E1cLU=
github.com/libp2p/go-socket-activation v0.1.1 h1:wkLBj6RqKffjt7BI794ewoSt241UV52NKYvIbpzhn4Q=
github.com/libp2p/go-socket-activation v0.1.1/go.mod h1:NBfVUPXTRL/FU6UmSOM+1O7/vJkpS523sQiriw0Qln8=
-github.com/libp2p/go-yamux/v5 v5.0.0 h1:2djUh96d3Jiac/JpGkKs4TO49YhsfLopAoryfPmf+Po=
-github.com/libp2p/go-yamux/v5 v5.0.0/go.mod h1:en+3cdX51U0ZslwRdRLrvQsdayFt3TSUKvBGErzpWbU=
+github.com/libp2p/go-yamux/v5 v5.0.1 h1:f0WoX/bEF2E8SbE4c/k1Mo+/9z0O4oC/hWEA+nfYRSg=
+github.com/libp2p/go-yamux/v5 v5.0.1/go.mod h1:en+3cdX51U0ZslwRdRLrvQsdayFt3TSUKvBGErzpWbU=
github.com/libp2p/zeroconf/v2 v2.2.0 h1:Cup06Jv6u81HLhIj1KasuNM/RHHrJ8T7wOTS4+Tv53Q=
github.com/libp2p/zeroconf/v2 v2.2.0/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0DmyYyNO1Xs=
github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI=
@@ -685,12 +685,12 @@ github.com/pion/datachannel v1.5.10/go.mod h1:p/jJfC9arb29W7WrxyKbepTU20CFgyx5oL
github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s=
github.com/pion/dtls/v2 v2.2.12 h1:KP7H5/c1EiVAAKUmXyCzPiQe5+bCJrpOeKg/L05dunk=
github.com/pion/dtls/v2 v2.2.12/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE=
-github.com/pion/dtls/v3 v3.0.4 h1:44CZekewMzfrn9pmGrj5BNnTMDCFwr+6sLH+cCuLM7U=
-github.com/pion/dtls/v3 v3.0.4/go.mod h1:R373CsjxWqNPf6MEkfdy3aSe9niZvL/JaKlGeFphtMg=
-github.com/pion/ice/v4 v4.0.8 h1:ajNx0idNG+S+v9Phu4LSn2cs8JEfTsA1/tEjkkAVpFY=
-github.com/pion/ice/v4 v4.0.8/go.mod h1:y3M18aPhIxLlcO/4dn9X8LzLLSma84cx6emMSu14FGw=
-github.com/pion/interceptor v0.1.37 h1:aRA8Zpab/wE7/c0O3fh1PqY0AJI3fCSEM5lRWJVorwI=
-github.com/pion/interceptor v0.1.37/go.mod h1:JzxbJ4umVTlZAf+/utHzNesY8tmRkM2lVmkS82TTj8Y=
+github.com/pion/dtls/v3 v3.0.6 h1:7Hkd8WhAJNbRgq9RgdNh1aaWlZlGpYTzdqjy9x9sK2E=
+github.com/pion/dtls/v3 v3.0.6/go.mod h1:iJxNQ3Uhn1NZWOMWlLxEEHAN5yX7GyPvvKw04v9bzYU=
+github.com/pion/ice/v4 v4.0.10 h1:P59w1iauC/wPk9PdY8Vjl4fOFL5B+USq1+xbDcN6gT4=
+github.com/pion/ice/v4 v4.0.10/go.mod h1:y3M18aPhIxLlcO/4dn9X8LzLLSma84cx6emMSu14FGw=
+github.com/pion/interceptor v0.1.40 h1:e0BjnPcGpr2CFQgKhrQisBU7V3GXK6wrfYrGYaU6Jq4=
+github.com/pion/interceptor v0.1.40/go.mod h1:Z6kqH7M/FYirg3frjGJ21VLSRJGBXB/KqaTIrdqnOic=
github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms=
github.com/pion/logging v0.2.3 h1:gHuf0zpoh1GW67Nr6Gj4cv5Z9ZscU7g/EaoC/Ke/igI=
github.com/pion/logging v0.2.3/go.mod h1:z8YfknkquMe1csOrxK5kc+5/ZPAzMxbKLX5aXpbpC90=
@@ -700,14 +700,14 @@ github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA=
github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8=
github.com/pion/rtcp v1.2.15 h1:LZQi2JbdipLOj4eBjK4wlVoQWfrZbh3Q6eHtWtJBZBo=
github.com/pion/rtcp v1.2.15/go.mod h1:jlGuAjHMEXwMUHK78RgX0UmEJFV4zUKOFHR7OP+D3D0=
-github.com/pion/rtp v1.8.13 h1:8uSUPpjSL4OlwZI8Ygqu7+h2p9NPFB+yAZ461Xn5sNg=
-github.com/pion/rtp v1.8.13/go.mod h1:8uMBJj32Pa1wwx8Fuv/AsFhn8jsgw+3rUC2PfoBZ8p4=
-github.com/pion/sctp v1.8.37 h1:ZDmGPtRPX9mKCiVXtMbTWybFw3z/hVKAZgU81wcOrqs=
-github.com/pion/sctp v1.8.37/go.mod h1:cNiLdchXra8fHQwmIoqw0MbLLMs+f7uQ+dGMG2gWebE=
-github.com/pion/sdp/v3 v3.0.11 h1:VhgVSopdsBKwhCFoyyPmT1fKMeV9nLMrEKxNOdy3IVI=
-github.com/pion/sdp/v3 v3.0.11/go.mod h1:88GMahN5xnScv1hIMTqLdu/cOcUkj6a9ytbncwMCq2E=
-github.com/pion/srtp/v3 v3.0.4 h1:2Z6vDVxzrX3UHEgrUyIGM4rRouoC7v+NiF1IHtp9B5M=
-github.com/pion/srtp/v3 v3.0.4/go.mod h1:1Jx3FwDoxpRaTh1oRV8A/6G1BnFL+QI82eK4ms8EEJQ=
+github.com/pion/rtp v1.8.19 h1:jhdO/3XhL/aKm/wARFVmvTfq0lC/CvN1xwYKmduly3c=
+github.com/pion/rtp v1.8.19/go.mod h1:bAu2UFKScgzyFqvUKmbvzSdPr+NGbZtv6UB2hesqXBk=
+github.com/pion/sctp v1.8.39 h1:PJma40vRHa3UTO3C4MyeJDQ+KIobVYRZQZ0Nt7SjQnE=
+github.com/pion/sctp v1.8.39/go.mod h1:cNiLdchXra8fHQwmIoqw0MbLLMs+f7uQ+dGMG2gWebE=
+github.com/pion/sdp/v3 v3.0.13 h1:uN3SS2b+QDZnWXgdr69SM8KB4EbcnPnPf2Laxhty/l4=
+github.com/pion/sdp/v3 v3.0.13/go.mod h1:88GMahN5xnScv1hIMTqLdu/cOcUkj6a9ytbncwMCq2E=
+github.com/pion/srtp/v3 v3.0.6 h1:E2gyj1f5X10sB/qILUGIkL4C2CqK269Xq167PbGCc/4=
+github.com/pion/srtp/v3 v3.0.6/go.mod h1:BxvziG3v/armJHAaJ87euvkhHqWe9I7iiOy50K2QkhY=
github.com/pion/stun v0.6.1 h1:8lp6YejULeHBF8NmV8e2787BogQhduZugh5PdhDyyN4=
github.com/pion/stun v0.6.1/go.mod h1:/hO7APkX4hZKu/D0f2lHzNyvdkTGtIy3NDmLR7kSz/8=
github.com/pion/stun/v3 v3.0.0 h1:4h1gwhWLWuZWOJIJR9s2ferRO+W3zA/b6ijOI6mKzUw=
@@ -718,10 +718,10 @@ github.com/pion/transport/v2 v2.2.10 h1:ucLBLE8nuxiHfvkFKnkDQRYWYfp8ejf4YBOPfaQp
github.com/pion/transport/v2 v2.2.10/go.mod h1:sq1kSLWs+cHW9E+2fJP95QudkzbK7wscs8yYgQToO5E=
github.com/pion/transport/v3 v3.0.7 h1:iRbMH05BzSNwhILHoBoAPxoB9xQgOaJk+591KC9P1o0=
github.com/pion/transport/v3 v3.0.7/go.mod h1:YleKiTZ4vqNxVwh77Z0zytYi7rXHl7j6uPLGhhz9rwo=
-github.com/pion/turn/v4 v4.0.0 h1:qxplo3Rxa9Yg1xXDxxH8xaqcyGUtbHYw4QSCvmFWvhM=
-github.com/pion/turn/v4 v4.0.0/go.mod h1:MuPDkm15nYSklKpN8vWJ9W2M0PlyQZqYt1McGuxG7mA=
-github.com/pion/webrtc/v4 v4.0.14 h1:nyds/sFRR+HvmWoBa6wrL46sSfpArE0qR883MBW96lg=
-github.com/pion/webrtc/v4 v4.0.14/go.mod h1:R3+qTnQTS03UzwDarYecgioNf7DYgTsldxnCXB821Kk=
+github.com/pion/turn/v4 v4.0.2 h1:ZqgQ3+MjP32ug30xAbD6Mn+/K4Sxi3SdNOTFf+7mpps=
+github.com/pion/turn/v4 v4.0.2/go.mod h1:pMMKP/ieNAG/fN5cZiN4SDuyKsXtNTr0ccN7IToA1zs=
+github.com/pion/webrtc/v4 v4.1.2 h1:mpuUo/EJ1zMNKGE79fAdYNFZBX790KE7kQQpLMjjR54=
+github.com/pion/webrtc/v4 v4.1.2/go.mod h1:xsCXiNAmMEjIdFxAYU0MbB3RwRieJsegSB2JZsGN+8U=
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
@@ -758,8 +758,8 @@ github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9
github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
github.com/prometheus/common v0.35.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=
github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=
-github.com/prometheus/common v0.63.0 h1:YR/EIY1o3mEFP/kZCD7iDMnLPlGyuU2Gb3HIcXnA98k=
-github.com/prometheus/common v0.63.0/go.mod h1:VVFF/fBIoToEnWRVkYoXEkq3R3paCoxG9PXP74SnV18=
+github.com/prometheus/common v0.64.0 h1:pdZeA+g617P7oGv1CzdTzyeShxAGrTBsolKNOLQPGO4=
+github.com/prometheus/common v0.64.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8=
github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
@@ -971,10 +971,10 @@ go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8=
-go.uber.org/dig v1.18.0 h1:imUL1UiY0Mg4bqbFfsRQO5G4CGRBec/ZujWTvSVp3pw=
-go.uber.org/dig v1.18.0/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE=
-go.uber.org/fx v1.23.0 h1:lIr/gYWQGfTwGcSXWXu4vP5Ws6iqnNEIY+F/aFzCKTg=
-go.uber.org/fx v1.23.0/go.mod h1:o/D9n+2mLP6v1EG+qsdT1O8wKopYAsqZasju97SDFCU=
+go.uber.org/dig v1.19.0 h1:BACLhebsYdpQ7IROQ1AGPjrXcP5dF80U3gKoFzbaq/4=
+go.uber.org/dig v1.19.0/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE=
+go.uber.org/fx v1.24.0 h1:wE8mruvpg2kiiL1Vqd0CC+tr0/24XIB10Iwp2lLWzkg=
+go.uber.org/fx v1.24.0/go.mod h1:AmDeGyS+ZARGKM4tlH4FY2Jr63VjbEDJHtqXTGP5hbo=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
go.uber.org/mock v0.5.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko=
@@ -1109,8 +1109,8 @@ golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4Iltr
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
-golang.org/x/oauth2 v0.25.0 h1:CY4y7XT9v0cRI9oupztF8AgiIu99L/ksR/Xp/6jrZ70=
-golang.org/x/oauth2 v0.25.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
+golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
+golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=
golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -1224,8 +1224,8 @@ golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxb
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0=
-golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
+golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE=
+golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index 40eaa7914..b061d286e 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -79,6 +79,7 @@ require (
github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5 // indirect
github.com/fatih/color v1.17.0 // indirect
github.com/fatih/structtag v1.2.0 // indirect
+ github.com/filecoin-project/go-clock v0.1.0 // indirect
github.com/firefart/nonamedreturns v1.0.5 // indirect
github.com/flynn/noise v1.1.0 // indirect
github.com/francoispqt/gojay v1.2.13 // indirect
@@ -113,7 +114,7 @@ require (
github.com/golangci/unconvert v0.0.0-20240309020433-c5143eacb3ed // indirect
github.com/google/go-cmp v0.7.0 // indirect
github.com/google/gopacket v1.1.19 // indirect
- github.com/google/pprof v0.0.0-20250501235452-c0086092b71a // indirect
+ github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a // indirect
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/gordonklaus/ineffassign v0.1.0 // indirect
@@ -140,7 +141,7 @@ require (
github.com/ipfs/kubo v0.31.0 // indirect
github.com/ipld/go-codec-dagpb v1.7.0 // indirect
github.com/ipld/go-ipld-prime v0.21.0 // indirect
- github.com/ipshipyard/p2p-forge v0.5.2-0.20250616211529-2c25ee655b22 // indirect
+ github.com/ipshipyard/p2p-forge v0.6.0 // indirect
github.com/jackpal/go-nat-pmp v1.0.2 // indirect
github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect
github.com/jgautheron/goconst v1.7.1 // indirect
@@ -153,7 +154,7 @@ require (
github.com/kkHAIKE/contextcheck v1.1.5 // indirect
github.com/klauspost/compress v1.18.0 // indirect
github.com/klauspost/cpuid/v2 v2.2.10 // indirect
- github.com/koron/go-ssdp v0.0.5 // indirect
+ github.com/koron/go-ssdp v0.0.6 // indirect
github.com/kr/pretty v0.3.1 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/kulti/thelper v0.6.3 // indirect
@@ -166,8 +167,8 @@ require (
github.com/libdns/libdns v0.2.2 // indirect
github.com/libp2p/go-buffer-pool v0.1.0 // indirect
github.com/libp2p/go-cidranger v1.1.0 // indirect
- github.com/libp2p/go-flow-metrics v0.2.0 // indirect
- github.com/libp2p/go-libp2p v0.42.0-alpha-2 // indirect
+ github.com/libp2p/go-flow-metrics v0.3.0 // indirect
+ github.com/libp2p/go-libp2p v0.42.0 // indirect
github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect
github.com/libp2p/go-libp2p-kad-dht v0.33.1 // indirect
github.com/libp2p/go-libp2p-kbucket v0.7.0 // indirect
@@ -213,30 +214,30 @@ require (
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
github.com/pion/datachannel v1.5.10 // indirect
github.com/pion/dtls/v2 v2.2.12 // indirect
- github.com/pion/dtls/v3 v3.0.4 // indirect
- github.com/pion/ice/v4 v4.0.8 // indirect
- github.com/pion/interceptor v0.1.37 // indirect
+ github.com/pion/dtls/v3 v3.0.6 // indirect
+ github.com/pion/ice/v4 v4.0.10 // indirect
+ github.com/pion/interceptor v0.1.40 // indirect
github.com/pion/logging v0.2.3 // indirect
github.com/pion/mdns/v2 v2.0.7 // indirect
github.com/pion/randutil v0.1.0 // indirect
github.com/pion/rtcp v1.2.15 // indirect
- github.com/pion/rtp v1.8.13 // indirect
- github.com/pion/sctp v1.8.37 // indirect
- github.com/pion/sdp/v3 v3.0.11 // indirect
- github.com/pion/srtp/v3 v3.0.4 // indirect
+ github.com/pion/rtp v1.8.19 // indirect
+ github.com/pion/sctp v1.8.39 // indirect
+ github.com/pion/sdp/v3 v3.0.13 // indirect
+ github.com/pion/srtp/v3 v3.0.6 // indirect
github.com/pion/stun v0.6.1 // indirect
github.com/pion/stun/v3 v3.0.0 // indirect
github.com/pion/transport/v2 v2.2.10 // indirect
github.com/pion/transport/v3 v3.0.7 // indirect
- github.com/pion/turn/v4 v4.0.0 // indirect
- github.com/pion/webrtc/v4 v4.0.14 // indirect
+ github.com/pion/turn/v4 v4.0.2 // indirect
+ github.com/pion/webrtc/v4 v4.1.2 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/polydawn/refmt v0.89.0 // indirect
github.com/polyfloyd/go-errorlint v1.6.0 // indirect
github.com/prometheus/client_golang v1.22.0 // indirect
github.com/prometheus/client_model v0.6.2 // indirect
- github.com/prometheus/common v0.63.0 // indirect
+ github.com/prometheus/common v0.64.0 // indirect
github.com/prometheus/procfs v0.16.1 // indirect
github.com/quasilyte/go-ruleguard v0.4.2 // indirect
github.com/quasilyte/go-ruleguard/dsl v0.3.22 // indirect
@@ -304,8 +305,8 @@ require (
go.opentelemetry.io/otel/metric v1.35.0 // indirect
go.opentelemetry.io/otel/trace v1.35.0 // indirect
go.uber.org/automaxprocs v1.6.0 // indirect
- go.uber.org/dig v1.18.0 // indirect
- go.uber.org/fx v1.23.0 // indirect
+ go.uber.org/dig v1.19.0 // indirect
+ go.uber.org/fx v1.24.0 // indirect
go.uber.org/mock v0.5.2 // indirect
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.27.0 // indirect
@@ -319,7 +320,7 @@ require (
golang.org/x/sys v0.33.0 // indirect
golang.org/x/term v0.32.0 // indirect
golang.org/x/text v0.26.0 // indirect
- golang.org/x/time v0.11.0 // indirect
+ golang.org/x/time v0.12.0 // indirect
golang.org/x/tools v0.34.0 // indirect
gonum.org/v1/gonum v0.16.0 // indirect
google.golang.org/protobuf v1.36.6 // indirect
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index cc37881a8..b3b0de5c2 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -273,8 +273,8 @@ github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF
github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo=
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
-github.com/google/pprof v0.0.0-20250501235452-c0086092b71a h1:rDA3FfmxwXR+BVKKdz55WwMJ1pD2hJQNW31d+l3mPk4=
-github.com/google/pprof v0.0.0-20250501235452-c0086092b71a/go.mod h1:5hDyRhoBCxViHszMt12TnOpEI4VVi+U8Gm9iphldiMA=
+github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a h1://KbezygeMJZCSHH+HgUZiTeSoiuFspbMg1ge+eFj18=
+github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a/go.mod h1:5hDyRhoBCxViHszMt12TnOpEI4VVi+U8Gm9iphldiMA=
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
@@ -359,8 +359,8 @@ github.com/ipld/go-codec-dagpb v1.7.0 h1:hpuvQjCSVSLnTnHXn+QAMR0mLmb1gA6wl10LExo
github.com/ipld/go-codec-dagpb v1.7.0/go.mod h1:rD3Zg+zub9ZnxcLwfol/OTQRVjaLzXypgy4UqHQvilM=
github.com/ipld/go-ipld-prime v0.21.0 h1:n4JmcpOlPDIxBcY037SVfpd1G+Sj1nKZah0m6QH9C2E=
github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOanyMctpPjsvxQ=
-github.com/ipshipyard/p2p-forge v0.5.2-0.20250616211529-2c25ee655b22 h1:J9UVOPm9gSOKM9BurRyHLRVpG5d5TPsYaSwZe1iTNqQ=
-github.com/ipshipyard/p2p-forge v0.5.2-0.20250616211529-2c25ee655b22/go.mod h1:eCkvoEuBwYJpPjMaBtVwLuIU9dzMWiO2hej3zfpbu+4=
+github.com/ipshipyard/p2p-forge v0.6.0 h1:kNhYxgYGtqF3MLts/i0hw+7ygtgNB4Qv8h6fo7j6Iq4=
+github.com/ipshipyard/p2p-forge v0.6.0/go.mod h1:pj8Zcs+ex5OMq5a1bFLHqW0oL3qYO0v5eGLZmit0l7U=
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
github.com/jbenet/go-temp-err-catcher v0.1.0 h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABoLk/+KKHggpk=
@@ -392,8 +392,8 @@ github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zt
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE=
github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
-github.com/koron/go-ssdp v0.0.5 h1:E1iSMxIs4WqxTbIBLtmNBeOOC+1sCIXQeqTWVnpmwhk=
-github.com/koron/go-ssdp v0.0.5/go.mod h1:Qm59B7hpKpDqfyRNWRNr00jGwLdXjDyZh6y7rH6VS0w=
+github.com/koron/go-ssdp v0.0.6 h1:Jb0h04599eq/CY7rB5YEqPS83HmRfHP2azkxMN2rFtU=
+github.com/koron/go-ssdp v0.0.6/go.mod h1:0R9LfRJGek1zWTjN3JUNlm5INCDYGpRDfAptnct63fI=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
@@ -423,10 +423,10 @@ github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6
github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg=
github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38yPW7c=
github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic=
-github.com/libp2p/go-flow-metrics v0.2.0 h1:EIZzjmeOE6c8Dav0sNv35vhZxATIXWZg6j/C08XmmDw=
-github.com/libp2p/go-flow-metrics v0.2.0/go.mod h1:st3qqfu8+pMfh+9Mzqb2GTiwrAGjIPszEjZmtksN8Jc=
-github.com/libp2p/go-libp2p v0.42.0-alpha-2 h1:/YdRlrtb/kNge0MszF8mMgO9tEaPBvD1ZGubYaliaBY=
-github.com/libp2p/go-libp2p v0.42.0-alpha-2/go.mod h1:tp7K6LUZDruO2li9fK9cnQAGN8o3yTb8FwUd5AdKv+k=
+github.com/libp2p/go-flow-metrics v0.3.0 h1:q31zcHUvHnwDO0SHaukewPYgwOBSxtt830uJtUx6784=
+github.com/libp2p/go-flow-metrics v0.3.0/go.mod h1:nuhlreIwEguM1IvHAew3ij7A8BMlyHQJ279ao24eZZo=
+github.com/libp2p/go-libp2p v0.42.0 h1:A8foZk+ZEhZTv0Jb++7xUFlrFhBDv4j2Vh/uq4YX+KE=
+github.com/libp2p/go-libp2p v0.42.0/go.mod h1:4NGcjbD9OIvFiSRb0XueCO19zJ4kSPK5vkyyOUYmMro=
github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94=
github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8=
github.com/libp2p/go-libp2p-kad-dht v0.33.1 h1:hKFhHMf7WH69LDjaxsJUWOU6qZm71uO47M/a5ijkiP0=
@@ -445,8 +445,8 @@ github.com/libp2p/go-netroute v0.2.2 h1:Dejd8cQ47Qx2kRABg6lPwknU7+nBnFRpko45/fFP
github.com/libp2p/go-netroute v0.2.2/go.mod h1:Rntq6jUAH0l9Gg17w5bFGhcC9a+vk4KNXs6s7IljKYE=
github.com/libp2p/go-reuseport v0.4.0 h1:nR5KU7hD0WxXCJbmw7r2rhRYruNRl2koHw8fQscQm2s=
github.com/libp2p/go-reuseport v0.4.0/go.mod h1:ZtI03j/wO5hZVDFo2jKywN6bYKWLOy8Se6DrI2E1cLU=
-github.com/libp2p/go-yamux/v5 v5.0.0 h1:2djUh96d3Jiac/JpGkKs4TO49YhsfLopAoryfPmf+Po=
-github.com/libp2p/go-yamux/v5 v5.0.0/go.mod h1:en+3cdX51U0ZslwRdRLrvQsdayFt3TSUKvBGErzpWbU=
+github.com/libp2p/go-yamux/v5 v5.0.1 h1:f0WoX/bEF2E8SbE4c/k1Mo+/9z0O4oC/hWEA+nfYRSg=
+github.com/libp2p/go-yamux/v5 v5.0.1/go.mod h1:en+3cdX51U0ZslwRdRLrvQsdayFt3TSUKvBGErzpWbU=
github.com/lufeee/execinquery v1.2.1 h1:hf0Ems4SHcUGBxpGN7Jz78z1ppVkP/837ZlETPCEtOM=
github.com/lufeee/execinquery v1.2.1/go.mod h1:EC7DrEKView09ocscGHC+apXMIaorh4xqSxS/dy8SbM=
github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI=
@@ -563,12 +563,12 @@ github.com/pion/datachannel v1.5.10/go.mod h1:p/jJfC9arb29W7WrxyKbepTU20CFgyx5oL
github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s=
github.com/pion/dtls/v2 v2.2.12 h1:KP7H5/c1EiVAAKUmXyCzPiQe5+bCJrpOeKg/L05dunk=
github.com/pion/dtls/v2 v2.2.12/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE=
-github.com/pion/dtls/v3 v3.0.4 h1:44CZekewMzfrn9pmGrj5BNnTMDCFwr+6sLH+cCuLM7U=
-github.com/pion/dtls/v3 v3.0.4/go.mod h1:R373CsjxWqNPf6MEkfdy3aSe9niZvL/JaKlGeFphtMg=
-github.com/pion/ice/v4 v4.0.8 h1:ajNx0idNG+S+v9Phu4LSn2cs8JEfTsA1/tEjkkAVpFY=
-github.com/pion/ice/v4 v4.0.8/go.mod h1:y3M18aPhIxLlcO/4dn9X8LzLLSma84cx6emMSu14FGw=
-github.com/pion/interceptor v0.1.37 h1:aRA8Zpab/wE7/c0O3fh1PqY0AJI3fCSEM5lRWJVorwI=
-github.com/pion/interceptor v0.1.37/go.mod h1:JzxbJ4umVTlZAf+/utHzNesY8tmRkM2lVmkS82TTj8Y=
+github.com/pion/dtls/v3 v3.0.6 h1:7Hkd8WhAJNbRgq9RgdNh1aaWlZlGpYTzdqjy9x9sK2E=
+github.com/pion/dtls/v3 v3.0.6/go.mod h1:iJxNQ3Uhn1NZWOMWlLxEEHAN5yX7GyPvvKw04v9bzYU=
+github.com/pion/ice/v4 v4.0.10 h1:P59w1iauC/wPk9PdY8Vjl4fOFL5B+USq1+xbDcN6gT4=
+github.com/pion/ice/v4 v4.0.10/go.mod h1:y3M18aPhIxLlcO/4dn9X8LzLLSma84cx6emMSu14FGw=
+github.com/pion/interceptor v0.1.40 h1:e0BjnPcGpr2CFQgKhrQisBU7V3GXK6wrfYrGYaU6Jq4=
+github.com/pion/interceptor v0.1.40/go.mod h1:Z6kqH7M/FYirg3frjGJ21VLSRJGBXB/KqaTIrdqnOic=
github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms=
github.com/pion/logging v0.2.3 h1:gHuf0zpoh1GW67Nr6Gj4cv5Z9ZscU7g/EaoC/Ke/igI=
github.com/pion/logging v0.2.3/go.mod h1:z8YfknkquMe1csOrxK5kc+5/ZPAzMxbKLX5aXpbpC90=
@@ -578,14 +578,14 @@ github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA=
github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8=
github.com/pion/rtcp v1.2.15 h1:LZQi2JbdipLOj4eBjK4wlVoQWfrZbh3Q6eHtWtJBZBo=
github.com/pion/rtcp v1.2.15/go.mod h1:jlGuAjHMEXwMUHK78RgX0UmEJFV4zUKOFHR7OP+D3D0=
-github.com/pion/rtp v1.8.13 h1:8uSUPpjSL4OlwZI8Ygqu7+h2p9NPFB+yAZ461Xn5sNg=
-github.com/pion/rtp v1.8.13/go.mod h1:8uMBJj32Pa1wwx8Fuv/AsFhn8jsgw+3rUC2PfoBZ8p4=
-github.com/pion/sctp v1.8.37 h1:ZDmGPtRPX9mKCiVXtMbTWybFw3z/hVKAZgU81wcOrqs=
-github.com/pion/sctp v1.8.37/go.mod h1:cNiLdchXra8fHQwmIoqw0MbLLMs+f7uQ+dGMG2gWebE=
-github.com/pion/sdp/v3 v3.0.11 h1:VhgVSopdsBKwhCFoyyPmT1fKMeV9nLMrEKxNOdy3IVI=
-github.com/pion/sdp/v3 v3.0.11/go.mod h1:88GMahN5xnScv1hIMTqLdu/cOcUkj6a9ytbncwMCq2E=
-github.com/pion/srtp/v3 v3.0.4 h1:2Z6vDVxzrX3UHEgrUyIGM4rRouoC7v+NiF1IHtp9B5M=
-github.com/pion/srtp/v3 v3.0.4/go.mod h1:1Jx3FwDoxpRaTh1oRV8A/6G1BnFL+QI82eK4ms8EEJQ=
+github.com/pion/rtp v1.8.19 h1:jhdO/3XhL/aKm/wARFVmvTfq0lC/CvN1xwYKmduly3c=
+github.com/pion/rtp v1.8.19/go.mod h1:bAu2UFKScgzyFqvUKmbvzSdPr+NGbZtv6UB2hesqXBk=
+github.com/pion/sctp v1.8.39 h1:PJma40vRHa3UTO3C4MyeJDQ+KIobVYRZQZ0Nt7SjQnE=
+github.com/pion/sctp v1.8.39/go.mod h1:cNiLdchXra8fHQwmIoqw0MbLLMs+f7uQ+dGMG2gWebE=
+github.com/pion/sdp/v3 v3.0.13 h1:uN3SS2b+QDZnWXgdr69SM8KB4EbcnPnPf2Laxhty/l4=
+github.com/pion/sdp/v3 v3.0.13/go.mod h1:88GMahN5xnScv1hIMTqLdu/cOcUkj6a9ytbncwMCq2E=
+github.com/pion/srtp/v3 v3.0.6 h1:E2gyj1f5X10sB/qILUGIkL4C2CqK269Xq167PbGCc/4=
+github.com/pion/srtp/v3 v3.0.6/go.mod h1:BxvziG3v/armJHAaJ87euvkhHqWe9I7iiOy50K2QkhY=
github.com/pion/stun v0.6.1 h1:8lp6YejULeHBF8NmV8e2787BogQhduZugh5PdhDyyN4=
github.com/pion/stun v0.6.1/go.mod h1:/hO7APkX4hZKu/D0f2lHzNyvdkTGtIy3NDmLR7kSz/8=
github.com/pion/stun/v3 v3.0.0 h1:4h1gwhWLWuZWOJIJR9s2ferRO+W3zA/b6ijOI6mKzUw=
@@ -596,10 +596,10 @@ github.com/pion/transport/v2 v2.2.10 h1:ucLBLE8nuxiHfvkFKnkDQRYWYfp8ejf4YBOPfaQp
github.com/pion/transport/v2 v2.2.10/go.mod h1:sq1kSLWs+cHW9E+2fJP95QudkzbK7wscs8yYgQToO5E=
github.com/pion/transport/v3 v3.0.7 h1:iRbMH05BzSNwhILHoBoAPxoB9xQgOaJk+591KC9P1o0=
github.com/pion/transport/v3 v3.0.7/go.mod h1:YleKiTZ4vqNxVwh77Z0zytYi7rXHl7j6uPLGhhz9rwo=
-github.com/pion/turn/v4 v4.0.0 h1:qxplo3Rxa9Yg1xXDxxH8xaqcyGUtbHYw4QSCvmFWvhM=
-github.com/pion/turn/v4 v4.0.0/go.mod h1:MuPDkm15nYSklKpN8vWJ9W2M0PlyQZqYt1McGuxG7mA=
-github.com/pion/webrtc/v4 v4.0.14 h1:nyds/sFRR+HvmWoBa6wrL46sSfpArE0qR883MBW96lg=
-github.com/pion/webrtc/v4 v4.0.14/go.mod h1:R3+qTnQTS03UzwDarYecgioNf7DYgTsldxnCXB821Kk=
+github.com/pion/turn/v4 v4.0.2 h1:ZqgQ3+MjP32ug30xAbD6Mn+/K4Sxi3SdNOTFf+7mpps=
+github.com/pion/turn/v4 v4.0.2/go.mod h1:pMMKP/ieNAG/fN5cZiN4SDuyKsXtNTr0ccN7IToA1zs=
+github.com/pion/webrtc/v4 v4.1.2 h1:mpuUo/EJ1zMNKGE79fAdYNFZBX790KE7kQQpLMjjR54=
+github.com/pion/webrtc/v4 v4.1.2/go.mod h1:xsCXiNAmMEjIdFxAYU0MbB3RwRieJsegSB2JZsGN+8U=
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
@@ -620,8 +620,8 @@ github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:
github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=
github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
-github.com/prometheus/common v0.63.0 h1:YR/EIY1o3mEFP/kZCD7iDMnLPlGyuU2Gb3HIcXnA98k=
-github.com/prometheus/common v0.63.0/go.mod h1:VVFF/fBIoToEnWRVkYoXEkq3R3paCoxG9PXP74SnV18=
+github.com/prometheus/common v0.64.0 h1:pdZeA+g617P7oGv1CzdTzyeShxAGrTBsolKNOLQPGO4=
+github.com/prometheus/common v0.64.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8=
github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg=
github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is=
@@ -832,10 +832,10 @@ go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt
go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc=
go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8=
-go.uber.org/dig v1.18.0 h1:imUL1UiY0Mg4bqbFfsRQO5G4CGRBec/ZujWTvSVp3pw=
-go.uber.org/dig v1.18.0/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE=
-go.uber.org/fx v1.23.0 h1:lIr/gYWQGfTwGcSXWXu4vP5Ws6iqnNEIY+F/aFzCKTg=
-go.uber.org/fx v1.23.0/go.mod h1:o/D9n+2mLP6v1EG+qsdT1O8wKopYAsqZasju97SDFCU=
+go.uber.org/dig v1.19.0 h1:BACLhebsYdpQ7IROQ1AGPjrXcP5dF80U3gKoFzbaq/4=
+go.uber.org/dig v1.19.0/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE=
+go.uber.org/fx v1.24.0 h1:wE8mruvpg2kiiL1Vqd0CC+tr0/24XIB10Iwp2lLWzkg=
+go.uber.org/fx v1.24.0/go.mod h1:AmDeGyS+ZARGKM4tlH4FY2Jr63VjbEDJHtqXTGP5hbo=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
go.uber.org/mock v0.5.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko=
@@ -1026,8 +1026,8 @@ golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M=
golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA=
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0=
-golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
+golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE=
+golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
From 024225eaf25bc183c6398bdae257c7c301426b79 Mon Sep 17 00:00:00 2001
From: Hector Sanjuan
Date: Thu, 26 Jun 2025 12:42:51 +0200
Subject: [PATCH 270/499] core:constructor: add a log line about http retrieval
Similar to broadcast control. Useful for debugging/info purposes.
---
core/node/bitswap.go | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/core/node/bitswap.go b/core/node/bitswap.go
index 9da278305..7e87f8288 100644
--- a/core/node/bitswap.go
+++ b/core/node/bitswap.go
@@ -99,6 +99,11 @@ func Bitswap(serverEnabled, libp2pEnabled, httpEnabled bool) interface{} {
if err != nil {
return nil, err
}
+ logger.Infof("HTTP Retrieval enabled: Allowlist: %t. Denylist: %t",
+ httpCfg.Allowlist != nil,
+ httpCfg.Denylist != nil,
+ )
+
bitswapHTTP := httpnet.New(in.Host,
httpnet.WithHTTPWorkers(int(httpCfg.NumWorkers.WithDefault(config.DefaultHTTPRetrievalNumWorkers))),
httpnet.WithAllowlist(httpCfg.Allowlist),
From 6f0c1de58fe0eb5e1c67b68b036a8275ba7bb5d7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C5=A0tefan=20Baebler?=
<319826+stefanb@users.noreply.github.com>
Date: Wed, 2 Jul 2025 04:32:33 +0200
Subject: [PATCH 271/499] chore: Upgrade github.com/cockroachdb/pebble/v2 to
v2.0.6 for Go 1.25 support (#10850)
* Upgrade github.com/cockroachdb/swiss for Go 1.25 support
Go 1.25 incompatibility detected in
* https://github.com/Homebrew/homebrew-core/pull/226636
then:
* reported upstream in https://github.com/cockroachdb/swiss/issues/48
* fixed upstream https://github.com/cockroachdb/swiss/pull/49
This PR brings this fix upstream to kubo.
The fix was brought to github.com/cockroachdb/pebble/v2 in
* https://github.com/cockroachdb/pebble/pull/4954
And released in https://github.com/cockroachdb/pebble/releases/tag/v2.0.6
Which is now used.
Full changelog: https://github.com/cockroachdb/pebble/compare/v2.0.3...v2.0.6
* Upgrade to go-ds-pebble v0.5.1 for pebbel v2.0.6 support
---------
Co-authored-by: gammazero <11790789+gammazero@users.noreply.github.com>
---
docs/changelogs/v0.36.md | 1 +
docs/examples/kubo-as-a-library/go.mod | 6 +++---
docs/examples/kubo-as-a-library/go.sum | 12 ++++++------
go.mod | 6 +++---
go.sum | 12 ++++++------
test/dependencies/go.mod | 4 ++--
test/dependencies/go.sum | 8 ++++----
7 files changed, 25 insertions(+), 24 deletions(-)
diff --git a/docs/changelogs/v0.36.md b/docs/changelogs/v0.36.md
index fd62f6ef2..4806e3b54 100644
--- a/docs/changelogs/v0.36.md
+++ b/docs/changelogs/v0.36.md
@@ -86,6 +86,7 @@ This connection manager option controls how often connections are swept and pote
- update `boxo` to [v0.32.0](https://github.com/ipfs/boxo/releases/tag/v0.32.0)
- update `gateway-conformance` to [v0.8](https://github.com/ipfs/gateway-conformance/releases/tag/v0.8.0)
- update `p2p-forge/client` to [v0.6.0](https://github.com/ipshipyard/p2p-forge/releases/tag/v0.6.0)
+- update `github.com/cockroachdb/pebble/v2` to [v2.0.6](https://github.com/cockroachdb/pebble/releases/tag/v2.0.6) for Go 1.25 support
### ๐ Changelog
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index e99c9706e..237780e0a 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -32,9 +32,9 @@ require (
github.com/cockroachdb/errors v1.11.3 // indirect
github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect
- github.com/cockroachdb/pebble/v2 v2.0.3 // indirect
+ github.com/cockroachdb/pebble/v2 v2.0.6 // indirect
github.com/cockroachdb/redact v1.1.5 // indirect
- github.com/cockroachdb/swiss v0.0.0-20250327203710-2932b022f6df // indirect
+ github.com/cockroachdb/swiss v0.0.0-20250624142022-d6e517c1d961 // indirect
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect
github.com/crackcomm/go-gitignore v0.0.0-20241020182519-7843d2ba8fdf // indirect
github.com/cskr/pubsub v1.0.2 // indirect
@@ -81,7 +81,7 @@ require (
github.com/ipfs/go-ds-flatfs v0.5.5 // indirect
github.com/ipfs/go-ds-leveldb v0.5.2 // indirect
github.com/ipfs/go-ds-measure v0.2.2 // indirect
- github.com/ipfs/go-ds-pebble v0.5.0 // indirect
+ github.com/ipfs/go-ds-pebble v0.5.1 // indirect
github.com/ipfs/go-fs-lock v0.1.1 // indirect
github.com/ipfs/go-ipfs-delay v0.0.1 // indirect
github.com/ipfs/go-ipfs-ds-help v1.1.1 // indirect
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index 948ec2f14..c9a5574dc 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -91,12 +91,12 @@ github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZe
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs=
github.com/cockroachdb/metamorphic v0.0.0-20231108215700-4ba948b56895 h1:XANOgPYtvELQ/h4IrmPAohXqe2pWA8Bwhejr3VQoZsA=
github.com/cockroachdb/metamorphic v0.0.0-20231108215700-4ba948b56895/go.mod h1:aPd7gM9ov9M8v32Yy5NJrDyOcD8z642dqs+F0CeNXfA=
-github.com/cockroachdb/pebble/v2 v2.0.3 h1:YJ3Sc9jRN/q6OOCNyRHPbcpenbxL1DdgdpUqPlPus6o=
-github.com/cockroachdb/pebble/v2 v2.0.3/go.mod h1:NgxgNcWwyG/uxkLUZGM2aelshaLIZvc0hCX7SCfaO8s=
+github.com/cockroachdb/pebble/v2 v2.0.6 h1:eL54kX2AKp1ePJ/8vq4IO3xIEPpvVjlSP12dlLYilyE=
+github.com/cockroachdb/pebble/v2 v2.0.6/go.mod h1:un1DXG73PKw3F7Ndd30YactyvsFviI9Fuhe0tENdnyA=
github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30=
github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg=
-github.com/cockroachdb/swiss v0.0.0-20250327203710-2932b022f6df h1:GUJ4KuZtbOcIfRlprHJFFvIqQ4irtQUl+1fJr+yNmPI=
-github.com/cockroachdb/swiss v0.0.0-20250327203710-2932b022f6df/go.mod h1:yBRu/cnL4ks9bgy4vAASdjIW+/xMlFwuHKqtmh3GZQg=
+github.com/cockroachdb/swiss v0.0.0-20250624142022-d6e517c1d961 h1:Nua446ru3juLHLZd4AwKNzClZgL1co3pUPGv3o8FlcA=
+github.com/cockroachdb/swiss v0.0.0-20250624142022-d6e517c1d961/go.mod h1:yBRu/cnL4ks9bgy4vAASdjIW+/xMlFwuHKqtmh3GZQg=
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo=
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ=
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
@@ -319,8 +319,8 @@ github.com/ipfs/go-ds-leveldb v0.5.2 h1:6nmxlQ2zbp4LCNdJVsmHfs9GP0eylfBNxpmY1csp
github.com/ipfs/go-ds-leveldb v0.5.2/go.mod h1:2fAwmcvD3WoRT72PzEekHBkQmBDhc39DJGoREiuGmYo=
github.com/ipfs/go-ds-measure v0.2.2 h1:4kwvBGbbSXNYe4ANlg7qTIYoZU6mNlqzQHdVqICkqGI=
github.com/ipfs/go-ds-measure v0.2.2/go.mod h1:b/87ak0jMgH9Ylt7oH0+XGy4P8jHx9KG09Qz+pOeTIs=
-github.com/ipfs/go-ds-pebble v0.5.0 h1:lXffYCAKVD7nLLPqwJ9D8IxgO7Kz8woiX021tezdsIM=
-github.com/ipfs/go-ds-pebble v0.5.0/go.mod h1:aiCRVcj3K60sxc6k5C+HO9C6rouqiSkjR/WKnbTcMfQ=
+github.com/ipfs/go-ds-pebble v0.5.1 h1:p0FAE0zw9J/3T1VkGB9s98jWmfKmw2t0iEwfMUv8iSQ=
+github.com/ipfs/go-ds-pebble v0.5.1/go.mod h1:LsmQx4w+0o9znl4hTxYo1Y2lnBTzNCwc4kNpD3wWXM0=
github.com/ipfs/go-fs-lock v0.1.1 h1:TecsP/Uc7WqYYatasreZQiP9EGRy4ZnKoG4yXxR33nw=
github.com/ipfs/go-fs-lock v0.1.1/go.mod h1:2goSXMCw7QfscHmSe09oXiR34DQeUdm+ei+dhonqly0=
github.com/ipfs/go-ipfs-blockstore v1.3.1 h1:cEI9ci7V0sRNivqaOr0elDsamxXFxJMMMy7PTTDQNsQ=
diff --git a/go.mod b/go.mod
index e343aa2aa..4abc0b7d4 100644
--- a/go.mod
+++ b/go.mod
@@ -10,7 +10,7 @@ require (
github.com/cenkalti/backoff/v4 v4.3.0
github.com/ceramicnetwork/go-dag-jose v0.1.1
github.com/cheggaaa/pb v1.0.29
- github.com/cockroachdb/pebble/v2 v2.0.3
+ github.com/cockroachdb/pebble/v2 v2.0.6
github.com/coreos/go-systemd/v22 v22.5.0
github.com/dustin/go-humanize v1.0.1
github.com/elgris/jsondiff v0.0.0-20160530203242-765b5c24c302
@@ -31,7 +31,7 @@ require (
github.com/ipfs/go-ds-flatfs v0.5.5
github.com/ipfs/go-ds-leveldb v0.5.2
github.com/ipfs/go-ds-measure v0.2.2
- github.com/ipfs/go-ds-pebble v0.5.0
+ github.com/ipfs/go-ds-pebble v0.5.1
github.com/ipfs/go-fs-lock v0.1.1
github.com/ipfs/go-ipfs-cmds v0.15.0
github.com/ipfs/go-ipld-cbor v0.2.0
@@ -109,7 +109,7 @@ require (
github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect
github.com/cockroachdb/redact v1.1.5 // indirect
- github.com/cockroachdb/swiss v0.0.0-20250327203710-2932b022f6df // indirect
+ github.com/cockroachdb/swiss v0.0.0-20250624142022-d6e517c1d961 // indirect
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect
github.com/crackcomm/go-gitignore v0.0.0-20241020182519-7843d2ba8fdf // indirect
github.com/cskr/pubsub v1.0.2 // indirect
diff --git a/go.sum b/go.sum
index 8c403e49c..79548813a 100644
--- a/go.sum
+++ b/go.sum
@@ -121,12 +121,12 @@ github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZe
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs=
github.com/cockroachdb/metamorphic v0.0.0-20231108215700-4ba948b56895 h1:XANOgPYtvELQ/h4IrmPAohXqe2pWA8Bwhejr3VQoZsA=
github.com/cockroachdb/metamorphic v0.0.0-20231108215700-4ba948b56895/go.mod h1:aPd7gM9ov9M8v32Yy5NJrDyOcD8z642dqs+F0CeNXfA=
-github.com/cockroachdb/pebble/v2 v2.0.3 h1:YJ3Sc9jRN/q6OOCNyRHPbcpenbxL1DdgdpUqPlPus6o=
-github.com/cockroachdb/pebble/v2 v2.0.3/go.mod h1:NgxgNcWwyG/uxkLUZGM2aelshaLIZvc0hCX7SCfaO8s=
+github.com/cockroachdb/pebble/v2 v2.0.6 h1:eL54kX2AKp1ePJ/8vq4IO3xIEPpvVjlSP12dlLYilyE=
+github.com/cockroachdb/pebble/v2 v2.0.6/go.mod h1:un1DXG73PKw3F7Ndd30YactyvsFviI9Fuhe0tENdnyA=
github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30=
github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg=
-github.com/cockroachdb/swiss v0.0.0-20250327203710-2932b022f6df h1:GUJ4KuZtbOcIfRlprHJFFvIqQ4irtQUl+1fJr+yNmPI=
-github.com/cockroachdb/swiss v0.0.0-20250327203710-2932b022f6df/go.mod h1:yBRu/cnL4ks9bgy4vAASdjIW+/xMlFwuHKqtmh3GZQg=
+github.com/cockroachdb/swiss v0.0.0-20250624142022-d6e517c1d961 h1:Nua446ru3juLHLZd4AwKNzClZgL1co3pUPGv3o8FlcA=
+github.com/cockroachdb/swiss v0.0.0-20250624142022-d6e517c1d961/go.mod h1:yBRu/cnL4ks9bgy4vAASdjIW+/xMlFwuHKqtmh3GZQg=
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo=
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ=
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
@@ -384,8 +384,8 @@ github.com/ipfs/go-ds-leveldb v0.5.2 h1:6nmxlQ2zbp4LCNdJVsmHfs9GP0eylfBNxpmY1csp
github.com/ipfs/go-ds-leveldb v0.5.2/go.mod h1:2fAwmcvD3WoRT72PzEekHBkQmBDhc39DJGoREiuGmYo=
github.com/ipfs/go-ds-measure v0.2.2 h1:4kwvBGbbSXNYe4ANlg7qTIYoZU6mNlqzQHdVqICkqGI=
github.com/ipfs/go-ds-measure v0.2.2/go.mod h1:b/87ak0jMgH9Ylt7oH0+XGy4P8jHx9KG09Qz+pOeTIs=
-github.com/ipfs/go-ds-pebble v0.5.0 h1:lXffYCAKVD7nLLPqwJ9D8IxgO7Kz8woiX021tezdsIM=
-github.com/ipfs/go-ds-pebble v0.5.0/go.mod h1:aiCRVcj3K60sxc6k5C+HO9C6rouqiSkjR/WKnbTcMfQ=
+github.com/ipfs/go-ds-pebble v0.5.1 h1:p0FAE0zw9J/3T1VkGB9s98jWmfKmw2t0iEwfMUv8iSQ=
+github.com/ipfs/go-ds-pebble v0.5.1/go.mod h1:LsmQx4w+0o9znl4hTxYo1Y2lnBTzNCwc4kNpD3wWXM0=
github.com/ipfs/go-fs-lock v0.1.1 h1:TecsP/Uc7WqYYatasreZQiP9EGRy4ZnKoG4yXxR33nw=
github.com/ipfs/go-fs-lock v0.1.1/go.mod h1:2goSXMCw7QfscHmSe09oXiR34DQeUdm+ei+dhonqly0=
github.com/ipfs/go-ipfs-blockstore v1.3.1 h1:cEI9ci7V0sRNivqaOr0elDsamxXFxJMMMy7PTTDQNsQ=
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index b061d286e..1ca2c871b 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -62,9 +62,9 @@ require (
github.com/cockroachdb/errors v1.11.3 // indirect
github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect
- github.com/cockroachdb/pebble/v2 v2.0.3 // indirect
+ github.com/cockroachdb/pebble/v2 v2.0.6 // indirect
github.com/cockroachdb/redact v1.1.5 // indirect
- github.com/cockroachdb/swiss v0.0.0-20250327203710-2932b022f6df // indirect
+ github.com/cockroachdb/swiss v0.0.0-20250624142022-d6e517c1d961 // indirect
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect
github.com/crackcomm/go-gitignore v0.0.0-20241020182519-7843d2ba8fdf // indirect
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index b3b0de5c2..a9af9d086 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -112,12 +112,12 @@ github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZe
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs=
github.com/cockroachdb/metamorphic v0.0.0-20231108215700-4ba948b56895 h1:XANOgPYtvELQ/h4IrmPAohXqe2pWA8Bwhejr3VQoZsA=
github.com/cockroachdb/metamorphic v0.0.0-20231108215700-4ba948b56895/go.mod h1:aPd7gM9ov9M8v32Yy5NJrDyOcD8z642dqs+F0CeNXfA=
-github.com/cockroachdb/pebble/v2 v2.0.3 h1:YJ3Sc9jRN/q6OOCNyRHPbcpenbxL1DdgdpUqPlPus6o=
-github.com/cockroachdb/pebble/v2 v2.0.3/go.mod h1:NgxgNcWwyG/uxkLUZGM2aelshaLIZvc0hCX7SCfaO8s=
+github.com/cockroachdb/pebble/v2 v2.0.6 h1:eL54kX2AKp1ePJ/8vq4IO3xIEPpvVjlSP12dlLYilyE=
+github.com/cockroachdb/pebble/v2 v2.0.6/go.mod h1:un1DXG73PKw3F7Ndd30YactyvsFviI9Fuhe0tENdnyA=
github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30=
github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg=
-github.com/cockroachdb/swiss v0.0.0-20250327203710-2932b022f6df h1:GUJ4KuZtbOcIfRlprHJFFvIqQ4irtQUl+1fJr+yNmPI=
-github.com/cockroachdb/swiss v0.0.0-20250327203710-2932b022f6df/go.mod h1:yBRu/cnL4ks9bgy4vAASdjIW+/xMlFwuHKqtmh3GZQg=
+github.com/cockroachdb/swiss v0.0.0-20250624142022-d6e517c1d961 h1:Nua446ru3juLHLZd4AwKNzClZgL1co3pUPGv3o8FlcA=
+github.com/cockroachdb/swiss v0.0.0-20250624142022-d6e517c1d961/go.mod h1:yBRu/cnL4ks9bgy4vAASdjIW+/xMlFwuHKqtmh3GZQg=
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo=
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ=
github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
From 738d5232fb61cce57a4d29415df94dfe54e4f118 Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Tue, 8 Jul 2025 02:45:43 -0700
Subject: [PATCH 272/499] Upgrade to Boxo v0.33.0 (#10857)
* Upgrade to Boxo v0.33.0
* Update test to work with boxo-v0.33.0
---
docs/changelogs/v0.36.md | 2 +-
docs/examples/kubo-as-a-library/go.mod | 12 ++++++------
docs/examples/kubo-as-a-library/go.sum | 24 ++++++++++++------------
go.mod | 12 ++++++------
go.sum | 24 ++++++++++++------------
routing/delegated_test.go | 8 ++++----
test/dependencies/go.mod | 12 ++++++------
test/dependencies/go.sum | 24 ++++++++++++------------
8 files changed, 59 insertions(+), 59 deletions(-)
diff --git a/docs/changelogs/v0.36.md b/docs/changelogs/v0.36.md
index 4806e3b54..7137180bd 100644
--- a/docs/changelogs/v0.36.md
+++ b/docs/changelogs/v0.36.md
@@ -83,7 +83,7 @@ This connection manager option controls how often connections are swept and pote
- update `go-libp2p` to [v0.42.0](https://github.com/libp2p/go-libp2p/releases/tag/v0.42.0)
- update `go-libp2p-kad-dht` to [v0.33.0](https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.33.0)
-- update `boxo` to [v0.32.0](https://github.com/ipfs/boxo/releases/tag/v0.32.0)
+- update `boxo` to [v0.33.0](https://github.com/ipfs/boxo/releases/tag/v0.33.0) (incl. [v0.32.0](https://github.com/ipfs/boxo/releases/tag/v0.32.0))
- update `gateway-conformance` to [v0.8](https://github.com/ipfs/gateway-conformance/releases/tag/v0.8.0)
- update `p2p-forge/client` to [v0.6.0](https://github.com/ipshipyard/p2p-forge/releases/tag/v0.6.0)
- update `github.com/cockroachdb/pebble/v2` to [v2.0.6](https://github.com/cockroachdb/pebble/releases/tag/v2.0.6) for Go 1.25 support
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index 237780e0a..6c0881fab 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -7,7 +7,7 @@ go 1.24
replace github.com/ipfs/kubo => ./../../..
require (
- github.com/ipfs/boxo v0.32.0
+ github.com/ipfs/boxo v0.33.0
github.com/ipfs/kubo v0.0.0-00010101000000-000000000000
github.com/libp2p/go-libp2p v0.42.0
github.com/multiformats/go-multiaddr v0.16.0
@@ -73,7 +73,7 @@ require (
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 // indirect
github.com/ipfs/bbloom v0.0.4 // indirect
github.com/ipfs/go-bitfield v1.1.0 // indirect
- github.com/ipfs/go-block-format v0.2.1 // indirect
+ github.com/ipfs/go-block-format v0.2.2 // indirect
github.com/ipfs/go-cid v0.5.0 // indirect
github.com/ipfs/go-cidutil v0.1.0 // indirect
github.com/ipfs/go-datastore v0.8.2 // indirect
@@ -88,9 +88,9 @@ require (
github.com/ipfs/go-ipfs-pq v0.0.3 // indirect
github.com/ipfs/go-ipfs-redirects-file v0.1.2 // indirect
github.com/ipfs/go-ipld-cbor v0.2.0 // indirect
- github.com/ipfs/go-ipld-format v0.6.1 // indirect
+ github.com/ipfs/go-ipld-format v0.6.2 // indirect
github.com/ipfs/go-ipld-git v0.1.1 // indirect
- github.com/ipfs/go-ipld-legacy v0.2.1 // indirect
+ github.com/ipfs/go-ipld-legacy v0.2.2 // indirect
github.com/ipfs/go-log/v2 v2.6.0 // indirect
github.com/ipfs/go-metrics-interface v0.3.0 // indirect
github.com/ipfs/go-peertaskqueue v0.8.2 // indirect
@@ -138,7 +138,7 @@ require (
github.com/multiformats/go-multiaddr-dns v0.4.1 // indirect
github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect
github.com/multiformats/go-multibase v0.2.0 // indirect
- github.com/multiformats/go-multicodec v0.9.1 // indirect
+ github.com/multiformats/go-multicodec v0.9.2 // indirect
github.com/multiformats/go-multihash v0.2.3 // indirect
github.com/multiformats/go-multistream v0.6.1 // indirect
github.com/multiformats/go-varint v0.0.7 // indirect
@@ -211,7 +211,7 @@ require (
go.uber.org/zap/exp v0.3.0 // indirect
go4.org v0.0.0-20230225012048-214862532bf5 // indirect
golang.org/x/crypto v0.39.0 // indirect
- golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476 // indirect
+ golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b // indirect
golang.org/x/mod v0.25.0 // indirect
golang.org/x/net v0.41.0 // indirect
golang.org/x/sync v0.15.0 // indirect
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index c9a5574dc..bcaa73e90 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -289,13 +289,13 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcd
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.32.0 h1:rBs3P53Wt9bFW9WJwVdkzLtzYCXAj2bMjM7+1nrazZw=
-github.com/ipfs/boxo v0.32.0/go.mod h1:VEtO3gOmr+sXGodalaTV9Vvsp3qVYegc4Rcu08Iw+wM=
+github.com/ipfs/boxo v0.33.0 h1:9ow3chwkDzMj0Deq4AWRUEI7WnIIV7SZhPTzzG2mmfw=
+github.com/ipfs/boxo v0.33.0/go.mod h1:3IPh7YFcCIcKp6o02mCHovrPntoT5Pctj/7j4syh/RM=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk=
-github.com/ipfs/go-block-format v0.2.1 h1:96kW71XGNNa+mZw/MTzJrCpMhBWCrd9kBLoKm9Iip/Q=
-github.com/ipfs/go-block-format v0.2.1/go.mod h1:frtvXHMQhM6zn7HvEQu+Qz5wSTj+04oEH/I+NjDgEjk=
+github.com/ipfs/go-block-format v0.2.2 h1:uecCTgRwDIXyZPgYspaLXoMiMmxQpSx2aq34eNc4YvQ=
+github.com/ipfs/go-block-format v0.2.2/go.mod h1:vmuefuWU6b+9kIU0vZJgpiJt1yicQz9baHXE8qR+KB8=
github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM=
github.com/ipfs/go-cid v0.0.4/go.mod h1:4LLaPOQwmk5z9LBgQnpkivrx8BJjUyGwTXCd5Xfj6+M=
github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I=
@@ -340,12 +340,12 @@ github.com/ipfs/go-ipfs-util v0.0.3 h1:2RFdGez6bu2ZlZdI+rWfIdbQb1KudQp3VGwPtdNCm
github.com/ipfs/go-ipfs-util v0.0.3/go.mod h1:LHzG1a0Ig4G+iZ26UUOMjHd+lfM84LZCrn17xAKWBvs=
github.com/ipfs/go-ipld-cbor v0.2.0 h1:VHIW3HVIjcMd8m4ZLZbrYpwjzqlVUfjLM7oK4T5/YF0=
github.com/ipfs/go-ipld-cbor v0.2.0/go.mod h1:Cp8T7w1NKcu4AQJLqK0tWpd1nkgTxEVB5C6kVpLW6/0=
-github.com/ipfs/go-ipld-format v0.6.1 h1:lQLmBM/HHbrXvjIkrydRXkn+gc0DE5xO5fqelsCKYOQ=
-github.com/ipfs/go-ipld-format v0.6.1/go.mod h1:8TOH1Hj+LFyqM2PjSqI2/ZnyO0KlfhHbJLkbxFa61hs=
+github.com/ipfs/go-ipld-format v0.6.2 h1:bPZQ+A05ol0b3lsJSl0bLvwbuQ+HQbSsdGTy4xtYUkU=
+github.com/ipfs/go-ipld-format v0.6.2/go.mod h1:nni2xFdHKx5lxvXJ6brt/pndtGxKAE+FPR1rg4jTkyk=
github.com/ipfs/go-ipld-git v0.1.1 h1:TWGnZjS0htmEmlMFEkA3ogrNCqWjIxwr16x1OsdhG+Y=
github.com/ipfs/go-ipld-git v0.1.1/go.mod h1:+VyMqF5lMcJh4rwEppV0e6g4nCCHXThLYYDpKUkJubI=
-github.com/ipfs/go-ipld-legacy v0.2.1 h1:mDFtrBpmU7b//LzLSypVrXsD8QxkEWxu5qVxN99/+tk=
-github.com/ipfs/go-ipld-legacy v0.2.1/go.mod h1:782MOUghNzMO2DER0FlBR94mllfdCJCkTtDtPM51otM=
+github.com/ipfs/go-ipld-legacy v0.2.2 h1:DThbqCPVLpWBcGtU23KDLiY2YRZZnTkXQyfz8aOfBkQ=
+github.com/ipfs/go-ipld-legacy v0.2.2/go.mod h1:hhkj+b3kG9b2BcUNw8IFYAsfeNo8E3U7eYlWeAOPyDU=
github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM=
github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8=
github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo=
@@ -525,8 +525,8 @@ github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/g
github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc=
github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g=
github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk=
-github.com/multiformats/go-multicodec v0.9.1 h1:x/Fuxr7ZuR4jJV4Os5g444F7xC4XmyUaT/FWtE+9Zjo=
-github.com/multiformats/go-multicodec v0.9.1/go.mod h1:LLWNMtyV5ithSBUo3vFIMaeDy+h3EbkMTek1m+Fybbo=
+github.com/multiformats/go-multicodec v0.9.2 h1:YrlXCuqxjqm3bXl+vBq5LKz5pz4mvAsugdqy78k0pXQ=
+github.com/multiformats/go-multicodec v0.9.2/go.mod h1:LLWNMtyV5ithSBUo3vFIMaeDy+h3EbkMTek1m+Fybbo=
github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U=
github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew=
github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew=
@@ -854,8 +854,8 @@ golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE
golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
-golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476 h1:bsqhLWFR6G6xiQcb+JoGqdKdRU6WzPWmK8E0jxTjzo4=
-golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8=
+golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/yqS/lQJ6PmkyIV3YP+o=
+golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
diff --git a/go.mod b/go.mod
index 4abc0b7d4..77bc12fc2 100644
--- a/go.mod
+++ b/go.mod
@@ -21,8 +21,8 @@ require (
github.com/hashicorp/go-version v1.7.0
github.com/ipfs-shipyard/nopfs v0.0.14
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0
- github.com/ipfs/boxo v0.32.0
- github.com/ipfs/go-block-format v0.2.1
+ github.com/ipfs/boxo v0.33.0
+ github.com/ipfs/go-block-format v0.2.2
github.com/ipfs/go-cid v0.5.0
github.com/ipfs/go-cidutil v0.1.0
github.com/ipfs/go-datastore v0.8.2
@@ -35,9 +35,9 @@ require (
github.com/ipfs/go-fs-lock v0.1.1
github.com/ipfs/go-ipfs-cmds v0.15.0
github.com/ipfs/go-ipld-cbor v0.2.0
- github.com/ipfs/go-ipld-format v0.6.1
+ github.com/ipfs/go-ipld-format v0.6.2
github.com/ipfs/go-ipld-git v0.1.1
- github.com/ipfs/go-ipld-legacy v0.2.1
+ github.com/ipfs/go-ipld-legacy v0.2.2
github.com/ipfs/go-log/v2 v2.6.0
github.com/ipfs/go-metrics-interface v0.3.0
github.com/ipfs/go-metrics-prometheus v0.1.0
@@ -64,7 +64,7 @@ require (
github.com/multiformats/go-multiaddr v0.16.0
github.com/multiformats/go-multiaddr-dns v0.4.1
github.com/multiformats/go-multibase v0.2.0
- github.com/multiformats/go-multicodec v0.9.1
+ github.com/multiformats/go-multicodec v0.9.2
github.com/multiformats/go-multihash v0.2.3
github.com/opentracing/opentracing-go v1.2.0
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58
@@ -86,7 +86,7 @@ require (
go.uber.org/multierr v1.11.0
go.uber.org/zap v1.27.0
golang.org/x/crypto v0.39.0
- golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476
+ golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b
golang.org/x/mod v0.25.0
golang.org/x/sync v0.15.0
golang.org/x/sys v0.33.0
diff --git a/go.sum b/go.sum
index 79548813a..943c6a7e2 100644
--- a/go.sum
+++ b/go.sum
@@ -354,13 +354,13 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcd
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.32.0 h1:rBs3P53Wt9bFW9WJwVdkzLtzYCXAj2bMjM7+1nrazZw=
-github.com/ipfs/boxo v0.32.0/go.mod h1:VEtO3gOmr+sXGodalaTV9Vvsp3qVYegc4Rcu08Iw+wM=
+github.com/ipfs/boxo v0.33.0 h1:9ow3chwkDzMj0Deq4AWRUEI7WnIIV7SZhPTzzG2mmfw=
+github.com/ipfs/boxo v0.33.0/go.mod h1:3IPh7YFcCIcKp6o02mCHovrPntoT5Pctj/7j4syh/RM=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk=
-github.com/ipfs/go-block-format v0.2.1 h1:96kW71XGNNa+mZw/MTzJrCpMhBWCrd9kBLoKm9Iip/Q=
-github.com/ipfs/go-block-format v0.2.1/go.mod h1:frtvXHMQhM6zn7HvEQu+Qz5wSTj+04oEH/I+NjDgEjk=
+github.com/ipfs/go-block-format v0.2.2 h1:uecCTgRwDIXyZPgYspaLXoMiMmxQpSx2aq34eNc4YvQ=
+github.com/ipfs/go-block-format v0.2.2/go.mod h1:vmuefuWU6b+9kIU0vZJgpiJt1yicQz9baHXE8qR+KB8=
github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM=
github.com/ipfs/go-cid v0.0.4/go.mod h1:4LLaPOQwmk5z9LBgQnpkivrx8BJjUyGwTXCd5Xfj6+M=
github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I=
@@ -407,12 +407,12 @@ github.com/ipfs/go-ipfs-util v0.0.3 h1:2RFdGez6bu2ZlZdI+rWfIdbQb1KudQp3VGwPtdNCm
github.com/ipfs/go-ipfs-util v0.0.3/go.mod h1:LHzG1a0Ig4G+iZ26UUOMjHd+lfM84LZCrn17xAKWBvs=
github.com/ipfs/go-ipld-cbor v0.2.0 h1:VHIW3HVIjcMd8m4ZLZbrYpwjzqlVUfjLM7oK4T5/YF0=
github.com/ipfs/go-ipld-cbor v0.2.0/go.mod h1:Cp8T7w1NKcu4AQJLqK0tWpd1nkgTxEVB5C6kVpLW6/0=
-github.com/ipfs/go-ipld-format v0.6.1 h1:lQLmBM/HHbrXvjIkrydRXkn+gc0DE5xO5fqelsCKYOQ=
-github.com/ipfs/go-ipld-format v0.6.1/go.mod h1:8TOH1Hj+LFyqM2PjSqI2/ZnyO0KlfhHbJLkbxFa61hs=
+github.com/ipfs/go-ipld-format v0.6.2 h1:bPZQ+A05ol0b3lsJSl0bLvwbuQ+HQbSsdGTy4xtYUkU=
+github.com/ipfs/go-ipld-format v0.6.2/go.mod h1:nni2xFdHKx5lxvXJ6brt/pndtGxKAE+FPR1rg4jTkyk=
github.com/ipfs/go-ipld-git v0.1.1 h1:TWGnZjS0htmEmlMFEkA3ogrNCqWjIxwr16x1OsdhG+Y=
github.com/ipfs/go-ipld-git v0.1.1/go.mod h1:+VyMqF5lMcJh4rwEppV0e6g4nCCHXThLYYDpKUkJubI=
-github.com/ipfs/go-ipld-legacy v0.2.1 h1:mDFtrBpmU7b//LzLSypVrXsD8QxkEWxu5qVxN99/+tk=
-github.com/ipfs/go-ipld-legacy v0.2.1/go.mod h1:782MOUghNzMO2DER0FlBR94mllfdCJCkTtDtPM51otM=
+github.com/ipfs/go-ipld-legacy v0.2.2 h1:DThbqCPVLpWBcGtU23KDLiY2YRZZnTkXQyfz8aOfBkQ=
+github.com/ipfs/go-ipld-legacy v0.2.2/go.mod h1:hhkj+b3kG9b2BcUNw8IFYAsfeNo8E3U7eYlWeAOPyDU=
github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM=
github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8=
github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo=
@@ -625,8 +625,8 @@ github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/g
github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc=
github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g=
github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk=
-github.com/multiformats/go-multicodec v0.9.1 h1:x/Fuxr7ZuR4jJV4Os5g444F7xC4XmyUaT/FWtE+9Zjo=
-github.com/multiformats/go-multicodec v0.9.1/go.mod h1:LLWNMtyV5ithSBUo3vFIMaeDy+h3EbkMTek1m+Fybbo=
+github.com/multiformats/go-multicodec v0.9.2 h1:YrlXCuqxjqm3bXl+vBq5LKz5pz4mvAsugdqy78k0pXQ=
+github.com/multiformats/go-multicodec v0.9.2/go.mod h1:LLWNMtyV5ithSBUo3vFIMaeDy+h3EbkMTek1m+Fybbo=
github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U=
github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew=
github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew=
@@ -1020,8 +1020,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
-golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476 h1:bsqhLWFR6G6xiQcb+JoGqdKdRU6WzPWmK8E0jxTjzo4=
-golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8=
+golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/yqS/lQJ6PmkyIV3YP+o=
+golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
diff --git a/routing/delegated_test.go b/routing/delegated_test.go
index 028f3b465..028503a37 100644
--- a/routing/delegated_test.go
+++ b/routing/delegated_test.go
@@ -22,7 +22,7 @@ func TestParser(t *testing.T) {
Router: config.Router{
Type: config.RouterTypeHTTP,
Parameters: &config.HTTPRouterParams{
- Endpoint: "testEndpoint",
+ Endpoint: "http://testEndpoint",
},
},
},
@@ -79,7 +79,7 @@ func TestParserRecursive(t *testing.T) {
Router: config.Router{
Type: config.RouterTypeHTTP,
Parameters: &config.HTTPRouterParams{
- Endpoint: "testEndpoint1",
+ Endpoint: "http://testEndpoint1",
},
},
},
@@ -87,7 +87,7 @@ func TestParserRecursive(t *testing.T) {
Router: config.Router{
Type: config.RouterTypeHTTP,
Parameters: &config.HTTPRouterParams{
- Endpoint: "testEndpoint2",
+ Endpoint: "http://testEndpoint2",
},
},
},
@@ -95,7 +95,7 @@ func TestParserRecursive(t *testing.T) {
Router: config.Router{
Type: config.RouterTypeHTTP,
Parameters: &config.HTTPRouterParams{
- Endpoint: "testEndpoint3",
+ Endpoint: "http://testEndpoint3",
},
},
},
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index 1ca2c871b..d641e1034 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -130,13 +130,13 @@ require (
github.com/huin/goupnp v1.3.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/ipfs/bbloom v0.0.4 // indirect
- github.com/ipfs/boxo v0.32.0 // indirect
+ github.com/ipfs/boxo v0.33.0 // indirect
github.com/ipfs/go-bitfield v1.1.0 // indirect
- github.com/ipfs/go-block-format v0.2.1 // indirect
+ github.com/ipfs/go-block-format v0.2.2 // indirect
github.com/ipfs/go-cid v0.5.0 // indirect
github.com/ipfs/go-datastore v0.8.2 // indirect
- github.com/ipfs/go-ipld-format v0.6.1 // indirect
- github.com/ipfs/go-ipld-legacy v0.2.1 // indirect
+ github.com/ipfs/go-ipld-format v0.6.2 // indirect
+ github.com/ipfs/go-ipld-legacy v0.2.2 // indirect
github.com/ipfs/go-metrics-interface v0.3.0 // indirect
github.com/ipfs/kubo v0.31.0 // indirect
github.com/ipld/go-codec-dagpb v1.7.0 // indirect
@@ -200,7 +200,7 @@ require (
github.com/multiformats/go-multiaddr-dns v0.4.1 // indirect
github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect
github.com/multiformats/go-multibase v0.2.0 // indirect
- github.com/multiformats/go-multicodec v0.9.1 // indirect
+ github.com/multiformats/go-multicodec v0.9.2 // indirect
github.com/multiformats/go-multistream v0.6.1 // indirect
github.com/multiformats/go-varint v0.0.7 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
@@ -312,7 +312,7 @@ require (
go.uber.org/zap v1.27.0 // indirect
go.uber.org/zap/exp v0.3.0 // indirect
golang.org/x/crypto v0.39.0 // indirect
- golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476 // indirect
+ golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b // indirect
golang.org/x/exp/typeparams v0.0.0-20240314144324-c7f7c6466f7f // indirect
golang.org/x/mod v0.25.0 // indirect
golang.org/x/net v0.41.0 // indirect
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index a9af9d086..28cf50f9c 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -319,12 +319,12 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.32.0 h1:rBs3P53Wt9bFW9WJwVdkzLtzYCXAj2bMjM7+1nrazZw=
-github.com/ipfs/boxo v0.32.0/go.mod h1:VEtO3gOmr+sXGodalaTV9Vvsp3qVYegc4Rcu08Iw+wM=
+github.com/ipfs/boxo v0.33.0 h1:9ow3chwkDzMj0Deq4AWRUEI7WnIIV7SZhPTzzG2mmfw=
+github.com/ipfs/boxo v0.33.0/go.mod h1:3IPh7YFcCIcKp6o02mCHovrPntoT5Pctj/7j4syh/RM=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
-github.com/ipfs/go-block-format v0.2.1 h1:96kW71XGNNa+mZw/MTzJrCpMhBWCrd9kBLoKm9Iip/Q=
-github.com/ipfs/go-block-format v0.2.1/go.mod h1:frtvXHMQhM6zn7HvEQu+Qz5wSTj+04oEH/I+NjDgEjk=
+github.com/ipfs/go-block-format v0.2.2 h1:uecCTgRwDIXyZPgYspaLXoMiMmxQpSx2aq34eNc4YvQ=
+github.com/ipfs/go-block-format v0.2.2/go.mod h1:vmuefuWU6b+9kIU0vZJgpiJt1yicQz9baHXE8qR+KB8=
github.com/ipfs/go-cid v0.5.0 h1:goEKKhaGm0ul11IHA7I6p1GmKz8kEYniqFopaB5Otwg=
github.com/ipfs/go-cid v0.5.0/go.mod h1:0L7vmeNXpQpUS9vt+yEARkJ8rOg43DF3iPgn4GIN0mk=
github.com/ipfs/go-cidutil v0.1.0 h1:RW5hO7Vcf16dplUU60Hs0AKDkQAVPVplr7lk97CFL+Q=
@@ -337,10 +337,10 @@ github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1I
github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw=
github.com/ipfs/go-ipfs-pq v0.0.3 h1:YpoHVJB+jzK15mr/xsWC574tyDLkezVrDNeaalQBsTE=
github.com/ipfs/go-ipfs-pq v0.0.3/go.mod h1:btNw5hsHBpRcSSgZtiNm/SLj5gYIZ18AKtv3kERkRb4=
-github.com/ipfs/go-ipld-format v0.6.1 h1:lQLmBM/HHbrXvjIkrydRXkn+gc0DE5xO5fqelsCKYOQ=
-github.com/ipfs/go-ipld-format v0.6.1/go.mod h1:8TOH1Hj+LFyqM2PjSqI2/ZnyO0KlfhHbJLkbxFa61hs=
-github.com/ipfs/go-ipld-legacy v0.2.1 h1:mDFtrBpmU7b//LzLSypVrXsD8QxkEWxu5qVxN99/+tk=
-github.com/ipfs/go-ipld-legacy v0.2.1/go.mod h1:782MOUghNzMO2DER0FlBR94mllfdCJCkTtDtPM51otM=
+github.com/ipfs/go-ipld-format v0.6.2 h1:bPZQ+A05ol0b3lsJSl0bLvwbuQ+HQbSsdGTy4xtYUkU=
+github.com/ipfs/go-ipld-format v0.6.2/go.mod h1:nni2xFdHKx5lxvXJ6brt/pndtGxKAE+FPR1rg4jTkyk=
+github.com/ipfs/go-ipld-legacy v0.2.2 h1:DThbqCPVLpWBcGtU23KDLiY2YRZZnTkXQyfz8aOfBkQ=
+github.com/ipfs/go-ipld-legacy v0.2.2/go.mod h1:hhkj+b3kG9b2BcUNw8IFYAsfeNo8E3U7eYlWeAOPyDU=
github.com/ipfs/go-log/v2 v2.6.0 h1:2Nu1KKQQ2ayonKp4MPo6pXCjqw1ULc9iohRqWV5EYqg=
github.com/ipfs/go-log/v2 v2.6.0/go.mod h1:p+Efr3qaY5YXpx9TX7MoLCSEZX5boSWj9wh86P5HJa8=
github.com/ipfs/go-metrics-interface v0.3.0 h1:YwG7/Cy4R94mYDUuwsBfeziJCVm9pBMJ6q/JR9V40TU=
@@ -517,8 +517,8 @@ github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/e
github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo=
github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g=
github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk=
-github.com/multiformats/go-multicodec v0.9.1 h1:x/Fuxr7ZuR4jJV4Os5g444F7xC4XmyUaT/FWtE+9Zjo=
-github.com/multiformats/go-multicodec v0.9.1/go.mod h1:LLWNMtyV5ithSBUo3vFIMaeDy+h3EbkMTek1m+Fybbo=
+github.com/multiformats/go-multicodec v0.9.2 h1:YrlXCuqxjqm3bXl+vBq5LKz5pz4mvAsugdqy78k0pXQ=
+github.com/multiformats/go-multicodec v0.9.2/go.mod h1:LLWNMtyV5ithSBUo3vFIMaeDy+h3EbkMTek1m+Fybbo=
github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew=
github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U=
github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM=
@@ -869,8 +869,8 @@ golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOM
golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM=
golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476 h1:bsqhLWFR6G6xiQcb+JoGqdKdRU6WzPWmK8E0jxTjzo4=
-golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8=
+golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/yqS/lQJ6PmkyIV3YP+o=
+golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8=
golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
golang.org/x/exp/typeparams v0.0.0-20240314144324-c7f7c6466f7f h1:phY1HzDcf18Aq9A8KkmRtY9WvOFIxN8wgfvy6Zm1DV8=
From b95845e539e481c22f1d37c0bc3d1a606d06f80b Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Tue, 8 Jul 2025 08:27:49 -0700
Subject: [PATCH 273/499] refactor: use slices.Sort where appropriate (#10858)
---
core/commands/active.go | 4 ++--
core/commands/bootstrap.go | 14 +++++++-----
core/commands/cid.go | 34 ++++++++++++++--------------
core/commands/commands.go | 4 ++--
core/commands/completion.go | 23 +++++++------------
core/commands/files.go | 6 ++---
core/commands/id.go | 10 ++++-----
core/commands/ls.go | 7 +++---
core/commands/pubsub.go | 4 ++--
core/commands/swarm.go | 45 ++++++++++++++-----------------------
10 files changed, 68 insertions(+), 83 deletions(-)
diff --git a/core/commands/active.go b/core/commands/active.go
index 786075f01..aacadd676 100644
--- a/core/commands/active.go
+++ b/core/commands/active.go
@@ -3,7 +3,7 @@ package commands
import (
"fmt"
"io"
- "sort"
+ "slices"
"text/tabwriter"
"time"
@@ -60,7 +60,7 @@ Lists running and recently run commands.
for k := range req.Options {
keys = append(keys, k)
}
- sort.Strings(keys)
+ slices.Sort(keys)
for _, k := range keys {
fmt.Fprintf(tw, "%s=%v,", k, req.Options[k])
diff --git a/core/commands/bootstrap.go b/core/commands/bootstrap.go
index decf2b271..6d760f47f 100644
--- a/core/commands/bootstrap.go
+++ b/core/commands/bootstrap.go
@@ -4,14 +4,14 @@ import (
"errors"
"fmt"
"io"
- "sort"
-
- cmdenv "github.com/ipfs/kubo/core/commands/cmdenv"
- repo "github.com/ipfs/kubo/repo"
- fsrepo "github.com/ipfs/kubo/repo/fsrepo"
+ "slices"
+ "strings"
cmds "github.com/ipfs/go-ipfs-cmds"
config "github.com/ipfs/kubo/config"
+ cmdenv "github.com/ipfs/kubo/core/commands/cmdenv"
+ repo "github.com/ipfs/kubo/repo"
+ fsrepo "github.com/ipfs/kubo/repo/fsrepo"
peer "github.com/libp2p/go-libp2p/core/peer"
ma "github.com/multiformats/go-multiaddr"
)
@@ -284,7 +284,9 @@ var bootstrapListCmd = &cmds.Command{
}
func bootstrapWritePeers(w io.Writer, prefix string, peers []string) error {
- sort.Stable(sort.StringSlice(peers))
+ slices.SortStableFunc(peers, func(a, b string) int {
+ return strings.Compare(a, b)
+ })
for _, peer := range peers {
_, err := w.Write([]byte(prefix + peer + "\n"))
if err != nil {
diff --git a/core/commands/cid.go b/core/commands/cid.go
index 26596f011..8491715be 100644
--- a/core/commands/cid.go
+++ b/core/commands/cid.go
@@ -1,10 +1,11 @@
package commands
import (
+ "cmp"
"errors"
"fmt"
"io"
- "sort"
+ "slices"
"strings"
"unicode"
@@ -287,7 +288,7 @@ var basesCmd = &cmds.Command{
cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, val []CodeAndName) error {
prefixes, _ := req.Options[prefixOptionName].(bool)
numeric, _ := req.Options[numericOptionName].(bool)
- sort.Sort(multibaseSorter{val})
+ multibaseSorter{val}.Sort()
for _, v := range val {
code := v.Code
if code < 32 || code >= 127 {
@@ -357,7 +358,7 @@ var codecsCmd = &cmds.Command{
Encoders: cmds.EncoderMap{
cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, val []CodeAndName) error {
numeric, _ := req.Options[codecsNumericOptionName].(bool)
- sort.Sort(codeAndNameSorter{val})
+ codeAndNameSorter{val}.Sort()
for _, v := range val {
if numeric {
fmt.Fprintf(w, "%5d %s\n", v.Code, v.Name)
@@ -398,23 +399,22 @@ type multibaseSorter struct {
data []CodeAndName
}
-func (s multibaseSorter) Len() int { return len(s.data) }
-func (s multibaseSorter) Swap(i, j int) { s.data[i], s.data[j] = s.data[j], s.data[i] }
-
-func (s multibaseSorter) Less(i, j int) bool {
- a := unicode.ToLower(rune(s.data[i].Code))
- b := unicode.ToLower(rune(s.data[j].Code))
- if a != b {
- return a < b
- }
- // lowecase letters should come before uppercase
- return s.data[i].Code > s.data[j].Code
+func (s multibaseSorter) Sort() {
+ slices.SortFunc(s.data, func(a, b CodeAndName) int {
+ if n := cmp.Compare(unicode.ToLower(rune(a.Code)), unicode.ToLower(rune(b.Code))); n != 0 {
+ return n
+ }
+ // lowecase letters should come before uppercase
+ return cmp.Compare(b.Code, a.Code)
+ })
}
type codeAndNameSorter struct {
data []CodeAndName
}
-func (s codeAndNameSorter) Len() int { return len(s.data) }
-func (s codeAndNameSorter) Swap(i, j int) { s.data[i], s.data[j] = s.data[j], s.data[i] }
-func (s codeAndNameSorter) Less(i, j int) bool { return s.data[i].Code < s.data[j].Code }
+func (s codeAndNameSorter) Sort() {
+ slices.SortFunc(s.data, func(a, b CodeAndName) int {
+ return cmp.Compare(a.Code, b.Code)
+ })
+}
diff --git a/core/commands/commands.go b/core/commands/commands.go
index 249f0ffbe..9e2b60dc8 100644
--- a/core/commands/commands.go
+++ b/core/commands/commands.go
@@ -10,7 +10,7 @@ import (
"fmt"
"io"
"os"
- "sort"
+ "slices"
"strings"
cmds "github.com/ipfs/go-ipfs-cmds"
@@ -131,7 +131,7 @@ func cmdPathStrings(cmd *Command, showOptions bool) []string {
}
recurse("", cmd)
- sort.Strings(cmds)
+ slices.Sort(cmds)
return cmds
}
diff --git a/core/commands/completion.go b/core/commands/completion.go
index 2f5b8b61e..448af4d50 100644
--- a/core/commands/completion.go
+++ b/core/commands/completion.go
@@ -2,7 +2,8 @@ package commands
import (
"io"
- "sort"
+ "slices"
+ "strings"
"text/template"
cmds "github.com/ipfs/go-ipfs-cmds"
@@ -39,8 +40,8 @@ func commandToCompletions(name string, fullName string, cmd *cmds.Command) *comp
parsed.Subcommands = append(parsed.Subcommands,
commandToCompletions(name, fullName+" "+name, subCmd))
}
- sort.Slice(parsed.Subcommands, func(i, j int) bool {
- return parsed.Subcommands[i].Name < parsed.Subcommands[j].Name
+ slices.SortFunc(parsed.Subcommands, func(a, b *completionCommand) int {
+ return strings.Compare(a.Name, b.Name)
})
for _, opt := range cmd.Options {
@@ -68,18 +69,10 @@ func commandToCompletions(name string, fullName string, cmd *cmds.Command) *comp
parsed.Options = append(parsed.Options, flag)
}
}
- sort.Slice(parsed.LongFlags, func(i, j int) bool {
- return parsed.LongFlags[i] < parsed.LongFlags[j]
- })
- sort.Slice(parsed.ShortFlags, func(i, j int) bool {
- return parsed.ShortFlags[i] < parsed.ShortFlags[j]
- })
- sort.Slice(parsed.LongOptions, func(i, j int) bool {
- return parsed.LongOptions[i] < parsed.LongOptions[j]
- })
- sort.Slice(parsed.ShortOptions, func(i, j int) bool {
- return parsed.ShortOptions[i] < parsed.ShortOptions[j]
- })
+ slices.Sort(parsed.LongFlags)
+ slices.Sort(parsed.ShortFlags)
+ slices.Sort(parsed.LongOptions)
+ slices.Sort(parsed.ShortOptions)
return parsed
}
diff --git a/core/commands/files.go b/core/commands/files.go
index dfa94d2a6..12a96eba2 100644
--- a/core/commands/files.go
+++ b/core/commands/files.go
@@ -8,7 +8,7 @@ import (
"io"
"os"
gopath "path"
- "sort"
+ "slices"
"strconv"
"strings"
"time"
@@ -698,8 +698,8 @@ Examples:
cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, out *filesLsOutput) error {
noSort, _ := req.Options[dontSortOptionName].(bool)
if !noSort {
- sort.Slice(out.Entries, func(i, j int) bool {
- return strings.Compare(out.Entries[i].Name, out.Entries[j].Name) < 0
+ slices.SortFunc(out.Entries, func(a, b mfs.NodeListing) int {
+ return strings.Compare(a.Name, b.Name)
})
}
diff --git a/core/commands/id.go b/core/commands/id.go
index 33ad03286..295223258 100644
--- a/core/commands/id.go
+++ b/core/commands/id.go
@@ -6,7 +6,7 @@ import (
"errors"
"fmt"
"io"
- "sort"
+ "slices"
"strings"
version "github.com/ipfs/kubo"
@@ -170,11 +170,11 @@ func printPeer(keyEnc ke.KeyEncoder, ps pstore.Peerstore, p peer.ID) (interface{
for _, a := range addrs {
info.Addresses = append(info.Addresses, a.String())
}
- sort.Strings(info.Addresses)
+ slices.Sort(info.Addresses)
protocols, _ := ps.GetProtocols(p) // don't care about errors here.
info.Protocols = append(info.Protocols, protocols...)
- sort.Slice(info.Protocols, func(i, j int) bool { return info.Protocols[i] < info.Protocols[j] })
+ slices.Sort(info.Protocols)
if v, err := ps.Get(p, "AgentVersion"); err == nil {
if vs, ok := v.(string); ok {
@@ -205,9 +205,9 @@ func printSelf(keyEnc ke.KeyEncoder, node *core.IpfsNode) (interface{}, error) {
for _, a := range addrs {
info.Addresses = append(info.Addresses, a.String())
}
- sort.Strings(info.Addresses)
+ slices.Sort(info.Addresses)
info.Protocols = node.PeerHost.Mux().Protocols()
- sort.Slice(info.Protocols, func(i, j int) bool { return info.Protocols[i] < info.Protocols[j] })
+ slices.Sort(info.Protocols)
}
info.AgentVersion = version.GetUserAgentVersion()
return info, nil
diff --git a/core/commands/ls.go b/core/commands/ls.go
index bdd475d96..327b159a1 100644
--- a/core/commands/ls.go
+++ b/core/commands/ls.go
@@ -5,7 +5,8 @@ import (
"fmt"
"io"
"os"
- "sort"
+ "slices"
+ "strings"
"text/tabwriter"
"time"
@@ -118,8 +119,8 @@ The JSON output contains type information.
return nil
}, func(i int) {
// after each dir
- sort.Slice(outputLinks, func(i, j int) bool {
- return outputLinks[i].Name < outputLinks[j].Name
+ slices.SortFunc(outputLinks, func(a, b LsLink) int {
+ return strings.Compare(a.Name, b.Name)
})
output[i] = LsObject{
diff --git a/core/commands/pubsub.go b/core/commands/pubsub.go
index d50e651b2..9e81ef281 100644
--- a/core/commands/pubsub.go
+++ b/core/commands/pubsub.go
@@ -6,7 +6,7 @@ import (
"fmt"
"io"
"net/http"
- "sort"
+ "slices"
cmdenv "github.com/ipfs/kubo/core/commands/cmdenv"
mbase "github.com/multiformats/go-multibase"
@@ -325,7 +325,7 @@ TOPIC AND DATA ENCODING
for _, peer := range peers {
list.Strings = append(list.Strings, peer.String())
}
- sort.Strings(list.Strings)
+ slices.Sort(list.Strings)
return cmds.EmitOnce(res, list)
},
Type: stringList{},
diff --git a/core/commands/swarm.go b/core/commands/swarm.go
index 252c48d33..153068438 100644
--- a/core/commands/swarm.go
+++ b/core/commands/swarm.go
@@ -8,8 +8,9 @@ import (
"fmt"
"io"
"path"
- "sort"
+ "slices"
"strconv"
+ "strings"
"sync"
"text/tabwriter"
"time"
@@ -301,11 +302,11 @@ var swarmPeersCmd = &cmds.Command{
identifyResult, _ := ci.identifyPeer(n.Peerstore, c.ID())
ci.Identify = identifyResult
}
- sort.Sort(&ci)
+ ci.Sort()
out.Peers = append(out.Peers, ci)
}
- sort.Sort(&out)
+ out.Sort()
return cmds.EmitOnce(res, &out)
},
Encoders: cmds.EncoderMap{
@@ -435,32 +436,20 @@ type connInfo struct {
Identify IdOutput `json:",omitempty"`
}
-func (ci *connInfo) Less(i, j int) bool {
- return ci.Streams[i].Protocol < ci.Streams[j].Protocol
-}
-
-func (ci *connInfo) Len() int {
- return len(ci.Streams)
-}
-
-func (ci *connInfo) Swap(i, j int) {
- ci.Streams[i], ci.Streams[j] = ci.Streams[j], ci.Streams[i]
+func (ci *connInfo) Sort() {
+ slices.SortFunc(ci.Streams, func(a, b streamInfo) int {
+ return strings.Compare(a.Protocol, b.Protocol)
+ })
}
type connInfos struct {
Peers []connInfo
}
-func (ci connInfos) Less(i, j int) bool {
- return ci.Peers[i].Addr < ci.Peers[j].Addr
-}
-
-func (ci connInfos) Len() int {
- return len(ci.Peers)
-}
-
-func (ci connInfos) Swap(i, j int) {
- ci.Peers[i], ci.Peers[j] = ci.Peers[j], ci.Peers[i]
+func (ci *connInfos) Sort() {
+ slices.SortFunc(ci.Peers, func(a, b connInfo) int {
+ return strings.Compare(a.Addr, b.Addr)
+ })
}
func (ci *connInfo) identifyPeer(ps pstore.Peerstore, p peer.ID) (IdOutput, error) {
@@ -484,11 +473,11 @@ func (ci *connInfo) identifyPeer(ps pstore.Peerstore, p peer.ID) (IdOutput, erro
for _, a := range addrs {
info.Addresses = append(info.Addresses, a.String())
}
- sort.Strings(info.Addresses)
+ slices.Sort(info.Addresses)
if protocols, err := ps.GetProtocols(p); err == nil {
info.Protocols = append(info.Protocols, protocols...)
- sort.Slice(info.Protocols, func(i, j int) bool { return info.Protocols[i] < info.Protocols[j] })
+ slices.Sort(info.Protocols)
}
if v, err := ps.Get(p, "AgentVersion"); err == nil {
@@ -551,7 +540,7 @@ var swarmAddrsCmd = &cmds.Command{
for p := range am.Addrs {
ids = append(ids, p)
}
- sort.Strings(ids)
+ slices.Sort(ids)
for _, p := range ids {
paddrs := am.Addrs[p]
@@ -603,7 +592,7 @@ var swarmAddrsLocalCmd = &cmds.Command{
}
addrs = append(addrs, saddr)
}
- sort.Strings(addrs)
+ slices.Sort(addrs)
return cmds.EmitOnce(res, &stringList{addrs})
},
Type: stringList{},
@@ -634,7 +623,7 @@ var swarmAddrsListenCmd = &cmds.Command{
for _, addr := range maddrs {
addrs = append(addrs, addr.String())
}
- sort.Strings(addrs)
+ slices.Sort(addrs)
return cmds.EmitOnce(res, &stringList{addrs})
},
From 4195a1da9fffec4451cc10de6b12b4751fc31b56 Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Tue, 8 Jul 2025 09:00:28 -0700
Subject: [PATCH 274/499] fix: handling of EDITOR env var (#10855)
The `ipfs config edit` command did not correctly handle the `EDITOR` environment variable correctly when its value contains flags and arguments, i.e. `EDITOR=emacs -nw`. The command was treating the entire value of `$EDITOR` as the name of the editor command. This has been fixed to parse the value of `$EDITOR` into separate args, respecting shell quoting.
Closes #9375
---
core/commands/config.go | 17 ++++++++++++-----
docs/changelogs/v0.36.md | 5 +++++
go.mod | 1 +
go.sum | 2 ++
4 files changed, 20 insertions(+), 5 deletions(-)
diff --git a/core/commands/config.go b/core/commands/config.go
index 9d37111c3..7d5a5fa17 100644
--- a/core/commands/config.go
+++ b/core/commands/config.go
@@ -9,13 +9,13 @@ import (
"os/exec"
"strings"
- "github.com/ipfs/kubo/core/commands/cmdenv"
- "github.com/ipfs/kubo/repo"
- "github.com/ipfs/kubo/repo/fsrepo"
-
+ "github.com/anmitsu/go-shlex"
"github.com/elgris/jsondiff"
cmds "github.com/ipfs/go-ipfs-cmds"
config "github.com/ipfs/kubo/config"
+ "github.com/ipfs/kubo/core/commands/cmdenv"
+ "github.com/ipfs/kubo/repo"
+ "github.com/ipfs/kubo/repo/fsrepo"
)
// ConfigUpdateOutput is config profile apply command's output
@@ -512,7 +512,14 @@ func editConfig(filename string) error {
return errors.New("ENV variable $EDITOR not set")
}
- cmd := exec.Command(editor, filename)
+ editorAndArgs, err := shlex.Split(editor, true)
+ if err != nil {
+ return fmt.Errorf("cannot parse $EDITOR value: %s", err)
+ }
+ editor = editorAndArgs[0]
+ args := append(editorAndArgs[1:], filename)
+
+ cmd := exec.Command(editor, args...)
cmd.Stdin, cmd.Stdout, cmd.Stderr = os.Stdin, os.Stdout, os.Stderr
return cmd.Run()
}
diff --git a/docs/changelogs/v0.36.md b/docs/changelogs/v0.36.md
index 7137180bd..2e977f79b 100644
--- a/docs/changelogs/v0.36.md
+++ b/docs/changelogs/v0.36.md
@@ -18,6 +18,7 @@ This release was brought to you by the [Interplanetary Shipyard](https://ipship
- [Overwrite option for files cp command](#overwrite-option-for-files-cp-command)
- [Option for filestore command to remove bad blocks](#option-for-filestore-command-to-remove-bad-blocks)
- [`ConnMgr.SilencePeriod` configuration setting exposed](#connmgrsilenceperiod-configuration-setting-exposed)
+ - [Fix handling of EDITOR env var](#fix-handling-of-editor-env-var)
- [๐ฆ๏ธ Important dependency updates](#-important-dependency-updates)
- [๐ Changelog](#-changelog)
- [๐จโ๐ฉโ๐งโ๐ฆ Contributors](#-contributors)
@@ -79,6 +80,10 @@ The `filestore` command has a new option, `--remove-bad-blocks`, to verify objec
This connection manager option controls how often connections are swept and potentially terminated. See the [ConnMgr documentation](https://github.com/ipfs/kubo/blob/master/docs/config.md#swarmconnmgrsilenceperiod).
+#### Fix handling of EDITOR env var
+
+The `ipfs config edit` command did not correctly handle the `EDITOR` environment variable correctly when its value contains flags and arguments, i.e. `EDITOR=emacs -nw`. The command was treating the entire value of `$EDITOR` as the name of the editor command. This has been fixed to parse the value of `$EDITOR` into separate args, respecting shell quoting.
+
#### ๐ฆ๏ธ Important dependency updates
- update `go-libp2p` to [v0.42.0](https://github.com/libp2p/go-libp2p/releases/tag/v0.42.0)
diff --git a/go.mod b/go.mod
index 77bc12fc2..a9bd58174 100644
--- a/go.mod
+++ b/go.mod
@@ -5,6 +5,7 @@ go 1.24
require (
bazil.org/fuse v0.0.0-20200117225306-7b5117fecadc
contrib.go.opencensus.io/exporter/prometheus v0.4.2
+ github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239
github.com/blang/semver/v4 v4.0.0
github.com/caddyserver/certmagic v0.21.6
github.com/cenkalti/backoff/v4 v4.3.0
diff --git a/go.sum b/go.sum
index 943c6a7e2..368d2f8bc 100644
--- a/go.sum
+++ b/go.sum
@@ -66,6 +66,7 @@ github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b h1:mimo19zliBX/vS
github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs=
github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5 h1:iW0a5ljuFxkLGPNem5Ui+KBjFJzKg4Fv2fnxe4dvzpM=
github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5/go.mod h1:Y2QMoi1vgtOIfc+6DhrMOGkLoGzqSV2rKp4Sm+opsyA=
+github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA=
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o=
@@ -180,6 +181,7 @@ github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
github.com/filecoin-project/go-clock v0.1.0 h1:SFbYIM75M8NnFm1yMHhN9Ahy3W5bEZV9gd6MPfXbKVU=
github.com/filecoin-project/go-clock v0.1.0/go.mod h1:4uB/O4PvOjlx1VCMdZ9MyDZXRm//gkj1ELEbxfI1AZs=
+github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ=
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
github.com/flynn/noise v1.1.0 h1:KjPQoQCEFdZDiP03phOvGi11+SVVhBG2wOWAorLsstg=
github.com/flynn/noise v1.1.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag=
From aabedff818de79efe92efb04cf12a99977029ad3 Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Mon, 23 Jun 2025 07:18:11 -0700
Subject: [PATCH 275/499] Replace use of go-car v1 with go-car/v2 (#10845)
* Replace use of go-car v1 with go-car/v2
The `dag export` commend needed to be updated to use go-car/v2. This removes the last dependency on go-car v1.
(cherry picked from commit ace0b0b987f5abe6a4480d3f9e14f55bb233785e)
---
core/commands/dag/export.go | 96 +++++++++++++++++++++++++++----------
go.mod | 9 ----
go.sum | 27 -----------
3 files changed, 72 insertions(+), 60 deletions(-)
diff --git a/core/commands/dag/export.go b/core/commands/dag/export.go
index a729cf752..9f11c43de 100644
--- a/core/commands/dag/export.go
+++ b/core/commands/dag/export.go
@@ -9,15 +9,14 @@ import (
"time"
"github.com/cheggaaa/pb"
- blocks "github.com/ipfs/go-block-format"
cid "github.com/ipfs/go-cid"
+ cmds "github.com/ipfs/go-ipfs-cmds"
ipld "github.com/ipfs/go-ipld-format"
"github.com/ipfs/kubo/core/commands/cmdenv"
"github.com/ipfs/kubo/core/commands/cmdutils"
iface "github.com/ipfs/kubo/core/coreiface"
-
- cmds "github.com/ipfs/go-ipfs-cmds"
- gocar "github.com/ipld/go-car"
+ gocar "github.com/ipld/go-car/v2"
+ cidlink "github.com/ipld/go-ipld-prime/linking/cid"
selectorparse "github.com/ipld/go-ipld-prime/traversal/selector/parse"
)
@@ -51,14 +50,27 @@ func dagExport(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment
close(errCh)
}()
- store := dagStore{dag: api.Dag(), ctx: req.Context}
- dag := gocar.Dag{Root: c, Selector: selectorparse.CommonSelector_ExploreAllRecursively}
- // TraverseLinksOnlyOnce is safe for an exhaustive selector but won't be when we allow
- // arbitrary selectors here
- car := gocar.NewSelectiveCar(req.Context, store, []gocar.Dag{dag}, gocar.TraverseLinksOnlyOnce())
- if err := car.Write(pipeW); err != nil {
+ lsys := cidlink.DefaultLinkSystem()
+ lsys.SetReadStorage(&dagStore{dag: api.Dag(), ctx: req.Context})
+
+ // Uncomment the following to support CARv2 output.
+ /*
+ car, err := gocar.NewSelectiveWriter(req.Context, &lsys, c, selectorparse.CommonSelector_ExploreAllRecursively, gocar.AllowDuplicatePuts(false))
+ if err != nil {
+ errCh <- err
+ return
+ }
+ if _, err = car.WriteTo(pipeW); err != nil {
+ errCh <- err
+ return
+ }
+ */
+ _, err := gocar.TraverseV1(req.Context, &lsys, c, selectorparse.CommonSelector_ExploreAllRecursively, pipeW, gocar.AllowDuplicatePuts(false))
+ if err != nil {
errCh <- err
+ return
}
+
}()
if err := res.Emit(pipeR); err != nil {
@@ -69,7 +81,7 @@ func dagExport(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment
err = <-errCh
// minimal user friendliness
- if ipld.IsNotFound(err) {
+ if errors.Is(err, ipld.ErrNotFound{}) {
explicitOffline, _ := req.Options["offline"].(bool)
if explicitOffline {
err = fmt.Errorf("%s (currently offline, perhaps retry without the offline flag)", err)
@@ -112,16 +124,17 @@ func finishCLIExport(res cmds.Response, re cmds.ResponseEmitter) error {
var processedOneResponse bool
for {
v, err := res.Next()
- if err == io.EOF {
-
- // We only write the final bar update on success
- // On error it looks too weird
- bar.Finish()
-
- return re.Close()
- } else if err != nil {
+ if err != nil {
+ if errors.Is(err, io.EOF) {
+ // We only write the final bar update on success
+ // On error it looks too weird
+ bar.Finish()
+ return re.Close()
+ }
return re.CloseWithError(err)
- } else if processedOneResponse {
+ }
+
+ if processedOneResponse {
return re.CloseWithError(errors.New("unexpected multipart response during emit, please file a bugreport"))
}
@@ -133,18 +146,53 @@ func finishCLIExport(res cmds.Response, re cmds.ResponseEmitter) error {
processedOneResponse = true
- if err := re.Emit(bar.NewProxyReader(r)); err != nil {
+ if err = re.Emit(bar.NewProxyReader(r)); err != nil {
return err
}
}
}
-// FIXME(@Jorropo): https://github.com/ipld/go-car/issues/315
type dagStore struct {
dag iface.APIDagService
ctx context.Context
}
-func (ds dagStore) Get(_ context.Context, c cid.Cid) (blocks.Block, error) {
- return ds.dag.Get(ds.ctx, c)
+func (ds *dagStore) Get(ctx context.Context, key string) ([]byte, error) {
+ if ctx.Err() != nil {
+ return nil, ctx.Err()
+ }
+
+ c, err := cidFromBinString(key)
+ if err != nil {
+ return nil, err
+ }
+
+ block, err := ds.dag.Get(ds.ctx, c)
+ if err != nil {
+ return nil, err
+ }
+
+ return block.RawData(), nil
+}
+
+func (ds *dagStore) Has(ctx context.Context, key string) (bool, error) {
+ _, err := ds.Get(ctx, key)
+ if err != nil {
+ if errors.Is(err, ipld.ErrNotFound{}) {
+ return false, nil
+ }
+ return false, err
+ }
+ return true, nil
+}
+
+func cidFromBinString(key string) (cid.Cid, error) {
+ l, k, err := cid.CidFromBytes([]byte(key))
+ if err != nil {
+ return cid.Undef, fmt.Errorf("dagStore: key was not a cid: %w", err)
+ }
+ if l != len(key) {
+ return cid.Undef, fmt.Errorf("dagSore: key was not a cid: had %d bytes leftover", len(key)-l)
+ }
+ return k, nil
}
diff --git a/go.mod b/go.mod
index 155063595..4625dde43 100644
--- a/go.mod
+++ b/go.mod
@@ -43,7 +43,6 @@ require (
github.com/ipfs/go-metrics-prometheus v0.1.0
github.com/ipfs/go-test v0.2.2
github.com/ipfs/go-unixfsnode v1.10.1
- github.com/ipld/go-car v0.6.2
github.com/ipld/go-car/v2 v2.14.3
github.com/ipld/go-codec-dagpb v1.7.0
github.com/ipld/go-ipld-prime v0.21.0
@@ -148,18 +147,11 @@ require (
github.com/huin/goupnp v1.3.0 // indirect
github.com/ipfs/bbloom v0.0.4 // indirect
github.com/ipfs/go-bitfield v1.1.0 // indirect
- github.com/ipfs/go-blockservice v0.5.2 // indirect
- github.com/ipfs/go-ipfs-blockstore v1.3.1 // indirect
github.com/ipfs/go-ipfs-delay v0.0.1 // indirect
github.com/ipfs/go-ipfs-ds-help v1.1.1 // indirect
- github.com/ipfs/go-ipfs-exchange-interface v0.2.1 // indirect
github.com/ipfs/go-ipfs-pq v0.0.3 // indirect
github.com/ipfs/go-ipfs-redirects-file v0.1.2 // indirect
- github.com/ipfs/go-ipfs-util v0.0.3 // indirect
- github.com/ipfs/go-log v1.0.5 // indirect
- github.com/ipfs/go-merkledag v0.11.0 // indirect
github.com/ipfs/go-peertaskqueue v0.8.2 // indirect
- github.com/ipfs/go-verifcid v0.0.3 // indirect
github.com/jackpal/go-nat-pmp v1.0.2 // indirect
github.com/klauspost/compress v1.18.0 // indirect
github.com/klauspost/cpuid/v2 v2.2.10 // indirect
@@ -256,7 +248,6 @@ require (
go.opentelemetry.io/otel/exporters/zipkin v1.31.0 // indirect
go.opentelemetry.io/otel/metric v1.35.0 // indirect
go.opentelemetry.io/proto/otlp v1.3.1 // indirect
- go.uber.org/atomic v1.11.0 // indirect
go.uber.org/automaxprocs v1.6.0 // indirect
go.uber.org/mock v0.5.2 // indirect
go.uber.org/zap/exp v0.3.0 // indirect
diff --git a/go.sum b/go.sum
index 34be1f680..ea6070457 100644
--- a/go.sum
+++ b/go.sum
@@ -358,13 +358,9 @@ github.com/ipfs/boxo v0.32.0 h1:rBs3P53Wt9bFW9WJwVdkzLtzYCXAj2bMjM7+1nrazZw=
github.com/ipfs/boxo v0.32.0/go.mod h1:VEtO3gOmr+sXGodalaTV9Vvsp3qVYegc4Rcu08Iw+wM=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
-github.com/ipfs/go-bitswap v0.11.0 h1:j1WVvhDX1yhG32NTC9xfxnqycqYIlhzEzLXG/cU1HyQ=
-github.com/ipfs/go-bitswap v0.11.0/go.mod h1:05aE8H3XOU+LXpTedeAS0OZpcO1WFsj5niYQH9a1Tmk=
github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk=
github.com/ipfs/go-block-format v0.2.1 h1:96kW71XGNNa+mZw/MTzJrCpMhBWCrd9kBLoKm9Iip/Q=
github.com/ipfs/go-block-format v0.2.1/go.mod h1:frtvXHMQhM6zn7HvEQu+Qz5wSTj+04oEH/I+NjDgEjk=
-github.com/ipfs/go-blockservice v0.5.2 h1:in9Bc+QcXwd1apOVM7Un9t8tixPKdaHQFdLSUM1Xgk8=
-github.com/ipfs/go-blockservice v0.5.2/go.mod h1:VpMblFEqG67A/H2sHKAemeH9vlURVavlysbdUI632yk=
github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM=
github.com/ipfs/go-cid v0.0.4/go.mod h1:4LLaPOQwmk5z9LBgQnpkivrx8BJjUyGwTXCd5Xfj6+M=
github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I=
@@ -394,8 +390,6 @@ github.com/ipfs/go-fs-lock v0.1.1 h1:TecsP/Uc7WqYYatasreZQiP9EGRy4ZnKoG4yXxR33nw
github.com/ipfs/go-fs-lock v0.1.1/go.mod h1:2goSXMCw7QfscHmSe09oXiR34DQeUdm+ei+dhonqly0=
github.com/ipfs/go-ipfs-blockstore v1.3.1 h1:cEI9ci7V0sRNivqaOr0elDsamxXFxJMMMy7PTTDQNsQ=
github.com/ipfs/go-ipfs-blockstore v1.3.1/go.mod h1:KgtZyc9fq+P2xJUiCAzbRdhhqJHvsw8u2Dlqy2MyRTE=
-github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ=
-github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk=
github.com/ipfs/go-ipfs-cmds v0.15.0 h1:nQDgKadrzyiFyYoZMARMIoVoSwe3gGTAfGvrWLeAQbQ=
github.com/ipfs/go-ipfs-cmds v0.15.0/go.mod h1:VABf/mv/wqvYX6hLG6Z+40eNAEw3FQO0bSm370Or3Wk=
github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw=
@@ -403,16 +397,10 @@ github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1I
github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw=
github.com/ipfs/go-ipfs-ds-help v1.1.1 h1:B5UJOH52IbcfS56+Ul+sv8jnIV10lbjLF5eOO0C66Nw=
github.com/ipfs/go-ipfs-ds-help v1.1.1/go.mod h1:75vrVCkSdSFidJscs8n4W+77AtTpCIAdDGAwjitJMIo=
-github.com/ipfs/go-ipfs-exchange-interface v0.2.1 h1:jMzo2VhLKSHbVe+mHNzYgs95n0+t0Q69GQ5WhRDZV/s=
-github.com/ipfs/go-ipfs-exchange-interface v0.2.1/go.mod h1:MUsYn6rKbG6CTtsDp+lKJPmVt3ZrCViNyH3rfPGsZ2E=
-github.com/ipfs/go-ipfs-exchange-offline v0.3.0 h1:c/Dg8GDPzixGd0MC8Jh6mjOwU57uYokgWRFidfvEkuA=
-github.com/ipfs/go-ipfs-exchange-offline v0.3.0/go.mod h1:MOdJ9DChbb5u37M1IcbrRB02e++Z7521fMxqCNRrz9s=
github.com/ipfs/go-ipfs-pq v0.0.3 h1:YpoHVJB+jzK15mr/xsWC574tyDLkezVrDNeaalQBsTE=
github.com/ipfs/go-ipfs-pq v0.0.3/go.mod h1:btNw5hsHBpRcSSgZtiNm/SLj5gYIZ18AKtv3kERkRb4=
github.com/ipfs/go-ipfs-redirects-file v0.1.2 h1:QCK7VtL91FH17KROVVy5KrzDx2hu68QvB2FTWk08ZQk=
github.com/ipfs/go-ipfs-redirects-file v0.1.2/go.mod h1:yIiTlLcDEM/8lS6T3FlCEXZktPPqSOyuY6dEzVqw7Fw=
-github.com/ipfs/go-ipfs-routing v0.3.0 h1:9W/W3N+g+y4ZDeffSgqhgo7BsBSJwPMcyssET9OWevc=
-github.com/ipfs/go-ipfs-routing v0.3.0/go.mod h1:dKqtTFIql7e1zYsEuWLyuOU+E0WJWW8JjbTPLParDWo=
github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc=
github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ=
github.com/ipfs/go-ipfs-util v0.0.3 h1:2RFdGez6bu2ZlZdI+rWfIdbQb1KudQp3VGwPtdNCmE0=
@@ -428,11 +416,8 @@ github.com/ipfs/go-ipld-legacy v0.2.1/go.mod h1:782MOUghNzMO2DER0FlBR94mllfdCJCk
github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM=
github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8=
github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo=
-github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g=
github.com/ipfs/go-log/v2 v2.6.0 h1:2Nu1KKQQ2ayonKp4MPo6pXCjqw1ULc9iohRqWV5EYqg=
github.com/ipfs/go-log/v2 v2.6.0/go.mod h1:p+Efr3qaY5YXpx9TX7MoLCSEZX5boSWj9wh86P5HJa8=
-github.com/ipfs/go-merkledag v0.11.0 h1:DgzwK5hprESOzS4O1t/wi6JDpyVQdvm9Bs59N/jqfBY=
-github.com/ipfs/go-merkledag v0.11.0/go.mod h1:Q4f/1ezvBiJV0YCIXvt51W/9/kqJGH4I1LsA7+djsM4=
github.com/ipfs/go-metrics-interface v0.3.0 h1:YwG7/Cy4R94mYDUuwsBfeziJCVm9pBMJ6q/JR9V40TU=
github.com/ipfs/go-metrics-interface v0.3.0/go.mod h1:OxxQjZDGocXVdyTPocns6cOLwHieqej/jos7H4POwoY=
github.com/ipfs/go-metrics-prometheus v0.1.0 h1:bApWOHkrH3VTBHzTHrZSfq4n4weOZDzZFxUXv+HyKcA=
@@ -443,10 +428,6 @@ github.com/ipfs/go-test v0.2.2 h1:1yjYyfbdt1w93lVzde6JZ2einh3DIV40at4rVoyEcE8=
github.com/ipfs/go-test v0.2.2/go.mod h1:cmLisgVwkdRCnKu/CFZOk2DdhOcwghr5GsHeqwexoRA=
github.com/ipfs/go-unixfsnode v1.10.1 h1:hGKhzuH6NSzZ4y621wGuDspkjXRNG3B+HqhlyTjSwSM=
github.com/ipfs/go-unixfsnode v1.10.1/go.mod h1:eguv/otvacjmfSbYvmamc9ssNAzLvRk0+YN30EYeOOY=
-github.com/ipfs/go-verifcid v0.0.3 h1:gmRKccqhWDocCRkC+a59g5QW7uJw5bpX9HWBevXa0zs=
-github.com/ipfs/go-verifcid v0.0.3/go.mod h1:gcCtGniVzelKrbk9ooUSX/pM3xlH73fZZJDzQJRvOUw=
-github.com/ipld/go-car v0.6.2 h1:Hlnl3Awgnq8icK+ze3iRghk805lu8YNq3wlREDTF2qc=
-github.com/ipld/go-car v0.6.2/go.mod h1:oEGXdwp6bmxJCZ+rARSkDliTeYnVzv3++eXajZ+Bmr8=
github.com/ipld/go-car/v2 v2.14.3 h1:1Mhl82/ny8MVP+w1M4LXbj4j99oK3gnuZG2GmG1IhC8=
github.com/ipld/go-car/v2 v2.14.3/go.mod h1:/vpSvPngOX8UnvmdFJ3o/mDgXa9LuyXsn7wxOzHDYQE=
github.com/ipld/go-codec-dagpb v1.7.0 h1:hpuvQjCSVSLnTnHXn+QAMR0mLmb1gA6wl10LExo2Ts0=
@@ -986,8 +967,6 @@ go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt
go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc=
go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0=
go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8=
-go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
-go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
@@ -1000,12 +979,8 @@ go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
go.uber.org/mock v0.5.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko=
go.uber.org/mock v0.5.2/go.mod h1:wLlUxC2vVTPTaE3UD51E0BGOAElKrILxhVSDYQLld5o=
-go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
-go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
-go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
-go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ=
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
go.uber.org/zap/exp v0.3.0 h1:6JYzdifzYkGmTdRR59oYH+Ng7k49H9qVpWwNSsGJj3U=
@@ -1272,8 +1247,6 @@ golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgw
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
From 917466b6bd95767a5b1c35fefe64ab64830981a8 Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Wed, 25 Jun 2025 01:26:26 -0700
Subject: [PATCH 276/499] docs: fix minor typos (#10849)
(cherry picked from commit be241769769ecd3bb29ddae7f2ff04f5157a9a03)
---
README.md | 2 +-
docs/changelogs/v0.10.md | 2 +-
docs/changelogs/v0.4.md | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index 2e6766877..f9953c3b7 100644
--- a/README.md
+++ b/README.md
@@ -224,7 +224,7 @@ $ ipfs get /ipns/dist.ipfs.tech/kubo/$VERSION/kubo_$VERSION_windows-amd64.zip
# pacman -S kubo
```
-[](https://aur.archlinux.org/packages/kubo/)
+[](https://archlinux.org/packages/kubo/)
#### Gentoo Linux
diff --git a/docs/changelogs/v0.10.md b/docs/changelogs/v0.10.md
index 8cfc29a7a..9a1d8b8af 100644
--- a/docs/changelogs/v0.10.md
+++ b/docs/changelogs/v0.10.md
@@ -101,7 +101,7 @@ See `ipfs swarm peering --help` for more details.
- github.com/ipfs/go-ipfs:
- fuse: load unixfs adls as their dagpb substrates
- enable the legacy mDNS implementation
- - test: add dag get --ouput-codec test
+ - test: add dag get --output-codec test
- change ipfs dag get flag name from format to output-codec
- test: check behavior of loading UnixFS sharded directories with missing shards
- remove dag put option shortcuts
diff --git a/docs/changelogs/v0.4.md b/docs/changelogs/v0.4.md
index 2862c8b77..3f2b9c358 100644
--- a/docs/changelogs/v0.4.md
+++ b/docs/changelogs/v0.4.md
@@ -1808,7 +1808,7 @@ The next steps are:
- make timecache duration configurable ([libp2p/go-libp2p-pubsub#148](https://github.com/libp2p/go-libp2p-pubsub/pull/148))
- godoc is not html either ([libp2p/go-libp2p-pubsub#147](https://github.com/libp2p/go-libp2p-pubsub/pull/147))
- godoc documentation is not markdown ([libp2p/go-libp2p-pubsub#146](https://github.com/libp2p/go-libp2p-pubsub/pull/146))
- - Add documentation for subscribe's non-instanteneous semantics ([libp2p/go-libp2p-pubsub#145](https://github.com/libp2p/go-libp2p-pubsub/pull/145))
+ - Add documentation for subscribe's non-instantaneous semantics ([libp2p/go-libp2p-pubsub#145](https://github.com/libp2p/go-libp2p-pubsub/pull/145))
- Some documentation ([libp2p/go-libp2p-pubsub#140](https://github.com/libp2p/go-libp2p-pubsub/pull/140))
- rework peer tracking logic to handle multiple connections ([libp2p/go-libp2p-pubsub#132](https://github.com/libp2p/go-libp2p-pubsub/pull/132))
- github.com/libp2p/go-libp2p-pubsub-router:
From 1fa8dfcc88f10c60baa94131b7e406d27635fc07 Mon Sep 17 00:00:00 2001
From: sukun
Date: Thu, 26 Jun 2025 02:18:44 +0200
Subject: [PATCH 277/499] chore: p2p-forge v0.6.0 + go-libp2p 0.42.0 (#10840)
* update go-libp2p to v0.42
* chore: p2p-forge v0.6.0 + final go-libp2p 0.42.0
* docs: changelog
---------
Co-authored-by: Marcin Rataj
(cherry picked from commit 839023c79d7988f649e6411430f43f7785770cb3)
---
docs/changelogs/v0.36.md | 3 +-
docs/examples/kubo-as-a-library/go.mod | 38 ++++++------
docs/examples/kubo-as-a-library/go.sum | 76 ++++++++++++------------
go.mod | 40 ++++++-------
go.sum | 80 +++++++++++++-------------
test/dependencies/go.mod | 37 ++++++------
test/dependencies/go.sum | 76 ++++++++++++------------
7 files changed, 176 insertions(+), 174 deletions(-)
diff --git a/docs/changelogs/v0.36.md b/docs/changelogs/v0.36.md
index f8ea9f5fc..dac366da9 100644
--- a/docs/changelogs/v0.36.md
+++ b/docs/changelogs/v0.36.md
@@ -89,10 +89,11 @@ This connection manager option controls how often connections are swept and pote
#### ๐ฆ๏ธ Important dependency updates
+- update `go-libp2p` to [v0.42.0](https://github.com/libp2p/go-libp2p/releases/tag/v0.42.0)
- update `go-libp2p-kad-dht` to [v0.33.0](https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.33.0)
- update `boxo` to [v0.32.0](https://github.com/ipfs/boxo/releases/tag/v0.32.0)
- update `gateway-conformance` to [v0.8](https://github.com/ipfs/gateway-conformance/releases/tag/v0.8.0)
-- update `p2p-forge/client` to **TODO**
+- update `p2p-forge/client` to [v0.6.0](https://github.com/ipshipyard/p2p-forge/releases/tag/v0.6.0)
### ๐ Changelog
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index a6b888485..e99c9706e 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -9,7 +9,7 @@ replace github.com/ipfs/kubo => ./../../..
require (
github.com/ipfs/boxo v0.32.0
github.com/ipfs/kubo v0.0.0-00010101000000-000000000000
- github.com/libp2p/go-libp2p v0.42.0-alpha-2
+ github.com/libp2p/go-libp2p v0.42.0
github.com/multiformats/go-multiaddr v0.16.0
)
@@ -62,7 +62,7 @@ require (
github.com/golang/protobuf v1.5.4 // indirect
github.com/golang/snappy v0.0.5-0.20231225225746-43d5d4cd4e0e // indirect
github.com/google/gopacket v1.1.19 // indirect
- github.com/google/pprof v0.0.0-20250501235452-c0086092b71a // indirect
+ github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/gorilla/websocket v1.5.3 // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect
@@ -98,20 +98,20 @@ require (
github.com/ipld/go-car/v2 v2.14.3 // indirect
github.com/ipld/go-codec-dagpb v1.7.0 // indirect
github.com/ipld/go-ipld-prime v0.21.0 // indirect
- github.com/ipshipyard/p2p-forge v0.5.2-0.20250616211529-2c25ee655b22 // indirect
+ github.com/ipshipyard/p2p-forge v0.6.0 // indirect
github.com/jackpal/go-nat-pmp v1.0.2 // indirect
github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect
github.com/jbenet/goprocess v0.1.4 // indirect
github.com/klauspost/compress v1.18.0 // indirect
github.com/klauspost/cpuid/v2 v2.2.10 // indirect
- github.com/koron/go-ssdp v0.0.5 // indirect
+ github.com/koron/go-ssdp v0.0.6 // indirect
github.com/kr/pretty v0.3.1 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/libdns/libdns v0.2.2 // indirect
github.com/libp2p/go-buffer-pool v0.1.0 // indirect
github.com/libp2p/go-cidranger v1.1.0 // indirect
github.com/libp2p/go-doh-resolver v0.5.0 // indirect
- github.com/libp2p/go-flow-metrics v0.2.0 // indirect
+ github.com/libp2p/go-flow-metrics v0.3.0 // indirect
github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect
github.com/libp2p/go-libp2p-kad-dht v0.33.1 // indirect
github.com/libp2p/go-libp2p-kbucket v0.7.0 // indirect
@@ -123,7 +123,7 @@ require (
github.com/libp2p/go-msgio v0.3.0 // indirect
github.com/libp2p/go-netroute v0.2.2 // indirect
github.com/libp2p/go-reuseport v0.4.0 // indirect
- github.com/libp2p/go-yamux/v5 v5.0.0 // indirect
+ github.com/libp2p/go-yamux/v5 v5.0.1 // indirect
github.com/libp2p/zeroconf/v2 v2.2.0 // indirect
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
@@ -150,28 +150,28 @@ require (
github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 // indirect
github.com/pion/datachannel v1.5.10 // indirect
github.com/pion/dtls/v2 v2.2.12 // indirect
- github.com/pion/dtls/v3 v3.0.4 // indirect
- github.com/pion/ice/v4 v4.0.8 // indirect
- github.com/pion/interceptor v0.1.37 // indirect
+ github.com/pion/dtls/v3 v3.0.6 // indirect
+ github.com/pion/ice/v4 v4.0.10 // indirect
+ github.com/pion/interceptor v0.1.40 // indirect
github.com/pion/logging v0.2.3 // indirect
github.com/pion/mdns/v2 v2.0.7 // indirect
github.com/pion/randutil v0.1.0 // indirect
github.com/pion/rtcp v1.2.15 // indirect
- github.com/pion/rtp v1.8.13 // indirect
- github.com/pion/sctp v1.8.37 // indirect
- github.com/pion/sdp/v3 v3.0.11 // indirect
- github.com/pion/srtp/v3 v3.0.4 // indirect
+ github.com/pion/rtp v1.8.19 // indirect
+ github.com/pion/sctp v1.8.39 // indirect
+ github.com/pion/sdp/v3 v3.0.13 // indirect
+ github.com/pion/srtp/v3 v3.0.6 // indirect
github.com/pion/stun v0.6.1 // indirect
github.com/pion/stun/v3 v3.0.0 // indirect
github.com/pion/transport/v2 v2.2.10 // indirect
github.com/pion/transport/v3 v3.0.7 // indirect
- github.com/pion/turn/v4 v4.0.0 // indirect
- github.com/pion/webrtc/v4 v4.0.14 // indirect
+ github.com/pion/turn/v4 v4.0.2 // indirect
+ github.com/pion/webrtc/v4 v4.1.2 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/polydawn/refmt v0.89.0 // indirect
github.com/prometheus/client_golang v1.22.0 // indirect
github.com/prometheus/client_model v0.6.2 // indirect
- github.com/prometheus/common v0.63.0 // indirect
+ github.com/prometheus/common v0.64.0 // indirect
github.com/prometheus/procfs v0.16.1 // indirect
github.com/quic-go/qpack v0.5.1 // indirect
github.com/quic-go/quic-go v0.52.0 // indirect
@@ -203,8 +203,8 @@ require (
go.opentelemetry.io/otel/trace v1.35.0 // indirect
go.opentelemetry.io/proto/otlp v1.3.1 // indirect
go.uber.org/automaxprocs v1.6.0 // indirect
- go.uber.org/dig v1.18.0 // indirect
- go.uber.org/fx v1.23.0 // indirect
+ go.uber.org/dig v1.19.0 // indirect
+ go.uber.org/fx v1.24.0 // indirect
go.uber.org/mock v0.5.2 // indirect
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.27.0 // indirect
@@ -217,7 +217,7 @@ require (
golang.org/x/sync v0.15.0 // indirect
golang.org/x/sys v0.33.0 // indirect
golang.org/x/text v0.26.0 // indirect
- golang.org/x/time v0.11.0 // indirect
+ golang.org/x/time v0.12.0 // indirect
golang.org/x/tools v0.34.0 // indirect
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
gonum.org/v1/gonum v0.16.0 // indirect
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index 1bfe46b1a..948ec2f14 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -246,8 +246,8 @@ github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OI
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20250501235452-c0086092b71a h1:rDA3FfmxwXR+BVKKdz55WwMJ1pD2hJQNW31d+l3mPk4=
-github.com/google/pprof v0.0.0-20250501235452-c0086092b71a/go.mod h1:5hDyRhoBCxViHszMt12TnOpEI4VVi+U8Gm9iphldiMA=
+github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a h1://KbezygeMJZCSHH+HgUZiTeSoiuFspbMg1ge+eFj18=
+github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a/go.mod h1:5hDyRhoBCxViHszMt12TnOpEI4VVi+U8Gm9iphldiMA=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
@@ -368,8 +368,8 @@ github.com/ipld/go-ipld-prime v0.21.0 h1:n4JmcpOlPDIxBcY037SVfpd1G+Sj1nKZah0m6QH
github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOanyMctpPjsvxQ=
github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd h1:gMlw/MhNr2Wtp5RwGdsW23cs+yCuj9k2ON7i9MiJlRo=
github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd/go.mod h1:wZ8hH8UxeryOs4kJEJaiui/s00hDSbE37OKsL47g+Sw=
-github.com/ipshipyard/p2p-forge v0.5.2-0.20250616211529-2c25ee655b22 h1:J9UVOPm9gSOKM9BurRyHLRVpG5d5TPsYaSwZe1iTNqQ=
-github.com/ipshipyard/p2p-forge v0.5.2-0.20250616211529-2c25ee655b22/go.mod h1:eCkvoEuBwYJpPjMaBtVwLuIU9dzMWiO2hej3zfpbu+4=
+github.com/ipshipyard/p2p-forge v0.6.0 h1:kNhYxgYGtqF3MLts/i0hw+7ygtgNB4Qv8h6fo7j6Iq4=
+github.com/ipshipyard/p2p-forge v0.6.0/go.mod h1:pj8Zcs+ex5OMq5a1bFLHqW0oL3qYO0v5eGLZmit0l7U=
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA=
@@ -400,8 +400,8 @@ github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa02
github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE=
github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
-github.com/koron/go-ssdp v0.0.5 h1:E1iSMxIs4WqxTbIBLtmNBeOOC+1sCIXQeqTWVnpmwhk=
-github.com/koron/go-ssdp v0.0.5/go.mod h1:Qm59B7hpKpDqfyRNWRNr00jGwLdXjDyZh6y7rH6VS0w=
+github.com/koron/go-ssdp v0.0.6 h1:Jb0h04599eq/CY7rB5YEqPS83HmRfHP2azkxMN2rFtU=
+github.com/koron/go-ssdp v0.0.6/go.mod h1:0R9LfRJGek1zWTjN3JUNlm5INCDYGpRDfAptnct63fI=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
@@ -424,10 +424,10 @@ github.com/libp2p/go-doh-resolver v0.5.0 h1:4h7plVVW+XTS+oUBw2+8KfoM1jF6w8XmO7+s
github.com/libp2p/go-doh-resolver v0.5.0/go.mod h1:aPDxfiD2hNURgd13+hfo29z9IC22fv30ee5iM31RzxU=
github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8=
github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs=
-github.com/libp2p/go-flow-metrics v0.2.0 h1:EIZzjmeOE6c8Dav0sNv35vhZxATIXWZg6j/C08XmmDw=
-github.com/libp2p/go-flow-metrics v0.2.0/go.mod h1:st3qqfu8+pMfh+9Mzqb2GTiwrAGjIPszEjZmtksN8Jc=
-github.com/libp2p/go-libp2p v0.42.0-alpha-2 h1:/YdRlrtb/kNge0MszF8mMgO9tEaPBvD1ZGubYaliaBY=
-github.com/libp2p/go-libp2p v0.42.0-alpha-2/go.mod h1:tp7K6LUZDruO2li9fK9cnQAGN8o3yTb8FwUd5AdKv+k=
+github.com/libp2p/go-flow-metrics v0.3.0 h1:q31zcHUvHnwDO0SHaukewPYgwOBSxtt830uJtUx6784=
+github.com/libp2p/go-flow-metrics v0.3.0/go.mod h1:nuhlreIwEguM1IvHAew3ij7A8BMlyHQJ279ao24eZZo=
+github.com/libp2p/go-libp2p v0.42.0 h1:A8foZk+ZEhZTv0Jb++7xUFlrFhBDv4j2Vh/uq4YX+KE=
+github.com/libp2p/go-libp2p v0.42.0/go.mod h1:4NGcjbD9OIvFiSRb0XueCO19zJ4kSPK5vkyyOUYmMro=
github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94=
github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8=
github.com/libp2p/go-libp2p-core v0.2.4/go.mod h1:STh4fdfa5vDYr0/SzYYeqnt+E6KfEV5VxfIrm0bcI0g=
@@ -459,8 +459,8 @@ github.com/libp2p/go-openssl v0.0.3/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO
github.com/libp2p/go-openssl v0.0.4/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc=
github.com/libp2p/go-reuseport v0.4.0 h1:nR5KU7hD0WxXCJbmw7r2rhRYruNRl2koHw8fQscQm2s=
github.com/libp2p/go-reuseport v0.4.0/go.mod h1:ZtI03j/wO5hZVDFo2jKywN6bYKWLOy8Se6DrI2E1cLU=
-github.com/libp2p/go-yamux/v5 v5.0.0 h1:2djUh96d3Jiac/JpGkKs4TO49YhsfLopAoryfPmf+Po=
-github.com/libp2p/go-yamux/v5 v5.0.0/go.mod h1:en+3cdX51U0ZslwRdRLrvQsdayFt3TSUKvBGErzpWbU=
+github.com/libp2p/go-yamux/v5 v5.0.1 h1:f0WoX/bEF2E8SbE4c/k1Mo+/9z0O4oC/hWEA+nfYRSg=
+github.com/libp2p/go-yamux/v5 v5.0.1/go.mod h1:en+3cdX51U0ZslwRdRLrvQsdayFt3TSUKvBGErzpWbU=
github.com/libp2p/zeroconf/v2 v2.2.0 h1:Cup06Jv6u81HLhIj1KasuNM/RHHrJ8T7wOTS4+Tv53Q=
github.com/libp2p/zeroconf/v2 v2.2.0/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0DmyYyNO1Xs=
github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI=
@@ -583,12 +583,12 @@ github.com/pion/datachannel v1.5.10/go.mod h1:p/jJfC9arb29W7WrxyKbepTU20CFgyx5oL
github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s=
github.com/pion/dtls/v2 v2.2.12 h1:KP7H5/c1EiVAAKUmXyCzPiQe5+bCJrpOeKg/L05dunk=
github.com/pion/dtls/v2 v2.2.12/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE=
-github.com/pion/dtls/v3 v3.0.4 h1:44CZekewMzfrn9pmGrj5BNnTMDCFwr+6sLH+cCuLM7U=
-github.com/pion/dtls/v3 v3.0.4/go.mod h1:R373CsjxWqNPf6MEkfdy3aSe9niZvL/JaKlGeFphtMg=
-github.com/pion/ice/v4 v4.0.8 h1:ajNx0idNG+S+v9Phu4LSn2cs8JEfTsA1/tEjkkAVpFY=
-github.com/pion/ice/v4 v4.0.8/go.mod h1:y3M18aPhIxLlcO/4dn9X8LzLLSma84cx6emMSu14FGw=
-github.com/pion/interceptor v0.1.37 h1:aRA8Zpab/wE7/c0O3fh1PqY0AJI3fCSEM5lRWJVorwI=
-github.com/pion/interceptor v0.1.37/go.mod h1:JzxbJ4umVTlZAf+/utHzNesY8tmRkM2lVmkS82TTj8Y=
+github.com/pion/dtls/v3 v3.0.6 h1:7Hkd8WhAJNbRgq9RgdNh1aaWlZlGpYTzdqjy9x9sK2E=
+github.com/pion/dtls/v3 v3.0.6/go.mod h1:iJxNQ3Uhn1NZWOMWlLxEEHAN5yX7GyPvvKw04v9bzYU=
+github.com/pion/ice/v4 v4.0.10 h1:P59w1iauC/wPk9PdY8Vjl4fOFL5B+USq1+xbDcN6gT4=
+github.com/pion/ice/v4 v4.0.10/go.mod h1:y3M18aPhIxLlcO/4dn9X8LzLLSma84cx6emMSu14FGw=
+github.com/pion/interceptor v0.1.40 h1:e0BjnPcGpr2CFQgKhrQisBU7V3GXK6wrfYrGYaU6Jq4=
+github.com/pion/interceptor v0.1.40/go.mod h1:Z6kqH7M/FYirg3frjGJ21VLSRJGBXB/KqaTIrdqnOic=
github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms=
github.com/pion/logging v0.2.3 h1:gHuf0zpoh1GW67Nr6Gj4cv5Z9ZscU7g/EaoC/Ke/igI=
github.com/pion/logging v0.2.3/go.mod h1:z8YfknkquMe1csOrxK5kc+5/ZPAzMxbKLX5aXpbpC90=
@@ -598,14 +598,14 @@ github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA=
github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8=
github.com/pion/rtcp v1.2.15 h1:LZQi2JbdipLOj4eBjK4wlVoQWfrZbh3Q6eHtWtJBZBo=
github.com/pion/rtcp v1.2.15/go.mod h1:jlGuAjHMEXwMUHK78RgX0UmEJFV4zUKOFHR7OP+D3D0=
-github.com/pion/rtp v1.8.13 h1:8uSUPpjSL4OlwZI8Ygqu7+h2p9NPFB+yAZ461Xn5sNg=
-github.com/pion/rtp v1.8.13/go.mod h1:8uMBJj32Pa1wwx8Fuv/AsFhn8jsgw+3rUC2PfoBZ8p4=
-github.com/pion/sctp v1.8.37 h1:ZDmGPtRPX9mKCiVXtMbTWybFw3z/hVKAZgU81wcOrqs=
-github.com/pion/sctp v1.8.37/go.mod h1:cNiLdchXra8fHQwmIoqw0MbLLMs+f7uQ+dGMG2gWebE=
-github.com/pion/sdp/v3 v3.0.11 h1:VhgVSopdsBKwhCFoyyPmT1fKMeV9nLMrEKxNOdy3IVI=
-github.com/pion/sdp/v3 v3.0.11/go.mod h1:88GMahN5xnScv1hIMTqLdu/cOcUkj6a9ytbncwMCq2E=
-github.com/pion/srtp/v3 v3.0.4 h1:2Z6vDVxzrX3UHEgrUyIGM4rRouoC7v+NiF1IHtp9B5M=
-github.com/pion/srtp/v3 v3.0.4/go.mod h1:1Jx3FwDoxpRaTh1oRV8A/6G1BnFL+QI82eK4ms8EEJQ=
+github.com/pion/rtp v1.8.19 h1:jhdO/3XhL/aKm/wARFVmvTfq0lC/CvN1xwYKmduly3c=
+github.com/pion/rtp v1.8.19/go.mod h1:bAu2UFKScgzyFqvUKmbvzSdPr+NGbZtv6UB2hesqXBk=
+github.com/pion/sctp v1.8.39 h1:PJma40vRHa3UTO3C4MyeJDQ+KIobVYRZQZ0Nt7SjQnE=
+github.com/pion/sctp v1.8.39/go.mod h1:cNiLdchXra8fHQwmIoqw0MbLLMs+f7uQ+dGMG2gWebE=
+github.com/pion/sdp/v3 v3.0.13 h1:uN3SS2b+QDZnWXgdr69SM8KB4EbcnPnPf2Laxhty/l4=
+github.com/pion/sdp/v3 v3.0.13/go.mod h1:88GMahN5xnScv1hIMTqLdu/cOcUkj6a9ytbncwMCq2E=
+github.com/pion/srtp/v3 v3.0.6 h1:E2gyj1f5X10sB/qILUGIkL4C2CqK269Xq167PbGCc/4=
+github.com/pion/srtp/v3 v3.0.6/go.mod h1:BxvziG3v/armJHAaJ87euvkhHqWe9I7iiOy50K2QkhY=
github.com/pion/stun v0.6.1 h1:8lp6YejULeHBF8NmV8e2787BogQhduZugh5PdhDyyN4=
github.com/pion/stun v0.6.1/go.mod h1:/hO7APkX4hZKu/D0f2lHzNyvdkTGtIy3NDmLR7kSz/8=
github.com/pion/stun/v3 v3.0.0 h1:4h1gwhWLWuZWOJIJR9s2ferRO+W3zA/b6ijOI6mKzUw=
@@ -616,10 +616,10 @@ github.com/pion/transport/v2 v2.2.10 h1:ucLBLE8nuxiHfvkFKnkDQRYWYfp8ejf4YBOPfaQp
github.com/pion/transport/v2 v2.2.10/go.mod h1:sq1kSLWs+cHW9E+2fJP95QudkzbK7wscs8yYgQToO5E=
github.com/pion/transport/v3 v3.0.7 h1:iRbMH05BzSNwhILHoBoAPxoB9xQgOaJk+591KC9P1o0=
github.com/pion/transport/v3 v3.0.7/go.mod h1:YleKiTZ4vqNxVwh77Z0zytYi7rXHl7j6uPLGhhz9rwo=
-github.com/pion/turn/v4 v4.0.0 h1:qxplo3Rxa9Yg1xXDxxH8xaqcyGUtbHYw4QSCvmFWvhM=
-github.com/pion/turn/v4 v4.0.0/go.mod h1:MuPDkm15nYSklKpN8vWJ9W2M0PlyQZqYt1McGuxG7mA=
-github.com/pion/webrtc/v4 v4.0.14 h1:nyds/sFRR+HvmWoBa6wrL46sSfpArE0qR883MBW96lg=
-github.com/pion/webrtc/v4 v4.0.14/go.mod h1:R3+qTnQTS03UzwDarYecgioNf7DYgTsldxnCXB821Kk=
+github.com/pion/turn/v4 v4.0.2 h1:ZqgQ3+MjP32ug30xAbD6Mn+/K4Sxi3SdNOTFf+7mpps=
+github.com/pion/turn/v4 v4.0.2/go.mod h1:pMMKP/ieNAG/fN5cZiN4SDuyKsXtNTr0ccN7IToA1zs=
+github.com/pion/webrtc/v4 v4.1.2 h1:mpuUo/EJ1zMNKGE79fAdYNFZBX790KE7kQQpLMjjR54=
+github.com/pion/webrtc/v4 v4.1.2/go.mod h1:xsCXiNAmMEjIdFxAYU0MbB3RwRieJsegSB2JZsGN+8U=
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
@@ -640,8 +640,8 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:
github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=
github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
-github.com/prometheus/common v0.63.0 h1:YR/EIY1o3mEFP/kZCD7iDMnLPlGyuU2Gb3HIcXnA98k=
-github.com/prometheus/common v0.63.0/go.mod h1:VVFF/fBIoToEnWRVkYoXEkq3R3paCoxG9PXP74SnV18=
+github.com/prometheus/common v0.64.0 h1:pdZeA+g617P7oGv1CzdTzyeShxAGrTBsolKNOLQPGO4=
+github.com/prometheus/common v0.64.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8=
github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg=
github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is=
@@ -807,10 +807,10 @@ go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8=
-go.uber.org/dig v1.18.0 h1:imUL1UiY0Mg4bqbFfsRQO5G4CGRBec/ZujWTvSVp3pw=
-go.uber.org/dig v1.18.0/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE=
-go.uber.org/fx v1.23.0 h1:lIr/gYWQGfTwGcSXWXu4vP5Ws6iqnNEIY+F/aFzCKTg=
-go.uber.org/fx v1.23.0/go.mod h1:o/D9n+2mLP6v1EG+qsdT1O8wKopYAsqZasju97SDFCU=
+go.uber.org/dig v1.19.0 h1:BACLhebsYdpQ7IROQ1AGPjrXcP5dF80U3gKoFzbaq/4=
+go.uber.org/dig v1.19.0/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE=
+go.uber.org/fx v1.24.0 h1:wE8mruvpg2kiiL1Vqd0CC+tr0/24XIB10Iwp2lLWzkg=
+go.uber.org/fx v1.24.0/go.mod h1:AmDeGyS+ZARGKM4tlH4FY2Jr63VjbEDJHtqXTGP5hbo=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
go.uber.org/mock v0.5.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko=
@@ -1009,8 +1009,8 @@ golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA=
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0=
-golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
+golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE=
+golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
diff --git a/go.mod b/go.mod
index 4625dde43..e343aa2aa 100644
--- a/go.mod
+++ b/go.mod
@@ -46,12 +46,12 @@ require (
github.com/ipld/go-car/v2 v2.14.3
github.com/ipld/go-codec-dagpb v1.7.0
github.com/ipld/go-ipld-prime v0.21.0
- github.com/ipshipyard/p2p-forge v0.5.2-0.20250616211529-2c25ee655b22
+ github.com/ipshipyard/p2p-forge v0.6.0
github.com/jbenet/go-temp-err-catcher v0.1.0
github.com/jbenet/goprocess v0.1.4
github.com/julienschmidt/httprouter v1.3.0
github.com/libp2p/go-doh-resolver v0.5.0
- github.com/libp2p/go-libp2p v0.42.0-alpha-2
+ github.com/libp2p/go-libp2p v0.42.0
github.com/libp2p/go-libp2p-http v0.5.0
github.com/libp2p/go-libp2p-kad-dht v0.33.1
github.com/libp2p/go-libp2p-kbucket v0.7.0
@@ -81,8 +81,8 @@ require (
go.opentelemetry.io/otel v1.35.0
go.opentelemetry.io/otel/sdk v1.31.0
go.opentelemetry.io/otel/trace v1.35.0
- go.uber.org/dig v1.18.0
- go.uber.org/fx v1.23.0
+ go.uber.org/dig v1.19.0
+ go.uber.org/fx v1.24.0
go.uber.org/multierr v1.11.0
go.uber.org/zap v1.27.0
golang.org/x/crypto v0.39.0
@@ -138,7 +138,7 @@ require (
github.com/golang/protobuf v1.5.4 // indirect
github.com/golang/snappy v0.0.5-0.20231225225746-43d5d4cd4e0e // indirect
github.com/google/gopacket v1.1.19 // indirect
- github.com/google/pprof v0.0.0-20250501235452-c0086092b71a // indirect
+ github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a // indirect
github.com/gorilla/mux v1.8.1 // indirect
github.com/gorilla/websocket v1.5.3 // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect
@@ -155,20 +155,20 @@ require (
github.com/jackpal/go-nat-pmp v1.0.2 // indirect
github.com/klauspost/compress v1.18.0 // indirect
github.com/klauspost/cpuid/v2 v2.2.10 // indirect
- github.com/koron/go-ssdp v0.0.5 // indirect
+ github.com/koron/go-ssdp v0.0.6 // indirect
github.com/kr/pretty v0.3.1 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/libdns/libdns v0.2.2 // indirect
github.com/libp2p/go-buffer-pool v0.1.0 // indirect
github.com/libp2p/go-cidranger v1.1.0 // indirect
- github.com/libp2p/go-flow-metrics v0.2.0 // indirect
+ github.com/libp2p/go-flow-metrics v0.3.0 // indirect
github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect
github.com/libp2p/go-libp2p-gostream v0.6.0 // indirect
github.com/libp2p/go-libp2p-xor v0.1.0 // indirect
github.com/libp2p/go-msgio v0.3.0 // indirect
github.com/libp2p/go-netroute v0.2.2 // indirect
github.com/libp2p/go-reuseport v0.4.0 // indirect
- github.com/libp2p/go-yamux/v5 v5.0.0 // indirect
+ github.com/libp2p/go-yamux/v5 v5.0.1 // indirect
github.com/libp2p/zeroconf/v2 v2.2.0 // indirect
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
@@ -192,28 +192,28 @@ require (
github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 // indirect
github.com/pion/datachannel v1.5.10 // indirect
github.com/pion/dtls/v2 v2.2.12 // indirect
- github.com/pion/dtls/v3 v3.0.4 // indirect
- github.com/pion/ice/v4 v4.0.8 // indirect
- github.com/pion/interceptor v0.1.37 // indirect
+ github.com/pion/dtls/v3 v3.0.6 // indirect
+ github.com/pion/ice/v4 v4.0.10 // indirect
+ github.com/pion/interceptor v0.1.40 // indirect
github.com/pion/logging v0.2.3 // indirect
github.com/pion/mdns/v2 v2.0.7 // indirect
github.com/pion/randutil v0.1.0 // indirect
github.com/pion/rtcp v1.2.15 // indirect
- github.com/pion/rtp v1.8.13 // indirect
- github.com/pion/sctp v1.8.37 // indirect
- github.com/pion/sdp/v3 v3.0.11 // indirect
- github.com/pion/srtp/v3 v3.0.4 // indirect
+ github.com/pion/rtp v1.8.19 // indirect
+ github.com/pion/sctp v1.8.39 // indirect
+ github.com/pion/sdp/v3 v3.0.13 // indirect
+ github.com/pion/srtp/v3 v3.0.6 // indirect
github.com/pion/stun v0.6.1 // indirect
github.com/pion/stun/v3 v3.0.0 // indirect
github.com/pion/transport/v2 v2.2.10 // indirect
github.com/pion/transport/v3 v3.0.7 // indirect
- github.com/pion/turn/v4 v4.0.0 // indirect
- github.com/pion/webrtc/v4 v4.0.14 // indirect
+ github.com/pion/turn/v4 v4.0.2 // indirect
+ github.com/pion/webrtc/v4 v4.1.2 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/polydawn/refmt v0.89.0 // indirect
github.com/prometheus/client_model v0.6.2 // indirect
- github.com/prometheus/common v0.63.0 // indirect
+ github.com/prometheus/common v0.64.0 // indirect
github.com/prometheus/procfs v0.16.1 // indirect
github.com/prometheus/statsd_exporter v0.27.1 // indirect
github.com/quic-go/qpack v0.5.1 // indirect
@@ -253,10 +253,10 @@ require (
go.uber.org/zap/exp v0.3.0 // indirect
go4.org v0.0.0-20230225012048-214862532bf5 // indirect
golang.org/x/net v0.41.0 // indirect
- golang.org/x/oauth2 v0.25.0 // indirect
+ golang.org/x/oauth2 v0.30.0 // indirect
golang.org/x/term v0.32.0 // indirect
golang.org/x/text v0.26.0 // indirect
- golang.org/x/time v0.11.0 // indirect
+ golang.org/x/time v0.12.0 // indirect
golang.org/x/tools v0.34.0 // indirect
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
gonum.org/v1/gonum v0.16.0 // indirect
diff --git a/go.sum b/go.sum
index ea6070457..8c403e49c 100644
--- a/go.sum
+++ b/go.sum
@@ -309,8 +309,8 @@ github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hf
github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20250501235452-c0086092b71a h1:rDA3FfmxwXR+BVKKdz55WwMJ1pD2hJQNW31d+l3mPk4=
-github.com/google/pprof v0.0.0-20250501235452-c0086092b71a/go.mod h1:5hDyRhoBCxViHszMt12TnOpEI4VVi+U8Gm9iphldiMA=
+github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a h1://KbezygeMJZCSHH+HgUZiTeSoiuFspbMg1ge+eFj18=
+github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a/go.mod h1:5hDyRhoBCxViHszMt12TnOpEI4VVi+U8Gm9iphldiMA=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
@@ -437,8 +437,8 @@ github.com/ipld/go-ipld-prime v0.21.0 h1:n4JmcpOlPDIxBcY037SVfpd1G+Sj1nKZah0m6QH
github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOanyMctpPjsvxQ=
github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd h1:gMlw/MhNr2Wtp5RwGdsW23cs+yCuj9k2ON7i9MiJlRo=
github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd/go.mod h1:wZ8hH8UxeryOs4kJEJaiui/s00hDSbE37OKsL47g+Sw=
-github.com/ipshipyard/p2p-forge v0.5.2-0.20250616211529-2c25ee655b22 h1:J9UVOPm9gSOKM9BurRyHLRVpG5d5TPsYaSwZe1iTNqQ=
-github.com/ipshipyard/p2p-forge v0.5.2-0.20250616211529-2c25ee655b22/go.mod h1:eCkvoEuBwYJpPjMaBtVwLuIU9dzMWiO2hej3zfpbu+4=
+github.com/ipshipyard/p2p-forge v0.6.0 h1:kNhYxgYGtqF3MLts/i0hw+7ygtgNB4Qv8h6fo7j6Iq4=
+github.com/ipshipyard/p2p-forge v0.6.0/go.mod h1:pj8Zcs+ex5OMq5a1bFLHqW0oL3qYO0v5eGLZmit0l7U=
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
github.com/jbenet/go-cienv v0.1.0 h1:Vc/s0QbQtoxX8MwwSLWWh+xNNZvM3Lw7NsTcHrvvhMc=
@@ -478,8 +478,8 @@ github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2
github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
-github.com/koron/go-ssdp v0.0.5 h1:E1iSMxIs4WqxTbIBLtmNBeOOC+1sCIXQeqTWVnpmwhk=
-github.com/koron/go-ssdp v0.0.5/go.mod h1:Qm59B7hpKpDqfyRNWRNr00jGwLdXjDyZh6y7rH6VS0w=
+github.com/koron/go-ssdp v0.0.6 h1:Jb0h04599eq/CY7rB5YEqPS83HmRfHP2azkxMN2rFtU=
+github.com/koron/go-ssdp v0.0.6/go.mod h1:0R9LfRJGek1zWTjN3JUNlm5INCDYGpRDfAptnct63fI=
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
@@ -505,10 +505,10 @@ github.com/libp2p/go-doh-resolver v0.5.0 h1:4h7plVVW+XTS+oUBw2+8KfoM1jF6w8XmO7+s
github.com/libp2p/go-doh-resolver v0.5.0/go.mod h1:aPDxfiD2hNURgd13+hfo29z9IC22fv30ee5iM31RzxU=
github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8=
github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs=
-github.com/libp2p/go-flow-metrics v0.2.0 h1:EIZzjmeOE6c8Dav0sNv35vhZxATIXWZg6j/C08XmmDw=
-github.com/libp2p/go-flow-metrics v0.2.0/go.mod h1:st3qqfu8+pMfh+9Mzqb2GTiwrAGjIPszEjZmtksN8Jc=
-github.com/libp2p/go-libp2p v0.42.0-alpha-2 h1:/YdRlrtb/kNge0MszF8mMgO9tEaPBvD1ZGubYaliaBY=
-github.com/libp2p/go-libp2p v0.42.0-alpha-2/go.mod h1:tp7K6LUZDruO2li9fK9cnQAGN8o3yTb8FwUd5AdKv+k=
+github.com/libp2p/go-flow-metrics v0.3.0 h1:q31zcHUvHnwDO0SHaukewPYgwOBSxtt830uJtUx6784=
+github.com/libp2p/go-flow-metrics v0.3.0/go.mod h1:nuhlreIwEguM1IvHAew3ij7A8BMlyHQJ279ao24eZZo=
+github.com/libp2p/go-libp2p v0.42.0 h1:A8foZk+ZEhZTv0Jb++7xUFlrFhBDv4j2Vh/uq4YX+KE=
+github.com/libp2p/go-libp2p v0.42.0/go.mod h1:4NGcjbD9OIvFiSRb0XueCO19zJ4kSPK5vkyyOUYmMro=
github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94=
github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8=
github.com/libp2p/go-libp2p-core v0.2.4/go.mod h1:STh4fdfa5vDYr0/SzYYeqnt+E6KfEV5VxfIrm0bcI0g=
@@ -546,8 +546,8 @@ github.com/libp2p/go-reuseport v0.4.0 h1:nR5KU7hD0WxXCJbmw7r2rhRYruNRl2koHw8fQsc
github.com/libp2p/go-reuseport v0.4.0/go.mod h1:ZtI03j/wO5hZVDFo2jKywN6bYKWLOy8Se6DrI2E1cLU=
github.com/libp2p/go-socket-activation v0.1.1 h1:wkLBj6RqKffjt7BI794ewoSt241UV52NKYvIbpzhn4Q=
github.com/libp2p/go-socket-activation v0.1.1/go.mod h1:NBfVUPXTRL/FU6UmSOM+1O7/vJkpS523sQiriw0Qln8=
-github.com/libp2p/go-yamux/v5 v5.0.0 h1:2djUh96d3Jiac/JpGkKs4TO49YhsfLopAoryfPmf+Po=
-github.com/libp2p/go-yamux/v5 v5.0.0/go.mod h1:en+3cdX51U0ZslwRdRLrvQsdayFt3TSUKvBGErzpWbU=
+github.com/libp2p/go-yamux/v5 v5.0.1 h1:f0WoX/bEF2E8SbE4c/k1Mo+/9z0O4oC/hWEA+nfYRSg=
+github.com/libp2p/go-yamux/v5 v5.0.1/go.mod h1:en+3cdX51U0ZslwRdRLrvQsdayFt3TSUKvBGErzpWbU=
github.com/libp2p/zeroconf/v2 v2.2.0 h1:Cup06Jv6u81HLhIj1KasuNM/RHHrJ8T7wOTS4+Tv53Q=
github.com/libp2p/zeroconf/v2 v2.2.0/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0DmyYyNO1Xs=
github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI=
@@ -685,12 +685,12 @@ github.com/pion/datachannel v1.5.10/go.mod h1:p/jJfC9arb29W7WrxyKbepTU20CFgyx5oL
github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s=
github.com/pion/dtls/v2 v2.2.12 h1:KP7H5/c1EiVAAKUmXyCzPiQe5+bCJrpOeKg/L05dunk=
github.com/pion/dtls/v2 v2.2.12/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE=
-github.com/pion/dtls/v3 v3.0.4 h1:44CZekewMzfrn9pmGrj5BNnTMDCFwr+6sLH+cCuLM7U=
-github.com/pion/dtls/v3 v3.0.4/go.mod h1:R373CsjxWqNPf6MEkfdy3aSe9niZvL/JaKlGeFphtMg=
-github.com/pion/ice/v4 v4.0.8 h1:ajNx0idNG+S+v9Phu4LSn2cs8JEfTsA1/tEjkkAVpFY=
-github.com/pion/ice/v4 v4.0.8/go.mod h1:y3M18aPhIxLlcO/4dn9X8LzLLSma84cx6emMSu14FGw=
-github.com/pion/interceptor v0.1.37 h1:aRA8Zpab/wE7/c0O3fh1PqY0AJI3fCSEM5lRWJVorwI=
-github.com/pion/interceptor v0.1.37/go.mod h1:JzxbJ4umVTlZAf+/utHzNesY8tmRkM2lVmkS82TTj8Y=
+github.com/pion/dtls/v3 v3.0.6 h1:7Hkd8WhAJNbRgq9RgdNh1aaWlZlGpYTzdqjy9x9sK2E=
+github.com/pion/dtls/v3 v3.0.6/go.mod h1:iJxNQ3Uhn1NZWOMWlLxEEHAN5yX7GyPvvKw04v9bzYU=
+github.com/pion/ice/v4 v4.0.10 h1:P59w1iauC/wPk9PdY8Vjl4fOFL5B+USq1+xbDcN6gT4=
+github.com/pion/ice/v4 v4.0.10/go.mod h1:y3M18aPhIxLlcO/4dn9X8LzLLSma84cx6emMSu14FGw=
+github.com/pion/interceptor v0.1.40 h1:e0BjnPcGpr2CFQgKhrQisBU7V3GXK6wrfYrGYaU6Jq4=
+github.com/pion/interceptor v0.1.40/go.mod h1:Z6kqH7M/FYirg3frjGJ21VLSRJGBXB/KqaTIrdqnOic=
github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms=
github.com/pion/logging v0.2.3 h1:gHuf0zpoh1GW67Nr6Gj4cv5Z9ZscU7g/EaoC/Ke/igI=
github.com/pion/logging v0.2.3/go.mod h1:z8YfknkquMe1csOrxK5kc+5/ZPAzMxbKLX5aXpbpC90=
@@ -700,14 +700,14 @@ github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA=
github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8=
github.com/pion/rtcp v1.2.15 h1:LZQi2JbdipLOj4eBjK4wlVoQWfrZbh3Q6eHtWtJBZBo=
github.com/pion/rtcp v1.2.15/go.mod h1:jlGuAjHMEXwMUHK78RgX0UmEJFV4zUKOFHR7OP+D3D0=
-github.com/pion/rtp v1.8.13 h1:8uSUPpjSL4OlwZI8Ygqu7+h2p9NPFB+yAZ461Xn5sNg=
-github.com/pion/rtp v1.8.13/go.mod h1:8uMBJj32Pa1wwx8Fuv/AsFhn8jsgw+3rUC2PfoBZ8p4=
-github.com/pion/sctp v1.8.37 h1:ZDmGPtRPX9mKCiVXtMbTWybFw3z/hVKAZgU81wcOrqs=
-github.com/pion/sctp v1.8.37/go.mod h1:cNiLdchXra8fHQwmIoqw0MbLLMs+f7uQ+dGMG2gWebE=
-github.com/pion/sdp/v3 v3.0.11 h1:VhgVSopdsBKwhCFoyyPmT1fKMeV9nLMrEKxNOdy3IVI=
-github.com/pion/sdp/v3 v3.0.11/go.mod h1:88GMahN5xnScv1hIMTqLdu/cOcUkj6a9ytbncwMCq2E=
-github.com/pion/srtp/v3 v3.0.4 h1:2Z6vDVxzrX3UHEgrUyIGM4rRouoC7v+NiF1IHtp9B5M=
-github.com/pion/srtp/v3 v3.0.4/go.mod h1:1Jx3FwDoxpRaTh1oRV8A/6G1BnFL+QI82eK4ms8EEJQ=
+github.com/pion/rtp v1.8.19 h1:jhdO/3XhL/aKm/wARFVmvTfq0lC/CvN1xwYKmduly3c=
+github.com/pion/rtp v1.8.19/go.mod h1:bAu2UFKScgzyFqvUKmbvzSdPr+NGbZtv6UB2hesqXBk=
+github.com/pion/sctp v1.8.39 h1:PJma40vRHa3UTO3C4MyeJDQ+KIobVYRZQZ0Nt7SjQnE=
+github.com/pion/sctp v1.8.39/go.mod h1:cNiLdchXra8fHQwmIoqw0MbLLMs+f7uQ+dGMG2gWebE=
+github.com/pion/sdp/v3 v3.0.13 h1:uN3SS2b+QDZnWXgdr69SM8KB4EbcnPnPf2Laxhty/l4=
+github.com/pion/sdp/v3 v3.0.13/go.mod h1:88GMahN5xnScv1hIMTqLdu/cOcUkj6a9ytbncwMCq2E=
+github.com/pion/srtp/v3 v3.0.6 h1:E2gyj1f5X10sB/qILUGIkL4C2CqK269Xq167PbGCc/4=
+github.com/pion/srtp/v3 v3.0.6/go.mod h1:BxvziG3v/armJHAaJ87euvkhHqWe9I7iiOy50K2QkhY=
github.com/pion/stun v0.6.1 h1:8lp6YejULeHBF8NmV8e2787BogQhduZugh5PdhDyyN4=
github.com/pion/stun v0.6.1/go.mod h1:/hO7APkX4hZKu/D0f2lHzNyvdkTGtIy3NDmLR7kSz/8=
github.com/pion/stun/v3 v3.0.0 h1:4h1gwhWLWuZWOJIJR9s2ferRO+W3zA/b6ijOI6mKzUw=
@@ -718,10 +718,10 @@ github.com/pion/transport/v2 v2.2.10 h1:ucLBLE8nuxiHfvkFKnkDQRYWYfp8ejf4YBOPfaQp
github.com/pion/transport/v2 v2.2.10/go.mod h1:sq1kSLWs+cHW9E+2fJP95QudkzbK7wscs8yYgQToO5E=
github.com/pion/transport/v3 v3.0.7 h1:iRbMH05BzSNwhILHoBoAPxoB9xQgOaJk+591KC9P1o0=
github.com/pion/transport/v3 v3.0.7/go.mod h1:YleKiTZ4vqNxVwh77Z0zytYi7rXHl7j6uPLGhhz9rwo=
-github.com/pion/turn/v4 v4.0.0 h1:qxplo3Rxa9Yg1xXDxxH8xaqcyGUtbHYw4QSCvmFWvhM=
-github.com/pion/turn/v4 v4.0.0/go.mod h1:MuPDkm15nYSklKpN8vWJ9W2M0PlyQZqYt1McGuxG7mA=
-github.com/pion/webrtc/v4 v4.0.14 h1:nyds/sFRR+HvmWoBa6wrL46sSfpArE0qR883MBW96lg=
-github.com/pion/webrtc/v4 v4.0.14/go.mod h1:R3+qTnQTS03UzwDarYecgioNf7DYgTsldxnCXB821Kk=
+github.com/pion/turn/v4 v4.0.2 h1:ZqgQ3+MjP32ug30xAbD6Mn+/K4Sxi3SdNOTFf+7mpps=
+github.com/pion/turn/v4 v4.0.2/go.mod h1:pMMKP/ieNAG/fN5cZiN4SDuyKsXtNTr0ccN7IToA1zs=
+github.com/pion/webrtc/v4 v4.1.2 h1:mpuUo/EJ1zMNKGE79fAdYNFZBX790KE7kQQpLMjjR54=
+github.com/pion/webrtc/v4 v4.1.2/go.mod h1:xsCXiNAmMEjIdFxAYU0MbB3RwRieJsegSB2JZsGN+8U=
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
@@ -758,8 +758,8 @@ github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9
github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
github.com/prometheus/common v0.35.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=
github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=
-github.com/prometheus/common v0.63.0 h1:YR/EIY1o3mEFP/kZCD7iDMnLPlGyuU2Gb3HIcXnA98k=
-github.com/prometheus/common v0.63.0/go.mod h1:VVFF/fBIoToEnWRVkYoXEkq3R3paCoxG9PXP74SnV18=
+github.com/prometheus/common v0.64.0 h1:pdZeA+g617P7oGv1CzdTzyeShxAGrTBsolKNOLQPGO4=
+github.com/prometheus/common v0.64.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8=
github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
@@ -971,10 +971,10 @@ go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8=
-go.uber.org/dig v1.18.0 h1:imUL1UiY0Mg4bqbFfsRQO5G4CGRBec/ZujWTvSVp3pw=
-go.uber.org/dig v1.18.0/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE=
-go.uber.org/fx v1.23.0 h1:lIr/gYWQGfTwGcSXWXu4vP5Ws6iqnNEIY+F/aFzCKTg=
-go.uber.org/fx v1.23.0/go.mod h1:o/D9n+2mLP6v1EG+qsdT1O8wKopYAsqZasju97SDFCU=
+go.uber.org/dig v1.19.0 h1:BACLhebsYdpQ7IROQ1AGPjrXcP5dF80U3gKoFzbaq/4=
+go.uber.org/dig v1.19.0/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE=
+go.uber.org/fx v1.24.0 h1:wE8mruvpg2kiiL1Vqd0CC+tr0/24XIB10Iwp2lLWzkg=
+go.uber.org/fx v1.24.0/go.mod h1:AmDeGyS+ZARGKM4tlH4FY2Jr63VjbEDJHtqXTGP5hbo=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
go.uber.org/mock v0.5.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko=
@@ -1109,8 +1109,8 @@ golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4Iltr
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
-golang.org/x/oauth2 v0.25.0 h1:CY4y7XT9v0cRI9oupztF8AgiIu99L/ksR/Xp/6jrZ70=
-golang.org/x/oauth2 v0.25.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
+golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
+golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=
golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -1224,8 +1224,8 @@ golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxb
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0=
-golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
+golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE=
+golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index 40eaa7914..b061d286e 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -79,6 +79,7 @@ require (
github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5 // indirect
github.com/fatih/color v1.17.0 // indirect
github.com/fatih/structtag v1.2.0 // indirect
+ github.com/filecoin-project/go-clock v0.1.0 // indirect
github.com/firefart/nonamedreturns v1.0.5 // indirect
github.com/flynn/noise v1.1.0 // indirect
github.com/francoispqt/gojay v1.2.13 // indirect
@@ -113,7 +114,7 @@ require (
github.com/golangci/unconvert v0.0.0-20240309020433-c5143eacb3ed // indirect
github.com/google/go-cmp v0.7.0 // indirect
github.com/google/gopacket v1.1.19 // indirect
- github.com/google/pprof v0.0.0-20250501235452-c0086092b71a // indirect
+ github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a // indirect
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/gordonklaus/ineffassign v0.1.0 // indirect
@@ -140,7 +141,7 @@ require (
github.com/ipfs/kubo v0.31.0 // indirect
github.com/ipld/go-codec-dagpb v1.7.0 // indirect
github.com/ipld/go-ipld-prime v0.21.0 // indirect
- github.com/ipshipyard/p2p-forge v0.5.2-0.20250616211529-2c25ee655b22 // indirect
+ github.com/ipshipyard/p2p-forge v0.6.0 // indirect
github.com/jackpal/go-nat-pmp v1.0.2 // indirect
github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect
github.com/jgautheron/goconst v1.7.1 // indirect
@@ -153,7 +154,7 @@ require (
github.com/kkHAIKE/contextcheck v1.1.5 // indirect
github.com/klauspost/compress v1.18.0 // indirect
github.com/klauspost/cpuid/v2 v2.2.10 // indirect
- github.com/koron/go-ssdp v0.0.5 // indirect
+ github.com/koron/go-ssdp v0.0.6 // indirect
github.com/kr/pretty v0.3.1 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/kulti/thelper v0.6.3 // indirect
@@ -166,8 +167,8 @@ require (
github.com/libdns/libdns v0.2.2 // indirect
github.com/libp2p/go-buffer-pool v0.1.0 // indirect
github.com/libp2p/go-cidranger v1.1.0 // indirect
- github.com/libp2p/go-flow-metrics v0.2.0 // indirect
- github.com/libp2p/go-libp2p v0.42.0-alpha-2 // indirect
+ github.com/libp2p/go-flow-metrics v0.3.0 // indirect
+ github.com/libp2p/go-libp2p v0.42.0 // indirect
github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect
github.com/libp2p/go-libp2p-kad-dht v0.33.1 // indirect
github.com/libp2p/go-libp2p-kbucket v0.7.0 // indirect
@@ -213,30 +214,30 @@ require (
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
github.com/pion/datachannel v1.5.10 // indirect
github.com/pion/dtls/v2 v2.2.12 // indirect
- github.com/pion/dtls/v3 v3.0.4 // indirect
- github.com/pion/ice/v4 v4.0.8 // indirect
- github.com/pion/interceptor v0.1.37 // indirect
+ github.com/pion/dtls/v3 v3.0.6 // indirect
+ github.com/pion/ice/v4 v4.0.10 // indirect
+ github.com/pion/interceptor v0.1.40 // indirect
github.com/pion/logging v0.2.3 // indirect
github.com/pion/mdns/v2 v2.0.7 // indirect
github.com/pion/randutil v0.1.0 // indirect
github.com/pion/rtcp v1.2.15 // indirect
- github.com/pion/rtp v1.8.13 // indirect
- github.com/pion/sctp v1.8.37 // indirect
- github.com/pion/sdp/v3 v3.0.11 // indirect
- github.com/pion/srtp/v3 v3.0.4 // indirect
+ github.com/pion/rtp v1.8.19 // indirect
+ github.com/pion/sctp v1.8.39 // indirect
+ github.com/pion/sdp/v3 v3.0.13 // indirect
+ github.com/pion/srtp/v3 v3.0.6 // indirect
github.com/pion/stun v0.6.1 // indirect
github.com/pion/stun/v3 v3.0.0 // indirect
github.com/pion/transport/v2 v2.2.10 // indirect
github.com/pion/transport/v3 v3.0.7 // indirect
- github.com/pion/turn/v4 v4.0.0 // indirect
- github.com/pion/webrtc/v4 v4.0.14 // indirect
+ github.com/pion/turn/v4 v4.0.2 // indirect
+ github.com/pion/webrtc/v4 v4.1.2 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/polydawn/refmt v0.89.0 // indirect
github.com/polyfloyd/go-errorlint v1.6.0 // indirect
github.com/prometheus/client_golang v1.22.0 // indirect
github.com/prometheus/client_model v0.6.2 // indirect
- github.com/prometheus/common v0.63.0 // indirect
+ github.com/prometheus/common v0.64.0 // indirect
github.com/prometheus/procfs v0.16.1 // indirect
github.com/quasilyte/go-ruleguard v0.4.2 // indirect
github.com/quasilyte/go-ruleguard/dsl v0.3.22 // indirect
@@ -304,8 +305,8 @@ require (
go.opentelemetry.io/otel/metric v1.35.0 // indirect
go.opentelemetry.io/otel/trace v1.35.0 // indirect
go.uber.org/automaxprocs v1.6.0 // indirect
- go.uber.org/dig v1.18.0 // indirect
- go.uber.org/fx v1.23.0 // indirect
+ go.uber.org/dig v1.19.0 // indirect
+ go.uber.org/fx v1.24.0 // indirect
go.uber.org/mock v0.5.2 // indirect
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.27.0 // indirect
@@ -319,7 +320,7 @@ require (
golang.org/x/sys v0.33.0 // indirect
golang.org/x/term v0.32.0 // indirect
golang.org/x/text v0.26.0 // indirect
- golang.org/x/time v0.11.0 // indirect
+ golang.org/x/time v0.12.0 // indirect
golang.org/x/tools v0.34.0 // indirect
gonum.org/v1/gonum v0.16.0 // indirect
google.golang.org/protobuf v1.36.6 // indirect
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index cc37881a8..b3b0de5c2 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -273,8 +273,8 @@ github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF
github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo=
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
-github.com/google/pprof v0.0.0-20250501235452-c0086092b71a h1:rDA3FfmxwXR+BVKKdz55WwMJ1pD2hJQNW31d+l3mPk4=
-github.com/google/pprof v0.0.0-20250501235452-c0086092b71a/go.mod h1:5hDyRhoBCxViHszMt12TnOpEI4VVi+U8Gm9iphldiMA=
+github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a h1://KbezygeMJZCSHH+HgUZiTeSoiuFspbMg1ge+eFj18=
+github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a/go.mod h1:5hDyRhoBCxViHszMt12TnOpEI4VVi+U8Gm9iphldiMA=
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
@@ -359,8 +359,8 @@ github.com/ipld/go-codec-dagpb v1.7.0 h1:hpuvQjCSVSLnTnHXn+QAMR0mLmb1gA6wl10LExo
github.com/ipld/go-codec-dagpb v1.7.0/go.mod h1:rD3Zg+zub9ZnxcLwfol/OTQRVjaLzXypgy4UqHQvilM=
github.com/ipld/go-ipld-prime v0.21.0 h1:n4JmcpOlPDIxBcY037SVfpd1G+Sj1nKZah0m6QH9C2E=
github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOanyMctpPjsvxQ=
-github.com/ipshipyard/p2p-forge v0.5.2-0.20250616211529-2c25ee655b22 h1:J9UVOPm9gSOKM9BurRyHLRVpG5d5TPsYaSwZe1iTNqQ=
-github.com/ipshipyard/p2p-forge v0.5.2-0.20250616211529-2c25ee655b22/go.mod h1:eCkvoEuBwYJpPjMaBtVwLuIU9dzMWiO2hej3zfpbu+4=
+github.com/ipshipyard/p2p-forge v0.6.0 h1:kNhYxgYGtqF3MLts/i0hw+7ygtgNB4Qv8h6fo7j6Iq4=
+github.com/ipshipyard/p2p-forge v0.6.0/go.mod h1:pj8Zcs+ex5OMq5a1bFLHqW0oL3qYO0v5eGLZmit0l7U=
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
github.com/jbenet/go-temp-err-catcher v0.1.0 h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABoLk/+KKHggpk=
@@ -392,8 +392,8 @@ github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zt
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE=
github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
-github.com/koron/go-ssdp v0.0.5 h1:E1iSMxIs4WqxTbIBLtmNBeOOC+1sCIXQeqTWVnpmwhk=
-github.com/koron/go-ssdp v0.0.5/go.mod h1:Qm59B7hpKpDqfyRNWRNr00jGwLdXjDyZh6y7rH6VS0w=
+github.com/koron/go-ssdp v0.0.6 h1:Jb0h04599eq/CY7rB5YEqPS83HmRfHP2azkxMN2rFtU=
+github.com/koron/go-ssdp v0.0.6/go.mod h1:0R9LfRJGek1zWTjN3JUNlm5INCDYGpRDfAptnct63fI=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
@@ -423,10 +423,10 @@ github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6
github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg=
github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38yPW7c=
github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic=
-github.com/libp2p/go-flow-metrics v0.2.0 h1:EIZzjmeOE6c8Dav0sNv35vhZxATIXWZg6j/C08XmmDw=
-github.com/libp2p/go-flow-metrics v0.2.0/go.mod h1:st3qqfu8+pMfh+9Mzqb2GTiwrAGjIPszEjZmtksN8Jc=
-github.com/libp2p/go-libp2p v0.42.0-alpha-2 h1:/YdRlrtb/kNge0MszF8mMgO9tEaPBvD1ZGubYaliaBY=
-github.com/libp2p/go-libp2p v0.42.0-alpha-2/go.mod h1:tp7K6LUZDruO2li9fK9cnQAGN8o3yTb8FwUd5AdKv+k=
+github.com/libp2p/go-flow-metrics v0.3.0 h1:q31zcHUvHnwDO0SHaukewPYgwOBSxtt830uJtUx6784=
+github.com/libp2p/go-flow-metrics v0.3.0/go.mod h1:nuhlreIwEguM1IvHAew3ij7A8BMlyHQJ279ao24eZZo=
+github.com/libp2p/go-libp2p v0.42.0 h1:A8foZk+ZEhZTv0Jb++7xUFlrFhBDv4j2Vh/uq4YX+KE=
+github.com/libp2p/go-libp2p v0.42.0/go.mod h1:4NGcjbD9OIvFiSRb0XueCO19zJ4kSPK5vkyyOUYmMro=
github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94=
github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8=
github.com/libp2p/go-libp2p-kad-dht v0.33.1 h1:hKFhHMf7WH69LDjaxsJUWOU6qZm71uO47M/a5ijkiP0=
@@ -445,8 +445,8 @@ github.com/libp2p/go-netroute v0.2.2 h1:Dejd8cQ47Qx2kRABg6lPwknU7+nBnFRpko45/fFP
github.com/libp2p/go-netroute v0.2.2/go.mod h1:Rntq6jUAH0l9Gg17w5bFGhcC9a+vk4KNXs6s7IljKYE=
github.com/libp2p/go-reuseport v0.4.0 h1:nR5KU7hD0WxXCJbmw7r2rhRYruNRl2koHw8fQscQm2s=
github.com/libp2p/go-reuseport v0.4.0/go.mod h1:ZtI03j/wO5hZVDFo2jKywN6bYKWLOy8Se6DrI2E1cLU=
-github.com/libp2p/go-yamux/v5 v5.0.0 h1:2djUh96d3Jiac/JpGkKs4TO49YhsfLopAoryfPmf+Po=
-github.com/libp2p/go-yamux/v5 v5.0.0/go.mod h1:en+3cdX51U0ZslwRdRLrvQsdayFt3TSUKvBGErzpWbU=
+github.com/libp2p/go-yamux/v5 v5.0.1 h1:f0WoX/bEF2E8SbE4c/k1Mo+/9z0O4oC/hWEA+nfYRSg=
+github.com/libp2p/go-yamux/v5 v5.0.1/go.mod h1:en+3cdX51U0ZslwRdRLrvQsdayFt3TSUKvBGErzpWbU=
github.com/lufeee/execinquery v1.2.1 h1:hf0Ems4SHcUGBxpGN7Jz78z1ppVkP/837ZlETPCEtOM=
github.com/lufeee/execinquery v1.2.1/go.mod h1:EC7DrEKView09ocscGHC+apXMIaorh4xqSxS/dy8SbM=
github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI=
@@ -563,12 +563,12 @@ github.com/pion/datachannel v1.5.10/go.mod h1:p/jJfC9arb29W7WrxyKbepTU20CFgyx5oL
github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s=
github.com/pion/dtls/v2 v2.2.12 h1:KP7H5/c1EiVAAKUmXyCzPiQe5+bCJrpOeKg/L05dunk=
github.com/pion/dtls/v2 v2.2.12/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE=
-github.com/pion/dtls/v3 v3.0.4 h1:44CZekewMzfrn9pmGrj5BNnTMDCFwr+6sLH+cCuLM7U=
-github.com/pion/dtls/v3 v3.0.4/go.mod h1:R373CsjxWqNPf6MEkfdy3aSe9niZvL/JaKlGeFphtMg=
-github.com/pion/ice/v4 v4.0.8 h1:ajNx0idNG+S+v9Phu4LSn2cs8JEfTsA1/tEjkkAVpFY=
-github.com/pion/ice/v4 v4.0.8/go.mod h1:y3M18aPhIxLlcO/4dn9X8LzLLSma84cx6emMSu14FGw=
-github.com/pion/interceptor v0.1.37 h1:aRA8Zpab/wE7/c0O3fh1PqY0AJI3fCSEM5lRWJVorwI=
-github.com/pion/interceptor v0.1.37/go.mod h1:JzxbJ4umVTlZAf+/utHzNesY8tmRkM2lVmkS82TTj8Y=
+github.com/pion/dtls/v3 v3.0.6 h1:7Hkd8WhAJNbRgq9RgdNh1aaWlZlGpYTzdqjy9x9sK2E=
+github.com/pion/dtls/v3 v3.0.6/go.mod h1:iJxNQ3Uhn1NZWOMWlLxEEHAN5yX7GyPvvKw04v9bzYU=
+github.com/pion/ice/v4 v4.0.10 h1:P59w1iauC/wPk9PdY8Vjl4fOFL5B+USq1+xbDcN6gT4=
+github.com/pion/ice/v4 v4.0.10/go.mod h1:y3M18aPhIxLlcO/4dn9X8LzLLSma84cx6emMSu14FGw=
+github.com/pion/interceptor v0.1.40 h1:e0BjnPcGpr2CFQgKhrQisBU7V3GXK6wrfYrGYaU6Jq4=
+github.com/pion/interceptor v0.1.40/go.mod h1:Z6kqH7M/FYirg3frjGJ21VLSRJGBXB/KqaTIrdqnOic=
github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms=
github.com/pion/logging v0.2.3 h1:gHuf0zpoh1GW67Nr6Gj4cv5Z9ZscU7g/EaoC/Ke/igI=
github.com/pion/logging v0.2.3/go.mod h1:z8YfknkquMe1csOrxK5kc+5/ZPAzMxbKLX5aXpbpC90=
@@ -578,14 +578,14 @@ github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA=
github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8=
github.com/pion/rtcp v1.2.15 h1:LZQi2JbdipLOj4eBjK4wlVoQWfrZbh3Q6eHtWtJBZBo=
github.com/pion/rtcp v1.2.15/go.mod h1:jlGuAjHMEXwMUHK78RgX0UmEJFV4zUKOFHR7OP+D3D0=
-github.com/pion/rtp v1.8.13 h1:8uSUPpjSL4OlwZI8Ygqu7+h2p9NPFB+yAZ461Xn5sNg=
-github.com/pion/rtp v1.8.13/go.mod h1:8uMBJj32Pa1wwx8Fuv/AsFhn8jsgw+3rUC2PfoBZ8p4=
-github.com/pion/sctp v1.8.37 h1:ZDmGPtRPX9mKCiVXtMbTWybFw3z/hVKAZgU81wcOrqs=
-github.com/pion/sctp v1.8.37/go.mod h1:cNiLdchXra8fHQwmIoqw0MbLLMs+f7uQ+dGMG2gWebE=
-github.com/pion/sdp/v3 v3.0.11 h1:VhgVSopdsBKwhCFoyyPmT1fKMeV9nLMrEKxNOdy3IVI=
-github.com/pion/sdp/v3 v3.0.11/go.mod h1:88GMahN5xnScv1hIMTqLdu/cOcUkj6a9ytbncwMCq2E=
-github.com/pion/srtp/v3 v3.0.4 h1:2Z6vDVxzrX3UHEgrUyIGM4rRouoC7v+NiF1IHtp9B5M=
-github.com/pion/srtp/v3 v3.0.4/go.mod h1:1Jx3FwDoxpRaTh1oRV8A/6G1BnFL+QI82eK4ms8EEJQ=
+github.com/pion/rtp v1.8.19 h1:jhdO/3XhL/aKm/wARFVmvTfq0lC/CvN1xwYKmduly3c=
+github.com/pion/rtp v1.8.19/go.mod h1:bAu2UFKScgzyFqvUKmbvzSdPr+NGbZtv6UB2hesqXBk=
+github.com/pion/sctp v1.8.39 h1:PJma40vRHa3UTO3C4MyeJDQ+KIobVYRZQZ0Nt7SjQnE=
+github.com/pion/sctp v1.8.39/go.mod h1:cNiLdchXra8fHQwmIoqw0MbLLMs+f7uQ+dGMG2gWebE=
+github.com/pion/sdp/v3 v3.0.13 h1:uN3SS2b+QDZnWXgdr69SM8KB4EbcnPnPf2Laxhty/l4=
+github.com/pion/sdp/v3 v3.0.13/go.mod h1:88GMahN5xnScv1hIMTqLdu/cOcUkj6a9ytbncwMCq2E=
+github.com/pion/srtp/v3 v3.0.6 h1:E2gyj1f5X10sB/qILUGIkL4C2CqK269Xq167PbGCc/4=
+github.com/pion/srtp/v3 v3.0.6/go.mod h1:BxvziG3v/armJHAaJ87euvkhHqWe9I7iiOy50K2QkhY=
github.com/pion/stun v0.6.1 h1:8lp6YejULeHBF8NmV8e2787BogQhduZugh5PdhDyyN4=
github.com/pion/stun v0.6.1/go.mod h1:/hO7APkX4hZKu/D0f2lHzNyvdkTGtIy3NDmLR7kSz/8=
github.com/pion/stun/v3 v3.0.0 h1:4h1gwhWLWuZWOJIJR9s2ferRO+W3zA/b6ijOI6mKzUw=
@@ -596,10 +596,10 @@ github.com/pion/transport/v2 v2.2.10 h1:ucLBLE8nuxiHfvkFKnkDQRYWYfp8ejf4YBOPfaQp
github.com/pion/transport/v2 v2.2.10/go.mod h1:sq1kSLWs+cHW9E+2fJP95QudkzbK7wscs8yYgQToO5E=
github.com/pion/transport/v3 v3.0.7 h1:iRbMH05BzSNwhILHoBoAPxoB9xQgOaJk+591KC9P1o0=
github.com/pion/transport/v3 v3.0.7/go.mod h1:YleKiTZ4vqNxVwh77Z0zytYi7rXHl7j6uPLGhhz9rwo=
-github.com/pion/turn/v4 v4.0.0 h1:qxplo3Rxa9Yg1xXDxxH8xaqcyGUtbHYw4QSCvmFWvhM=
-github.com/pion/turn/v4 v4.0.0/go.mod h1:MuPDkm15nYSklKpN8vWJ9W2M0PlyQZqYt1McGuxG7mA=
-github.com/pion/webrtc/v4 v4.0.14 h1:nyds/sFRR+HvmWoBa6wrL46sSfpArE0qR883MBW96lg=
-github.com/pion/webrtc/v4 v4.0.14/go.mod h1:R3+qTnQTS03UzwDarYecgioNf7DYgTsldxnCXB821Kk=
+github.com/pion/turn/v4 v4.0.2 h1:ZqgQ3+MjP32ug30xAbD6Mn+/K4Sxi3SdNOTFf+7mpps=
+github.com/pion/turn/v4 v4.0.2/go.mod h1:pMMKP/ieNAG/fN5cZiN4SDuyKsXtNTr0ccN7IToA1zs=
+github.com/pion/webrtc/v4 v4.1.2 h1:mpuUo/EJ1zMNKGE79fAdYNFZBX790KE7kQQpLMjjR54=
+github.com/pion/webrtc/v4 v4.1.2/go.mod h1:xsCXiNAmMEjIdFxAYU0MbB3RwRieJsegSB2JZsGN+8U=
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
@@ -620,8 +620,8 @@ github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:
github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=
github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
-github.com/prometheus/common v0.63.0 h1:YR/EIY1o3mEFP/kZCD7iDMnLPlGyuU2Gb3HIcXnA98k=
-github.com/prometheus/common v0.63.0/go.mod h1:VVFF/fBIoToEnWRVkYoXEkq3R3paCoxG9PXP74SnV18=
+github.com/prometheus/common v0.64.0 h1:pdZeA+g617P7oGv1CzdTzyeShxAGrTBsolKNOLQPGO4=
+github.com/prometheus/common v0.64.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8=
github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg=
github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is=
@@ -832,10 +832,10 @@ go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt
go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc=
go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8=
-go.uber.org/dig v1.18.0 h1:imUL1UiY0Mg4bqbFfsRQO5G4CGRBec/ZujWTvSVp3pw=
-go.uber.org/dig v1.18.0/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE=
-go.uber.org/fx v1.23.0 h1:lIr/gYWQGfTwGcSXWXu4vP5Ws6iqnNEIY+F/aFzCKTg=
-go.uber.org/fx v1.23.0/go.mod h1:o/D9n+2mLP6v1EG+qsdT1O8wKopYAsqZasju97SDFCU=
+go.uber.org/dig v1.19.0 h1:BACLhebsYdpQ7IROQ1AGPjrXcP5dF80U3gKoFzbaq/4=
+go.uber.org/dig v1.19.0/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE=
+go.uber.org/fx v1.24.0 h1:wE8mruvpg2kiiL1Vqd0CC+tr0/24XIB10Iwp2lLWzkg=
+go.uber.org/fx v1.24.0/go.mod h1:AmDeGyS+ZARGKM4tlH4FY2Jr63VjbEDJHtqXTGP5hbo=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
go.uber.org/mock v0.5.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko=
@@ -1026,8 +1026,8 @@ golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M=
golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA=
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0=
-golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
+golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE=
+golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
From 1269b0ce7e505a482ea9e33b2c0e899e217166e1 Mon Sep 17 00:00:00 2001
From: Hector Sanjuan
Date: Thu, 26 Jun 2025 12:42:51 +0200
Subject: [PATCH 278/499] core:constructor: add a log line about http retrieval
Similar to broadcast control. Useful for debugging/info purposes.
(cherry picked from commit 024225eaf25bc183c6398bdae257c7c301426b79)
---
core/node/bitswap.go | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/core/node/bitswap.go b/core/node/bitswap.go
index 9da278305..7e87f8288 100644
--- a/core/node/bitswap.go
+++ b/core/node/bitswap.go
@@ -99,6 +99,11 @@ func Bitswap(serverEnabled, libp2pEnabled, httpEnabled bool) interface{} {
if err != nil {
return nil, err
}
+ logger.Infof("HTTP Retrieval enabled: Allowlist: %t. Denylist: %t",
+ httpCfg.Allowlist != nil,
+ httpCfg.Denylist != nil,
+ )
+
bitswapHTTP := httpnet.New(in.Host,
httpnet.WithHTTPWorkers(int(httpCfg.NumWorkers.WithDefault(config.DefaultHTTPRetrievalNumWorkers))),
httpnet.WithAllowlist(httpCfg.Allowlist),
From 647aa2f9b50cf1867a6a0a04ce7ac45c05196383 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C5=A0tefan=20Baebler?=
<319826+stefanb@users.noreply.github.com>
Date: Wed, 2 Jul 2025 04:32:33 +0200
Subject: [PATCH 279/499] chore: Upgrade github.com/cockroachdb/pebble/v2 to
v2.0.6 for Go 1.25 support (#10850)
* Upgrade github.com/cockroachdb/swiss for Go 1.25 support
Go 1.25 incompatibility detected in
* https://github.com/Homebrew/homebrew-core/pull/226636
then:
* reported upstream in https://github.com/cockroachdb/swiss/issues/48
* fixed upstream https://github.com/cockroachdb/swiss/pull/49
This PR brings this fix upstream to kubo.
The fix was brought to github.com/cockroachdb/pebble/v2 in
* https://github.com/cockroachdb/pebble/pull/4954
And released in https://github.com/cockroachdb/pebble/releases/tag/v2.0.6
Which is now used.
Full changelog: https://github.com/cockroachdb/pebble/compare/v2.0.3...v2.0.6
* Upgrade to go-ds-pebble v0.5.1 for pebbel v2.0.6 support
---------
Co-authored-by: gammazero <11790789+gammazero@users.noreply.github.com>
(cherry picked from commit 6f0c1de58fe0eb5e1c67b68b036a8275ba7bb5d7)
---
docs/changelogs/v0.36.md | 1 +
docs/examples/kubo-as-a-library/go.mod | 6 +++---
docs/examples/kubo-as-a-library/go.sum | 12 ++++++------
go.mod | 6 +++---
go.sum | 12 ++++++------
test/dependencies/go.mod | 4 ++--
test/dependencies/go.sum | 8 ++++----
7 files changed, 25 insertions(+), 24 deletions(-)
diff --git a/docs/changelogs/v0.36.md b/docs/changelogs/v0.36.md
index dac366da9..f36a5ce37 100644
--- a/docs/changelogs/v0.36.md
+++ b/docs/changelogs/v0.36.md
@@ -94,6 +94,7 @@ This connection manager option controls how often connections are swept and pote
- update `boxo` to [v0.32.0](https://github.com/ipfs/boxo/releases/tag/v0.32.0)
- update `gateway-conformance` to [v0.8](https://github.com/ipfs/gateway-conformance/releases/tag/v0.8.0)
- update `p2p-forge/client` to [v0.6.0](https://github.com/ipshipyard/p2p-forge/releases/tag/v0.6.0)
+- update `github.com/cockroachdb/pebble/v2` to [v2.0.6](https://github.com/cockroachdb/pebble/releases/tag/v2.0.6) for Go 1.25 support
### ๐ Changelog
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index e99c9706e..237780e0a 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -32,9 +32,9 @@ require (
github.com/cockroachdb/errors v1.11.3 // indirect
github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect
- github.com/cockroachdb/pebble/v2 v2.0.3 // indirect
+ github.com/cockroachdb/pebble/v2 v2.0.6 // indirect
github.com/cockroachdb/redact v1.1.5 // indirect
- github.com/cockroachdb/swiss v0.0.0-20250327203710-2932b022f6df // indirect
+ github.com/cockroachdb/swiss v0.0.0-20250624142022-d6e517c1d961 // indirect
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect
github.com/crackcomm/go-gitignore v0.0.0-20241020182519-7843d2ba8fdf // indirect
github.com/cskr/pubsub v1.0.2 // indirect
@@ -81,7 +81,7 @@ require (
github.com/ipfs/go-ds-flatfs v0.5.5 // indirect
github.com/ipfs/go-ds-leveldb v0.5.2 // indirect
github.com/ipfs/go-ds-measure v0.2.2 // indirect
- github.com/ipfs/go-ds-pebble v0.5.0 // indirect
+ github.com/ipfs/go-ds-pebble v0.5.1 // indirect
github.com/ipfs/go-fs-lock v0.1.1 // indirect
github.com/ipfs/go-ipfs-delay v0.0.1 // indirect
github.com/ipfs/go-ipfs-ds-help v1.1.1 // indirect
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index 948ec2f14..c9a5574dc 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -91,12 +91,12 @@ github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZe
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs=
github.com/cockroachdb/metamorphic v0.0.0-20231108215700-4ba948b56895 h1:XANOgPYtvELQ/h4IrmPAohXqe2pWA8Bwhejr3VQoZsA=
github.com/cockroachdb/metamorphic v0.0.0-20231108215700-4ba948b56895/go.mod h1:aPd7gM9ov9M8v32Yy5NJrDyOcD8z642dqs+F0CeNXfA=
-github.com/cockroachdb/pebble/v2 v2.0.3 h1:YJ3Sc9jRN/q6OOCNyRHPbcpenbxL1DdgdpUqPlPus6o=
-github.com/cockroachdb/pebble/v2 v2.0.3/go.mod h1:NgxgNcWwyG/uxkLUZGM2aelshaLIZvc0hCX7SCfaO8s=
+github.com/cockroachdb/pebble/v2 v2.0.6 h1:eL54kX2AKp1ePJ/8vq4IO3xIEPpvVjlSP12dlLYilyE=
+github.com/cockroachdb/pebble/v2 v2.0.6/go.mod h1:un1DXG73PKw3F7Ndd30YactyvsFviI9Fuhe0tENdnyA=
github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30=
github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg=
-github.com/cockroachdb/swiss v0.0.0-20250327203710-2932b022f6df h1:GUJ4KuZtbOcIfRlprHJFFvIqQ4irtQUl+1fJr+yNmPI=
-github.com/cockroachdb/swiss v0.0.0-20250327203710-2932b022f6df/go.mod h1:yBRu/cnL4ks9bgy4vAASdjIW+/xMlFwuHKqtmh3GZQg=
+github.com/cockroachdb/swiss v0.0.0-20250624142022-d6e517c1d961 h1:Nua446ru3juLHLZd4AwKNzClZgL1co3pUPGv3o8FlcA=
+github.com/cockroachdb/swiss v0.0.0-20250624142022-d6e517c1d961/go.mod h1:yBRu/cnL4ks9bgy4vAASdjIW+/xMlFwuHKqtmh3GZQg=
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo=
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ=
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
@@ -319,8 +319,8 @@ github.com/ipfs/go-ds-leveldb v0.5.2 h1:6nmxlQ2zbp4LCNdJVsmHfs9GP0eylfBNxpmY1csp
github.com/ipfs/go-ds-leveldb v0.5.2/go.mod h1:2fAwmcvD3WoRT72PzEekHBkQmBDhc39DJGoREiuGmYo=
github.com/ipfs/go-ds-measure v0.2.2 h1:4kwvBGbbSXNYe4ANlg7qTIYoZU6mNlqzQHdVqICkqGI=
github.com/ipfs/go-ds-measure v0.2.2/go.mod h1:b/87ak0jMgH9Ylt7oH0+XGy4P8jHx9KG09Qz+pOeTIs=
-github.com/ipfs/go-ds-pebble v0.5.0 h1:lXffYCAKVD7nLLPqwJ9D8IxgO7Kz8woiX021tezdsIM=
-github.com/ipfs/go-ds-pebble v0.5.0/go.mod h1:aiCRVcj3K60sxc6k5C+HO9C6rouqiSkjR/WKnbTcMfQ=
+github.com/ipfs/go-ds-pebble v0.5.1 h1:p0FAE0zw9J/3T1VkGB9s98jWmfKmw2t0iEwfMUv8iSQ=
+github.com/ipfs/go-ds-pebble v0.5.1/go.mod h1:LsmQx4w+0o9znl4hTxYo1Y2lnBTzNCwc4kNpD3wWXM0=
github.com/ipfs/go-fs-lock v0.1.1 h1:TecsP/Uc7WqYYatasreZQiP9EGRy4ZnKoG4yXxR33nw=
github.com/ipfs/go-fs-lock v0.1.1/go.mod h1:2goSXMCw7QfscHmSe09oXiR34DQeUdm+ei+dhonqly0=
github.com/ipfs/go-ipfs-blockstore v1.3.1 h1:cEI9ci7V0sRNivqaOr0elDsamxXFxJMMMy7PTTDQNsQ=
diff --git a/go.mod b/go.mod
index e343aa2aa..4abc0b7d4 100644
--- a/go.mod
+++ b/go.mod
@@ -10,7 +10,7 @@ require (
github.com/cenkalti/backoff/v4 v4.3.0
github.com/ceramicnetwork/go-dag-jose v0.1.1
github.com/cheggaaa/pb v1.0.29
- github.com/cockroachdb/pebble/v2 v2.0.3
+ github.com/cockroachdb/pebble/v2 v2.0.6
github.com/coreos/go-systemd/v22 v22.5.0
github.com/dustin/go-humanize v1.0.1
github.com/elgris/jsondiff v0.0.0-20160530203242-765b5c24c302
@@ -31,7 +31,7 @@ require (
github.com/ipfs/go-ds-flatfs v0.5.5
github.com/ipfs/go-ds-leveldb v0.5.2
github.com/ipfs/go-ds-measure v0.2.2
- github.com/ipfs/go-ds-pebble v0.5.0
+ github.com/ipfs/go-ds-pebble v0.5.1
github.com/ipfs/go-fs-lock v0.1.1
github.com/ipfs/go-ipfs-cmds v0.15.0
github.com/ipfs/go-ipld-cbor v0.2.0
@@ -109,7 +109,7 @@ require (
github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect
github.com/cockroachdb/redact v1.1.5 // indirect
- github.com/cockroachdb/swiss v0.0.0-20250327203710-2932b022f6df // indirect
+ github.com/cockroachdb/swiss v0.0.0-20250624142022-d6e517c1d961 // indirect
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect
github.com/crackcomm/go-gitignore v0.0.0-20241020182519-7843d2ba8fdf // indirect
github.com/cskr/pubsub v1.0.2 // indirect
diff --git a/go.sum b/go.sum
index 8c403e49c..79548813a 100644
--- a/go.sum
+++ b/go.sum
@@ -121,12 +121,12 @@ github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZe
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs=
github.com/cockroachdb/metamorphic v0.0.0-20231108215700-4ba948b56895 h1:XANOgPYtvELQ/h4IrmPAohXqe2pWA8Bwhejr3VQoZsA=
github.com/cockroachdb/metamorphic v0.0.0-20231108215700-4ba948b56895/go.mod h1:aPd7gM9ov9M8v32Yy5NJrDyOcD8z642dqs+F0CeNXfA=
-github.com/cockroachdb/pebble/v2 v2.0.3 h1:YJ3Sc9jRN/q6OOCNyRHPbcpenbxL1DdgdpUqPlPus6o=
-github.com/cockroachdb/pebble/v2 v2.0.3/go.mod h1:NgxgNcWwyG/uxkLUZGM2aelshaLIZvc0hCX7SCfaO8s=
+github.com/cockroachdb/pebble/v2 v2.0.6 h1:eL54kX2AKp1ePJ/8vq4IO3xIEPpvVjlSP12dlLYilyE=
+github.com/cockroachdb/pebble/v2 v2.0.6/go.mod h1:un1DXG73PKw3F7Ndd30YactyvsFviI9Fuhe0tENdnyA=
github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30=
github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg=
-github.com/cockroachdb/swiss v0.0.0-20250327203710-2932b022f6df h1:GUJ4KuZtbOcIfRlprHJFFvIqQ4irtQUl+1fJr+yNmPI=
-github.com/cockroachdb/swiss v0.0.0-20250327203710-2932b022f6df/go.mod h1:yBRu/cnL4ks9bgy4vAASdjIW+/xMlFwuHKqtmh3GZQg=
+github.com/cockroachdb/swiss v0.0.0-20250624142022-d6e517c1d961 h1:Nua446ru3juLHLZd4AwKNzClZgL1co3pUPGv3o8FlcA=
+github.com/cockroachdb/swiss v0.0.0-20250624142022-d6e517c1d961/go.mod h1:yBRu/cnL4ks9bgy4vAASdjIW+/xMlFwuHKqtmh3GZQg=
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo=
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ=
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
@@ -384,8 +384,8 @@ github.com/ipfs/go-ds-leveldb v0.5.2 h1:6nmxlQ2zbp4LCNdJVsmHfs9GP0eylfBNxpmY1csp
github.com/ipfs/go-ds-leveldb v0.5.2/go.mod h1:2fAwmcvD3WoRT72PzEekHBkQmBDhc39DJGoREiuGmYo=
github.com/ipfs/go-ds-measure v0.2.2 h1:4kwvBGbbSXNYe4ANlg7qTIYoZU6mNlqzQHdVqICkqGI=
github.com/ipfs/go-ds-measure v0.2.2/go.mod h1:b/87ak0jMgH9Ylt7oH0+XGy4P8jHx9KG09Qz+pOeTIs=
-github.com/ipfs/go-ds-pebble v0.5.0 h1:lXffYCAKVD7nLLPqwJ9D8IxgO7Kz8woiX021tezdsIM=
-github.com/ipfs/go-ds-pebble v0.5.0/go.mod h1:aiCRVcj3K60sxc6k5C+HO9C6rouqiSkjR/WKnbTcMfQ=
+github.com/ipfs/go-ds-pebble v0.5.1 h1:p0FAE0zw9J/3T1VkGB9s98jWmfKmw2t0iEwfMUv8iSQ=
+github.com/ipfs/go-ds-pebble v0.5.1/go.mod h1:LsmQx4w+0o9znl4hTxYo1Y2lnBTzNCwc4kNpD3wWXM0=
github.com/ipfs/go-fs-lock v0.1.1 h1:TecsP/Uc7WqYYatasreZQiP9EGRy4ZnKoG4yXxR33nw=
github.com/ipfs/go-fs-lock v0.1.1/go.mod h1:2goSXMCw7QfscHmSe09oXiR34DQeUdm+ei+dhonqly0=
github.com/ipfs/go-ipfs-blockstore v1.3.1 h1:cEI9ci7V0sRNivqaOr0elDsamxXFxJMMMy7PTTDQNsQ=
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index b061d286e..1ca2c871b 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -62,9 +62,9 @@ require (
github.com/cockroachdb/errors v1.11.3 // indirect
github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect
- github.com/cockroachdb/pebble/v2 v2.0.3 // indirect
+ github.com/cockroachdb/pebble/v2 v2.0.6 // indirect
github.com/cockroachdb/redact v1.1.5 // indirect
- github.com/cockroachdb/swiss v0.0.0-20250327203710-2932b022f6df // indirect
+ github.com/cockroachdb/swiss v0.0.0-20250624142022-d6e517c1d961 // indirect
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect
github.com/crackcomm/go-gitignore v0.0.0-20241020182519-7843d2ba8fdf // indirect
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index b3b0de5c2..a9af9d086 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -112,12 +112,12 @@ github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZe
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs=
github.com/cockroachdb/metamorphic v0.0.0-20231108215700-4ba948b56895 h1:XANOgPYtvELQ/h4IrmPAohXqe2pWA8Bwhejr3VQoZsA=
github.com/cockroachdb/metamorphic v0.0.0-20231108215700-4ba948b56895/go.mod h1:aPd7gM9ov9M8v32Yy5NJrDyOcD8z642dqs+F0CeNXfA=
-github.com/cockroachdb/pebble/v2 v2.0.3 h1:YJ3Sc9jRN/q6OOCNyRHPbcpenbxL1DdgdpUqPlPus6o=
-github.com/cockroachdb/pebble/v2 v2.0.3/go.mod h1:NgxgNcWwyG/uxkLUZGM2aelshaLIZvc0hCX7SCfaO8s=
+github.com/cockroachdb/pebble/v2 v2.0.6 h1:eL54kX2AKp1ePJ/8vq4IO3xIEPpvVjlSP12dlLYilyE=
+github.com/cockroachdb/pebble/v2 v2.0.6/go.mod h1:un1DXG73PKw3F7Ndd30YactyvsFviI9Fuhe0tENdnyA=
github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30=
github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg=
-github.com/cockroachdb/swiss v0.0.0-20250327203710-2932b022f6df h1:GUJ4KuZtbOcIfRlprHJFFvIqQ4irtQUl+1fJr+yNmPI=
-github.com/cockroachdb/swiss v0.0.0-20250327203710-2932b022f6df/go.mod h1:yBRu/cnL4ks9bgy4vAASdjIW+/xMlFwuHKqtmh3GZQg=
+github.com/cockroachdb/swiss v0.0.0-20250624142022-d6e517c1d961 h1:Nua446ru3juLHLZd4AwKNzClZgL1co3pUPGv3o8FlcA=
+github.com/cockroachdb/swiss v0.0.0-20250624142022-d6e517c1d961/go.mod h1:yBRu/cnL4ks9bgy4vAASdjIW+/xMlFwuHKqtmh3GZQg=
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo=
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ=
github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
From 120ea0d13be6e42eccbea8bc76fb617fd32b124a Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Tue, 8 Jul 2025 02:45:43 -0700
Subject: [PATCH 280/499] Upgrade to Boxo v0.33.0 (#10857)
* Upgrade to Boxo v0.33.0
* Update test to work with boxo-v0.33.0
(cherry picked from commit 738d5232fb61cce57a4d29415df94dfe54e4f118)
---
docs/changelogs/v0.36.md | 2 +-
docs/examples/kubo-as-a-library/go.mod | 12 ++++++------
docs/examples/kubo-as-a-library/go.sum | 24 ++++++++++++------------
go.mod | 12 ++++++------
go.sum | 24 ++++++++++++------------
routing/delegated_test.go | 8 ++++----
test/dependencies/go.mod | 12 ++++++------
test/dependencies/go.sum | 24 ++++++++++++------------
8 files changed, 59 insertions(+), 59 deletions(-)
diff --git a/docs/changelogs/v0.36.md b/docs/changelogs/v0.36.md
index f36a5ce37..9c9540069 100644
--- a/docs/changelogs/v0.36.md
+++ b/docs/changelogs/v0.36.md
@@ -91,7 +91,7 @@ This connection manager option controls how often connections are swept and pote
- update `go-libp2p` to [v0.42.0](https://github.com/libp2p/go-libp2p/releases/tag/v0.42.0)
- update `go-libp2p-kad-dht` to [v0.33.0](https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.33.0)
-- update `boxo` to [v0.32.0](https://github.com/ipfs/boxo/releases/tag/v0.32.0)
+- update `boxo` to [v0.33.0](https://github.com/ipfs/boxo/releases/tag/v0.33.0) (incl. [v0.32.0](https://github.com/ipfs/boxo/releases/tag/v0.32.0))
- update `gateway-conformance` to [v0.8](https://github.com/ipfs/gateway-conformance/releases/tag/v0.8.0)
- update `p2p-forge/client` to [v0.6.0](https://github.com/ipshipyard/p2p-forge/releases/tag/v0.6.0)
- update `github.com/cockroachdb/pebble/v2` to [v2.0.6](https://github.com/cockroachdb/pebble/releases/tag/v2.0.6) for Go 1.25 support
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index 237780e0a..6c0881fab 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -7,7 +7,7 @@ go 1.24
replace github.com/ipfs/kubo => ./../../..
require (
- github.com/ipfs/boxo v0.32.0
+ github.com/ipfs/boxo v0.33.0
github.com/ipfs/kubo v0.0.0-00010101000000-000000000000
github.com/libp2p/go-libp2p v0.42.0
github.com/multiformats/go-multiaddr v0.16.0
@@ -73,7 +73,7 @@ require (
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 // indirect
github.com/ipfs/bbloom v0.0.4 // indirect
github.com/ipfs/go-bitfield v1.1.0 // indirect
- github.com/ipfs/go-block-format v0.2.1 // indirect
+ github.com/ipfs/go-block-format v0.2.2 // indirect
github.com/ipfs/go-cid v0.5.0 // indirect
github.com/ipfs/go-cidutil v0.1.0 // indirect
github.com/ipfs/go-datastore v0.8.2 // indirect
@@ -88,9 +88,9 @@ require (
github.com/ipfs/go-ipfs-pq v0.0.3 // indirect
github.com/ipfs/go-ipfs-redirects-file v0.1.2 // indirect
github.com/ipfs/go-ipld-cbor v0.2.0 // indirect
- github.com/ipfs/go-ipld-format v0.6.1 // indirect
+ github.com/ipfs/go-ipld-format v0.6.2 // indirect
github.com/ipfs/go-ipld-git v0.1.1 // indirect
- github.com/ipfs/go-ipld-legacy v0.2.1 // indirect
+ github.com/ipfs/go-ipld-legacy v0.2.2 // indirect
github.com/ipfs/go-log/v2 v2.6.0 // indirect
github.com/ipfs/go-metrics-interface v0.3.0 // indirect
github.com/ipfs/go-peertaskqueue v0.8.2 // indirect
@@ -138,7 +138,7 @@ require (
github.com/multiformats/go-multiaddr-dns v0.4.1 // indirect
github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect
github.com/multiformats/go-multibase v0.2.0 // indirect
- github.com/multiformats/go-multicodec v0.9.1 // indirect
+ github.com/multiformats/go-multicodec v0.9.2 // indirect
github.com/multiformats/go-multihash v0.2.3 // indirect
github.com/multiformats/go-multistream v0.6.1 // indirect
github.com/multiformats/go-varint v0.0.7 // indirect
@@ -211,7 +211,7 @@ require (
go.uber.org/zap/exp v0.3.0 // indirect
go4.org v0.0.0-20230225012048-214862532bf5 // indirect
golang.org/x/crypto v0.39.0 // indirect
- golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476 // indirect
+ golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b // indirect
golang.org/x/mod v0.25.0 // indirect
golang.org/x/net v0.41.0 // indirect
golang.org/x/sync v0.15.0 // indirect
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index c9a5574dc..bcaa73e90 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -289,13 +289,13 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcd
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.32.0 h1:rBs3P53Wt9bFW9WJwVdkzLtzYCXAj2bMjM7+1nrazZw=
-github.com/ipfs/boxo v0.32.0/go.mod h1:VEtO3gOmr+sXGodalaTV9Vvsp3qVYegc4Rcu08Iw+wM=
+github.com/ipfs/boxo v0.33.0 h1:9ow3chwkDzMj0Deq4AWRUEI7WnIIV7SZhPTzzG2mmfw=
+github.com/ipfs/boxo v0.33.0/go.mod h1:3IPh7YFcCIcKp6o02mCHovrPntoT5Pctj/7j4syh/RM=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk=
-github.com/ipfs/go-block-format v0.2.1 h1:96kW71XGNNa+mZw/MTzJrCpMhBWCrd9kBLoKm9Iip/Q=
-github.com/ipfs/go-block-format v0.2.1/go.mod h1:frtvXHMQhM6zn7HvEQu+Qz5wSTj+04oEH/I+NjDgEjk=
+github.com/ipfs/go-block-format v0.2.2 h1:uecCTgRwDIXyZPgYspaLXoMiMmxQpSx2aq34eNc4YvQ=
+github.com/ipfs/go-block-format v0.2.2/go.mod h1:vmuefuWU6b+9kIU0vZJgpiJt1yicQz9baHXE8qR+KB8=
github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM=
github.com/ipfs/go-cid v0.0.4/go.mod h1:4LLaPOQwmk5z9LBgQnpkivrx8BJjUyGwTXCd5Xfj6+M=
github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I=
@@ -340,12 +340,12 @@ github.com/ipfs/go-ipfs-util v0.0.3 h1:2RFdGez6bu2ZlZdI+rWfIdbQb1KudQp3VGwPtdNCm
github.com/ipfs/go-ipfs-util v0.0.3/go.mod h1:LHzG1a0Ig4G+iZ26UUOMjHd+lfM84LZCrn17xAKWBvs=
github.com/ipfs/go-ipld-cbor v0.2.0 h1:VHIW3HVIjcMd8m4ZLZbrYpwjzqlVUfjLM7oK4T5/YF0=
github.com/ipfs/go-ipld-cbor v0.2.0/go.mod h1:Cp8T7w1NKcu4AQJLqK0tWpd1nkgTxEVB5C6kVpLW6/0=
-github.com/ipfs/go-ipld-format v0.6.1 h1:lQLmBM/HHbrXvjIkrydRXkn+gc0DE5xO5fqelsCKYOQ=
-github.com/ipfs/go-ipld-format v0.6.1/go.mod h1:8TOH1Hj+LFyqM2PjSqI2/ZnyO0KlfhHbJLkbxFa61hs=
+github.com/ipfs/go-ipld-format v0.6.2 h1:bPZQ+A05ol0b3lsJSl0bLvwbuQ+HQbSsdGTy4xtYUkU=
+github.com/ipfs/go-ipld-format v0.6.2/go.mod h1:nni2xFdHKx5lxvXJ6brt/pndtGxKAE+FPR1rg4jTkyk=
github.com/ipfs/go-ipld-git v0.1.1 h1:TWGnZjS0htmEmlMFEkA3ogrNCqWjIxwr16x1OsdhG+Y=
github.com/ipfs/go-ipld-git v0.1.1/go.mod h1:+VyMqF5lMcJh4rwEppV0e6g4nCCHXThLYYDpKUkJubI=
-github.com/ipfs/go-ipld-legacy v0.2.1 h1:mDFtrBpmU7b//LzLSypVrXsD8QxkEWxu5qVxN99/+tk=
-github.com/ipfs/go-ipld-legacy v0.2.1/go.mod h1:782MOUghNzMO2DER0FlBR94mllfdCJCkTtDtPM51otM=
+github.com/ipfs/go-ipld-legacy v0.2.2 h1:DThbqCPVLpWBcGtU23KDLiY2YRZZnTkXQyfz8aOfBkQ=
+github.com/ipfs/go-ipld-legacy v0.2.2/go.mod h1:hhkj+b3kG9b2BcUNw8IFYAsfeNo8E3U7eYlWeAOPyDU=
github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM=
github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8=
github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo=
@@ -525,8 +525,8 @@ github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/g
github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc=
github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g=
github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk=
-github.com/multiformats/go-multicodec v0.9.1 h1:x/Fuxr7ZuR4jJV4Os5g444F7xC4XmyUaT/FWtE+9Zjo=
-github.com/multiformats/go-multicodec v0.9.1/go.mod h1:LLWNMtyV5ithSBUo3vFIMaeDy+h3EbkMTek1m+Fybbo=
+github.com/multiformats/go-multicodec v0.9.2 h1:YrlXCuqxjqm3bXl+vBq5LKz5pz4mvAsugdqy78k0pXQ=
+github.com/multiformats/go-multicodec v0.9.2/go.mod h1:LLWNMtyV5ithSBUo3vFIMaeDy+h3EbkMTek1m+Fybbo=
github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U=
github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew=
github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew=
@@ -854,8 +854,8 @@ golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE
golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
-golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476 h1:bsqhLWFR6G6xiQcb+JoGqdKdRU6WzPWmK8E0jxTjzo4=
-golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8=
+golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/yqS/lQJ6PmkyIV3YP+o=
+golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
diff --git a/go.mod b/go.mod
index 4abc0b7d4..77bc12fc2 100644
--- a/go.mod
+++ b/go.mod
@@ -21,8 +21,8 @@ require (
github.com/hashicorp/go-version v1.7.0
github.com/ipfs-shipyard/nopfs v0.0.14
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0
- github.com/ipfs/boxo v0.32.0
- github.com/ipfs/go-block-format v0.2.1
+ github.com/ipfs/boxo v0.33.0
+ github.com/ipfs/go-block-format v0.2.2
github.com/ipfs/go-cid v0.5.0
github.com/ipfs/go-cidutil v0.1.0
github.com/ipfs/go-datastore v0.8.2
@@ -35,9 +35,9 @@ require (
github.com/ipfs/go-fs-lock v0.1.1
github.com/ipfs/go-ipfs-cmds v0.15.0
github.com/ipfs/go-ipld-cbor v0.2.0
- github.com/ipfs/go-ipld-format v0.6.1
+ github.com/ipfs/go-ipld-format v0.6.2
github.com/ipfs/go-ipld-git v0.1.1
- github.com/ipfs/go-ipld-legacy v0.2.1
+ github.com/ipfs/go-ipld-legacy v0.2.2
github.com/ipfs/go-log/v2 v2.6.0
github.com/ipfs/go-metrics-interface v0.3.0
github.com/ipfs/go-metrics-prometheus v0.1.0
@@ -64,7 +64,7 @@ require (
github.com/multiformats/go-multiaddr v0.16.0
github.com/multiformats/go-multiaddr-dns v0.4.1
github.com/multiformats/go-multibase v0.2.0
- github.com/multiformats/go-multicodec v0.9.1
+ github.com/multiformats/go-multicodec v0.9.2
github.com/multiformats/go-multihash v0.2.3
github.com/opentracing/opentracing-go v1.2.0
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58
@@ -86,7 +86,7 @@ require (
go.uber.org/multierr v1.11.0
go.uber.org/zap v1.27.0
golang.org/x/crypto v0.39.0
- golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476
+ golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b
golang.org/x/mod v0.25.0
golang.org/x/sync v0.15.0
golang.org/x/sys v0.33.0
diff --git a/go.sum b/go.sum
index 79548813a..943c6a7e2 100644
--- a/go.sum
+++ b/go.sum
@@ -354,13 +354,13 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcd
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.32.0 h1:rBs3P53Wt9bFW9WJwVdkzLtzYCXAj2bMjM7+1nrazZw=
-github.com/ipfs/boxo v0.32.0/go.mod h1:VEtO3gOmr+sXGodalaTV9Vvsp3qVYegc4Rcu08Iw+wM=
+github.com/ipfs/boxo v0.33.0 h1:9ow3chwkDzMj0Deq4AWRUEI7WnIIV7SZhPTzzG2mmfw=
+github.com/ipfs/boxo v0.33.0/go.mod h1:3IPh7YFcCIcKp6o02mCHovrPntoT5Pctj/7j4syh/RM=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk=
-github.com/ipfs/go-block-format v0.2.1 h1:96kW71XGNNa+mZw/MTzJrCpMhBWCrd9kBLoKm9Iip/Q=
-github.com/ipfs/go-block-format v0.2.1/go.mod h1:frtvXHMQhM6zn7HvEQu+Qz5wSTj+04oEH/I+NjDgEjk=
+github.com/ipfs/go-block-format v0.2.2 h1:uecCTgRwDIXyZPgYspaLXoMiMmxQpSx2aq34eNc4YvQ=
+github.com/ipfs/go-block-format v0.2.2/go.mod h1:vmuefuWU6b+9kIU0vZJgpiJt1yicQz9baHXE8qR+KB8=
github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM=
github.com/ipfs/go-cid v0.0.4/go.mod h1:4LLaPOQwmk5z9LBgQnpkivrx8BJjUyGwTXCd5Xfj6+M=
github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I=
@@ -407,12 +407,12 @@ github.com/ipfs/go-ipfs-util v0.0.3 h1:2RFdGez6bu2ZlZdI+rWfIdbQb1KudQp3VGwPtdNCm
github.com/ipfs/go-ipfs-util v0.0.3/go.mod h1:LHzG1a0Ig4G+iZ26UUOMjHd+lfM84LZCrn17xAKWBvs=
github.com/ipfs/go-ipld-cbor v0.2.0 h1:VHIW3HVIjcMd8m4ZLZbrYpwjzqlVUfjLM7oK4T5/YF0=
github.com/ipfs/go-ipld-cbor v0.2.0/go.mod h1:Cp8T7w1NKcu4AQJLqK0tWpd1nkgTxEVB5C6kVpLW6/0=
-github.com/ipfs/go-ipld-format v0.6.1 h1:lQLmBM/HHbrXvjIkrydRXkn+gc0DE5xO5fqelsCKYOQ=
-github.com/ipfs/go-ipld-format v0.6.1/go.mod h1:8TOH1Hj+LFyqM2PjSqI2/ZnyO0KlfhHbJLkbxFa61hs=
+github.com/ipfs/go-ipld-format v0.6.2 h1:bPZQ+A05ol0b3lsJSl0bLvwbuQ+HQbSsdGTy4xtYUkU=
+github.com/ipfs/go-ipld-format v0.6.2/go.mod h1:nni2xFdHKx5lxvXJ6brt/pndtGxKAE+FPR1rg4jTkyk=
github.com/ipfs/go-ipld-git v0.1.1 h1:TWGnZjS0htmEmlMFEkA3ogrNCqWjIxwr16x1OsdhG+Y=
github.com/ipfs/go-ipld-git v0.1.1/go.mod h1:+VyMqF5lMcJh4rwEppV0e6g4nCCHXThLYYDpKUkJubI=
-github.com/ipfs/go-ipld-legacy v0.2.1 h1:mDFtrBpmU7b//LzLSypVrXsD8QxkEWxu5qVxN99/+tk=
-github.com/ipfs/go-ipld-legacy v0.2.1/go.mod h1:782MOUghNzMO2DER0FlBR94mllfdCJCkTtDtPM51otM=
+github.com/ipfs/go-ipld-legacy v0.2.2 h1:DThbqCPVLpWBcGtU23KDLiY2YRZZnTkXQyfz8aOfBkQ=
+github.com/ipfs/go-ipld-legacy v0.2.2/go.mod h1:hhkj+b3kG9b2BcUNw8IFYAsfeNo8E3U7eYlWeAOPyDU=
github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM=
github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8=
github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo=
@@ -625,8 +625,8 @@ github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/g
github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc=
github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g=
github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk=
-github.com/multiformats/go-multicodec v0.9.1 h1:x/Fuxr7ZuR4jJV4Os5g444F7xC4XmyUaT/FWtE+9Zjo=
-github.com/multiformats/go-multicodec v0.9.1/go.mod h1:LLWNMtyV5ithSBUo3vFIMaeDy+h3EbkMTek1m+Fybbo=
+github.com/multiformats/go-multicodec v0.9.2 h1:YrlXCuqxjqm3bXl+vBq5LKz5pz4mvAsugdqy78k0pXQ=
+github.com/multiformats/go-multicodec v0.9.2/go.mod h1:LLWNMtyV5ithSBUo3vFIMaeDy+h3EbkMTek1m+Fybbo=
github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U=
github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew=
github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew=
@@ -1020,8 +1020,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
-golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476 h1:bsqhLWFR6G6xiQcb+JoGqdKdRU6WzPWmK8E0jxTjzo4=
-golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8=
+golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/yqS/lQJ6PmkyIV3YP+o=
+golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
diff --git a/routing/delegated_test.go b/routing/delegated_test.go
index 028f3b465..028503a37 100644
--- a/routing/delegated_test.go
+++ b/routing/delegated_test.go
@@ -22,7 +22,7 @@ func TestParser(t *testing.T) {
Router: config.Router{
Type: config.RouterTypeHTTP,
Parameters: &config.HTTPRouterParams{
- Endpoint: "testEndpoint",
+ Endpoint: "http://testEndpoint",
},
},
},
@@ -79,7 +79,7 @@ func TestParserRecursive(t *testing.T) {
Router: config.Router{
Type: config.RouterTypeHTTP,
Parameters: &config.HTTPRouterParams{
- Endpoint: "testEndpoint1",
+ Endpoint: "http://testEndpoint1",
},
},
},
@@ -87,7 +87,7 @@ func TestParserRecursive(t *testing.T) {
Router: config.Router{
Type: config.RouterTypeHTTP,
Parameters: &config.HTTPRouterParams{
- Endpoint: "testEndpoint2",
+ Endpoint: "http://testEndpoint2",
},
},
},
@@ -95,7 +95,7 @@ func TestParserRecursive(t *testing.T) {
Router: config.Router{
Type: config.RouterTypeHTTP,
Parameters: &config.HTTPRouterParams{
- Endpoint: "testEndpoint3",
+ Endpoint: "http://testEndpoint3",
},
},
},
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index 1ca2c871b..d641e1034 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -130,13 +130,13 @@ require (
github.com/huin/goupnp v1.3.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/ipfs/bbloom v0.0.4 // indirect
- github.com/ipfs/boxo v0.32.0 // indirect
+ github.com/ipfs/boxo v0.33.0 // indirect
github.com/ipfs/go-bitfield v1.1.0 // indirect
- github.com/ipfs/go-block-format v0.2.1 // indirect
+ github.com/ipfs/go-block-format v0.2.2 // indirect
github.com/ipfs/go-cid v0.5.0 // indirect
github.com/ipfs/go-datastore v0.8.2 // indirect
- github.com/ipfs/go-ipld-format v0.6.1 // indirect
- github.com/ipfs/go-ipld-legacy v0.2.1 // indirect
+ github.com/ipfs/go-ipld-format v0.6.2 // indirect
+ github.com/ipfs/go-ipld-legacy v0.2.2 // indirect
github.com/ipfs/go-metrics-interface v0.3.0 // indirect
github.com/ipfs/kubo v0.31.0 // indirect
github.com/ipld/go-codec-dagpb v1.7.0 // indirect
@@ -200,7 +200,7 @@ require (
github.com/multiformats/go-multiaddr-dns v0.4.1 // indirect
github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect
github.com/multiformats/go-multibase v0.2.0 // indirect
- github.com/multiformats/go-multicodec v0.9.1 // indirect
+ github.com/multiformats/go-multicodec v0.9.2 // indirect
github.com/multiformats/go-multistream v0.6.1 // indirect
github.com/multiformats/go-varint v0.0.7 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
@@ -312,7 +312,7 @@ require (
go.uber.org/zap v1.27.0 // indirect
go.uber.org/zap/exp v0.3.0 // indirect
golang.org/x/crypto v0.39.0 // indirect
- golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476 // indirect
+ golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b // indirect
golang.org/x/exp/typeparams v0.0.0-20240314144324-c7f7c6466f7f // indirect
golang.org/x/mod v0.25.0 // indirect
golang.org/x/net v0.41.0 // indirect
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index a9af9d086..28cf50f9c 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -319,12 +319,12 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.32.0 h1:rBs3P53Wt9bFW9WJwVdkzLtzYCXAj2bMjM7+1nrazZw=
-github.com/ipfs/boxo v0.32.0/go.mod h1:VEtO3gOmr+sXGodalaTV9Vvsp3qVYegc4Rcu08Iw+wM=
+github.com/ipfs/boxo v0.33.0 h1:9ow3chwkDzMj0Deq4AWRUEI7WnIIV7SZhPTzzG2mmfw=
+github.com/ipfs/boxo v0.33.0/go.mod h1:3IPh7YFcCIcKp6o02mCHovrPntoT5Pctj/7j4syh/RM=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
-github.com/ipfs/go-block-format v0.2.1 h1:96kW71XGNNa+mZw/MTzJrCpMhBWCrd9kBLoKm9Iip/Q=
-github.com/ipfs/go-block-format v0.2.1/go.mod h1:frtvXHMQhM6zn7HvEQu+Qz5wSTj+04oEH/I+NjDgEjk=
+github.com/ipfs/go-block-format v0.2.2 h1:uecCTgRwDIXyZPgYspaLXoMiMmxQpSx2aq34eNc4YvQ=
+github.com/ipfs/go-block-format v0.2.2/go.mod h1:vmuefuWU6b+9kIU0vZJgpiJt1yicQz9baHXE8qR+KB8=
github.com/ipfs/go-cid v0.5.0 h1:goEKKhaGm0ul11IHA7I6p1GmKz8kEYniqFopaB5Otwg=
github.com/ipfs/go-cid v0.5.0/go.mod h1:0L7vmeNXpQpUS9vt+yEARkJ8rOg43DF3iPgn4GIN0mk=
github.com/ipfs/go-cidutil v0.1.0 h1:RW5hO7Vcf16dplUU60Hs0AKDkQAVPVplr7lk97CFL+Q=
@@ -337,10 +337,10 @@ github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1I
github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw=
github.com/ipfs/go-ipfs-pq v0.0.3 h1:YpoHVJB+jzK15mr/xsWC574tyDLkezVrDNeaalQBsTE=
github.com/ipfs/go-ipfs-pq v0.0.3/go.mod h1:btNw5hsHBpRcSSgZtiNm/SLj5gYIZ18AKtv3kERkRb4=
-github.com/ipfs/go-ipld-format v0.6.1 h1:lQLmBM/HHbrXvjIkrydRXkn+gc0DE5xO5fqelsCKYOQ=
-github.com/ipfs/go-ipld-format v0.6.1/go.mod h1:8TOH1Hj+LFyqM2PjSqI2/ZnyO0KlfhHbJLkbxFa61hs=
-github.com/ipfs/go-ipld-legacy v0.2.1 h1:mDFtrBpmU7b//LzLSypVrXsD8QxkEWxu5qVxN99/+tk=
-github.com/ipfs/go-ipld-legacy v0.2.1/go.mod h1:782MOUghNzMO2DER0FlBR94mllfdCJCkTtDtPM51otM=
+github.com/ipfs/go-ipld-format v0.6.2 h1:bPZQ+A05ol0b3lsJSl0bLvwbuQ+HQbSsdGTy4xtYUkU=
+github.com/ipfs/go-ipld-format v0.6.2/go.mod h1:nni2xFdHKx5lxvXJ6brt/pndtGxKAE+FPR1rg4jTkyk=
+github.com/ipfs/go-ipld-legacy v0.2.2 h1:DThbqCPVLpWBcGtU23KDLiY2YRZZnTkXQyfz8aOfBkQ=
+github.com/ipfs/go-ipld-legacy v0.2.2/go.mod h1:hhkj+b3kG9b2BcUNw8IFYAsfeNo8E3U7eYlWeAOPyDU=
github.com/ipfs/go-log/v2 v2.6.0 h1:2Nu1KKQQ2ayonKp4MPo6pXCjqw1ULc9iohRqWV5EYqg=
github.com/ipfs/go-log/v2 v2.6.0/go.mod h1:p+Efr3qaY5YXpx9TX7MoLCSEZX5boSWj9wh86P5HJa8=
github.com/ipfs/go-metrics-interface v0.3.0 h1:YwG7/Cy4R94mYDUuwsBfeziJCVm9pBMJ6q/JR9V40TU=
@@ -517,8 +517,8 @@ github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/e
github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo=
github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g=
github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk=
-github.com/multiformats/go-multicodec v0.9.1 h1:x/Fuxr7ZuR4jJV4Os5g444F7xC4XmyUaT/FWtE+9Zjo=
-github.com/multiformats/go-multicodec v0.9.1/go.mod h1:LLWNMtyV5ithSBUo3vFIMaeDy+h3EbkMTek1m+Fybbo=
+github.com/multiformats/go-multicodec v0.9.2 h1:YrlXCuqxjqm3bXl+vBq5LKz5pz4mvAsugdqy78k0pXQ=
+github.com/multiformats/go-multicodec v0.9.2/go.mod h1:LLWNMtyV5ithSBUo3vFIMaeDy+h3EbkMTek1m+Fybbo=
github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew=
github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U=
github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM=
@@ -869,8 +869,8 @@ golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOM
golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM=
golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476 h1:bsqhLWFR6G6xiQcb+JoGqdKdRU6WzPWmK8E0jxTjzo4=
-golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8=
+golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/yqS/lQJ6PmkyIV3YP+o=
+golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8=
golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
golang.org/x/exp/typeparams v0.0.0-20240314144324-c7f7c6466f7f h1:phY1HzDcf18Aq9A8KkmRtY9WvOFIxN8wgfvy6Zm1DV8=
From ca2b8f69a67f8d5b13c330cb7b26f8249484b134 Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Tue, 8 Jul 2025 08:27:49 -0700
Subject: [PATCH 281/499] refactor: use slices.Sort where appropriate (#10858)
(cherry picked from commit b95845e539e481c22f1d37c0bc3d1a606d06f80b)
---
core/commands/active.go | 4 ++--
core/commands/bootstrap.go | 14 +++++++-----
core/commands/cid.go | 34 ++++++++++++++--------------
core/commands/commands.go | 4 ++--
core/commands/completion.go | 23 +++++++------------
core/commands/files.go | 6 ++---
core/commands/id.go | 10 ++++-----
core/commands/ls.go | 7 +++---
core/commands/pubsub.go | 4 ++--
core/commands/swarm.go | 45 ++++++++++++++-----------------------
10 files changed, 68 insertions(+), 83 deletions(-)
diff --git a/core/commands/active.go b/core/commands/active.go
index 786075f01..aacadd676 100644
--- a/core/commands/active.go
+++ b/core/commands/active.go
@@ -3,7 +3,7 @@ package commands
import (
"fmt"
"io"
- "sort"
+ "slices"
"text/tabwriter"
"time"
@@ -60,7 +60,7 @@ Lists running and recently run commands.
for k := range req.Options {
keys = append(keys, k)
}
- sort.Strings(keys)
+ slices.Sort(keys)
for _, k := range keys {
fmt.Fprintf(tw, "%s=%v,", k, req.Options[k])
diff --git a/core/commands/bootstrap.go b/core/commands/bootstrap.go
index decf2b271..6d760f47f 100644
--- a/core/commands/bootstrap.go
+++ b/core/commands/bootstrap.go
@@ -4,14 +4,14 @@ import (
"errors"
"fmt"
"io"
- "sort"
-
- cmdenv "github.com/ipfs/kubo/core/commands/cmdenv"
- repo "github.com/ipfs/kubo/repo"
- fsrepo "github.com/ipfs/kubo/repo/fsrepo"
+ "slices"
+ "strings"
cmds "github.com/ipfs/go-ipfs-cmds"
config "github.com/ipfs/kubo/config"
+ cmdenv "github.com/ipfs/kubo/core/commands/cmdenv"
+ repo "github.com/ipfs/kubo/repo"
+ fsrepo "github.com/ipfs/kubo/repo/fsrepo"
peer "github.com/libp2p/go-libp2p/core/peer"
ma "github.com/multiformats/go-multiaddr"
)
@@ -284,7 +284,9 @@ var bootstrapListCmd = &cmds.Command{
}
func bootstrapWritePeers(w io.Writer, prefix string, peers []string) error {
- sort.Stable(sort.StringSlice(peers))
+ slices.SortStableFunc(peers, func(a, b string) int {
+ return strings.Compare(a, b)
+ })
for _, peer := range peers {
_, err := w.Write([]byte(prefix + peer + "\n"))
if err != nil {
diff --git a/core/commands/cid.go b/core/commands/cid.go
index 26596f011..8491715be 100644
--- a/core/commands/cid.go
+++ b/core/commands/cid.go
@@ -1,10 +1,11 @@
package commands
import (
+ "cmp"
"errors"
"fmt"
"io"
- "sort"
+ "slices"
"strings"
"unicode"
@@ -287,7 +288,7 @@ var basesCmd = &cmds.Command{
cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, val []CodeAndName) error {
prefixes, _ := req.Options[prefixOptionName].(bool)
numeric, _ := req.Options[numericOptionName].(bool)
- sort.Sort(multibaseSorter{val})
+ multibaseSorter{val}.Sort()
for _, v := range val {
code := v.Code
if code < 32 || code >= 127 {
@@ -357,7 +358,7 @@ var codecsCmd = &cmds.Command{
Encoders: cmds.EncoderMap{
cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, val []CodeAndName) error {
numeric, _ := req.Options[codecsNumericOptionName].(bool)
- sort.Sort(codeAndNameSorter{val})
+ codeAndNameSorter{val}.Sort()
for _, v := range val {
if numeric {
fmt.Fprintf(w, "%5d %s\n", v.Code, v.Name)
@@ -398,23 +399,22 @@ type multibaseSorter struct {
data []CodeAndName
}
-func (s multibaseSorter) Len() int { return len(s.data) }
-func (s multibaseSorter) Swap(i, j int) { s.data[i], s.data[j] = s.data[j], s.data[i] }
-
-func (s multibaseSorter) Less(i, j int) bool {
- a := unicode.ToLower(rune(s.data[i].Code))
- b := unicode.ToLower(rune(s.data[j].Code))
- if a != b {
- return a < b
- }
- // lowecase letters should come before uppercase
- return s.data[i].Code > s.data[j].Code
+func (s multibaseSorter) Sort() {
+ slices.SortFunc(s.data, func(a, b CodeAndName) int {
+ if n := cmp.Compare(unicode.ToLower(rune(a.Code)), unicode.ToLower(rune(b.Code))); n != 0 {
+ return n
+ }
+ // lowecase letters should come before uppercase
+ return cmp.Compare(b.Code, a.Code)
+ })
}
type codeAndNameSorter struct {
data []CodeAndName
}
-func (s codeAndNameSorter) Len() int { return len(s.data) }
-func (s codeAndNameSorter) Swap(i, j int) { s.data[i], s.data[j] = s.data[j], s.data[i] }
-func (s codeAndNameSorter) Less(i, j int) bool { return s.data[i].Code < s.data[j].Code }
+func (s codeAndNameSorter) Sort() {
+ slices.SortFunc(s.data, func(a, b CodeAndName) int {
+ return cmp.Compare(a.Code, b.Code)
+ })
+}
diff --git a/core/commands/commands.go b/core/commands/commands.go
index 249f0ffbe..9e2b60dc8 100644
--- a/core/commands/commands.go
+++ b/core/commands/commands.go
@@ -10,7 +10,7 @@ import (
"fmt"
"io"
"os"
- "sort"
+ "slices"
"strings"
cmds "github.com/ipfs/go-ipfs-cmds"
@@ -131,7 +131,7 @@ func cmdPathStrings(cmd *Command, showOptions bool) []string {
}
recurse("", cmd)
- sort.Strings(cmds)
+ slices.Sort(cmds)
return cmds
}
diff --git a/core/commands/completion.go b/core/commands/completion.go
index 2f5b8b61e..448af4d50 100644
--- a/core/commands/completion.go
+++ b/core/commands/completion.go
@@ -2,7 +2,8 @@ package commands
import (
"io"
- "sort"
+ "slices"
+ "strings"
"text/template"
cmds "github.com/ipfs/go-ipfs-cmds"
@@ -39,8 +40,8 @@ func commandToCompletions(name string, fullName string, cmd *cmds.Command) *comp
parsed.Subcommands = append(parsed.Subcommands,
commandToCompletions(name, fullName+" "+name, subCmd))
}
- sort.Slice(parsed.Subcommands, func(i, j int) bool {
- return parsed.Subcommands[i].Name < parsed.Subcommands[j].Name
+ slices.SortFunc(parsed.Subcommands, func(a, b *completionCommand) int {
+ return strings.Compare(a.Name, b.Name)
})
for _, opt := range cmd.Options {
@@ -68,18 +69,10 @@ func commandToCompletions(name string, fullName string, cmd *cmds.Command) *comp
parsed.Options = append(parsed.Options, flag)
}
}
- sort.Slice(parsed.LongFlags, func(i, j int) bool {
- return parsed.LongFlags[i] < parsed.LongFlags[j]
- })
- sort.Slice(parsed.ShortFlags, func(i, j int) bool {
- return parsed.ShortFlags[i] < parsed.ShortFlags[j]
- })
- sort.Slice(parsed.LongOptions, func(i, j int) bool {
- return parsed.LongOptions[i] < parsed.LongOptions[j]
- })
- sort.Slice(parsed.ShortOptions, func(i, j int) bool {
- return parsed.ShortOptions[i] < parsed.ShortOptions[j]
- })
+ slices.Sort(parsed.LongFlags)
+ slices.Sort(parsed.ShortFlags)
+ slices.Sort(parsed.LongOptions)
+ slices.Sort(parsed.ShortOptions)
return parsed
}
diff --git a/core/commands/files.go b/core/commands/files.go
index dfa94d2a6..12a96eba2 100644
--- a/core/commands/files.go
+++ b/core/commands/files.go
@@ -8,7 +8,7 @@ import (
"io"
"os"
gopath "path"
- "sort"
+ "slices"
"strconv"
"strings"
"time"
@@ -698,8 +698,8 @@ Examples:
cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, out *filesLsOutput) error {
noSort, _ := req.Options[dontSortOptionName].(bool)
if !noSort {
- sort.Slice(out.Entries, func(i, j int) bool {
- return strings.Compare(out.Entries[i].Name, out.Entries[j].Name) < 0
+ slices.SortFunc(out.Entries, func(a, b mfs.NodeListing) int {
+ return strings.Compare(a.Name, b.Name)
})
}
diff --git a/core/commands/id.go b/core/commands/id.go
index 33ad03286..295223258 100644
--- a/core/commands/id.go
+++ b/core/commands/id.go
@@ -6,7 +6,7 @@ import (
"errors"
"fmt"
"io"
- "sort"
+ "slices"
"strings"
version "github.com/ipfs/kubo"
@@ -170,11 +170,11 @@ func printPeer(keyEnc ke.KeyEncoder, ps pstore.Peerstore, p peer.ID) (interface{
for _, a := range addrs {
info.Addresses = append(info.Addresses, a.String())
}
- sort.Strings(info.Addresses)
+ slices.Sort(info.Addresses)
protocols, _ := ps.GetProtocols(p) // don't care about errors here.
info.Protocols = append(info.Protocols, protocols...)
- sort.Slice(info.Protocols, func(i, j int) bool { return info.Protocols[i] < info.Protocols[j] })
+ slices.Sort(info.Protocols)
if v, err := ps.Get(p, "AgentVersion"); err == nil {
if vs, ok := v.(string); ok {
@@ -205,9 +205,9 @@ func printSelf(keyEnc ke.KeyEncoder, node *core.IpfsNode) (interface{}, error) {
for _, a := range addrs {
info.Addresses = append(info.Addresses, a.String())
}
- sort.Strings(info.Addresses)
+ slices.Sort(info.Addresses)
info.Protocols = node.PeerHost.Mux().Protocols()
- sort.Slice(info.Protocols, func(i, j int) bool { return info.Protocols[i] < info.Protocols[j] })
+ slices.Sort(info.Protocols)
}
info.AgentVersion = version.GetUserAgentVersion()
return info, nil
diff --git a/core/commands/ls.go b/core/commands/ls.go
index bdd475d96..327b159a1 100644
--- a/core/commands/ls.go
+++ b/core/commands/ls.go
@@ -5,7 +5,8 @@ import (
"fmt"
"io"
"os"
- "sort"
+ "slices"
+ "strings"
"text/tabwriter"
"time"
@@ -118,8 +119,8 @@ The JSON output contains type information.
return nil
}, func(i int) {
// after each dir
- sort.Slice(outputLinks, func(i, j int) bool {
- return outputLinks[i].Name < outputLinks[j].Name
+ slices.SortFunc(outputLinks, func(a, b LsLink) int {
+ return strings.Compare(a.Name, b.Name)
})
output[i] = LsObject{
diff --git a/core/commands/pubsub.go b/core/commands/pubsub.go
index d50e651b2..9e81ef281 100644
--- a/core/commands/pubsub.go
+++ b/core/commands/pubsub.go
@@ -6,7 +6,7 @@ import (
"fmt"
"io"
"net/http"
- "sort"
+ "slices"
cmdenv "github.com/ipfs/kubo/core/commands/cmdenv"
mbase "github.com/multiformats/go-multibase"
@@ -325,7 +325,7 @@ TOPIC AND DATA ENCODING
for _, peer := range peers {
list.Strings = append(list.Strings, peer.String())
}
- sort.Strings(list.Strings)
+ slices.Sort(list.Strings)
return cmds.EmitOnce(res, list)
},
Type: stringList{},
diff --git a/core/commands/swarm.go b/core/commands/swarm.go
index 252c48d33..153068438 100644
--- a/core/commands/swarm.go
+++ b/core/commands/swarm.go
@@ -8,8 +8,9 @@ import (
"fmt"
"io"
"path"
- "sort"
+ "slices"
"strconv"
+ "strings"
"sync"
"text/tabwriter"
"time"
@@ -301,11 +302,11 @@ var swarmPeersCmd = &cmds.Command{
identifyResult, _ := ci.identifyPeer(n.Peerstore, c.ID())
ci.Identify = identifyResult
}
- sort.Sort(&ci)
+ ci.Sort()
out.Peers = append(out.Peers, ci)
}
- sort.Sort(&out)
+ out.Sort()
return cmds.EmitOnce(res, &out)
},
Encoders: cmds.EncoderMap{
@@ -435,32 +436,20 @@ type connInfo struct {
Identify IdOutput `json:",omitempty"`
}
-func (ci *connInfo) Less(i, j int) bool {
- return ci.Streams[i].Protocol < ci.Streams[j].Protocol
-}
-
-func (ci *connInfo) Len() int {
- return len(ci.Streams)
-}
-
-func (ci *connInfo) Swap(i, j int) {
- ci.Streams[i], ci.Streams[j] = ci.Streams[j], ci.Streams[i]
+func (ci *connInfo) Sort() {
+ slices.SortFunc(ci.Streams, func(a, b streamInfo) int {
+ return strings.Compare(a.Protocol, b.Protocol)
+ })
}
type connInfos struct {
Peers []connInfo
}
-func (ci connInfos) Less(i, j int) bool {
- return ci.Peers[i].Addr < ci.Peers[j].Addr
-}
-
-func (ci connInfos) Len() int {
- return len(ci.Peers)
-}
-
-func (ci connInfos) Swap(i, j int) {
- ci.Peers[i], ci.Peers[j] = ci.Peers[j], ci.Peers[i]
+func (ci *connInfos) Sort() {
+ slices.SortFunc(ci.Peers, func(a, b connInfo) int {
+ return strings.Compare(a.Addr, b.Addr)
+ })
}
func (ci *connInfo) identifyPeer(ps pstore.Peerstore, p peer.ID) (IdOutput, error) {
@@ -484,11 +473,11 @@ func (ci *connInfo) identifyPeer(ps pstore.Peerstore, p peer.ID) (IdOutput, erro
for _, a := range addrs {
info.Addresses = append(info.Addresses, a.String())
}
- sort.Strings(info.Addresses)
+ slices.Sort(info.Addresses)
if protocols, err := ps.GetProtocols(p); err == nil {
info.Protocols = append(info.Protocols, protocols...)
- sort.Slice(info.Protocols, func(i, j int) bool { return info.Protocols[i] < info.Protocols[j] })
+ slices.Sort(info.Protocols)
}
if v, err := ps.Get(p, "AgentVersion"); err == nil {
@@ -551,7 +540,7 @@ var swarmAddrsCmd = &cmds.Command{
for p := range am.Addrs {
ids = append(ids, p)
}
- sort.Strings(ids)
+ slices.Sort(ids)
for _, p := range ids {
paddrs := am.Addrs[p]
@@ -603,7 +592,7 @@ var swarmAddrsLocalCmd = &cmds.Command{
}
addrs = append(addrs, saddr)
}
- sort.Strings(addrs)
+ slices.Sort(addrs)
return cmds.EmitOnce(res, &stringList{addrs})
},
Type: stringList{},
@@ -634,7 +623,7 @@ var swarmAddrsListenCmd = &cmds.Command{
for _, addr := range maddrs {
addrs = append(addrs, addr.String())
}
- sort.Strings(addrs)
+ slices.Sort(addrs)
return cmds.EmitOnce(res, &stringList{addrs})
},
From 95453688e50b519835490d31a9165f57e89bef8b Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Tue, 8 Jul 2025 09:00:28 -0700
Subject: [PATCH 282/499] fix: handling of EDITOR env var (#10855)
The `ipfs config edit` command did not correctly handle the `EDITOR` environment variable correctly when its value contains flags and arguments, i.e. `EDITOR=emacs -nw`. The command was treating the entire value of `$EDITOR` as the name of the editor command. This has been fixed to parse the value of `$EDITOR` into separate args, respecting shell quoting.
Closes #9375
(cherry picked from commit 4195a1da9fffec4451cc10de6b12b4751fc31b56)
---
core/commands/config.go | 17 ++++++++++++-----
docs/changelogs/v0.36.md | 5 +++++
go.mod | 1 +
go.sum | 2 ++
4 files changed, 20 insertions(+), 5 deletions(-)
diff --git a/core/commands/config.go b/core/commands/config.go
index 9d37111c3..7d5a5fa17 100644
--- a/core/commands/config.go
+++ b/core/commands/config.go
@@ -9,13 +9,13 @@ import (
"os/exec"
"strings"
- "github.com/ipfs/kubo/core/commands/cmdenv"
- "github.com/ipfs/kubo/repo"
- "github.com/ipfs/kubo/repo/fsrepo"
-
+ "github.com/anmitsu/go-shlex"
"github.com/elgris/jsondiff"
cmds "github.com/ipfs/go-ipfs-cmds"
config "github.com/ipfs/kubo/config"
+ "github.com/ipfs/kubo/core/commands/cmdenv"
+ "github.com/ipfs/kubo/repo"
+ "github.com/ipfs/kubo/repo/fsrepo"
)
// ConfigUpdateOutput is config profile apply command's output
@@ -512,7 +512,14 @@ func editConfig(filename string) error {
return errors.New("ENV variable $EDITOR not set")
}
- cmd := exec.Command(editor, filename)
+ editorAndArgs, err := shlex.Split(editor, true)
+ if err != nil {
+ return fmt.Errorf("cannot parse $EDITOR value: %s", err)
+ }
+ editor = editorAndArgs[0]
+ args := append(editorAndArgs[1:], filename)
+
+ cmd := exec.Command(editor, args...)
cmd.Stdin, cmd.Stdout, cmd.Stderr = os.Stdin, os.Stdout, os.Stderr
return cmd.Run()
}
diff --git a/docs/changelogs/v0.36.md b/docs/changelogs/v0.36.md
index 9c9540069..9731e7f85 100644
--- a/docs/changelogs/v0.36.md
+++ b/docs/changelogs/v0.36.md
@@ -21,6 +21,7 @@ This release was brought to you by the [Interplanetary Shipyard](https://ipship
- [Gateway now supports negative HTTP Range requests](#gateway-now-supports-negative-http-range-requests)
- [Option for `filestore` command to remove bad blocks](#option-for-filestore-command-to-remove-bad-blocks)
- [`ConnMgr.SilencePeriod` configuration setting exposed](#connmgrsilenceperiod-configuration-setting-exposed)
+ - [Fix handling of EDITOR env var](#fix-handling-of-editor-env-var)
- [๐ฆ๏ธ Important dependency updates](#-important-dependency-updates)
- [๐ Changelog](#-changelog)
- [๐จโ๐ฉโ๐งโ๐ฆ Contributors](#-contributors)
@@ -87,6 +88,10 @@ The [experimental `filestore`](https://github.com/ipfs/kubo/blob/master/docs/exp
This connection manager option controls how often connections are swept and potentially terminated. See the [ConnMgr documentation](https://github.com/ipfs/kubo/blob/master/docs/config.md#swarmconnmgrsilenceperiod).
+#### Fix handling of EDITOR env var
+
+The `ipfs config edit` command did not correctly handle the `EDITOR` environment variable correctly when its value contains flags and arguments, i.e. `EDITOR=emacs -nw`. The command was treating the entire value of `$EDITOR` as the name of the editor command. This has been fixed to parse the value of `$EDITOR` into separate args, respecting shell quoting.
+
#### ๐ฆ๏ธ Important dependency updates
- update `go-libp2p` to [v0.42.0](https://github.com/libp2p/go-libp2p/releases/tag/v0.42.0)
diff --git a/go.mod b/go.mod
index 77bc12fc2..a9bd58174 100644
--- a/go.mod
+++ b/go.mod
@@ -5,6 +5,7 @@ go 1.24
require (
bazil.org/fuse v0.0.0-20200117225306-7b5117fecadc
contrib.go.opencensus.io/exporter/prometheus v0.4.2
+ github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239
github.com/blang/semver/v4 v4.0.0
github.com/caddyserver/certmagic v0.21.6
github.com/cenkalti/backoff/v4 v4.3.0
diff --git a/go.sum b/go.sum
index 943c6a7e2..368d2f8bc 100644
--- a/go.sum
+++ b/go.sum
@@ -66,6 +66,7 @@ github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b h1:mimo19zliBX/vS
github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs=
github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5 h1:iW0a5ljuFxkLGPNem5Ui+KBjFJzKg4Fv2fnxe4dvzpM=
github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5/go.mod h1:Y2QMoi1vgtOIfc+6DhrMOGkLoGzqSV2rKp4Sm+opsyA=
+github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA=
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o=
@@ -180,6 +181,7 @@ github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
github.com/filecoin-project/go-clock v0.1.0 h1:SFbYIM75M8NnFm1yMHhN9Ahy3W5bEZV9gd6MPfXbKVU=
github.com/filecoin-project/go-clock v0.1.0/go.mod h1:4uB/O4PvOjlx1VCMdZ9MyDZXRm//gkj1ELEbxfI1AZs=
+github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ=
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
github.com/flynn/noise v1.1.0 h1:KjPQoQCEFdZDiP03phOvGi11+SVVhBG2wOWAorLsstg=
github.com/flynn/noise v1.1.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag=
From d3a4558f6921bdfcb4f4be2bcab64961dc09d6d4 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Tue, 8 Jul 2025 18:28:40 +0200
Subject: [PATCH 283/499] test: TestEditorParsing
(cherry picked from commit e44b53a7c9b73dd2b7df514f9633b1c992504d4c)
---
core/commands/config.go | 7 ++-
core/commands/config_test.go | 113 +++++++++++++++++++++++++++++++++++
2 files changed, 119 insertions(+), 1 deletion(-)
diff --git a/core/commands/config.go b/core/commands/config.go
index 7d5a5fa17..8329e972f 100644
--- a/core/commands/config.go
+++ b/core/commands/config.go
@@ -506,13 +506,18 @@ func setConfig(r repo.Repo, key string, value interface{}) (*ConfigField, error)
return getConfig(r, key)
}
+// parseEditorCommand parses the EDITOR environment variable into command and arguments
+func parseEditorCommand(editor string) ([]string, error) {
+ return shlex.Split(editor, true)
+}
+
func editConfig(filename string) error {
editor := os.Getenv("EDITOR")
if editor == "" {
return errors.New("ENV variable $EDITOR not set")
}
- editorAndArgs, err := shlex.Split(editor, true)
+ editorAndArgs, err := parseEditorCommand(editor)
if err != nil {
return fmt.Errorf("cannot parse $EDITOR value: %s", err)
}
diff --git a/core/commands/config_test.go b/core/commands/config_test.go
index 5eb79c153..fe1660abb 100644
--- a/core/commands/config_test.go
+++ b/core/commands/config_test.go
@@ -14,3 +14,116 @@ func TestScrubMapInternalDelete(t *testing.T) {
t.Errorf("expecting an empty map, got a non-empty map")
}
}
+
+func TestEditorParsing(t *testing.T) {
+ testCases := []struct {
+ name string
+ input string
+ expected []string
+ hasError bool
+ }{
+ {
+ name: "simple editor",
+ input: "vim",
+ expected: []string{"vim"},
+ hasError: false,
+ },
+ {
+ name: "editor with single flag",
+ input: "emacs -nw",
+ expected: []string{"emacs", "-nw"},
+ hasError: false,
+ },
+ {
+ name: "VS Code with wait flag (issue #9375)",
+ input: "code --wait",
+ expected: []string{"code", "--wait"},
+ hasError: false,
+ },
+ {
+ name: "VS Code with full path and wait flag (issue #9375)",
+ input: "/opt/homebrew/bin/code --wait",
+ expected: []string{"/opt/homebrew/bin/code", "--wait"},
+ hasError: false,
+ },
+ {
+ name: "editor with quoted path containing spaces",
+ input: "\"/Applications/Visual Studio Code.app/Contents/Resources/app/bin/code\" --wait",
+ expected: []string{"/Applications/Visual Studio Code.app/Contents/Resources/app/bin/code", "--wait"},
+ hasError: false,
+ },
+ {
+ name: "sublime text with wait flag",
+ input: "subl -w",
+ expected: []string{"subl", "-w"},
+ hasError: false,
+ },
+ {
+ name: "nano editor",
+ input: "nano",
+ expected: []string{"nano"},
+ hasError: false,
+ },
+ {
+ name: "gedit editor",
+ input: "gedit",
+ expected: []string{"gedit"},
+ hasError: false,
+ },
+ {
+ name: "editor with multiple flags",
+ input: "vim -c 'set number' -c 'set hlsearch'",
+ expected: []string{"vim", "-c", "set number", "-c", "set hlsearch"},
+ hasError: false,
+ },
+ {
+ name: "trailing backslash (POSIX edge case)",
+ input: "editor\\",
+ expected: nil,
+ hasError: true,
+ },
+ {
+ name: "double quoted editor name with spaces",
+ input: "\"code with spaces\" --wait",
+ expected: []string{"code with spaces", "--wait"},
+ hasError: false,
+ },
+ {
+ name: "single quoted editor with flags",
+ input: "'my editor' -flag",
+ expected: []string{"my editor", "-flag"},
+ hasError: false,
+ },
+ }
+
+ for _, tc := range testCases {
+ t.Run(tc.name, func(t *testing.T) {
+ result, err := parseEditorCommand(tc.input)
+
+ if tc.hasError {
+ if err == nil {
+ t.Errorf("Expected error for input '%s', but got none", tc.input)
+ }
+ return
+ }
+
+ if err != nil {
+ t.Errorf("Unexpected error for input '%s': %v", tc.input, err)
+ return
+ }
+
+ if len(result) != len(tc.expected) {
+ t.Errorf("Expected %d args, got %d for input '%s'", len(tc.expected), len(result), tc.input)
+ t.Errorf("Expected: %v", tc.expected)
+ t.Errorf("Got: %v", result)
+ return
+ }
+
+ for i, expected := range tc.expected {
+ if result[i] != expected {
+ t.Errorf("Expected arg %d to be '%s', got '%s' for input '%s'", i, expected, result[i], tc.input)
+ }
+ }
+ })
+ }
+}
From f17f89eefca9dcdaf0bc14e91b0fb3c56e130f74 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Tue, 8 Jul 2025 19:19:15 +0200
Subject: [PATCH 284/499] chore: changelog
---
docs/changelogs/v0.36.md | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/docs/changelogs/v0.36.md b/docs/changelogs/v0.36.md
index 9731e7f85..383b08209 100644
--- a/docs/changelogs/v0.36.md
+++ b/docs/changelogs/v0.36.md
@@ -32,7 +32,7 @@ This release was brought to you by the [Interplanetary Shipyard](https://ipship
#### HTTP Retrieval Client Now Enabled by Default
-This release promotes the HTTP Retrieval client from an experimental feature to a standard feature that is enabled by default. When possible, Kubo will be retrieving blocks over plain HTTPS (HTTP/2) without any extra user configuration.
+This release promotes the HTTP Retrieval client from an experimental feature to a standard feature that is enabled by default. When possible, Kubo will retrieve blocks over plain HTTPS (HTTP/2) without any extra user configuration.
See [`HTTPRetrieval`](https://github.com/ipfs/kubo/blob/master/docs/config.md#httpretrieval) for more details.
@@ -40,11 +40,11 @@ See [`HTTPRetrieval`](https://github.com/ipfs/kubo/blob/master/docs/config.md#ht
The Bitswap client now supports broadcast reduction logic, which is enabled by default. This feature significantly reduces the number of broadcast messages sent to peers, resulting in lower bandwidth usage during load spikes.
-The overall logic works by sending to non-local peers only if those peers have previously replied that they have wanted data blocks. To minimize impact on existing workloads, by default, broadcasts are still always sent to peers on the local network, or the ones defined in `Peering.Peers`.
+The overall logic works by sending to non-local peers only if those peers have previously replied that they want data blocks. To minimize impact on existing workloads, by default, broadcasts are still always sent to peers on the local network, or the ones defined in `Peering.Peers`.
At Shipyard, we conducted A/B testing on our internal Kubo staging gateway with organic CID requests to `ipfs.io`. While these results may not exactly match your specific workload, the benefits proved significant enough to make this feature default. Here are the key findings:
-- **Dramatic Resource Usage Reduction:** Internal testing demonstrated reduction in Bitswap broadcast messages by 80-98% and network bandwidth savings of 50-95%, with the greatest improvements occurring during high traffic and peer spikes. These efficiency gains lower operational costs of running Kubo under high load and improve the IPFS Mainnet (which is >80% Kubo-based) by reducing ambient traffic for all connected peers.
+- **Dramatic Resource Usage Reduction:** Internal testing demonstrated a reduction in Bitswap broadcast messages by 80-98% and network bandwidth savings of 50-95%, with the greatest improvements occurring during high traffic and peer spikes. These efficiency gains lower operational costs of running Kubo under high load and improve the IPFS Mainnet (which is >80% Kubo-based) by reducing ambient traffic for all connected peers.
- **Improved Memory Stability:** Memory stays stable even during major CID request spikes that increase peer count, preventing the out-of-memory (OOM) issues found in earlier Kubo versions.
- **Data Retrieval Performance Remains Strong:** Our tests suggest that Kubo gateway hosts with broadcast reduction enabled achieve similar or better HTTP 200 success rates compared to version 0.35, while maintaining equivalent or higher want-have responses and unique blocks received.
@@ -56,7 +56,7 @@ For a description of the configuration items, see the documentation of [`Interna
#### Update go-log to v2
-go-log v2 has been out for quite a while now and it is time to deprecate v1.
+go-log v2 has been out for quite a while now and it's time to deprecate v1.
- Replace all use of `go-log` with `go-log/v2`
- Makes `/api/v0/log/tail` useful over HTTP
@@ -69,7 +69,7 @@ This Kubo release starts utilizing [AutoNATv2](https://github.com/libp2p/specs/b
##### Smarter AutoTLS registration
-This update to libp2p and [AutoTLS](https://github.com/ipfs/kubo/blob/master/docs/config.md#autotls) tests AutoNATv2 changes. It aims to reduce false-positive scenarios where AutoTLS certificate registration occurred before a publicly dialable multiaddr was available. This should result in fewer error logs during node start, especially when IPv6 and/or IPv4 NATs with UPnP/PCP/NAT-PMP are at play.
+This update to libp2p and [AutoTLS](https://github.com/ipfs/kubo/blob/master/docs/config.md#autotls) incorporates AutoNATv2 changes. It aims to reduce false-positive scenarios where AutoTLS certificate registration occurred before a publicly dialable multiaddr was available. This should result in fewer error logs during node start, especially when IPv6 and/or IPv4 NATs with UPnP/PCP/NAT-PMP are at play.
#### Overwrite option for files cp command
@@ -78,7 +78,7 @@ The `ipfs files cp` command has a `--force` option to allow it to overwrite exis
#### Gateway now supports negative HTTP Range requests
The latest update to `boxo/gateway` adds support for negative HTTP Range requests, achieving [gateway-conformance@v0.8](https://github.com/ipfs/gateway-conformance/releases/tag/v0.8.0) compatibility.
-This enables greater interoperability with generic HTTP-based tools. For example, [WebRecorder](https://webrecorder.net/archivewebpage/)'s https://replayweb.page/ can now directly load website snapshots from Kubo-backed URLs.
+This provides greater interoperability with generic HTTP-based tools. For example, [WebRecorder](https://webrecorder.net/archivewebpage/)'s https://replayweb.page/ can now directly load website snapshots from Kubo-backed URLs.
#### Option for `filestore` command to remove bad blocks
@@ -90,7 +90,7 @@ This connection manager option controls how often connections are swept and pote
#### Fix handling of EDITOR env var
-The `ipfs config edit` command did not correctly handle the `EDITOR` environment variable correctly when its value contains flags and arguments, i.e. `EDITOR=emacs -nw`. The command was treating the entire value of `$EDITOR` as the name of the editor command. This has been fixed to parse the value of `$EDITOR` into separate args, respecting shell quoting.
+The `ipfs config edit` command did not correctly handle the `EDITOR` environment variable when its value contains flags and arguments, i.e. `EDITOR=emacs -nw`. The command was treating the entire value of `$EDITOR` as the name of the editor command. This has been fixed to parse the value of `$EDITOR` into separate args, respecting shell quoting.
#### ๐ฆ๏ธ Important dependency updates
From 9d19996dbd3efd0aaef98a6ab32985221f7bf7cc Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Tue, 8 Jul 2025 21:02:57 +0200
Subject: [PATCH 285/499] feat(httpnet): gather metrics for allowlist
this wires up https://github.com/ipfs/boxo/pull/971
to make sure explicitly allowlisted hosts have
their own metric label
if we ever need more flexibility here, this can be exposed as
a separate config
---
core/node/bitswap.go | 1 +
1 file changed, 1 insertion(+)
diff --git a/core/node/bitswap.go b/core/node/bitswap.go
index 7e87f8288..976d82765 100644
--- a/core/node/bitswap.go
+++ b/core/node/bitswap.go
@@ -111,6 +111,7 @@ func Bitswap(serverEnabled, libp2pEnabled, httpEnabled bool) interface{} {
httpnet.WithInsecureSkipVerify(httpCfg.TLSInsecureSkipVerify.WithDefault(config.DefaultHTTPRetrievalTLSInsecureSkipVerify)),
httpnet.WithMaxBlockSize(int64(maxBlockSize)),
httpnet.WithUserAgent(version.GetUserAgentVersion()),
+ httpnet.WithMetricsLabelsForEndpoints(httpCfg.Allowlist),
)
bitswapNetworks = network.New(in.Host.Peerstore(), bitswapLibp2p, bitswapHTTP)
} else if libp2pEnabled {
From ee9a76f04fdff6326da059273dd8d52cf9396071 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Tue, 8 Jul 2025 23:16:14 +0200
Subject: [PATCH 286/499] chore: 0.36.0-rc2
---
version.go | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/version.go b/version.go
index 7eae0ffe4..25721fb9e 100644
--- a/version.go
+++ b/version.go
@@ -11,7 +11,7 @@ import (
var CurrentCommit string
// CurrentVersionNumber is the current application's version literal.
-const CurrentVersionNumber = "0.36.0-rc1"
+const CurrentVersionNumber = "0.36.0-rc2"
const ApiVersion = "/kubo/" + CurrentVersionNumber + "/" //nolint
From b4e6769a567da2008f44c024a37f03ba2c6ec6eb Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Fri, 11 Jul 2025 18:33:03 +0200
Subject: [PATCH 287/499] docs(config): add network exposure considerations
(#10856)
this adds Security section in effort to clarify how each port should
be evaluated from the security perspective
---
docs/config.md | 44 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 44 insertions(+)
diff --git a/docs/config.md b/docs/config.md
index 64e555984..d02a7e293 100644
--- a/docs/config.md
+++ b/docs/config.md
@@ -235,6 +235,9 @@ config file at runtime.
- [`legacy-cid-v0` profile](#legacy-cid-v0-profile)
- [`test-cid-v1` profile](#test-cid-v1-profile)
- [`test-cid-v1-wide` profile](#test-cid-v1-wide-profile)
+ - [Security](#security)
+ - [Port and Network Exposure](#port-and-network-exposure)
+ - [Security Best Practices](#security-best-practices)
- [Types](#types)
- [`flag`](#flag)
- [`priority`](#priority)
@@ -271,6 +274,7 @@ Supported Transports:
>
> - If you need secure access to a subset of RPC, secure it with [`API.Authorizations`](#apiauthorizations) or custom auth middleware running in front of the localhost-only RPC port defined here.
> - If you are looking for an interface designed for browsers and public internet, use [`Addresses.Gateway`](#addressesgateway) port instead.
+> - See [Security section](#security) for network exposure considerations.
Default: `/ip4/127.0.0.1/tcp/5001`
@@ -286,6 +290,16 @@ Supported Transports:
* tcp/ip{4,6} - `/ipN/.../tcp/...`
* unix - `/unix/path/to/socket`
+> [!CAUTION]
+> **SECURITY CONSIDERATIONS FOR GATEWAY EXPOSURE**
+>
+> By default, the gateway is bound to localhost for security. If you bind to `0.0.0.0`
+> or a public IP, anyone with access can trigger retrieval of arbitrary CIDs, causing
+> bandwidth usage and potential exposure to malicious content. Limit with
+> [`Gateway.NoFetch`](#gatewaynofetch). Consider firewall rules, authentication,
+> and [`Gateway.PublicGateways`](#gatewaypublicgateways) for public exposure.
+> See [Security section](#security) for network exposure considerations.
+
Default: `/ip4/127.0.0.1/tcp/8080`
Type: `strings` ([multiaddrs][multiaddr])
@@ -304,6 +318,7 @@ Supported Transports:
> [!IMPORTANT]
> Make sure your firewall rules allow incoming connections on both TCP and UDP ports defined here.
+> See [Security section](#security) for network exposure considerations.
Note that quic (Draft-29) used to be supported with the format `/ipN/.../udp/.../quic`, but has since been [removed](https://github.com/libp2p/go-libp2p/releases/tag/v0.30.0).
@@ -2485,6 +2500,14 @@ transports, multiaddrs for these transports must be added to `Addresses.Swarm`.
Supported transports are: QUIC, TCP, WS, Relay, WebTransport and WebRTCDirect.
+> [!CAUTION]
+> **SECURITY CONSIDERATIONS FOR NETWORK TRANSPORTS**
+>
+> Enabling network transports allows your node to accept connections from the internet.
+> Ensure your firewall rules and [`Addresses.Swarm`](#addressesswarm) configuration
+> align with your security requirements.
+> See [Security section](#security) for network exposure considerations.
+
Each field in this section is a `flag`.
#### `Swarm.Transports.Network.TCP`
@@ -3202,6 +3225,27 @@ See for exact [`Imp
> Follow [kubo#4143](https://github.com/ipfs/kubo/issues/4143) for more details,
> and provide feedback in [discuss.ipfs.tech/t/should-we-profile-cids](https://discuss.ipfs.tech/t/should-we-profile-cids/18507) or [ipfs/specs#499](https://github.com/ipfs/specs/pull/499).
+## Security
+
+This section provides an overview of security considerations for configurations that expose network services.
+
+### Port and Network Exposure
+
+Several configuration options expose TCP or UDP ports that can make your Kubo node accessible from the network:
+
+- **[`Addresses.API`](#addressesapi)** - Exposes the admin RPC API (default: localhost:5001)
+- **[`Addresses.Gateway`](#addressesgateway)** - Exposes the HTTP gateway (default: localhost:8080)
+- **[`Addresses.Swarm`](#addressesswarm)** - Exposes P2P connectivity (default: 0.0.0.0:4001, both UDP and TCP)
+- **[`Swarm.Transports.Network`](#swarmtransportsnetwork)** - Controls which P2P transport protocols are enabled over TCP and UDP
+
+### Security Best Practices
+
+- Keep admin services ([`Addresses.API`](#addressesapi)) bound to localhost unless authentication ([`API.Authorizations`](#apiauthorizations)) is configured
+- Use [`Gateway.NoFetch`](#gatewaynofetch) to prevent arbitrary CID retrieval if Kubo is acting as a public gateway available to anyone
+- Configure firewall rules to restrict access to exposed ports. Note that [`Addresses.Swarm`](#addressesswarm) is special - all incoming traffic to swarm ports should be allowed to ensure proper P2P connectivity
+- Control which public-facing addresses are announced to other peers using [`Addresses.NoAnnounce`](#addressesnoannounce), [`Addresses.Announce`](#addressesannounce), and [`Addresses.AppendAnnounce`](#addressesappendannounce)
+- Consider using the [`server` profile](#server-profile) for production deployments
+
## Types
This document refers to the standard JSON types (e.g., `null`, `string`,
From 12144dbeed03d42b21b60b13d61d8def2013fc38 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Mon, 14 Jul 2025 17:56:50 +0200
Subject: [PATCH 288/499] chore: update links in markdown
---
README.md | 20 ++++++++++++--------
docs/config.md | 2 +-
2 files changed, 13 insertions(+), 9 deletions(-)
diff --git a/README.md b/README.md
index f9953c3b7..ed1ffe904 100644
--- a/README.md
+++ b/README.md
@@ -168,7 +168,7 @@ From there:
- Open/extract the archive.
- Move kubo (`ipfs`) to your path (`install.sh` can do it for you).
-If you are unable to access [dist.ipfs.tech](https://dist.ipfs.tech#kubo), you can also download kubo (go-ipfs) from:
+If you are unable to access [dist.ipfs.tech](https://dist.ipfs.tech#kubo), you can also download kubo from:
- this project's GitHub [releases](https://github.com/ipfs/kubo/releases/latest) page
- `/ipns/dist.ipfs.tech` at [dweb.link](https://dweb.link/ipns/dist.ipfs.tech#kubo) gateway
@@ -176,7 +176,7 @@ If you are unable to access [dist.ipfs.tech](https://dist.ipfs.tech#kubo), you c
##### Downloading builds using IPFS
-List the available versions of Kubo (go-ipfs) implementation:
+List the available versions of Kubo implementation:
```console
$ ipfs cat /ipns/dist.ipfs.tech/kubo/versions
@@ -238,7 +238,7 @@ https://packages.gentoo.org/packages/net-p2p/kubo
#### Nix
-With the purely functional package manager [Nix](https://nixos.org/nix/) you can install kubo (go-ipfs) like this:
+With the purely functional package manager [Nix](https://nixos.org/nix/) you can install kubo like this:
```
$ nix-env -i kubo
@@ -258,11 +258,11 @@ You can also install it through the Solus software center.
#### openSUSE
-[Community Package for go-ipfs](https://software.opensuse.org/package/go-ipfs)
+[Community Package for kubo](https://software.opensuse.org/package/kubo)
#### Guix
-[Community Package for go-ipfs](https://packages.guix.gnu.org/packages/go-ipfs/0.11.0/) is now out-of-date.
+[Community Package for kubo](https://packages.guix.gnu.org/search/?query=kubo) is available.
#### Snap
@@ -323,7 +323,7 @@ PS> scoop install kubo
#### MacPorts
-The package [ipfs](https://ports.macports.org/port/ipfs) currently points to kubo (go-ipfs) and is being maintained.
+The package [ipfs](https://ports.macports.org/port/ipfs) currently points to kubo and is being maintained.
```
$ sudo port install ipfs
@@ -383,7 +383,7 @@ $ cd kubo
$ make install
```
-Alternatively, you can run `make build` to build the go-ipfs binary (storing it in `cmd/ipfs/ipfs`) without installing it.
+Alternatively, you can run `make build` to build the kubo binary (storing it in `cmd/ipfs/ipfs`) without installing it.
**NOTE:** If you get an error along the lines of "fatal error: stdlib.h: No such file or directory", you're missing a C compiler. Either re-run `make` with `CGO_ENABLED=0` or install GCC.
@@ -400,7 +400,7 @@ make build GOOS=myTargetOS GOARCH=myTargetArchitecture
- Separate [instructions are available for building on Windows](docs/windows.md).
- `git` is required in order for `go get` to fetch all dependencies.
- Package managers often contain out-of-date `golang` packages.
- Ensure that `go version` reports at least 1.10. See above for how to install go.
+ Ensure that `go version` reports the minimum version required (see go.mod). See above for how to install go.
- If you are interested in development, please install the development
dependencies as well.
- Shell command completions can be generated with one of the `ipfs commands completion` subcommands. Read [docs/command-completion.md](docs/command-completion.md) to learn more.
@@ -418,6 +418,8 @@ system, this is done with `ipfs init`. See `ipfs init --help` for information on
the optional arguments it takes. After initialization is complete, you can use
`ipfs mount`, `ipfs add` and any of the other commands to explore!
+For detailed configuration options, see [docs/config.md](https://github.com/ipfs/kubo/blob/master/docs/config.md).
+
### Some things to try
Basic proof of 'ipfs working' locally:
@@ -436,6 +438,8 @@ For programmatic interaction with Kubo, see our [list of HTTP/RPC clients](docs/
If you have previously installed IPFS before and you are running into problems getting a newer version to work, try deleting (or backing up somewhere else) your IPFS config directory (~/.ipfs by default) and rerunning `ipfs init`. This will reinitialize the config file to its defaults and clear out the local datastore of any bad entries.
+For more information about configuration options, see [docs/config.md](https://github.com/ipfs/kubo/blob/master/docs/config.md).
+
Please direct general questions and help requests to our [forums](https://discuss.ipfs.tech).
If you believe you've found a bug, check the [issues list](https://github.com/ipfs/kubo/issues) and, if you don't see your problem there, either come talk to us on [Matrix chat](https://docs.ipfs.tech/community/chat/), or file an issue of your own!
diff --git a/docs/config.md b/docs/config.md
index 64e555984..82046b5fa 100644
--- a/docs/config.md
+++ b/docs/config.md
@@ -1,6 +1,6 @@
# The Kubo config file
-The Kubo (go-ipfs) config file is a JSON document located at `$IPFS_PATH/config`. It
+The Kubo config file is a JSON document located at `$IPFS_PATH/config`. It
is read once at node instantiation, either for an offline command, or when
starting the daemon. Commands that execute on a running daemon do not read the
config file at runtime.
From 475e2bad6747fc2019e3bed92b99d99dac85ef1b Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Mon, 14 Jul 2025 18:58:05 +0200
Subject: [PATCH 289/499] docs: release checklist fixes from 0.36 (#10861)
---
docs/RELEASE_CHECKLIST.md | 57 +++++++++++++++++++--------------------
1 file changed, 28 insertions(+), 29 deletions(-)
diff --git a/docs/RELEASE_CHECKLIST.md b/docs/RELEASE_CHECKLIST.md
index 423e96632..0bf36a2de 100644
--- a/docs/RELEASE_CHECKLIST.md
+++ b/docs/RELEASE_CHECKLIST.md
@@ -1,4 +1,4 @@
-
+
# โ
Release Checklist (vX.Y.Z[-rcN])
@@ -30,7 +30,7 @@ This section covers tasks to be done during each release.
### 1. Prepare release branch
-- [ ] Prepare the release branch and update version numbers accordingly
+- [ ] Prepare the release branch and update version numbers accordingly
- [ ] create a new branch `release-vX.Y.Z`
- use `master` as base if `Z == 0`
- use `release` as base if `Z > 0`
@@ -39,16 +39,16 @@ This section covers tasks to be done during each release.
- [ ] create a draft PR from `release-vX.Y.Z` to `release` ([example](https://github.com/ipfs/kubo/pull/9306))
- [ ] Cherry-pick commits from `master` to the `release-vX.Y.Z` using `git cherry-pick -x ` ([example](https://github.com/ipfs/kubo/pull/10636/commits/033de22e3bc6191dbb024ad6472f5b96b34e3ccf))
- **NOTE:** cherry-picking with `-x` is important
- - [ ]  Replace the `Changelog` and `Contributors` sections of the [changelog](docs/changelogs/vX.Y.md) with the stdout (do **NOT** copy the stderr) of `./bin/mkreleaselog`.
- - **NOTE:** `mkreleaselog` expects your `$GOPATH/src/github.com/ipfs/kubo` to include latest commits from `release-vX.Y.Z`
- [ ] verify all CI checks on the PR from `release-vX.Y.Z` to `release` are passing
+ - [ ]  Replace the `Changelog` and `Contributors` sections of the [changelog](docs/changelogs/vX.Y.md) with the stdout (do **NOT** copy the stderr) of `./bin/mkreleaselog`.
+ - **NOTE:** `mkreleaselog` expects your `$GOPATH/src/github.com/ipfs/kubo` to include latest commits from `release-vX.Y.Z`
- [ ]  Merge the PR from `release-vX.Y.Z` to `release` using the `Create a merge commit`
- do **NOT** use `Squash and merge` nor `Rebase and merge` because we need to be able to sign the merge commit
- do **NOT** delete the `release-vX.Y.Z` branch
### 2. Tag release
-- [ ] Create the release tag
+- [ ] Create the release tag
- โ ๏ธ **NOTE:** This is a dangerous operation! Go and Docker publishing are difficult to reverse! Have the release reviewer verify all the commands marked with !
- [ ]  tag the HEAD commit using `git tag -s vX.Y.Z(-rcN) -m 'Prerelease X.Y.Z(-rcN)'`
- [ ]  tag the HEAD commit of the `release` branch using `git tag -s vX.Y.Z -m 'Release X.Y.Z'`
@@ -61,31 +61,28 @@ This section covers tasks to be done during each release.
- [ ] Publish Docker image to [DockerHub](https://hub.docker.com/r/ipfs/kubo/tags)
- [ ] Wait for [Publish docker image](https://github.com/ipfs/kubo/actions/workflows/docker-image.yml) workflow run initiated by the tag push to finish
- [ ] verify the image is available on [Docker Hub โ tags](https://hub.docker.com/r/ipfs/kubo/tags)
-- [ ] Publish the release to [dist.ipfs.tech](https://dist.ipfs.tech)
+- [ ] Publish the release to [dist.ipfs.tech](https://dist.ipfs.tech)
- [ ] check out [ipfs/distributions](https://github.com/ipfs/distributions)
- - [ ] create new branch: run `git checkout -b release-kubo-X.Y.Z(-rcN)`
- - [ ] run `./dist.sh add-version kubo vX.Y.Z(-rcN)` to add the new version to the `versions` file ([usage](https://github.com/ipfs/distributions#usage))
+ - [ ] create new branch: run `git checkout -b release-kubo-X.Y.Z(-rcN)`
- [ ] Verify [ipfs/distributions](https://github.com/ipfs/distributions)'s `.tool-versions`'s `golang` entry is set to the [latest go release](https://go.dev/doc/devel/release) on the major go branch [Kubo is being tested on](https://github.com/ipfs/kubo/blob/master/.github/workflows/gotest.yml) (see `go-version:`). If not, update `.tool-versions` to match the latest golang.
- - [ ] create and merge the PR which updates `dists/kubo/versions` and `dists/go-ipfs/versions` (**NOTE:**  will also have `dists/kubo/current` and `dists/go-ipfs/current` โ [example](https://github.com/ipfs/distributions/pull/1125))
+ - [ ] run `./dist.sh add-version kubo vX.Y.Z(-rcN)` to add the new version to the `versions` file ([usage](https://github.com/ipfs/distributions#usage))
+ - [ ] create and merge the PR which updates `dists/kubo/versions` (**NOTE:**  will also have `dists/kubo/current` โ [example](https://github.com/ipfs/distributions/pull/1125))
- [ ] wait for the [CI](https://github.com/ipfs/distributions/actions/workflows/main.yml) workflow run initiated by the merge to master to finish
- [ ] verify the release is available on [dist.ipfs.tech](https://dist.ipfs.tech/#kubo)
- [ ] Publish the release to [NPM](https://www.npmjs.com/package/kubo?activeTab=versions)
- - [ ] manually dispatch the [Release to npm](https://github.com/ipfs/npm-go-ipfs/actions/workflows/main.yml) workflow
- - [ ] check [Release to npm](https://github.com/ipfs/npm-go-ipfs/actions/workflows/main.yml) workflow run logs to verify it discovered the new release
+ - [ ] manually dispatch the [Release to npm](https://github.com/ipfs/npm-kubo/actions/workflows/main.yml) workflow if it was not executed already and verify it discovered the new release
- [ ] verify the release is available on [NPM](https://www.npmjs.com/package/kubo?activeTab=versions)
- [ ] Publish the release to [GitHub kubo/releases](https://github.com/ipfs/kubo/releases)
- - [ ] create a new release on [github.com/ipfs/kubo/releases](https://docs.github.com/en/repositories/releasing-projects-on-github/managing-releases-in-a-repository#creating-a-release)
- - [RC example](https://github.com/ipfs/kubo/releases/tag/v0.17.0-rc1)
- - [FINAL example](https://github.com/ipfs/kubo/releases/tag/v0.17.0)
+ - [ ] [create](https://docs.github.com/en/repositories/releasing-projects-on-github/managing-releases-in-a-repository#creating-a-release) a new release
+ - [RC example](https://github.com/ipfs/kubo/releases/tag/v0.36.0-rc1)
+ - [FINAL example](https://github.com/ipfs/kubo/releases/tag/v0.35.0)
- [ ] use the `vX.Y.Z(-rcN)` tag
- [ ] link to the release issue
- [ ]  link to the changelog in the description
- [ ]  check the `This is a pre-release` checkbox
- [ ]  copy the changelog (without the header) in the description
- [ ]  do **NOT** check the `This is a pre-release` checkbox
- - [ ] run the [sync-release-assets](https://github.com/ipfs/kubo/actions/workflows/sync-release-assets.yml) workflow
- - [ ] wait for the [sync-release-assets](https://github.com/ipfs/kubo/actions/workflows/sync-release-assets.yml) workflow run to finish
- - [ ] verify the release assets are present in the [GitHub release](https://github.com/ipfs/kubo/releases/tag/vX.Y.Z(-rcN))
+ - [ ] run the [sync-release-assets](https://github.com/ipfs/kubo/actions/workflows/sync-release-assets.yml) workflow and verify the release assets are attached to the GitHub release
### 4. After Publishing
@@ -95,12 +92,15 @@ This section covers tasks to be done during each release.
- [ ] Create and merge a PR from `merge-release-vX.Y.Z` to `master`
- โ ๏ธ do **NOT** use `Squash and merge` nor `Rebase and merge` because we need to be able to sign the merge commit
- โ ๏ธ **NOTE:** make sure to ignore the changes to [version.go](version.go) (keep the `-dev` in `master`)
-- [ ] Update Kubo staging environment, see the [Running Kubo tests on staging](https://www.notion.so/Running-Kubo-tests-on-staging-488578bb46154f9bad982e4205621af8) for details.
- - [ ]  Test last release against the current RC
- - [ ]  Test last release against the current one
-- [ ] Promote the release
+- [ ] Update [ipshipyard/waterworks-infra](https://github.com/ipshipyard/waterworks-infra)
+ - [ ] Update Kubo staging environment, see the [Running Kubo tests on staging](https://www.notion.so/Running-Kubo-tests-on-staging-488578bb46154f9bad982e4205621af8) for details.
+ - [ ]  Test last release against the current RC
+ - [ ]  Test last release against the current one
+ - [ ] Update collab cluster boxes to the tagged release (final or RC)
+ - [ ] Update libp2p bootstrappers to the tagged release (final or RC)
+- [ ] Promote the release
- [ ] create an [IPFS Discourse](https://discuss.ipfs.tech) topic ([prerelease example](https://discuss.ipfs.tech/t/kubo-v0-16-0-rc1-release-candidate-is-out/15248), [release example](https://discuss.ipfs.tech/t/kubo-v0-16-0-release-is-out/15249))
- - [ ] use `Kubo vX.Y.Z(-rcN) is out!` as the title and `kubo` and `go-ipfs` as tags
+ - [ ] use `Kubo vX.Y.Z(-rcN) is out!` as the title and `kubo` as tags
- [ ] repeat the title as a heading (`##`) in the description
- [ ] link to the GitHub Release, binaries on IPNS, docker pull command and release notes in the description
- [ ] pin the [IPFS Discourse](https://discuss.ipfs.tech) topic globally, you can make the topic a banner if there is no banner already
@@ -112,25 +112,24 @@ This section covers tasks to be done during each release.
- [ ]  create an issue comment mentioning early testers on the release issue ([example](https://github.com/ipfs/kubo/issues/9319#issuecomment-1311002478))
- [ ]  create an issue comment linking to the release on the release issue ([example](https://github.com/ipfs/kubo/issues/9417#issuecomment-1400740975))
- [ ]   promote on bsky.app ([example](https://bsky.app/profile/ipshipyard.com/post/3lh2brzrwbs2c))
- - [ ]   promote on x.com ([example](https://x.com/ipshipyard/status/1885346348808929609))
+ - [ ]   promote on x.com ([example](https://x.com/ipshipyard/status/1885346348808929609))
- [ ]   post the link to the [GitHub Release](https://github.com/ipfs/kubo/releases/tag/vX.Y.Z(-rcN)) to [Reddit](https://reddit.com/r/ipfs) ([example](https://www.reddit.com/r/ipfs/comments/9x0q0k/kubo_v0160_release_is_out/))
- [ ] Manually smoke-test the new version with [IPFS Companion Browser Extension](https://docs.ipfs.tech/install/ipfs-companion/)
-- [ ]  Update Kubo in [ipfs-desktop](https://github.com/ipfs/ipfs-desktop)
- - [ ] check out [ipfs/ipfs-desktop](https://github.com/ipfs/ipfs-desktop)
- - [ ] run `npm install `
- - [ ] create a PR which updates `package.json` and `package-lock.json`
+- [ ] Update Kubo in [ipfs-desktop](https://github.com/ipfs/ipfs-desktop)
+ - [ ] create a PR which updates `kubo` version to the tagged version in `package.json` and `package-lock.json`
+ - [ ]  switch to final release and merge
- [ ]  Update Kubo docs at docs.ipfs.tech:
- [ ]  run the [update-on-new-ipfs-tag.yml](https://github.com/ipfs/ipfs-docs/actions/workflows/update-on-new-ipfs-tag.yml) workflow
- [ ]  merge the PR created by the [update-on-new-ipfs-tag.yml](https://github.com/ipfs/ipfs-docs/actions/workflows/update-on-new-ipfs-tag.yml) workflow run
-- [ ]  Create a blog entry on [blog.ipfs.tech](https://blog.ipfs.tech)
+- [ ]  Create a blog entry on [blog.ipfs.tech](https://blog.ipfs.tech)
- [ ]  create a PR which adds a release note for the new Kubo version ([example](https://github.com/ipfs/ipfs-blog/pull/529))
- [ ]  merge the PR
- [ ]  verify the blog entry was published
- [ ]   Create a dependency update PR
- [ ]   check out [ipfs/kubo](https://github.com/ipfs/kubo)
- [ ]   go over direct dependencies from `go.mod` in the root directory (NOTE: do not run `go get -u` as it will upgrade indirect dependencies which may cause problems)
- - [ ]   run `make mod_tidy`
+ - [ ]   run `make mod_tidy`
- [ ]   create a PR which updates `go.mod` and `go.sum`
- [ ]   add the PR to the next release milestone
- [ ]   Create the next release issue
From 0276b3fafbc2b9a96ccff4594603c5d5670ffc6a Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Mon, 14 Jul 2025 19:02:09 +0200
Subject: [PATCH 290/499] chore: 0.36.0
---
docs/changelogs/v0.36.md | 225 ++++++++++++++++++++++++++++++++++++++-
version.go | 2 +-
2 files changed, 225 insertions(+), 2 deletions(-)
diff --git a/docs/changelogs/v0.36.md b/docs/changelogs/v0.36.md
index 383b08209..5c078e330 100644
--- a/docs/changelogs/v0.36.md
+++ b/docs/changelogs/v0.36.md
@@ -4,7 +4,7 @@
This release was brought to you by the [Interplanetary Shipyard](https://ipshipyard.com/) team.
-- [v0.36.0](#v0340)
+- [v0.36.0](#v0360)
## v0.36.0
@@ -103,4 +103,227 @@ The `ipfs config edit` command did not correctly handle the `EDITOR` environment
### ๐ Changelog
+Full Changelog
+
+- github.com/ipfs/kubo:
+ - chore: 0.36.0
+ - chore: update links in markdown
+ - chore: 0.36.0-rc2
+ - feat(httpnet): gather metrics for allowlist
+ - chore: changelog
+ - test: TestEditorParsing
+ - fix: handling of EDITOR env var (#10855) ([ipfs/kubo#10855](https://github.com/ipfs/kubo/pull/10855))
+ - refactor: use slices.Sort where appropriate (#10858) ([ipfs/kubo#10858](https://github.com/ipfs/kubo/pull/10858))
+ - Upgrade to Boxo v0.33.0 (#10857) ([ipfs/kubo#10857](https://github.com/ipfs/kubo/pull/10857))
+ - chore: Upgrade github.com/cockroachdb/pebble/v2 to v2.0.6 for Go 1.25 support (#10850) ([ipfs/kubo#10850](https://github.com/ipfs/kubo/pull/10850))
+ - core:constructor: add a log line about http retrieval
+ - chore: p2p-forge v0.6.0 + go-libp2p 0.42.0 (#10840) ([ipfs/kubo#10840](https://github.com/ipfs/kubo/pull/10840))
+ - docs: fix minor typos (#10849) ([ipfs/kubo#10849](https://github.com/ipfs/kubo/pull/10849))
+ - Replace use of go-car v1 with go-car/v2 (#10845) ([ipfs/kubo#10845](https://github.com/ipfs/kubo/pull/10845))
+ - chore: v0.36.0-rc1
+ - chore: deduplicate 0.36 changelog
+ - feat(config): connmgr: expose silence period (#10827) ([ipfs/kubo#10827](https://github.com/ipfs/kubo/pull/10827))
+ - bitswap/client: configurable broadcast reduction (#10825) ([ipfs/kubo#10825](https://github.com/ipfs/kubo/pull/10825))
+ - Upgrade to Boxo v0.32.0 (#10839) ([ipfs/kubo#10839](https://github.com/ipfs/kubo/pull/10839))
+ - feat: HTTP retrieval enabled by default (#10836) ([ipfs/kubo#10836](https://github.com/ipfs/kubo/pull/10836))
+ - feat: AutoTLS with AutoNATv2 client (#10835) ([ipfs/kubo#10835](https://github.com/ipfs/kubo/pull/10835))
+ - commands: add `--force` option to `files cp` command (#10823) ([ipfs/kubo#10823](https://github.com/ipfs/kubo/pull/10823))
+ - docs/env variables: Document LIBP2P_SWARM_FD_LIMIT ([ipfs/kubo#10828](https://github.com/ipfs/kubo/pull/10828))
+ - test: fix "invert" commands in sharness tests (#9652) ([ipfs/kubo#9652](https://github.com/ipfs/kubo/pull/9652))
+ - Ivan386/filestore fix (#7474) ([ipfs/kubo#7474](https://github.com/ipfs/kubo/pull/7474))
+ - wrap user-facing mfs.Lookup error (#10821) ([ipfs/kubo#10821](https://github.com/ipfs/kubo/pull/10821))
+ - Update fuse docs with FreeBSD specifics (#10820) ([ipfs/kubo#10820](https://github.com/ipfs/kubo/pull/10820))
+ - Minor wording fixes in docs (#10822) ([ipfs/kubo#10822](https://github.com/ipfs/kubo/pull/10822))
+ - fix(gateway): gateway-conformance v0.8 (#10818) ([ipfs/kubo#10818](https://github.com/ipfs/kubo/pull/10818))
+ - Upgrade to Boxo v0.31.0 (#10819) ([ipfs/kubo#10819](https://github.com/ipfs/kubo/pull/10819))
+ - Merge release v0.35.0 ([ipfs/kubo#10815](https://github.com/ipfs/kubo/pull/10815))
+ - fix: go-libp2p-kad-dht v0.33.1 (#10814) ([ipfs/kubo#10814](https://github.com/ipfs/kubo/pull/10814))
+ - fix: p2p-forge v0.5.1 ignoring /p2p-circuit (#10813) ([ipfs/kubo#10813](https://github.com/ipfs/kubo/pull/10813))
+ - Upgrade go-libp2p-kad-dht to v0.33.0 (#10811) ([ipfs/kubo#10811](https://github.com/ipfs/kubo/pull/10811))
+ - chore: use go-log/v2 (#10801) ([ipfs/kubo#10801](https://github.com/ipfs/kubo/pull/10801))
+ - fix(fuse): ipns error handling and friendly errors (#10807) ([ipfs/kubo#10807](https://github.com/ipfs/kubo/pull/10807))
+ - fix(config): wire up `Provider.Enabled` flag (#10804) ([ipfs/kubo#10804](https://github.com/ipfs/kubo/pull/10804))
+ - chore: bump version to 0.36.0-dev
+- github.com/ipfs/boxo (v0.30.0 -> v0.33.0):
+ - Release v0.33.0 ([ipfs/boxo#974](https://github.com/ipfs/boxo/pull/974))
+ - [skip changelog] fix sending empty want from #968 (#975) ([ipfs/boxo#975](https://github.com/ipfs/boxo/pull/975))
+ - minor typo fixes (#972) ([ipfs/boxo#972](https://github.com/ipfs/boxo/pull/972))
+ - fix: normalize delegated /routing/v1 urls (#971) ([ipfs/boxo#971](https://github.com/ipfs/boxo/pull/971))
+ - bitswap/client: Set DontHaveTimeout MinTimeout to 50ms (#965) ([ipfs/boxo#965](https://github.com/ipfs/boxo/pull/965))
+ - remove unused code (#967) ([ipfs/boxo#967](https://github.com/ipfs/boxo/pull/967))
+ - Fix sending extra wants (#968) ([ipfs/boxo#968](https://github.com/ipfs/boxo/pull/968))
+ - Handle Bitswap messages without `Wantlist` (#961) ([ipfs/boxo#961](https://github.com/ipfs/boxo/pull/961))
+ - bitswap/httpnet: limit metric cardinality ([ipfs/boxo#957](https://github.com/ipfs/boxo/pull/957))
+ - bitswap/httpnet: Sanitize allow/denylist inputs ([ipfs/boxo#964](https://github.com/ipfs/boxo/pull/964))
+ - Bitswap: Set DontHaveTimeout/MinTimeout to 200ms. ([ipfs/boxo#959](https://github.com/ipfs/boxo/pull/959))
+ - upgrade go-libp2p to v0.42.0 (#960) ([ipfs/boxo#960](https://github.com/ipfs/boxo/pull/960))
+ - refactor: use the built-in max/min to simplify the code [skip changelog] (#941) ([ipfs/boxo#941](https://github.com/ipfs/boxo/pull/941))
+ - bitswap/httpnet: adjust error logging (#958) ([ipfs/boxo#958](https://github.com/ipfs/boxo/pull/958))
+ - docs: reprovider metrics name in changelog (#953) ([ipfs/boxo#953](https://github.com/ipfs/boxo/pull/953))
+ - Release v0.32.0 (#952) ([ipfs/boxo#952](https://github.com/ipfs/boxo/pull/952))
+ - Remove redundant loop over published blocks (#950) ([ipfs/boxo#950](https://github.com/ipfs/boxo/pull/950))
+ - Fix links in README.md (#948) ([ipfs/boxo#948](https://github.com/ipfs/boxo/pull/948))
+ - chore(provider): meaningful info level log (#940) ([ipfs/boxo#940](https://github.com/ipfs/boxo/pull/940))
+ - feat(provider): reprovide metrics (#944) ([ipfs/boxo#944](https://github.com/ipfs/boxo/pull/944))
+ - ci: set up golangci lint in boxo (#943) ([ipfs/boxo#943](https://github.com/ipfs/boxo/pull/943))
+ - Do not return error from notify blocks when bitswap shutdown (#947) ([ipfs/boxo#947](https://github.com/ipfs/boxo/pull/947))
+ - bitswap/client: broadcast reduction and metrics (#937) ([ipfs/boxo#937](https://github.com/ipfs/boxo/pull/937))
+ - fix: typo in HAMT error message ([ipfs/boxo#945](https://github.com/ipfs/boxo/pull/945))
+ - bitswap/httpnet: expose the errors on connect when connection impossible ([ipfs/boxo#939](https://github.com/ipfs/boxo/pull/939))
+ - fix(unixfs): int check (#936) ([ipfs/boxo#936](https://github.com/ipfs/boxo/pull/936))
+ - Remove WithPeerLedger option and PeerLedger interface (#938) ([ipfs/boxo#938](https://github.com/ipfs/boxo/pull/938))
+ - fix(gateway): support suffix range requests (#922) ([ipfs/boxo#922](https://github.com/ipfs/boxo/pull/922))
+ - Release v0.31.0 ([ipfs/boxo#934](https://github.com/ipfs/boxo/pull/934))
+ - Revert "Remove an unused timestamp from traceability.Block" (#931) ([ipfs/boxo#931](https://github.com/ipfs/boxo/pull/931))
+ - update changelog (#930) ([ipfs/boxo#930](https://github.com/ipfs/boxo/pull/930))
+ - Deprecate WithPeerLedger option for bitswap server (#929) ([ipfs/boxo#929](https://github.com/ipfs/boxo/pull/929))
+ - refactor: use a more efficient querying method (#921) ([ipfs/boxo#921](https://github.com/ipfs/boxo/pull/921))
+ - Use go-car/v2 for reading CAR files in gateway backend (#927) ([ipfs/boxo#927](https://github.com/ipfs/boxo/pull/927))
+ - Upgrade go-libp2p-kad-dht v0.33.1 (#924) ([ipfs/boxo#924](https://github.com/ipfs/boxo/pull/924))
+ - bitswap/httpnet: Disconnect peers after client errors ([ipfs/boxo#919](https://github.com/ipfs/boxo/pull/919))
+ - Remove an unused timestamp from traceability.Block (#923) ([ipfs/boxo#923](https://github.com/ipfs/boxo/pull/923))
+ - fix(bitswap/httpnet): idempotent Stop() (#920) ([ipfs/boxo#920](https://github.com/ipfs/boxo/pull/920))
+ - Update dependencies (#916) ([ipfs/boxo#916](https://github.com/ipfs/boxo/pull/916))
+- github.com/ipfs/go-block-format (v0.2.1 -> v0.2.2):
+ - new version (#62) ([ipfs/go-block-format#62](https://github.com/ipfs/go-block-format/pull/62))
+ - Use value receivers for `BasicBlock` methods (#61) ([ipfs/go-block-format#61](https://github.com/ipfs/go-block-format/pull/61))
+- github.com/ipfs/go-ds-badger4 (v0.1.5 -> v0.1.8):
+ - new version (#7) ([ipfs/go-ds-badger4#7](https://github.com/ipfs/go-ds-badger4/pull/7))
+ - update version (#5) ([ipfs/go-ds-badger4#5](https://github.com/ipfs/go-ds-badger4/pull/5))
+ - update dependencies (#4) ([ipfs/go-ds-badger4#4](https://github.com/ipfs/go-ds-badger4/pull/4))
+ - new version ([ipfs/go-ds-badger4#3](https://github.com/ipfs/go-ds-badger4/pull/3))
+ - use go-datastore without goprocess ([ipfs/go-ds-badger4#2](https://github.com/ipfs/go-ds-badger4/pull/2))
+- github.com/ipfs/go-ds-pebble (v0.5.0 -> v0.5.1):
+ - new version (#55) ([ipfs/go-ds-pebble#55](https://github.com/ipfs/go-ds-pebble/pull/55))
+- github.com/ipfs/go-ipfs-cmds (v0.14.1 -> v0.15.0):
+ - new version (#287) ([ipfs/go-ipfs-cmds#287](https://github.com/ipfs/go-ipfs-cmds/pull/287))
+ - minor document updates (#286) ([ipfs/go-ipfs-cmds#286](https://github.com/ipfs/go-ipfs-cmds/pull/286))
+ - Update go log v2 (#285) ([ipfs/go-ipfs-cmds#285](https://github.com/ipfs/go-ipfs-cmds/pull/285))
+ - ci: uci/update-go (#281) ([ipfs/go-ipfs-cmds#281](https://github.com/ipfs/go-ipfs-cmds/pull/281))
+- github.com/ipfs/go-ipld-format (v0.6.0 -> v0.6.2):
+ - new version (#96) ([ipfs/go-ipld-format#96](https://github.com/ipfs/go-ipld-format/pull/96))
+ - bump version (#94) ([ipfs/go-ipld-format#94](https://github.com/ipfs/go-ipld-format/pull/94))
+- github.com/ipfs/go-ipld-legacy (v0.2.1 -> v0.2.2):
+ - new version ([ipfs/go-ipld-legacy#25](https://github.com/ipfs/go-ipld-legacy/pull/25))
+- github.com/ipfs/go-test (v0.2.1 -> v0.2.2):
+ - new version (#25) ([ipfs/go-test#25](https://github.com/ipfs/go-test/pull/25))
+ - Update README.md (#24) ([ipfs/go-test#24](https://github.com/ipfs/go-test/pull/24))
+- github.com/ipfs/go-unixfsnode (v1.10.0 -> v1.10.1):
+ - new version ([ipfs/go-unixfsnode#84](https://github.com/ipfs/go-unixfsnode/pull/84))
+- github.com/ipld/go-car/v2 (v2.14.2 -> v2.14.3):
+ - bump version ([ipld/go-car#579](https://github.com/ipld/go-car/pull/579))
+ - chore: update to boxo merkledag package
+ - feat: car debug handles the zero length block ([ipld/go-car#569](https://github.com/ipld/go-car/pull/569))
+ - chore(deps): bump github.com/rogpeppe/go-internal from 1.13.1 to 1.14.1 in /cmd ([ipld/go-car#566](https://github.com/ipld/go-car/pull/566))
+ - Add a concatination cli utility ([ipld/go-car#565](https://github.com/ipld/go-car/pull/565))
+- github.com/ipld/go-codec-dagpb (v1.6.0 -> v1.7.0):
+ - chore: v1.7.0 bump
+- github.com/libp2p/go-flow-metrics (v0.2.0 -> v0.3.0):
+ - chore: release v0.3.0 ([libp2p/go-flow-metrics#38](https://github.com/libp2p/go-flow-metrics/pull/38))
+ - go-clock migration ([libp2p/go-flow-metrics#36](https://github.com/libp2p/go-flow-metrics/pull/36))
+- github.com/libp2p/go-libp2p (v0.41.1 -> v0.42.0):
+ - Release v0.42.0 (#3318) ([libp2p/go-libp2p#3318](https://github.com/libp2p/go-libp2p/pull/3318))
+ - mocknet: notify listeners on listen (#3310) ([libp2p/go-libp2p#3310](https://github.com/libp2p/go-libp2p/pull/3310))
+ - autonatv2: add metrics (#3308) ([libp2p/go-libp2p#3308](https://github.com/libp2p/go-libp2p/pull/3308))
+ - chore: fix errors reported by golangci-lint ([libp2p/go-libp2p#3295](https://github.com/libp2p/go-libp2p/pull/3295))
+ - autonatv2: add Unknown addrs to event (#3305) ([libp2p/go-libp2p#3305](https://github.com/libp2p/go-libp2p/pull/3305))
+ - transport: rate limit new connections (#3283) ([libp2p/go-libp2p#3283](https://github.com/libp2p/go-libp2p/pull/3283))
+ - basichost: use autonatv2 to verify reachability (#3231) ([libp2p/go-libp2p#3231](https://github.com/libp2p/go-libp2p/pull/3231))
+ - chore: Revert "go-clock migration" (#3303) ([libp2p/go-libp2p#3303](https://github.com/libp2p/go-libp2p/pull/3303))
+ - tcp: ensure tcpGatedMaListener wrapping happens always (#3275) ([libp2p/go-libp2p#3275](https://github.com/libp2p/go-libp2p/pull/3275))
+ - go-clock migration ([libp2p/go-libp2p#3293](https://github.com/libp2p/go-libp2p/pull/3293))
+ - swarm_test: support more transports for GenSwarm (#3130) ([libp2p/go-libp2p#3130](https://github.com/libp2p/go-libp2p/pull/3130))
+ - eventbus: change slow consumer event from error to warn (#3286) ([libp2p/go-libp2p#3286](https://github.com/libp2p/go-libp2p/pull/3286))
+ - quicreuse: add some documentation for the package (#3279) ([libp2p/go-libp2p#3279](https://github.com/libp2p/go-libp2p/pull/3279))
+ - identify: rate limit id push protocol (#3266) ([libp2p/go-libp2p#3266](https://github.com/libp2p/go-libp2p/pull/3266))
+ - fix(pstoreds): add missing log for failed GC record unmarshalling in `purgeStore()` (#3273) ([libp2p/go-libp2p#3273](https://github.com/libp2p/go-libp2p/pull/3273))
+ - nat: improve port mapping failure logging (#3261) ([libp2p/go-libp2p#3261](https://github.com/libp2p/go-libp2p/pull/3261))
+ - ci: add golangci-lint for linting (#3269) ([libp2p/go-libp2p#3269](https://github.com/libp2p/go-libp2p/pull/3269))
+ - build(test_analysis): use `modernc.org/sqlite` directly (#3227) ([libp2p/go-libp2p#3227](https://github.com/libp2p/go-libp2p/pull/3227))
+ - chore(certificate): update test vectors (#3242) ([libp2p/go-libp2p#3242](https://github.com/libp2p/go-libp2p/pull/3242))
+ - rcmgr: use netip.Prefix as map key instead of string (#3264) ([libp2p/go-libp2p#3264](https://github.com/libp2p/go-libp2p/pull/3264))
+ - webrtc: support receiving 256kB messages (#3255) ([libp2p/go-libp2p#3255](https://github.com/libp2p/go-libp2p/pull/3255))
+ - peerstore: remove leveldb tests (#3260) ([libp2p/go-libp2p#3260](https://github.com/libp2p/go-libp2p/pull/3260))
+ - identify: reduce timeout to 5 seconds (#3259) ([libp2p/go-libp2p#3259](https://github.com/libp2p/go-libp2p/pull/3259))
+ - fix(relay): fix data-race in relayFinder (#3258) ([libp2p/go-libp2p#3258](https://github.com/libp2p/go-libp2p/pull/3258))
+ - chore: update p2p-forge to v0.5.0 for autotls example (#3257) ([libp2p/go-libp2p#3257](https://github.com/libp2p/go-libp2p/pull/3257))
+ - peerstore: remove unused badger tests (#3252) ([libp2p/go-libp2p#3252](https://github.com/libp2p/go-libp2p/pull/3252))
+ - chore: using t.TempDir() instead of os.MkdirTemp (#3222) ([libp2p/go-libp2p#3222](https://github.com/libp2p/go-libp2p/pull/3222))
+ - chore(examples): p2p-forge/client v0.4.0 (#3211) ([libp2p/go-libp2p#3211](https://github.com/libp2p/go-libp2p/pull/3211))
+ - transport: add GatedMaListener type (#3186) ([libp2p/go-libp2p#3186](https://github.com/libp2p/go-libp2p/pull/3186))
+ - autonatv2: explicitly handle dns addrs (#3249) ([libp2p/go-libp2p#3249](https://github.com/libp2p/go-libp2p/pull/3249))
+ - autonatv2: fix server dial data request policy (#3247) ([libp2p/go-libp2p#3247](https://github.com/libp2p/go-libp2p/pull/3247))
+ - webtransport: wrap underlying transport error on stream resets (#3237) ([libp2p/go-libp2p#3237](https://github.com/libp2p/go-libp2p/pull/3237))
+ - connmgr: remove WithEmergencyTrim (#3217) ([libp2p/go-libp2p#3217](https://github.com/libp2p/go-libp2p/pull/3217))
+ - connmgr: fix transport association bug (#3221) ([libp2p/go-libp2p#3221](https://github.com/libp2p/go-libp2p/pull/3221))
+ - webrtc: fix memory leak with udpmux.muxedConnection context (#3243) ([libp2p/go-libp2p#3243](https://github.com/libp2p/go-libp2p/pull/3243))
+ - fix(libp2phttp): bound NewStream timeout (#3225) ([libp2p/go-libp2p#3225](https://github.com/libp2p/go-libp2p/pull/3225))
+ - conngater: fix incorrect err return value (#3219) ([libp2p/go-libp2p#3219](https://github.com/libp2p/go-libp2p/pull/3219))
+ - addrsmanager: extract out addressing logic from basichost (#3075) ([libp2p/go-libp2p#3075](https://github.com/libp2p/go-libp2p/pull/3075))
+- github.com/libp2p/go-socket-activation (v0.1.0 -> v0.1.1):
+ - new version (#35) ([libp2p/go-socket-activation#35](https://github.com/libp2p/go-socket-activation/pull/35))
+ - Upgrade to go-log/v2 v2.6.0 (#33) ([libp2p/go-socket-activation#33](https://github.com/libp2p/go-socket-activation/pull/33))
+ - sync: update CI config files (#20) ([libp2p/go-socket-activation#20](https://github.com/libp2p/go-socket-activation/pull/20))
+ - sync: update CI config files (#18) ([libp2p/go-socket-activation#18](https://github.com/libp2p/go-socket-activation/pull/18))
+ - sync: update CI config files (#17) ([libp2p/go-socket-activation#17](https://github.com/libp2p/go-socket-activation/pull/17))
+- github.com/libp2p/go-yamux/v5 (v5.0.0 -> v5.0.1):
+ - Release v5.0.1
+ - fix: deadlock on close (#130) ([libp2p/go-yamux#130](https://github.com/libp2p/go-yamux/pull/130))
+- github.com/multiformats/go-multiaddr (v0.15.0 -> v0.16.0):
+ - Release v0.16.0 (#279) ([multiformats/go-multiaddr#279](https://github.com/multiformats/go-multiaddr/pull/279))
+ - Rename CaptureStringVal to CaptureString (#278) ([multiformats/go-multiaddr#278](https://github.com/multiformats/go-multiaddr/pull/278))
+ - Megular Expressions (#263) ([multiformats/go-multiaddr#263](https://github.com/multiformats/go-multiaddr/pull/263))
+- github.com/multiformats/go-multicodec (v0.9.0 -> v0.9.2):
+ - v0.9.2 bump
+ - chore: update submodules and go generate
+ - chore: v0.9.1 bump
+ - chore: update submodules and go generate
+ - ci: uci/update-go (#97) ([multiformats/go-multicodec#97](https://github.com/multiformats/go-multicodec/pull/97))
+ - chore: update submodules and go generate
+ - chore: update submodules and go generate
+ - chore: update submodules and go generate
+ - chore: update submodules and go generate
+- github.com/multiformats/go-multistream (v0.6.0 -> v0.6.1):
+ - Release v0.6.1 ([multiformats/go-multistream#121](https://github.com/multiformats/go-multistream/pull/121))
+ - refactor(lazyClientConn): Use synctest friendly once func ([multiformats/go-multistream#120](https://github.com/multiformats/go-multistream/pull/120))
+
+
+
### ๐จโ๐ฉโ๐งโ๐ฆ Contributors
+
+| Contributor | Commits | Lines ยฑ | Files Changed |
+|-------------|---------|---------|---------------|
+| sukun | 25 | +7274/-1586 | 140 |
+| galargh | 13 | +1714/-1680 | 115 |
+| rvagg | 2 | +1383/-960 | 6 |
+| Andrew Gillis | 46 | +1226/-564 | 140 |
+| Marco Munizaga | 6 | +1643/-36 | 24 |
+| Hector Sanjuan | 20 | +624/-202 | 40 |
+| Marcin Rataj | 24 | +583/-175 | 49 |
+| Dennis Trautwein | 1 | +134/-14 | 4 |
+| Piotr Galar | 1 | +73/-71 | 23 |
+| Guillaume Michel | 4 | +58/-44 | 23 |
+| Ivan | 1 | +90/-9 | 3 |
+| Will Scott | 1 | +97/-0 | 2 |
+| gammazero | 11 | +47/-30 | 13 |
+| guillaumemichel | 3 | +40/-35 | 21 |
+| Adin Schmahmann | 1 | +58/-17 | 8 |
+| Laurent Senta | 1 | +26/-24 | 4 |
+| pullmerge | 1 | +20/-16 | 5 |
+| vladopajic | 1 | +20/-14 | 1 |
+| Probot | 1 | +18/-4 | 1 |
+| Dmitry Markin | 1 | +13/-9 | 2 |
+| overallteach | 1 | +4/-12 | 3 |
+| web3-bot | 5 | +9/-6 | 7 |
+| Pavel Zbitskiy | 1 | +14/-1 | 1 |
+| Rod Vagg | 5 | +7/-7 | 5 |
+| argentpapa | 1 | +3/-10 | 1 |
+| GarmashAlex | 1 | +8/-3 | 1 |
+| huochexizhan | 1 | +3/-3 | 1 |
+| VolodymyrBg | 1 | +2/-3 | 1 |
+| levisyin | 1 | +2/-2 | 2 |
+| b00f | 1 | +3/-0 | 1 |
+| achingbrain | 1 | +1/-1 | 1 |
+| Ocenka | 1 | +1/-1 | 1 |
+| Dreamacro | 1 | +1/-1 | 1 |
+| ล tefan Baebler | 1 | +1/-0 | 1 |
diff --git a/version.go b/version.go
index 25721fb9e..af28b1aab 100644
--- a/version.go
+++ b/version.go
@@ -11,7 +11,7 @@ import (
var CurrentCommit string
// CurrentVersionNumber is the current application's version literal.
-const CurrentVersionNumber = "0.36.0-rc2"
+const CurrentVersionNumber = "0.36.0"
const ApiVersion = "/kubo/" + CurrentVersionNumber + "/" //nolint
From 780b207909acba83e93b0b35033b2240b25ec770 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Mon, 14 Jul 2025 20:05:16 +0200
Subject: [PATCH 291/499] chore: changelog 0.37
---
CHANGELOG.md | 1 +
docs/changelogs/v0.37.md | 25 +++++++++++++++++++++++++
2 files changed, 26 insertions(+)
create mode 100644 docs/changelogs/v0.37.md
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 67a776ee1..0dec582e3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,6 @@
# Kubo Changelogs
+- [v0.37](docs/changelogs/v0.37.md)
- [v0.36](docs/changelogs/v0.36.md)
- [v0.35](docs/changelogs/v0.35.md)
- [v0.34](docs/changelogs/v0.34.md)
diff --git a/docs/changelogs/v0.37.md b/docs/changelogs/v0.37.md
new file mode 100644
index 000000000..1a78a9505
--- /dev/null
+++ b/docs/changelogs/v0.37.md
@@ -0,0 +1,25 @@
+# Kubo changelog v0.37
+
+
+
+This release was brought to you by the [Interplanetary Shipyard](https://ipshipyard.com/) team.
+
+- [v0.37.0](#v0370)
+
+## v0.37.0
+
+- [Overview](#overview)
+- [๐ฆ Highlights](#-highlights)
+ - [๐ฆ๏ธ Important dependency updates](#-important-dependency-updates)
+- [๐ Changelog](#-changelog)
+- [๐จโ๐ฉโ๐งโ๐ฆ Contributors](#-contributors)
+
+### Overview
+
+### ๐ฆ Highlights
+
+#### ๐ฆ๏ธ Important dependency updates
+
+### ๐ Changelog
+
+### ๐จโ๐ฉโ๐งโ๐ฆ Contributors
From d80e85fa72c286727c9a2923638ee99e48f43f8f Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Tue, 15 Jul 2025 08:21:15 -0700
Subject: [PATCH 292/499] Update dependencies (#10860)
* Update dependencies
---
docs/examples/kubo-as-a-library/go.mod | 24 ++++++-------
docs/examples/kubo-as-a-library/go.sum | 50 +++++++++++++-------------
go.mod | 24 ++++++-------
go.sum | 50 +++++++++++++-------------
test/dependencies/go.mod | 18 +++++-----
test/dependencies/go.sum | 36 +++++++++----------
6 files changed, 99 insertions(+), 103 deletions(-)
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index 6c0881fab..47fd48238 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -23,7 +23,7 @@ require (
github.com/benbjohnson/clock v1.3.5 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/blang/semver/v4 v4.0.0 // indirect
- github.com/caddyserver/certmagic v0.21.6 // indirect
+ github.com/caddyserver/certmagic v0.23.0 // indirect
github.com/caddyserver/zerossl v0.1.3 // indirect
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
github.com/ceramicnetwork/go-dag-jose v0.1.1 // indirect
@@ -54,7 +54,7 @@ require (
github.com/gammazero/deque v1.0.0 // indirect
github.com/getsentry/sentry-go v0.27.0 // indirect
github.com/go-jose/go-jose/v4 v4.0.5 // indirect
- github.com/go-logr/logr v1.4.2 // indirect
+ github.com/go-logr/logr v1.4.3 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
@@ -87,7 +87,7 @@ require (
github.com/ipfs/go-ipfs-ds-help v1.1.1 // indirect
github.com/ipfs/go-ipfs-pq v0.0.3 // indirect
github.com/ipfs/go-ipfs-redirects-file v0.1.2 // indirect
- github.com/ipfs/go-ipld-cbor v0.2.0 // indirect
+ github.com/ipfs/go-ipld-cbor v0.2.1 // indirect
github.com/ipfs/go-ipld-format v0.6.2 // indirect
github.com/ipfs/go-ipld-git v0.1.1 // indirect
github.com/ipfs/go-ipld-legacy v0.2.2 // indirect
@@ -107,7 +107,7 @@ require (
github.com/koron/go-ssdp v0.0.6 // indirect
github.com/kr/pretty v0.3.1 // indirect
github.com/kr/text v0.2.0 // indirect
- github.com/libdns/libdns v0.2.2 // indirect
+ github.com/libdns/libdns v1.0.0-beta.1 // indirect
github.com/libp2p/go-buffer-pool v0.1.0 // indirect
github.com/libp2p/go-cidranger v1.1.0 // indirect
github.com/libp2p/go-doh-resolver v0.5.0 // indirect
@@ -115,7 +115,7 @@ require (
github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect
github.com/libp2p/go-libp2p-kad-dht v0.33.1 // indirect
github.com/libp2p/go-libp2p-kbucket v0.7.0 // indirect
- github.com/libp2p/go-libp2p-pubsub v0.13.1 // indirect
+ github.com/libp2p/go-libp2p-pubsub v0.14.2 // indirect
github.com/libp2p/go-libp2p-pubsub-router v0.6.0 // indirect
github.com/libp2p/go-libp2p-record v0.3.1 // indirect
github.com/libp2p/go-libp2p-routing-helpers v0.7.5 // indirect
@@ -127,7 +127,7 @@ require (
github.com/libp2p/zeroconf/v2 v2.2.0 // indirect
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
- github.com/mholt/acmez/v3 v3.0.0 // indirect
+ github.com/mholt/acmez/v3 v3.1.2 // indirect
github.com/miekg/dns v1.1.66 // indirect
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect
github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect
@@ -183,7 +183,7 @@ require (
github.com/ucarion/urlpath v0.0.0-20200424170820-7ccc79b76bbb // indirect
github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc // indirect
github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 // indirect
- github.com/whyrusleeping/cbor-gen v0.1.2 // indirect
+ github.com/whyrusleeping/cbor-gen v0.3.1 // indirect
github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f // indirect
github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 // indirect
github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 // indirect
@@ -192,15 +192,15 @@ require (
go.opencensus.io v0.24.0 // indirect
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect
- go.opentelemetry.io/otel v1.35.0 // indirect
+ go.opentelemetry.io/otel v1.37.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 // indirect
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 // indirect
go.opentelemetry.io/otel/exporters/zipkin v1.31.0 // indirect
- go.opentelemetry.io/otel/metric v1.35.0 // indirect
+ go.opentelemetry.io/otel/metric v1.37.0 // indirect
go.opentelemetry.io/otel/sdk v1.31.0 // indirect
- go.opentelemetry.io/otel/trace v1.35.0 // indirect
+ go.opentelemetry.io/otel/trace v1.37.0 // indirect
go.opentelemetry.io/proto/otlp v1.3.1 // indirect
go.uber.org/automaxprocs v1.6.0 // indirect
go.uber.org/dig v1.19.0 // indirect
@@ -214,8 +214,8 @@ require (
golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b // indirect
golang.org/x/mod v0.25.0 // indirect
golang.org/x/net v0.41.0 // indirect
- golang.org/x/sync v0.15.0 // indirect
- golang.org/x/sys v0.33.0 // indirect
+ golang.org/x/sync v0.16.0 // indirect
+ golang.org/x/sys v0.34.0 // indirect
golang.org/x/text v0.26.0 // indirect
golang.org/x/time v0.12.0 // indirect
golang.org/x/tools v0.34.0 // indirect
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index bcaa73e90..8ebaa1fad 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -61,8 +61,8 @@ github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku
github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY=
github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs=
github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s=
-github.com/caddyserver/certmagic v0.21.6 h1:1th6GfprVfsAtFNOu4StNMF5IxK5XiaI0yZhAHlZFPE=
-github.com/caddyserver/certmagic v0.21.6/go.mod h1:n1sCo7zV1Ez2j+89wrzDxo4N/T1Ws/Vx8u5NvuBFabw=
+github.com/caddyserver/certmagic v0.23.0 h1:CfpZ/50jMfG4+1J/u2LV6piJq4HOfO6ppOnOf7DkFEU=
+github.com/caddyserver/certmagic v0.23.0/go.mod h1:9mEZIWqqWoI+Gf+4Trh04MOVPD0tGSxtqsxg87hAIH4=
github.com/caddyserver/zerossl v0.1.3 h1:onS+pxp3M8HnHpN5MMbOMyNjmTheJyWRaZYwn+YTAyA=
github.com/caddyserver/zerossl v0.1.3/go.mod h1:CxA0acn7oEGO6//4rtrRjYgEoa4MFw/XofZnrYwGqG4=
github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
@@ -178,8 +178,8 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2
github.com/go-jose/go-jose/v4 v4.0.5 h1:M6T8+mKZl/+fNNuFHvGIzDz7BTLQPIounk/b9dw3AaE=
github.com/go-jose/go-jose/v4 v4.0.5/go.mod h1:s3P1lRrkT8igV8D9OjyL4WRyHvjB6a4JSllnOrmmBOA=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
-github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
-github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
+github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
@@ -336,10 +336,8 @@ github.com/ipfs/go-ipfs-redirects-file v0.1.2 h1:QCK7VtL91FH17KROVVy5KrzDx2hu68Q
github.com/ipfs/go-ipfs-redirects-file v0.1.2/go.mod h1:yIiTlLcDEM/8lS6T3FlCEXZktPPqSOyuY6dEzVqw7Fw=
github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc=
github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ=
-github.com/ipfs/go-ipfs-util v0.0.3 h1:2RFdGez6bu2ZlZdI+rWfIdbQb1KudQp3VGwPtdNCmE0=
-github.com/ipfs/go-ipfs-util v0.0.3/go.mod h1:LHzG1a0Ig4G+iZ26UUOMjHd+lfM84LZCrn17xAKWBvs=
-github.com/ipfs/go-ipld-cbor v0.2.0 h1:VHIW3HVIjcMd8m4ZLZbrYpwjzqlVUfjLM7oK4T5/YF0=
-github.com/ipfs/go-ipld-cbor v0.2.0/go.mod h1:Cp8T7w1NKcu4AQJLqK0tWpd1nkgTxEVB5C6kVpLW6/0=
+github.com/ipfs/go-ipld-cbor v0.2.1 h1:H05yEJbK/hxg0uf2AJhyerBDbjOuHX4yi+1U/ogRa7E=
+github.com/ipfs/go-ipld-cbor v0.2.1/go.mod h1:x9Zbeq8CoE5R2WicYgBMcr/9mnkQ0lHddYWJP2sMV3A=
github.com/ipfs/go-ipld-format v0.6.2 h1:bPZQ+A05ol0b3lsJSl0bLvwbuQ+HQbSsdGTy4xtYUkU=
github.com/ipfs/go-ipld-format v0.6.2/go.mod h1:nni2xFdHKx5lxvXJ6brt/pndtGxKAE+FPR1rg4jTkyk=
github.com/ipfs/go-ipld-git v0.1.1 h1:TWGnZjS0htmEmlMFEkA3ogrNCqWjIxwr16x1OsdhG+Y=
@@ -412,8 +410,8 @@ github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
-github.com/libdns/libdns v0.2.2 h1:O6ws7bAfRPaBsgAYt8MDe2HcNBGC29hkZ9MX2eUSX3s=
-github.com/libdns/libdns v0.2.2/go.mod h1:4Bj9+5CQiNMVGf87wjX4CY3HQJypUHRuLvlsfsZqLWQ=
+github.com/libdns/libdns v1.0.0-beta.1 h1:KIf4wLfsrEpXpZ3vmc/poM8zCATXT2klbdPe6hyOBjQ=
+github.com/libdns/libdns v1.0.0-beta.1/go.mod h1:4Bj9+5CQiNMVGf87wjX4CY3HQJypUHRuLvlsfsZqLWQ=
github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ=
github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM=
github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8=
@@ -438,8 +436,8 @@ github.com/libp2p/go-libp2p-kbucket v0.3.1/go.mod h1:oyjT5O7tS9CQurok++ERgc46YLw
github.com/libp2p/go-libp2p-kbucket v0.7.0 h1:vYDvRjkyJPeWunQXqcW2Z6E93Ywx7fX0jgzb/dGOKCs=
github.com/libp2p/go-libp2p-kbucket v0.7.0/go.mod h1:blOINGIj1yiPYlVEX0Rj9QwEkmVnz3EP8LK1dRKBC6g=
github.com/libp2p/go-libp2p-peerstore v0.1.4/go.mod h1:+4BDbDiiKf4PzpANZDAT+knVdLxvqh7hXOujessqdzs=
-github.com/libp2p/go-libp2p-pubsub v0.13.1 h1:tV3ttzzZSCk0EtEXnxVmWIXgjVxXx+20Jwjbs/Ctzjo=
-github.com/libp2p/go-libp2p-pubsub v0.13.1/go.mod h1:MKPU5vMI8RRFyTP0HfdsF9cLmL1nHAeJm44AxJGJx44=
+github.com/libp2p/go-libp2p-pubsub v0.14.2 h1:nT5lFHPQOFJcp9CW8hpKtvbpQNdl2udJuzLQWbgRum8=
+github.com/libp2p/go-libp2p-pubsub v0.14.2/go.mod h1:MKPU5vMI8RRFyTP0HfdsF9cLmL1nHAeJm44AxJGJx44=
github.com/libp2p/go-libp2p-pubsub-router v0.6.0 h1:D30iKdlqDt5ZmLEYhHELCMRj8b4sFAqrUcshIUvVP/s=
github.com/libp2p/go-libp2p-pubsub-router v0.6.0/go.mod h1:FY/q0/RBTKsLA7l4vqC2cbRbOvyDotg8PJQ7j8FDudE=
github.com/libp2p/go-libp2p-record v0.3.1 h1:cly48Xi5GjNw5Wq+7gmjfBiG9HCzQVkiZOUZ8kUl+Fg=
@@ -477,8 +475,8 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
-github.com/mholt/acmez/v3 v3.0.0 h1:r1NcjuWR0VaKP2BTjDK9LRFBw/WvURx3jlaEUl9Ht8E=
-github.com/mholt/acmez/v3 v3.0.0/go.mod h1:L1wOU06KKvq7tswuMDwKdcHeKpFFgkppZy/y0DFxagQ=
+github.com/mholt/acmez/v3 v3.1.2 h1:auob8J/0FhmdClQicvJvuDavgd5ezwLBfKuYmynhYzc=
+github.com/mholt/acmez/v3 v3.1.2/go.mod h1:L1wOU06KKvq7tswuMDwKdcHeKpFFgkppZy/y0DFxagQ=
github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4=
github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4=
github.com/miekg/dns v1.1.66 h1:FeZXOS3VCVsKnEAd+wBkjMC3D2K+ww66Cq3VnCINuJE=
@@ -748,8 +746,8 @@ github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc h1:BCPnHtcboa
github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc/go.mod h1:r45hJU7yEoA81k6MWNhpMj/kms0n14dkzkxYHoB96UM=
github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 h1:5HZfQkwe0mIfyDmc1Em5GqlNRzcdtlv4HTNmdpt7XH0=
github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11/go.mod h1:Wlo/SzPmxVp6vXpGt/zaXhHH0fn4IxgqZc82aKg6bpQ=
-github.com/whyrusleeping/cbor-gen v0.1.2 h1:WQFlrPhpcQl+M2/3dP5cvlTLWPVsL6LGBb9jJt6l/cA=
-github.com/whyrusleeping/cbor-gen v0.1.2/go.mod h1:pM99HXyEbSQHcosHc0iW7YFmwnscr+t9Te4ibko05so=
+github.com/whyrusleeping/cbor-gen v0.3.1 h1:82ioxmhEYut7LBVGhGq8xoRkXPLElVuh5mV67AFfdv0=
+github.com/whyrusleeping/cbor-gen v0.3.1/go.mod h1:pM99HXyEbSQHcosHc0iW7YFmwnscr+t9Te4ibko05so=
github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E=
github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8=
github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 h1:EKhdznlJHPMoKr0XTrX+IlJs1LH3lyx2nfr1dOlZ79k=
@@ -783,8 +781,8 @@ go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJyS
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM=
-go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ=
-go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y=
+go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ=
+go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 h1:K0XaT3DwHAcV4nKLzcQvwAgSyisUghWoY20I7huthMk=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0/go.mod h1:B5Ki776z/MBnVha1Nzwp5arlzBbE3+1jk+pGmaP5HME=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 h1:FFeLy03iVTXP6ffeN2iXrxfGsZGCjVx0/4KlizjyBwU=
@@ -795,12 +793,12 @@ go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 h1:UGZ1QwZWY67Z6Bm
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0/go.mod h1:fcwWuDuaObkkChiDlhEpSq9+X1C0omv+s5mBtToAQ64=
go.opentelemetry.io/otel/exporters/zipkin v1.31.0 h1:CgucL0tj3717DJnni7HVVB2wExzi8c2zJNEA2BhLMvI=
go.opentelemetry.io/otel/exporters/zipkin v1.31.0/go.mod h1:rfzOVNiSwIcWtEC2J8epwG26fiaXlYvLySJ7bwsrtAE=
-go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M=
-go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE=
+go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE=
+go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E=
go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk=
go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0=
-go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs=
-go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc=
+go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4=
+go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0=
go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0=
go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8=
go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
@@ -935,8 +933,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8=
-golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
+golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
+golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -983,8 +981,8 @@ golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
-golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
+golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=
+golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
diff --git a/go.mod b/go.mod
index a9bd58174..b50b82690 100644
--- a/go.mod
+++ b/go.mod
@@ -7,7 +7,7 @@ require (
contrib.go.opencensus.io/exporter/prometheus v0.4.2
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239
github.com/blang/semver/v4 v4.0.0
- github.com/caddyserver/certmagic v0.21.6
+ github.com/caddyserver/certmagic v0.23.0
github.com/cenkalti/backoff/v4 v4.3.0
github.com/ceramicnetwork/go-dag-jose v0.1.1
github.com/cheggaaa/pb v1.0.29
@@ -35,7 +35,7 @@ require (
github.com/ipfs/go-ds-pebble v0.5.1
github.com/ipfs/go-fs-lock v0.1.1
github.com/ipfs/go-ipfs-cmds v0.15.0
- github.com/ipfs/go-ipld-cbor v0.2.0
+ github.com/ipfs/go-ipld-cbor v0.2.1
github.com/ipfs/go-ipld-format v0.6.2
github.com/ipfs/go-ipld-git v0.1.1
github.com/ipfs/go-ipld-legacy v0.2.2
@@ -56,7 +56,7 @@ require (
github.com/libp2p/go-libp2p-http v0.5.0
github.com/libp2p/go-libp2p-kad-dht v0.33.1
github.com/libp2p/go-libp2p-kbucket v0.7.0
- github.com/libp2p/go-libp2p-pubsub v0.13.1
+ github.com/libp2p/go-libp2p-pubsub v0.14.2
github.com/libp2p/go-libp2p-pubsub-router v0.6.0
github.com/libp2p/go-libp2p-record v0.3.1
github.com/libp2p/go-libp2p-routing-helpers v0.7.5
@@ -79,9 +79,9 @@ require (
go.opencensus.io v0.24.0
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0
go.opentelemetry.io/contrib/propagators/autoprop v0.46.1
- go.opentelemetry.io/otel v1.35.0
+ go.opentelemetry.io/otel v1.37.0
go.opentelemetry.io/otel/sdk v1.31.0
- go.opentelemetry.io/otel/trace v1.35.0
+ go.opentelemetry.io/otel/trace v1.37.0
go.uber.org/dig v1.19.0
go.uber.org/fx v1.24.0
go.uber.org/multierr v1.11.0
@@ -89,8 +89,8 @@ require (
golang.org/x/crypto v0.39.0
golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b
golang.org/x/mod v0.25.0
- golang.org/x/sync v0.15.0
- golang.org/x/sys v0.33.0
+ golang.org/x/sync v0.16.0
+ golang.org/x/sys v0.34.0
google.golang.org/protobuf v1.36.6
)
@@ -131,7 +131,7 @@ require (
github.com/go-jose/go-jose/v4 v4.0.5 // indirect
github.com/go-kit/log v0.2.1 // indirect
github.com/go-logfmt/logfmt v0.6.0 // indirect
- github.com/go-logr/logr v1.4.2 // indirect
+ github.com/go-logr/logr v1.4.3 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
@@ -159,7 +159,7 @@ require (
github.com/koron/go-ssdp v0.0.6 // indirect
github.com/kr/pretty v0.3.1 // indirect
github.com/kr/text v0.2.0 // indirect
- github.com/libdns/libdns v0.2.2 // indirect
+ github.com/libdns/libdns v1.0.0-beta.1 // indirect
github.com/libp2p/go-buffer-pool v0.1.0 // indirect
github.com/libp2p/go-cidranger v1.1.0 // indirect
github.com/libp2p/go-flow-metrics v0.3.0 // indirect
@@ -176,7 +176,7 @@ require (
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-runewidth v0.0.15 // indirect
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect
- github.com/mholt/acmez/v3 v3.0.0 // indirect
+ github.com/mholt/acmez/v3 v3.1.2 // indirect
github.com/miekg/dns v1.1.66 // indirect
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect
github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect
@@ -232,7 +232,7 @@ require (
github.com/ucarion/urlpath v0.0.0-20200424170820-7ccc79b76bbb // indirect
github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc // indirect
github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 // indirect
- github.com/whyrusleeping/cbor-gen v0.1.2 // indirect
+ github.com/whyrusleeping/cbor-gen v0.3.1 // indirect
github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f // indirect
github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 // indirect
github.com/wlynxg/anet v0.0.5 // indirect
@@ -247,7 +247,7 @@ require (
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 // indirect
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 // indirect
go.opentelemetry.io/otel/exporters/zipkin v1.31.0 // indirect
- go.opentelemetry.io/otel/metric v1.35.0 // indirect
+ go.opentelemetry.io/otel/metric v1.37.0 // indirect
go.opentelemetry.io/proto/otlp v1.3.1 // indirect
go.uber.org/automaxprocs v1.6.0 // indirect
go.uber.org/mock v0.5.2 // indirect
diff --git a/go.sum b/go.sum
index 368d2f8bc..de2844ca1 100644
--- a/go.sum
+++ b/go.sum
@@ -88,8 +88,8 @@ github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku
github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY=
github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs=
github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s=
-github.com/caddyserver/certmagic v0.21.6 h1:1th6GfprVfsAtFNOu4StNMF5IxK5XiaI0yZhAHlZFPE=
-github.com/caddyserver/certmagic v0.21.6/go.mod h1:n1sCo7zV1Ez2j+89wrzDxo4N/T1Ws/Vx8u5NvuBFabw=
+github.com/caddyserver/certmagic v0.23.0 h1:CfpZ/50jMfG4+1J/u2LV6piJq4HOfO6ppOnOf7DkFEU=
+github.com/caddyserver/certmagic v0.23.0/go.mod h1:9mEZIWqqWoI+Gf+4Trh04MOVPD0tGSxtqsxg87hAIH4=
github.com/caddyserver/zerossl v0.1.3 h1:onS+pxp3M8HnHpN5MMbOMyNjmTheJyWRaZYwn+YTAyA=
github.com/caddyserver/zerossl v0.1.3/go.mod h1:CxA0acn7oEGO6//4rtrRjYgEoa4MFw/XofZnrYwGqG4=
github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
@@ -229,8 +229,8 @@ github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KE
github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4=
github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
-github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
-github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
+github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
@@ -405,10 +405,8 @@ github.com/ipfs/go-ipfs-redirects-file v0.1.2 h1:QCK7VtL91FH17KROVVy5KrzDx2hu68Q
github.com/ipfs/go-ipfs-redirects-file v0.1.2/go.mod h1:yIiTlLcDEM/8lS6T3FlCEXZktPPqSOyuY6dEzVqw7Fw=
github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc=
github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ=
-github.com/ipfs/go-ipfs-util v0.0.3 h1:2RFdGez6bu2ZlZdI+rWfIdbQb1KudQp3VGwPtdNCmE0=
-github.com/ipfs/go-ipfs-util v0.0.3/go.mod h1:LHzG1a0Ig4G+iZ26UUOMjHd+lfM84LZCrn17xAKWBvs=
-github.com/ipfs/go-ipld-cbor v0.2.0 h1:VHIW3HVIjcMd8m4ZLZbrYpwjzqlVUfjLM7oK4T5/YF0=
-github.com/ipfs/go-ipld-cbor v0.2.0/go.mod h1:Cp8T7w1NKcu4AQJLqK0tWpd1nkgTxEVB5C6kVpLW6/0=
+github.com/ipfs/go-ipld-cbor v0.2.1 h1:H05yEJbK/hxg0uf2AJhyerBDbjOuHX4yi+1U/ogRa7E=
+github.com/ipfs/go-ipld-cbor v0.2.1/go.mod h1:x9Zbeq8CoE5R2WicYgBMcr/9mnkQ0lHddYWJP2sMV3A=
github.com/ipfs/go-ipld-format v0.6.2 h1:bPZQ+A05ol0b3lsJSl0bLvwbuQ+HQbSsdGTy4xtYUkU=
github.com/ipfs/go-ipld-format v0.6.2/go.mod h1:nni2xFdHKx5lxvXJ6brt/pndtGxKAE+FPR1rg4jTkyk=
github.com/ipfs/go-ipld-git v0.1.1 h1:TWGnZjS0htmEmlMFEkA3ogrNCqWjIxwr16x1OsdhG+Y=
@@ -495,8 +493,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
-github.com/libdns/libdns v0.2.2 h1:O6ws7bAfRPaBsgAYt8MDe2HcNBGC29hkZ9MX2eUSX3s=
-github.com/libdns/libdns v0.2.2/go.mod h1:4Bj9+5CQiNMVGf87wjX4CY3HQJypUHRuLvlsfsZqLWQ=
+github.com/libdns/libdns v1.0.0-beta.1 h1:KIf4wLfsrEpXpZ3vmc/poM8zCATXT2klbdPe6hyOBjQ=
+github.com/libdns/libdns v1.0.0-beta.1/go.mod h1:4Bj9+5CQiNMVGf87wjX4CY3HQJypUHRuLvlsfsZqLWQ=
github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ=
github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM=
github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8=
@@ -525,8 +523,8 @@ github.com/libp2p/go-libp2p-kbucket v0.3.1/go.mod h1:oyjT5O7tS9CQurok++ERgc46YLw
github.com/libp2p/go-libp2p-kbucket v0.7.0 h1:vYDvRjkyJPeWunQXqcW2Z6E93Ywx7fX0jgzb/dGOKCs=
github.com/libp2p/go-libp2p-kbucket v0.7.0/go.mod h1:blOINGIj1yiPYlVEX0Rj9QwEkmVnz3EP8LK1dRKBC6g=
github.com/libp2p/go-libp2p-peerstore v0.1.4/go.mod h1:+4BDbDiiKf4PzpANZDAT+knVdLxvqh7hXOujessqdzs=
-github.com/libp2p/go-libp2p-pubsub v0.13.1 h1:tV3ttzzZSCk0EtEXnxVmWIXgjVxXx+20Jwjbs/Ctzjo=
-github.com/libp2p/go-libp2p-pubsub v0.13.1/go.mod h1:MKPU5vMI8RRFyTP0HfdsF9cLmL1nHAeJm44AxJGJx44=
+github.com/libp2p/go-libp2p-pubsub v0.14.2 h1:nT5lFHPQOFJcp9CW8hpKtvbpQNdl2udJuzLQWbgRum8=
+github.com/libp2p/go-libp2p-pubsub v0.14.2/go.mod h1:MKPU5vMI8RRFyTP0HfdsF9cLmL1nHAeJm44AxJGJx44=
github.com/libp2p/go-libp2p-pubsub-router v0.6.0 h1:D30iKdlqDt5ZmLEYhHELCMRj8b4sFAqrUcshIUvVP/s=
github.com/libp2p/go-libp2p-pubsub-router v0.6.0/go.mod h1:FY/q0/RBTKsLA7l4vqC2cbRbOvyDotg8PJQ7j8FDudE=
github.com/libp2p/go-libp2p-record v0.3.1 h1:cly48Xi5GjNw5Wq+7gmjfBiG9HCzQVkiZOUZ8kUl+Fg=
@@ -576,8 +574,8 @@ github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4=
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
-github.com/mholt/acmez/v3 v3.0.0 h1:r1NcjuWR0VaKP2BTjDK9LRFBw/WvURx3jlaEUl9Ht8E=
-github.com/mholt/acmez/v3 v3.0.0/go.mod h1:L1wOU06KKvq7tswuMDwKdcHeKpFFgkppZy/y0DFxagQ=
+github.com/mholt/acmez/v3 v3.1.2 h1:auob8J/0FhmdClQicvJvuDavgd5ezwLBfKuYmynhYzc=
+github.com/mholt/acmez/v3 v3.1.2/go.mod h1:L1wOU06KKvq7tswuMDwKdcHeKpFFgkppZy/y0DFxagQ=
github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4=
github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4=
github.com/miekg/dns v1.1.66 h1:FeZXOS3VCVsKnEAd+wBkjMC3D2K+ww66Cq3VnCINuJE=
@@ -898,8 +896,8 @@ github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc h1:BCPnHtcboa
github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc/go.mod h1:r45hJU7yEoA81k6MWNhpMj/kms0n14dkzkxYHoB96UM=
github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 h1:5HZfQkwe0mIfyDmc1Em5GqlNRzcdtlv4HTNmdpt7XH0=
github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11/go.mod h1:Wlo/SzPmxVp6vXpGt/zaXhHH0fn4IxgqZc82aKg6bpQ=
-github.com/whyrusleeping/cbor-gen v0.1.2 h1:WQFlrPhpcQl+M2/3dP5cvlTLWPVsL6LGBb9jJt6l/cA=
-github.com/whyrusleeping/cbor-gen v0.1.2/go.mod h1:pM99HXyEbSQHcosHc0iW7YFmwnscr+t9Te4ibko05so=
+github.com/whyrusleeping/cbor-gen v0.3.1 h1:82ioxmhEYut7LBVGhGq8xoRkXPLElVuh5mV67AFfdv0=
+github.com/whyrusleeping/cbor-gen v0.3.1/go.mod h1:pM99HXyEbSQHcosHc0iW7YFmwnscr+t9Te4ibko05so=
github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E=
github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8=
github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 h1:EKhdznlJHPMoKr0XTrX+IlJs1LH3lyx2nfr1dOlZ79k=
@@ -949,8 +947,8 @@ go.opentelemetry.io/contrib/propagators/jaeger v1.21.1 h1:f4beMGDKiVzg9IcX7/VuWV
go.opentelemetry.io/contrib/propagators/jaeger v1.21.1/go.mod h1:U9jhkEl8d1LL+QXY7q3kneJWJugiN3kZJV2OWz3hkBY=
go.opentelemetry.io/contrib/propagators/ot v1.21.1 h1:3TN5vkXjKYWp0YdMcnUEC/A+pBPvqz9V3nCS2xmcurk=
go.opentelemetry.io/contrib/propagators/ot v1.21.1/go.mod h1:oy0MYCbS/b3cqUDW37wBWtlwBIsutngS++Lklpgh+fc=
-go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ=
-go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y=
+go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ=
+go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 h1:K0XaT3DwHAcV4nKLzcQvwAgSyisUghWoY20I7huthMk=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0/go.mod h1:B5Ki776z/MBnVha1Nzwp5arlzBbE3+1jk+pGmaP5HME=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 h1:FFeLy03iVTXP6ffeN2iXrxfGsZGCjVx0/4KlizjyBwU=
@@ -961,12 +959,12 @@ go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 h1:UGZ1QwZWY67Z6Bm
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0/go.mod h1:fcwWuDuaObkkChiDlhEpSq9+X1C0omv+s5mBtToAQ64=
go.opentelemetry.io/otel/exporters/zipkin v1.31.0 h1:CgucL0tj3717DJnni7HVVB2wExzi8c2zJNEA2BhLMvI=
go.opentelemetry.io/otel/exporters/zipkin v1.31.0/go.mod h1:rfzOVNiSwIcWtEC2J8epwG26fiaXlYvLySJ7bwsrtAE=
-go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M=
-go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE=
+go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE=
+go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E=
go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk=
go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0=
-go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs=
-go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc=
+go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4=
+go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0=
go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0=
go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8=
go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
@@ -1128,8 +1126,8 @@ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8=
-golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
+golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
+golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1197,8 +1195,8 @@ golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
-golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
+golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=
+golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index d641e1034..27a11c854 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -50,7 +50,7 @@ require (
github.com/breml/errchkjson v0.3.6 // indirect
github.com/butuzov/ireturn v0.3.0 // indirect
github.com/butuzov/mirror v1.2.0 // indirect
- github.com/caddyserver/certmagic v0.21.6 // indirect
+ github.com/caddyserver/certmagic v0.23.0 // indirect
github.com/caddyserver/zerossl v0.1.3 // indirect
github.com/catenacyber/perfsprint v0.7.1 // indirect
github.com/ccojocar/zxcvbn-go v1.0.2 // indirect
@@ -89,7 +89,7 @@ require (
github.com/getsentry/sentry-go v0.27.0 // indirect
github.com/ghostiam/protogetter v0.3.6 // indirect
github.com/go-critic/go-critic v0.11.4 // indirect
- github.com/go-logr/logr v1.4.2 // indirect
+ github.com/go-logr/logr v1.4.3 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
github.com/go-toolsmith/astcast v1.1.0 // indirect
@@ -164,7 +164,7 @@ require (
github.com/ldez/gomoddirectives v0.2.4 // indirect
github.com/ldez/tagliatelle v0.5.0 // indirect
github.com/leonklingele/grouper v1.1.2 // indirect
- github.com/libdns/libdns v0.2.2 // indirect
+ github.com/libdns/libdns v1.0.0-beta.1 // indirect
github.com/libp2p/go-buffer-pool v0.1.0 // indirect
github.com/libp2p/go-cidranger v1.1.0 // indirect
github.com/libp2p/go-flow-metrics v0.3.0 // indirect
@@ -188,7 +188,7 @@ require (
github.com/mattn/go-runewidth v0.0.15 // indirect
github.com/mattn/go-shellwords v1.0.12 // indirect
github.com/mgechev/revive v1.3.9 // indirect
- github.com/mholt/acmez/v3 v3.0.0 // indirect
+ github.com/mholt/acmez/v3 v3.1.2 // indirect
github.com/miekg/dns v1.1.66 // indirect
github.com/minio/sha256-simd v1.0.1 // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect
@@ -301,9 +301,9 @@ require (
go-simpler.org/musttag v0.12.2 // indirect
go-simpler.org/sloglint v0.7.2 // indirect
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
- go.opentelemetry.io/otel v1.35.0 // indirect
- go.opentelemetry.io/otel/metric v1.35.0 // indirect
- go.opentelemetry.io/otel/trace v1.35.0 // indirect
+ go.opentelemetry.io/otel v1.37.0 // indirect
+ go.opentelemetry.io/otel/metric v1.37.0 // indirect
+ go.opentelemetry.io/otel/trace v1.37.0 // indirect
go.uber.org/automaxprocs v1.6.0 // indirect
go.uber.org/dig v1.19.0 // indirect
go.uber.org/fx v1.24.0 // indirect
@@ -316,8 +316,8 @@ require (
golang.org/x/exp/typeparams v0.0.0-20240314144324-c7f7c6466f7f // indirect
golang.org/x/mod v0.25.0 // indirect
golang.org/x/net v0.41.0 // indirect
- golang.org/x/sync v0.15.0 // indirect
- golang.org/x/sys v0.33.0 // indirect
+ golang.org/x/sync v0.16.0 // indirect
+ golang.org/x/sys v0.34.0 // indirect
golang.org/x/term v0.32.0 // indirect
golang.org/x/text v0.26.0 // indirect
golang.org/x/time v0.12.0 // indirect
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index 28cf50f9c..f07ad6041 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -83,8 +83,8 @@ github.com/butuzov/ireturn v0.3.0 h1:hTjMqWw3y5JC3kpnC5vXmFJAWI/m31jaCYQqzkS6PL0
github.com/butuzov/ireturn v0.3.0/go.mod h1:A09nIiwiqzN/IoVo9ogpa0Hzi9fex1kd9PSD6edP5ZA=
github.com/butuzov/mirror v1.2.0 h1:9YVK1qIjNspaqWutSv8gsge2e/Xpq1eqEkslEUHy5cs=
github.com/butuzov/mirror v1.2.0/go.mod h1:DqZZDtzm42wIAIyHXeN8W/qb1EPlb9Qn/if9icBOpdQ=
-github.com/caddyserver/certmagic v0.21.6 h1:1th6GfprVfsAtFNOu4StNMF5IxK5XiaI0yZhAHlZFPE=
-github.com/caddyserver/certmagic v0.21.6/go.mod h1:n1sCo7zV1Ez2j+89wrzDxo4N/T1Ws/Vx8u5NvuBFabw=
+github.com/caddyserver/certmagic v0.23.0 h1:CfpZ/50jMfG4+1J/u2LV6piJq4HOfO6ppOnOf7DkFEU=
+github.com/caddyserver/certmagic v0.23.0/go.mod h1:9mEZIWqqWoI+Gf+4Trh04MOVPD0tGSxtqsxg87hAIH4=
github.com/caddyserver/zerossl v0.1.3 h1:onS+pxp3M8HnHpN5MMbOMyNjmTheJyWRaZYwn+YTAyA=
github.com/caddyserver/zerossl v0.1.3/go.mod h1:CxA0acn7oEGO6//4rtrRjYgEoa4MFw/XofZnrYwGqG4=
github.com/catenacyber/perfsprint v0.7.1 h1:PGW5G/Kxn+YrN04cRAZKC+ZuvlVwolYMrIyyTJ/rMmc=
@@ -193,8 +193,8 @@ github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm
github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA=
github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
-github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
-github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
+github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-quicktest/qt v1.101.0 h1:O1K29Txy5P2OK0dGo59b7b0LR6wKfIhttaAhHUyn7eI=
@@ -417,8 +417,8 @@ github.com/ldez/tagliatelle v0.5.0 h1:epgfuYt9v0CG3fms0pEgIMNPuFf/LpPIfjk4kyqSio
github.com/ldez/tagliatelle v0.5.0/go.mod h1:rj1HmWiL1MiKQuOONhd09iySTEkUuE/8+5jtPYz9xa4=
github.com/leonklingele/grouper v1.1.2 h1:o1ARBDLOmmasUaNDesWqWCIFH3u7hoFlM84YrjT3mIY=
github.com/leonklingele/grouper v1.1.2/go.mod h1:6D0M/HVkhs2yRKRFZUoGjeDy7EZTfFBE9gl4kjmIGkA=
-github.com/libdns/libdns v0.2.2 h1:O6ws7bAfRPaBsgAYt8MDe2HcNBGC29hkZ9MX2eUSX3s=
-github.com/libdns/libdns v0.2.2/go.mod h1:4Bj9+5CQiNMVGf87wjX4CY3HQJypUHRuLvlsfsZqLWQ=
+github.com/libdns/libdns v1.0.0-beta.1 h1:KIf4wLfsrEpXpZ3vmc/poM8zCATXT2klbdPe6hyOBjQ=
+github.com/libdns/libdns v1.0.0-beta.1/go.mod h1:4Bj9+5CQiNMVGf87wjX4CY3HQJypUHRuLvlsfsZqLWQ=
github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8=
github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg=
github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38yPW7c=
@@ -480,8 +480,8 @@ github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lL
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/mgechev/revive v1.3.9 h1:18Y3R4a2USSBF+QZKFQwVkBROUda7uoBlkEuBD+YD1A=
github.com/mgechev/revive v1.3.9/go.mod h1:+uxEIr5UH0TjXWHTno3xh4u7eg6jDpXKzQccA9UGhHU=
-github.com/mholt/acmez/v3 v3.0.0 h1:r1NcjuWR0VaKP2BTjDK9LRFBw/WvURx3jlaEUl9Ht8E=
-github.com/mholt/acmez/v3 v3.0.0/go.mod h1:L1wOU06KKvq7tswuMDwKdcHeKpFFgkppZy/y0DFxagQ=
+github.com/mholt/acmez/v3 v3.1.2 h1:auob8J/0FhmdClQicvJvuDavgd5ezwLBfKuYmynhYzc=
+github.com/mholt/acmez/v3 v3.1.2/go.mod h1:L1wOU06KKvq7tswuMDwKdcHeKpFFgkppZy/y0DFxagQ=
github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4=
github.com/miekg/dns v1.1.66 h1:FeZXOS3VCVsKnEAd+wBkjMC3D2K+ww66Cq3VnCINuJE=
github.com/miekg/dns v1.1.66/go.mod h1:jGFzBsSNbJw6z1HYut1RKBKHA9PBdxeHrZG8J+gC2WE=
@@ -824,12 +824,12 @@ go-simpler.org/sloglint v0.7.2/go.mod h1:US+9C80ppl7VsThQclkM7BkCHQAzuz8kHLsW3pp
go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA=
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
-go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ=
-go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y=
-go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M=
-go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE=
-go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs=
-go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc=
+go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ=
+go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I=
+go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE=
+go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E=
+go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4=
+go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0=
go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8=
go.uber.org/dig v1.19.0 h1:BACLhebsYdpQ7IROQ1AGPjrXcP5dF80U3gKoFzbaq/4=
@@ -949,8 +949,8 @@ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
-golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8=
-golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
+golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
+golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -988,8 +988,8 @@ golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
-golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
+golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=
+golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
From a22efea6f337c6e6fc30265fb52fb083f629e154 Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Wed, 16 Jul 2025 01:28:27 -0700
Subject: [PATCH 293/499] provider: clear provide queue when reprovide strategy
changes (#10863)
* provider: clear reprovide queue when reprovide strategy changes
When the currently configured reprovide strategy does not match the previous strategy read from the datastore, then clear the reprovide queue and update the reprovide strategy that is stored in the datastore.
Depends on https://github.com/ipfs/boxo/pull/978
Closes #10829
* Update docs/changelogs/v0.36.md
Co-authored-by: Guillaume Michel
* update log message
* update boxo
* Move change log to v0.37.md
* Add `provide clear` command to clear provide queue
The `provide clear` command clears all items from the provide queue and prints out the number of items removed from the queue. The `quiet` option tells the command not to print output.
* refactor(cmds): ipfs provide clear
moving to new namespace to avoid conflicts, and also document other
commands
* docs: clarify Reprovider.Strategy
* chore: remove undesired md link
---
core/commands/commands_test.go | 2 +
core/commands/provide.go | 82 ++++++++++++++++++++++
core/commands/root.go | 2 +
core/node/provider.go | 36 +++++++++-
docs/changelogs/v0.36.md | 2 +-
docs/changelogs/v0.37.md | 16 ++++-
docs/config.md | 11 +--
docs/examples/kubo-as-a-library/go.mod | 32 ++++-----
docs/examples/kubo-as-a-library/go.sum | 66 +++++++++---------
go.mod | 32 ++++-----
go.sum | 66 +++++++++---------
test/cli/provider_test.go | 95 ++++++++++++++++++++++++++
test/dependencies/go.mod | 5 +-
test/dependencies/go.sum | 10 ++-
14 files changed, 343 insertions(+), 114 deletions(-)
create mode 100644 core/commands/provide.go
diff --git a/core/commands/commands_test.go b/core/commands/commands_test.go
index d8b4c4083..f12fbe40b 100644
--- a/core/commands/commands_test.go
+++ b/core/commands/commands_test.go
@@ -163,6 +163,8 @@ func TestCommands(t *testing.T) {
"/pin/update",
"/pin/verify",
"/ping",
+ "/provide",
+ "/provide/clear",
"/pubsub",
"/pubsub/ls",
"/pubsub/peers",
diff --git a/core/commands/provide.go b/core/commands/provide.go
new file mode 100644
index 000000000..97d4d8c94
--- /dev/null
+++ b/core/commands/provide.go
@@ -0,0 +1,82 @@
+package commands
+
+import (
+ "fmt"
+ "io"
+
+ cmds "github.com/ipfs/go-ipfs-cmds"
+ cmdenv "github.com/ipfs/kubo/core/commands/cmdenv"
+)
+
+const (
+ provideQuietOptionName = "quiet"
+)
+
+var ProvideCmd = &cmds.Command{
+ Status: cmds.Experimental,
+ Helptext: cmds.HelpText{
+ Tagline: "Control providing operations",
+ ShortDescription: `
+Control providing operations.
+
+NOTE: This command is experimental and not all provide-related commands have
+been migrated to this namespace yet. For example, 'ipfs routing
+provide|reprovide' are still under the routing namespace, 'ipfs stats
+reprovide' provides statistics. Additionally, 'ipfs bitswap reprovide' and
+'ipfs stats provide' are deprecated.
+`,
+ },
+
+ Subcommands: map[string]*cmds.Command{
+ "clear": ProvideClearCmd,
+ },
+}
+
+var ProvideClearCmd = &cmds.Command{
+ Status: cmds.Experimental,
+ Helptext: cmds.HelpText{
+ Tagline: "Clear all CIDs from the provide queue.",
+ ShortDescription: `
+Clear all CIDs from the reprovide queue.
+
+Note: Kubo will automatically clear the queue when it detects a change of
+Reprovider.Strategy upon a restart. For more information about reprovider
+strategies, see:
+https://github.com/ipfs/kubo/blob/master/docs/config.md#reproviderstrategy
+`,
+ },
+ Options: []cmds.Option{
+ cmds.BoolOption(provideQuietOptionName, "q", "Do not write output."),
+ },
+ Run: func(req *cmds.Request, re cmds.ResponseEmitter, env cmds.Environment) error {
+ n, err := cmdenv.GetNode(env)
+ if err != nil {
+ return err
+ }
+
+ quiet, _ := req.Options[provideQuietOptionName].(bool)
+ if n.Provider == nil {
+ return nil
+ }
+
+ cleared := n.Provider.Clear()
+ if quiet {
+ return nil
+ }
+ _ = re.Emit(cleared)
+
+ return nil
+ },
+ Type: int(0),
+ Encoders: cmds.EncoderMap{
+ cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, cleared int) error {
+ quiet, _ := req.Options[provideQuietOptionName].(bool)
+ if quiet {
+ return nil
+ }
+
+ _, err := fmt.Fprintf(w, "removed %d items from provide queue\n", cleared)
+ return err
+ }),
+ },
+}
diff --git a/core/commands/root.go b/core/commands/root.go
index 80c2309df..d70a49376 100644
--- a/core/commands/root.go
+++ b/core/commands/root.go
@@ -65,6 +65,7 @@ ADVANCED COMMANDS
p2p Libp2p stream mounting (experimental)
filestore Manage the filestore (experimental)
mount Mount an IPFS read-only mount point (experimental)
+ provide Control providing operations
NETWORK COMMANDS
id Show info about IPFS peers
@@ -133,6 +134,7 @@ var rootSubcommands = map[string]*cmds.Command{
"files": FilesCmd,
"filestore": FileStoreCmd,
"get": GetCmd,
+ "provide": ProvideCmd,
"pubsub": PubsubCmd,
"repo": RepoCmd,
"stats": StatsCmd,
diff --git a/core/node/provider.go b/core/node/provider.go
index 79fed2a4f..d1237da97 100644
--- a/core/node/provider.go
+++ b/core/node/provider.go
@@ -2,6 +2,7 @@ package node
import (
"context"
+ "errors"
"fmt"
"time"
@@ -11,6 +12,7 @@ import (
pin "github.com/ipfs/boxo/pinning/pinner"
provider "github.com/ipfs/boxo/provider"
"github.com/ipfs/go-cid"
+ "github.com/ipfs/go-datastore"
"github.com/ipfs/kubo/repo"
irouting "github.com/ipfs/kubo/routing"
"go.uber.org/fx"
@@ -21,7 +23,10 @@ import (
// and in 'ipfs stats provide' report.
const sampledBatchSize = 1000
-func ProviderSys(reprovideInterval time.Duration, acceleratedDHTClient bool, provideWorkerCount int) fx.Option {
+// Datastore key used to store previous reprovide strategy.
+const reprovideStrategyKey = "/reprovideStrategy"
+
+func ProviderSys(reprovideInterval time.Duration, acceleratedDHTClient bool, provideWorkerCount int, reprovideStrategy string) fx.Option {
return fx.Provide(func(lc fx.Lifecycle, cr irouting.ProvideManyRouter, keyProvider provider.KeyChanFunc, repo repo.Repo, bs blockstore.Blockstore) (provider.System, error) {
opts := []provider.Option{
provider.Online(cr),
@@ -114,10 +119,35 @@ https://github.com/ipfs/kubo/blob/master/docs/config.md#routingaccelerateddhtcli
return false
}, sampledBatchSize))
}
- sys, err := provider.New(repo.Datastore(), opts...)
+
+ var strategyChanged bool
+ ctx := context.Background()
+ ds := repo.Datastore()
+ strategyKey := datastore.NewKey(reprovideStrategyKey)
+
+ prev, err := ds.Get(ctx, strategyKey)
+ if err != nil && !errors.Is(err, datastore.ErrNotFound) {
+ logger.Error("cannot read previous reprovide strategy", "err", err)
+ } else if string(prev) != reprovideStrategy {
+ strategyChanged = true
+ }
+
+ sys, err := provider.New(ds, opts...)
if err != nil {
return nil, err
}
+ if strategyChanged {
+ logger.Infow("Reprovider.Strategy changed, clearing provide queue", "previous", string(prev), "current", reprovideStrategy)
+ sys.Clear()
+ if reprovideStrategy == "" {
+ err = ds.Delete(ctx, strategyKey)
+ } else {
+ err = ds.Put(ctx, strategyKey, []byte(reprovideStrategy))
+ }
+ if err != nil {
+ logger.Error("cannot update reprovide strategy", "err", err)
+ }
+ }
lc.Append(fx.Hook{
OnStop: func(ctx context.Context) error {
@@ -147,7 +177,7 @@ func OnlineProviders(provide bool, reprovideStrategy string, reprovideInterval t
return fx.Options(
keyProvider,
- ProviderSys(reprovideInterval, acceleratedDHTClient, provideWorkerCount),
+ ProviderSys(reprovideInterval, acceleratedDHTClient, provideWorkerCount, reprovideStrategy),
)
}
diff --git a/docs/changelogs/v0.36.md b/docs/changelogs/v0.36.md
index 5c078e330..0bf39522c 100644
--- a/docs/changelogs/v0.36.md
+++ b/docs/changelogs/v0.36.md
@@ -215,7 +215,7 @@ The `ipfs config edit` command did not correctly handle the `EDITOR` environment
- chore: update to boxo merkledag package
- feat: car debug handles the zero length block ([ipld/go-car#569](https://github.com/ipld/go-car/pull/569))
- chore(deps): bump github.com/rogpeppe/go-internal from 1.13.1 to 1.14.1 in /cmd ([ipld/go-car#566](https://github.com/ipld/go-car/pull/566))
- - Add a concatination cli utility ([ipld/go-car#565](https://github.com/ipld/go-car/pull/565))
+ - Add a concatenation cli utility ([ipld/go-car#565](https://github.com/ipld/go-car/pull/565))
- github.com/ipld/go-codec-dagpb (v1.6.0 -> v1.7.0):
- chore: v1.7.0 bump
- github.com/libp2p/go-flow-metrics (v0.2.0 -> v0.3.0):
diff --git a/docs/changelogs/v0.37.md b/docs/changelogs/v0.37.md
index 1a78a9505..f34d5cd6f 100644
--- a/docs/changelogs/v0.37.md
+++ b/docs/changelogs/v0.37.md
@@ -10,7 +10,8 @@ This release was brought to you by the [Interplanetary Shipyard](https://ipship
- [Overview](#overview)
- [๐ฆ Highlights](#-highlights)
- - [๐ฆ๏ธ Important dependency updates](#-important-dependency-updates)
+ - [Clear provide queue when reprovide strategy changes](#clear-provide-queue-when-reprovide-strategy-changes)
+- [๐ฆ๏ธ Important dependency updates](#-important-dependency-updates)
- [๐ Changelog](#-changelog)
- [๐จโ๐ฉโ๐งโ๐ฆ Contributors](#-contributors)
@@ -18,8 +19,21 @@ This release was brought to you by the [Interplanetary Shipyard](https://ipship
### ๐ฆ Highlights
+#### Clear provide queue when reprovide strategy changes
+
+Your content sharing strategy changes now take effect cleanly, without interference from previously queued items.
+
+When you change [`Reprovider.Strategy`](https://github.com/ipfs/kubo/blob/master/docs/config.md#reproviderstrategy) and restart Kubo, the provide queue is automatically cleared. This ensures only content matching your new strategy will be announced to the network.
+
+A new `ipfs provide clear` command also allows manual queue clearing for debugging purposes.
+
+> [!NOTE]
+> Upgrading to Kubo 0.37 will automatically clear any preexisting provide queue. The next time `Reprovider.Interval` hits, `Reprovider.Strategy` will be executed on a clean slate, ensuring consistent behavior with your current configuration.
+
#### ๐ฆ๏ธ Important dependency updates
+- update `boxo` to [v0.34.0](https://github.com/ipfs/boxo/releases/tag/v0.34.0)
+
### ๐ Changelog
### ๐จโ๐ฉโ๐งโ๐ฆ Contributors
diff --git a/docs/config.md b/docs/config.md
index 732899573..6b9ad4c13 100644
--- a/docs/config.md
+++ b/docs/config.md
@@ -1839,10 +1839,13 @@ Tells reprovider what should be announced. Valid strategies are:
- Order: first `pinned` and then the locally available part of `mfs`.
- `"flat"` - same as `all`, announce all CIDs of stored blocks, but without prioritizing anything.
-> [!IMPORTANT]
-> Reproviding larger pinsets using the `all`, `mfs`, `pinned`, `pinned+mfs` or `roots` strategies requires additional memory, with an estimated ~1 GiB of RAM per 20 million items for reproviding to the Amino DHT.
-> This is due to the use of a buffered provider, which avoids holding a lock on the entire pinset during the reprovide cycle.
-> The `flat` strategy can be used to lower memory requirements, but only recommended if memory utilization is too high, prioritization of pins is not necessary, and it is acceptable to announce every block cached in the local repository.
+**Strategy changes automatically clear the provide queue.** When you change `Reprovider.Strategy` and restart Kubo, the provide queue is automatically cleared to ensure only content matching your new strategy is announced. You can also manually clear the queue using `ipfs provide clear`.
+
+**Memory requirements:**
+
+- Reproviding larger pinsets using the `all`, `mfs`, `pinned`, `pinned+mfs` or `roots` strategies requires additional memory, with an estimated ~1 GiB of RAM per 20 million items for reproviding to the Amino DHT.
+- This is due to the use of a buffered provider, which avoids holding a lock on the entire pinset during the reprovide cycle.
+- The `flat` strategy can be used to lower memory requirements, but only recommended if memory utilization is too high, prioritization of pins is not necessary, and it is acceptable to announce every block cached in the local repository.
Default: `"all"`
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index 47fd48238..c9b695d99 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -7,7 +7,7 @@ go 1.24
replace github.com/ipfs/kubo => ./../../..
require (
- github.com/ipfs/boxo v0.33.0
+ github.com/ipfs/boxo v0.33.1-0.20250710085426-6cfa79448bb1
github.com/ipfs/kubo v0.0.0-00010101000000-000000000000
github.com/libp2p/go-libp2p v0.42.0
github.com/multiformats/go-multiaddr v0.16.0
@@ -26,6 +26,7 @@ require (
github.com/caddyserver/certmagic v0.23.0 // indirect
github.com/caddyserver/zerossl v0.1.3 // indirect
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
+ github.com/cenkalti/backoff/v5 v5.0.2 // indirect
github.com/ceramicnetwork/go-dag-jose v0.1.1 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/cockroachdb/crlib v0.0.0-20241015224233-894974b3ad94 // indirect
@@ -49,7 +50,7 @@ require (
github.com/flynn/noise v1.1.0 // indirect
github.com/francoispqt/gojay v1.2.13 // indirect
github.com/fsnotify/fsnotify v1.7.0 // indirect
- github.com/gabriel-vasile/mimetype v1.4.6 // indirect
+ github.com/gabriel-vasile/mimetype v1.4.9 // indirect
github.com/gammazero/chanqueue v1.1.0 // indirect
github.com/gammazero/deque v1.0.0 // indirect
github.com/getsentry/sentry-go v0.27.0 // indirect
@@ -65,7 +66,7 @@ require (
github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/gorilla/websocket v1.5.3 // indirect
- github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect
+ github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 // indirect
github.com/hashicorp/golang-lru v1.0.2 // indirect
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
github.com/huin/goupnp v1.3.0 // indirect
@@ -128,7 +129,7 @@ require (
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mholt/acmez/v3 v3.1.2 // indirect
- github.com/miekg/dns v1.1.66 // indirect
+ github.com/miekg/dns v1.1.67 // indirect
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect
github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect
github.com/minio/sha256-simd v1.0.1 // indirect
@@ -177,7 +178,6 @@ require (
github.com/quic-go/quic-go v0.52.0 // indirect
github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 // indirect
github.com/rogpeppe/go-internal v1.13.1 // indirect
- github.com/samber/lo v1.47.0 // indirect
github.com/spaolacci/murmur3 v1.1.0 // indirect
github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect
github.com/ucarion/urlpath v0.0.0-20200424170820-7ccc79b76bbb // indirect
@@ -191,17 +191,17 @@ require (
github.com/zeebo/blake3 v0.2.4 // indirect
go.opencensus.io v0.24.0 // indirect
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
- go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect
+ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 // indirect
go.opentelemetry.io/otel v1.37.0 // indirect
- go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 // indirect
- go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 // indirect
- go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 // indirect
- go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 // indirect
- go.opentelemetry.io/otel/exporters/zipkin v1.31.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.37.0 // indirect
+ go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.37.0 // indirect
+ go.opentelemetry.io/otel/exporters/zipkin v1.37.0 // indirect
go.opentelemetry.io/otel/metric v1.37.0 // indirect
- go.opentelemetry.io/otel/sdk v1.31.0 // indirect
+ go.opentelemetry.io/otel/sdk v1.37.0 // indirect
go.opentelemetry.io/otel/trace v1.37.0 // indirect
- go.opentelemetry.io/proto/otlp v1.3.1 // indirect
+ go.opentelemetry.io/proto/otlp v1.7.0 // indirect
go.uber.org/automaxprocs v1.6.0 // indirect
go.uber.org/dig v1.19.0 // indirect
go.uber.org/fx v1.24.0 // indirect
@@ -221,9 +221,9 @@ require (
golang.org/x/tools v0.34.0 // indirect
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
gonum.org/v1/gonum v0.16.0 // indirect
- google.golang.org/genproto/googleapis/api v0.0.0-20241007155032-5fefd90f89a9 // indirect
- google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 // indirect
- google.golang.org/grpc v1.67.1 // indirect
+ google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 // indirect
+ google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 // indirect
+ google.golang.org/grpc v1.73.0 // indirect
google.golang.org/protobuf v1.36.6 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
lukechampine.com/blake3 v1.4.1 // indirect
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index 8ebaa1fad..fa0462bf5 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -67,6 +67,8 @@ github.com/caddyserver/zerossl v0.1.3 h1:onS+pxp3M8HnHpN5MMbOMyNjmTheJyWRaZYwn+Y
github.com/caddyserver/zerossl v0.1.3/go.mod h1:CxA0acn7oEGO6//4rtrRjYgEoa4MFw/XofZnrYwGqG4=
github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
+github.com/cenkalti/backoff/v5 v5.0.2 h1:rIfFVxEf1QsI7E1ZHfp/B4DF/6QBAUhmgkxc0H7Zss8=
+github.com/cenkalti/backoff/v5 v5.0.2/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/ceramicnetwork/go-dag-jose v0.1.1 h1:7pObs22egc14vSS3AfCFfS1VmaL4lQUsAK7OGC3PlKk=
github.com/ceramicnetwork/go-dag-jose v0.1.1/go.mod h1:8ptnYwY2Z2y/s5oJnNBn/UCxLg6CpramNJ2ZXF/5aNY=
@@ -157,8 +159,8 @@ github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4
github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
-github.com/gabriel-vasile/mimetype v1.4.6 h1:3+PzJTKLkvgjeTbts6msPJt4DixhT4YtFNf1gtGe3zc=
-github.com/gabriel-vasile/mimetype v1.4.6/go.mod h1:JX1qVKqZd40hUPpAfiNTe0Sne7hdfKSbOqqmkq8GCXc=
+github.com/gabriel-vasile/mimetype v1.4.9 h1:5k+WDwEsD9eTLL8Tz3L0VnmVh9QxGjRmjBvAG7U/oYY=
+github.com/gabriel-vasile/mimetype v1.4.9/go.mod h1:WnSQhFKJuBlRyLiKohA/2DtIlPFAbguNaG7QCHcyGok=
github.com/gammazero/chanqueue v1.1.0 h1:yiwtloc1azhgGLFo2gMloJtQvkYD936Ai7tBfa+rYJw=
github.com/gammazero/chanqueue v1.1.0/go.mod h1:fMwpwEiuUgpab0sH4VHiVcEoji1pSi+EIzeG4TPeKPc=
github.com/gammazero/deque v1.0.0 h1:LTmimT8H7bXkkCy6gZX7zNLtkbz4NdS2z8LZuor3j34=
@@ -266,8 +268,8 @@ github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aN
github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 h1:X5VWvz21y3gzm9Nw/kaUeku/1+uBhcekkmy4IkffJww=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1/go.mod h1:Zanoh4+gvIgluNqcfMVTJueD4wSS5hT7zTt4Mrutd90=
github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU=
github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48=
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
@@ -289,8 +291,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcd
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.33.0 h1:9ow3chwkDzMj0Deq4AWRUEI7WnIIV7SZhPTzzG2mmfw=
-github.com/ipfs/boxo v0.33.0/go.mod h1:3IPh7YFcCIcKp6o02mCHovrPntoT5Pctj/7j4syh/RM=
+github.com/ipfs/boxo v0.33.1-0.20250710085426-6cfa79448bb1 h1:ZzGKxEqait8lqsEiZ7/esJKELW1/+/Y8swpRgjOZHK0=
+github.com/ipfs/boxo v0.33.1-0.20250710085426-6cfa79448bb1/go.mod h1:Cvy+GW4Noex2jaoTsOM+RYQdXhjNAk09s313vkOyYmA=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk=
@@ -479,8 +481,8 @@ github.com/mholt/acmez/v3 v3.1.2 h1:auob8J/0FhmdClQicvJvuDavgd5ezwLBfKuYmynhYzc=
github.com/mholt/acmez/v3 v3.1.2/go.mod h1:L1wOU06KKvq7tswuMDwKdcHeKpFFgkppZy/y0DFxagQ=
github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4=
github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4=
-github.com/miekg/dns v1.1.66 h1:FeZXOS3VCVsKnEAd+wBkjMC3D2K+ww66Cq3VnCINuJE=
-github.com/miekg/dns v1.1.66/go.mod h1:jGFzBsSNbJw6z1HYut1RKBKHA9PBdxeHrZG8J+gC2WE=
+github.com/miekg/dns v1.1.67 h1:kg0EHj0G4bfT5/oOys6HhZw4vmMlnoZ+gDu8tJ/AlI0=
+github.com/miekg/dns v1.1.67/go.mod h1:fujopn7TB3Pu3JM69XaawiU0wqjpL9/8xGop5UrTPps=
github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8=
github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms=
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc=
@@ -656,8 +658,6 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0+uJM6H+SuU8sEs5K5IQeKccPqeSjfgcKGgPk=
-github.com/samber/lo v1.47.0 h1:z7RynLwP5nbyRscyvcD043DWYoOcYRv3mV8lBeqOCLc=
-github.com/samber/lo v1.47.0/go.mod h1:RmDH9Ct32Qy3gduHQuKJ3gW1fMHAnE/fAzQuf6He5cU=
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY=
github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM=
@@ -779,28 +779,30 @@ go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 h1:Hf9xI/XLML9ElpiHVDNwvqI0hIFlzV8dgIr35kV1kRU=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0/go.mod h1:NfchwuyNoMcZ5MLHwPrODwUF1HWCXWrL31s8gSAdIKY=
go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ=
go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 h1:K0XaT3DwHAcV4nKLzcQvwAgSyisUghWoY20I7huthMk=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0/go.mod h1:B5Ki776z/MBnVha1Nzwp5arlzBbE3+1jk+pGmaP5HME=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 h1:FFeLy03iVTXP6ffeN2iXrxfGsZGCjVx0/4KlizjyBwU=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0/go.mod h1:TMu73/k1CP8nBUpDLc71Wj/Kf7ZS9FK5b53VapRsP9o=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 h1:lUsI2TYsQw2r1IASwoROaCnjdj2cvC2+Jbxvk6nHnWU=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0/go.mod h1:2HpZxxQurfGxJlJDblybejHB6RX6pmExPNe517hREw4=
-go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 h1:UGZ1QwZWY67Z6BmckTU+9Rxn04m2bD3gD6Mk0OIOCPk=
-go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0/go.mod h1:fcwWuDuaObkkChiDlhEpSq9+X1C0omv+s5mBtToAQ64=
-go.opentelemetry.io/otel/exporters/zipkin v1.31.0 h1:CgucL0tj3717DJnni7HVVB2wExzi8c2zJNEA2BhLMvI=
-go.opentelemetry.io/otel/exporters/zipkin v1.31.0/go.mod h1:rfzOVNiSwIcWtEC2J8epwG26fiaXlYvLySJ7bwsrtAE=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0 h1:Ahq7pZmv87yiyn3jeFz/LekZmPLLdKejuO3NcK9MssM=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0/go.mod h1:MJTqhM0im3mRLw1i8uGHnCvUEeS7VwRyxlLC78PA18M=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0 h1:EtFWSnwW9hGObjkIdmlnWSydO+Qs8OwzfzXLUPg4xOc=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0/go.mod h1:QjUEoiGCPkvFZ/MjK6ZZfNOS6mfVEVKYE99dFhuN2LI=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.37.0 h1:bDMKF3RUSxshZ5OjOTi8rsHGaPKsAt76FaqgvIUySLc=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.37.0/go.mod h1:dDT67G/IkA46Mr2l9Uj7HsQVwsjASyV9SjGofsiUZDA=
+go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.37.0 h1:SNhVp/9q4Go/XHBkQ1/d5u9P/U+L1yaGPoi0x+mStaI=
+go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.37.0/go.mod h1:tx8OOlGH6R4kLV67YaYO44GFXloEjGPZuMjEkaaqIp4=
+go.opentelemetry.io/otel/exporters/zipkin v1.37.0 h1:Z2apuaRnHEjzDAkpbWNPiksz1R0/FCIrJSjiMA43zwI=
+go.opentelemetry.io/otel/exporters/zipkin v1.37.0/go.mod h1:ofGu/7fG+bpmjZoiPUUmYDJ4vXWxMT57HmGoegx49uw=
go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE=
go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E=
-go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk=
-go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0=
+go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI=
+go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg=
+go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc=
+go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps=
go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4=
go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0=
-go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0=
-go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8=
+go.opentelemetry.io/proto/otlp v1.7.0 h1:jX1VolD6nHuFzOYso2E73H85i92Mv8JQYk0K9vz09os=
+go.opentelemetry.io/proto/otlp v1.7.0/go.mod h1:fSKjH6YJ7HDlwzltzyMj036AJ3ejJLCgCSHGj4efDDo=
go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
@@ -1091,10 +1093,10 @@ google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvx
google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
-google.golang.org/genproto/googleapis/api v0.0.0-20241007155032-5fefd90f89a9 h1:T6rh4haD3GVYsgEfWExoCZA2o2FmbNyKpTuAxbEFPTg=
-google.golang.org/genproto/googleapis/api v0.0.0-20241007155032-5fefd90f89a9/go.mod h1:wp2WsuBYj6j8wUdo3ToZsdxxixbvQNAHqVJrTgi5E5M=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 h1:QCqS/PdaHTSWGvupk2F/ehwHtGc0/GYkT+3GAcR1CCc=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI=
+google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 h1:oWVWY3NzT7KJppx2UKhKmzPq4SRe0LdCijVRwvGeikY=
+google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822/go.mod h1:h3c4v36UTKzUiuaOKQ6gr3S+0hovBtUrXzTG/i3+XEc=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 h1:fc6jSaCT0vBduLYZHYrBBNY4dsWuvgyff9noRNDdBeE=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio=
google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
@@ -1107,8 +1109,8 @@ google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
-google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E=
-google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA=
+google.golang.org/grpc v1.73.0 h1:VIWSmpI2MegBtTuFt5/JWy2oXxtjJ/e89Z70ImfD2ok=
+google.golang.org/grpc v1.73.0/go.mod h1:50sbHOUqWoCQGI8V2HQLJM0B+LMlIUjNSZmow7EVBQc=
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
diff --git a/go.mod b/go.mod
index b50b82690..f150e066f 100644
--- a/go.mod
+++ b/go.mod
@@ -22,7 +22,7 @@ require (
github.com/hashicorp/go-version v1.7.0
github.com/ipfs-shipyard/nopfs v0.0.14
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0
- github.com/ipfs/boxo v0.33.0
+ github.com/ipfs/boxo v0.33.1-0.20250710085426-6cfa79448bb1
github.com/ipfs/go-block-format v0.2.2
github.com/ipfs/go-cid v0.5.0
github.com/ipfs/go-cidutil v0.1.0
@@ -77,10 +77,10 @@ require (
github.com/whyrusleeping/go-sysinfo v0.0.0-20190219211824-4a357d4b90b1
github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7
go.opencensus.io v0.24.0
- go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0
+ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0
go.opentelemetry.io/contrib/propagators/autoprop v0.46.1
go.opentelemetry.io/otel v1.37.0
- go.opentelemetry.io/otel/sdk v1.31.0
+ go.opentelemetry.io/otel/sdk v1.37.0
go.opentelemetry.io/otel/trace v1.37.0
go.uber.org/dig v1.19.0
go.uber.org/fx v1.24.0
@@ -103,6 +103,7 @@ require (
github.com/benbjohnson/clock v1.3.5 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/caddyserver/zerossl v0.1.3 // indirect
+ github.com/cenkalti/backoff/v5 v5.0.2 // indirect
github.com/cespare/xxhash v1.1.0 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/cockroachdb/crlib v0.0.0-20241015224233-894974b3ad94 // indirect
@@ -124,7 +125,7 @@ require (
github.com/felixge/httpsnoop v1.0.4 // indirect
github.com/flynn/noise v1.1.0 // indirect
github.com/francoispqt/gojay v1.2.13 // indirect
- github.com/gabriel-vasile/mimetype v1.4.6 // indirect
+ github.com/gabriel-vasile/mimetype v1.4.9 // indirect
github.com/gammazero/chanqueue v1.1.0 // indirect
github.com/gammazero/deque v1.0.0 // indirect
github.com/getsentry/sentry-go v0.27.0 // indirect
@@ -142,7 +143,7 @@ require (
github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a // indirect
github.com/gorilla/mux v1.8.1 // indirect
github.com/gorilla/websocket v1.5.3 // indirect
- github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect
+ github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 // indirect
github.com/hashicorp/golang-lru v1.0.2 // indirect
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
github.com/huin/goupnp v1.3.0 // indirect
@@ -177,7 +178,7 @@ require (
github.com/mattn/go-runewidth v0.0.15 // indirect
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect
github.com/mholt/acmez/v3 v3.1.2 // indirect
- github.com/miekg/dns v1.1.66 // indirect
+ github.com/miekg/dns v1.1.67 // indirect
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect
github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect
github.com/minio/sha256-simd v1.0.1 // indirect
@@ -223,7 +224,6 @@ require (
github.com/rivo/uniseg v0.4.4 // indirect
github.com/rogpeppe/go-internal v1.13.1 // indirect
github.com/rs/cors v1.11.1 // indirect
- github.com/samber/lo v1.47.0 // indirect
github.com/slok/go-http-metrics v0.13.0 // indirect
github.com/spaolacci/murmur3 v1.1.0 // indirect
github.com/texttheater/golang-levenshtein v1.0.1 // indirect
@@ -242,13 +242,13 @@ require (
go.opentelemetry.io/contrib/propagators/b3 v1.21.1 // indirect
go.opentelemetry.io/contrib/propagators/jaeger v1.21.1 // indirect
go.opentelemetry.io/contrib/propagators/ot v1.21.1 // indirect
- go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 // indirect
- go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 // indirect
- go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 // indirect
- go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 // indirect
- go.opentelemetry.io/otel/exporters/zipkin v1.31.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.37.0 // indirect
+ go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.37.0 // indirect
+ go.opentelemetry.io/otel/exporters/zipkin v1.37.0 // indirect
go.opentelemetry.io/otel/metric v1.37.0 // indirect
- go.opentelemetry.io/proto/otlp v1.3.1 // indirect
+ go.opentelemetry.io/proto/otlp v1.7.0 // indirect
go.uber.org/automaxprocs v1.6.0 // indirect
go.uber.org/mock v0.5.2 // indirect
go.uber.org/zap/exp v0.3.0 // indirect
@@ -261,9 +261,9 @@ require (
golang.org/x/tools v0.34.0 // indirect
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
gonum.org/v1/gonum v0.16.0 // indirect
- google.golang.org/genproto/googleapis/api v0.0.0-20241007155032-5fefd90f89a9 // indirect
- google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 // indirect
- google.golang.org/grpc v1.67.1 // indirect
+ google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 // indirect
+ google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 // indirect
+ google.golang.org/grpc v1.73.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
lukechampine.com/blake3 v1.4.1 // indirect
diff --git a/go.sum b/go.sum
index de2844ca1..d88a92c76 100644
--- a/go.sum
+++ b/go.sum
@@ -94,6 +94,8 @@ github.com/caddyserver/zerossl v0.1.3 h1:onS+pxp3M8HnHpN5MMbOMyNjmTheJyWRaZYwn+Y
github.com/caddyserver/zerossl v0.1.3/go.mod h1:CxA0acn7oEGO6//4rtrRjYgEoa4MFw/XofZnrYwGqG4=
github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
+github.com/cenkalti/backoff/v5 v5.0.2 h1:rIfFVxEf1QsI7E1ZHfp/B4DF/6QBAUhmgkxc0H7Zss8=
+github.com/cenkalti/backoff/v5 v5.0.2/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/ceramicnetwork/go-dag-jose v0.1.1 h1:7pObs22egc14vSS3AfCFfS1VmaL4lQUsAK7OGC3PlKk=
github.com/ceramicnetwork/go-dag-jose v0.1.1/go.mod h1:8ptnYwY2Z2y/s5oJnNBn/UCxLg6CpramNJ2ZXF/5aNY=
@@ -195,8 +197,8 @@ github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4
github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
-github.com/gabriel-vasile/mimetype v1.4.6 h1:3+PzJTKLkvgjeTbts6msPJt4DixhT4YtFNf1gtGe3zc=
-github.com/gabriel-vasile/mimetype v1.4.6/go.mod h1:JX1qVKqZd40hUPpAfiNTe0Sne7hdfKSbOqqmkq8GCXc=
+github.com/gabriel-vasile/mimetype v1.4.9 h1:5k+WDwEsD9eTLL8Tz3L0VnmVh9QxGjRmjBvAG7U/oYY=
+github.com/gabriel-vasile/mimetype v1.4.9/go.mod h1:WnSQhFKJuBlRyLiKohA/2DtIlPFAbguNaG7QCHcyGok=
github.com/gammazero/chanqueue v1.1.0 h1:yiwtloc1azhgGLFo2gMloJtQvkYD936Ai7tBfa+rYJw=
github.com/gammazero/chanqueue v1.1.0/go.mod h1:fMwpwEiuUgpab0sH4VHiVcEoji1pSi+EIzeG4TPeKPc=
github.com/gammazero/deque v1.0.0 h1:LTmimT8H7bXkkCy6gZX7zNLtkbz4NdS2z8LZuor3j34=
@@ -331,8 +333,8 @@ github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aN
github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 h1:X5VWvz21y3gzm9Nw/kaUeku/1+uBhcekkmy4IkffJww=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1/go.mod h1:Zanoh4+gvIgluNqcfMVTJueD4wSS5hT7zTt4Mrutd90=
github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU=
github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48=
github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY=
@@ -356,8 +358,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcd
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.33.0 h1:9ow3chwkDzMj0Deq4AWRUEI7WnIIV7SZhPTzzG2mmfw=
-github.com/ipfs/boxo v0.33.0/go.mod h1:3IPh7YFcCIcKp6o02mCHovrPntoT5Pctj/7j4syh/RM=
+github.com/ipfs/boxo v0.33.1-0.20250710085426-6cfa79448bb1 h1:ZzGKxEqait8lqsEiZ7/esJKELW1/+/Y8swpRgjOZHK0=
+github.com/ipfs/boxo v0.33.1-0.20250710085426-6cfa79448bb1/go.mod h1:Cvy+GW4Noex2jaoTsOM+RYQdXhjNAk09s313vkOyYmA=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk=
@@ -578,8 +580,8 @@ github.com/mholt/acmez/v3 v3.1.2 h1:auob8J/0FhmdClQicvJvuDavgd5ezwLBfKuYmynhYzc=
github.com/mholt/acmez/v3 v3.1.2/go.mod h1:L1wOU06KKvq7tswuMDwKdcHeKpFFgkppZy/y0DFxagQ=
github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4=
github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4=
-github.com/miekg/dns v1.1.66 h1:FeZXOS3VCVsKnEAd+wBkjMC3D2K+ww66Cq3VnCINuJE=
-github.com/miekg/dns v1.1.66/go.mod h1:jGFzBsSNbJw6z1HYut1RKBKHA9PBdxeHrZG8J+gC2WE=
+github.com/miekg/dns v1.1.67 h1:kg0EHj0G4bfT5/oOys6HhZw4vmMlnoZ+gDu8tJ/AlI0=
+github.com/miekg/dns v1.1.67/go.mod h1:fujopn7TB3Pu3JM69XaawiU0wqjpL9/8xGop5UrTPps=
github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8=
github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms=
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc=
@@ -790,8 +792,6 @@ github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0+uJM6H+SuU8sEs5K5IQeKccPqeSjfgcKGgPk=
-github.com/samber/lo v1.47.0 h1:z7RynLwP5nbyRscyvcD043DWYoOcYRv3mV8lBeqOCLc=
-github.com/samber/lo v1.47.0/go.mod h1:RmDH9Ct32Qy3gduHQuKJ3gW1fMHAnE/fAzQuf6He5cU=
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY=
github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM=
@@ -935,8 +935,8 @@ go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 h1:Hf9xI/XLML9ElpiHVDNwvqI0hIFlzV8dgIr35kV1kRU=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0/go.mod h1:NfchwuyNoMcZ5MLHwPrODwUF1HWCXWrL31s8gSAdIKY=
go.opentelemetry.io/contrib/propagators/autoprop v0.46.1 h1:cXTYcMjY0dsYokAuo8LbNBQxpF8VgTHdiHJJ1zlIXl4=
go.opentelemetry.io/contrib/propagators/autoprop v0.46.1/go.mod h1:WZxgny1/6+j67B1s72PLJ4bGjidoWFzSmLNfJKVt2bo=
go.opentelemetry.io/contrib/propagators/aws v1.21.1 h1:uQIQIDWb0gzyvon2ICnghpLAf9w7ADOCUiIiwCQgR2o=
@@ -949,24 +949,26 @@ go.opentelemetry.io/contrib/propagators/ot v1.21.1 h1:3TN5vkXjKYWp0YdMcnUEC/A+pB
go.opentelemetry.io/contrib/propagators/ot v1.21.1/go.mod h1:oy0MYCbS/b3cqUDW37wBWtlwBIsutngS++Lklpgh+fc=
go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ=
go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 h1:K0XaT3DwHAcV4nKLzcQvwAgSyisUghWoY20I7huthMk=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0/go.mod h1:B5Ki776z/MBnVha1Nzwp5arlzBbE3+1jk+pGmaP5HME=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 h1:FFeLy03iVTXP6ffeN2iXrxfGsZGCjVx0/4KlizjyBwU=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0/go.mod h1:TMu73/k1CP8nBUpDLc71Wj/Kf7ZS9FK5b53VapRsP9o=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 h1:lUsI2TYsQw2r1IASwoROaCnjdj2cvC2+Jbxvk6nHnWU=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0/go.mod h1:2HpZxxQurfGxJlJDblybejHB6RX6pmExPNe517hREw4=
-go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 h1:UGZ1QwZWY67Z6BmckTU+9Rxn04m2bD3gD6Mk0OIOCPk=
-go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0/go.mod h1:fcwWuDuaObkkChiDlhEpSq9+X1C0omv+s5mBtToAQ64=
-go.opentelemetry.io/otel/exporters/zipkin v1.31.0 h1:CgucL0tj3717DJnni7HVVB2wExzi8c2zJNEA2BhLMvI=
-go.opentelemetry.io/otel/exporters/zipkin v1.31.0/go.mod h1:rfzOVNiSwIcWtEC2J8epwG26fiaXlYvLySJ7bwsrtAE=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0 h1:Ahq7pZmv87yiyn3jeFz/LekZmPLLdKejuO3NcK9MssM=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0/go.mod h1:MJTqhM0im3mRLw1i8uGHnCvUEeS7VwRyxlLC78PA18M=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0 h1:EtFWSnwW9hGObjkIdmlnWSydO+Qs8OwzfzXLUPg4xOc=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0/go.mod h1:QjUEoiGCPkvFZ/MjK6ZZfNOS6mfVEVKYE99dFhuN2LI=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.37.0 h1:bDMKF3RUSxshZ5OjOTi8rsHGaPKsAt76FaqgvIUySLc=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.37.0/go.mod h1:dDT67G/IkA46Mr2l9Uj7HsQVwsjASyV9SjGofsiUZDA=
+go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.37.0 h1:SNhVp/9q4Go/XHBkQ1/d5u9P/U+L1yaGPoi0x+mStaI=
+go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.37.0/go.mod h1:tx8OOlGH6R4kLV67YaYO44GFXloEjGPZuMjEkaaqIp4=
+go.opentelemetry.io/otel/exporters/zipkin v1.37.0 h1:Z2apuaRnHEjzDAkpbWNPiksz1R0/FCIrJSjiMA43zwI=
+go.opentelemetry.io/otel/exporters/zipkin v1.37.0/go.mod h1:ofGu/7fG+bpmjZoiPUUmYDJ4vXWxMT57HmGoegx49uw=
go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE=
go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E=
-go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk=
-go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0=
+go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI=
+go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg=
+go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc=
+go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps=
go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4=
go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0=
-go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0=
-go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8=
+go.opentelemetry.io/proto/otlp v1.7.0 h1:jX1VolD6nHuFzOYso2E73H85i92Mv8JQYk0K9vz09os=
+go.opentelemetry.io/proto/otlp v1.7.0/go.mod h1:fSKjH6YJ7HDlwzltzyMj036AJ3ejJLCgCSHGj4efDDo=
go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
@@ -1348,10 +1350,10 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc
google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto/googleapis/api v0.0.0-20241007155032-5fefd90f89a9 h1:T6rh4haD3GVYsgEfWExoCZA2o2FmbNyKpTuAxbEFPTg=
-google.golang.org/genproto/googleapis/api v0.0.0-20241007155032-5fefd90f89a9/go.mod h1:wp2WsuBYj6j8wUdo3ToZsdxxixbvQNAHqVJrTgi5E5M=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 h1:QCqS/PdaHTSWGvupk2F/ehwHtGc0/GYkT+3GAcR1CCc=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI=
+google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 h1:oWVWY3NzT7KJppx2UKhKmzPq4SRe0LdCijVRwvGeikY=
+google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822/go.mod h1:h3c4v36UTKzUiuaOKQ6gr3S+0hovBtUrXzTG/i3+XEc=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 h1:fc6jSaCT0vBduLYZHYrBBNY4dsWuvgyff9noRNDdBeE=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio=
google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
@@ -1368,8 +1370,8 @@ google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3Iji
google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
-google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E=
-google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA=
+google.golang.org/grpc v1.73.0 h1:VIWSmpI2MegBtTuFt5/JWy2oXxtjJ/e89Z70ImfD2ok=
+google.golang.org/grpc v1.73.0/go.mod h1:50sbHOUqWoCQGI8V2HQLJM0B+LMlIUjNSZmow7EVBQc=
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
diff --git a/test/cli/provider_test.go b/test/cli/provider_test.go
index 7e2bee411..4fd74ef8b 100644
--- a/test/cli/provider_test.go
+++ b/test/cli/provider_test.go
@@ -2,6 +2,7 @@ package cli
import (
"bytes"
+ "encoding/json"
"testing"
"time"
@@ -219,4 +220,98 @@ func TestProvider(t *testing.T) {
expectProviders(t, cidBarDir, nodes[0].PeerID().String(), nodes[1:]...)
})
+ t.Run("provide clear command removes items from provide queue", func(t *testing.T) {
+ t.Parallel()
+
+ nodes := harness.NewT(t).NewNodes(1).Init()
+ nodes.ForEachPar(func(n *harness.Node) {
+ n.SetIPFSConfig("Provider.Enabled", true)
+ n.SetIPFSConfig("Reprovider.Interval", "22h")
+ n.SetIPFSConfig("Reprovider.Strategy", "all")
+ })
+ nodes.StartDaemons()
+ defer nodes.StopDaemons()
+
+ // Clear the provide queue first time - works regardless of queue state
+ res1 := nodes[0].IPFS("provide", "clear")
+ require.NoError(t, res1.Err)
+
+ // Should report cleared items and proper message format
+ assert.Contains(t, res1.Stdout.String(), "removed")
+ assert.Contains(t, res1.Stdout.String(), "items from provide queue")
+
+ // Clear the provide queue second time - should definitely report 0 items
+ res2 := nodes[0].IPFS("provide", "clear")
+ require.NoError(t, res2.Err)
+
+ // Should report 0 items cleared since queue was already cleared
+ assert.Contains(t, res2.Stdout.String(), "removed 0 items from provide queue")
+ })
+
+ t.Run("provide clear command with quiet option", func(t *testing.T) {
+ t.Parallel()
+
+ nodes := harness.NewT(t).NewNodes(1).Init()
+ nodes.ForEachPar(func(n *harness.Node) {
+ n.SetIPFSConfig("Provider.Enabled", true)
+ n.SetIPFSConfig("Reprovider.Interval", "22h")
+ n.SetIPFSConfig("Reprovider.Strategy", "all")
+ })
+ nodes.StartDaemons()
+ defer nodes.StopDaemons()
+
+ // Clear the provide queue with quiet option
+ res := nodes[0].IPFS("provide", "clear", "-q")
+ require.NoError(t, res.Err)
+
+ // Should have no output when quiet
+ assert.Empty(t, res.Stdout.String())
+ })
+
+ t.Run("provide clear command works when provider is disabled", func(t *testing.T) {
+ t.Parallel()
+
+ nodes := harness.NewT(t).NewNodes(1).Init()
+ nodes.ForEachPar(func(n *harness.Node) {
+ n.SetIPFSConfig("Provider.Enabled", false)
+ n.SetIPFSConfig("Reprovider.Interval", "22h")
+ n.SetIPFSConfig("Reprovider.Strategy", "all")
+ })
+ nodes.StartDaemons()
+ defer nodes.StopDaemons()
+
+ // Clear should succeed even when provider is disabled
+ res := nodes[0].IPFS("provide", "clear")
+ require.NoError(t, res.Err)
+ })
+
+ t.Run("provide clear command returns JSON with removed item count", func(t *testing.T) {
+ t.Parallel()
+
+ nodes := harness.NewT(t).NewNodes(1).Init()
+ nodes.ForEachPar(func(n *harness.Node) {
+ n.SetIPFSConfig("Provider.Enabled", true)
+ n.SetIPFSConfig("Reprovider.Interval", "22h")
+ n.SetIPFSConfig("Reprovider.Strategy", "all")
+ })
+ nodes.StartDaemons()
+ defer nodes.StopDaemons()
+
+ // Clear the provide queue with JSON encoding
+ res := nodes[0].IPFS("provide", "clear", "--enc=json")
+ require.NoError(t, res.Err)
+
+ // Should return valid JSON with the number of removed items
+ output := res.Stdout.String()
+ assert.NotEmpty(t, output)
+
+ // Parse JSON to verify structure
+ var result int
+ err := json.Unmarshal([]byte(output), &result)
+ require.NoError(t, err, "Output should be valid JSON")
+
+ // Should be a non-negative integer (0 or positive)
+ assert.GreaterOrEqual(t, result, 0)
+ })
+
}
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index 27a11c854..367cfd049 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -130,7 +130,7 @@ require (
github.com/huin/goupnp v1.3.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/ipfs/bbloom v0.0.4 // indirect
- github.com/ipfs/boxo v0.33.0 // indirect
+ github.com/ipfs/boxo v0.33.1-0.20250710085426-6cfa79448bb1 // indirect
github.com/ipfs/go-bitfield v1.1.0 // indirect
github.com/ipfs/go-block-format v0.2.2 // indirect
github.com/ipfs/go-cid v0.5.0 // indirect
@@ -189,7 +189,7 @@ require (
github.com/mattn/go-shellwords v1.0.12 // indirect
github.com/mgechev/revive v1.3.9 // indirect
github.com/mholt/acmez/v3 v3.1.2 // indirect
- github.com/miekg/dns v1.1.66 // indirect
+ github.com/miekg/dns v1.1.67 // indirect
github.com/minio/sha256-simd v1.0.1 // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
@@ -254,7 +254,6 @@ require (
github.com/ryanrolds/sqlclosecheck v0.5.1 // indirect
github.com/sagikazarmark/locafero v0.6.0 // indirect
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
- github.com/samber/lo v1.47.0 // indirect
github.com/sanposhiho/wastedassign/v2 v2.0.7 // indirect
github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 // indirect
github.com/sashamelentyev/interfacebloat v1.1.0 // indirect
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index f07ad6041..fd6eee283 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -319,8 +319,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.33.0 h1:9ow3chwkDzMj0Deq4AWRUEI7WnIIV7SZhPTzzG2mmfw=
-github.com/ipfs/boxo v0.33.0/go.mod h1:3IPh7YFcCIcKp6o02mCHovrPntoT5Pctj/7j4syh/RM=
+github.com/ipfs/boxo v0.33.1-0.20250710085426-6cfa79448bb1 h1:ZzGKxEqait8lqsEiZ7/esJKELW1/+/Y8swpRgjOZHK0=
+github.com/ipfs/boxo v0.33.1-0.20250710085426-6cfa79448bb1/go.mod h1:Cvy+GW4Noex2jaoTsOM+RYQdXhjNAk09s313vkOyYmA=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-block-format v0.2.2 h1:uecCTgRwDIXyZPgYspaLXoMiMmxQpSx2aq34eNc4YvQ=
@@ -483,8 +483,8 @@ github.com/mgechev/revive v1.3.9/go.mod h1:+uxEIr5UH0TjXWHTno3xh4u7eg6jDpXKzQccA
github.com/mholt/acmez/v3 v3.1.2 h1:auob8J/0FhmdClQicvJvuDavgd5ezwLBfKuYmynhYzc=
github.com/mholt/acmez/v3 v3.1.2/go.mod h1:L1wOU06KKvq7tswuMDwKdcHeKpFFgkppZy/y0DFxagQ=
github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4=
-github.com/miekg/dns v1.1.66 h1:FeZXOS3VCVsKnEAd+wBkjMC3D2K+ww66Cq3VnCINuJE=
-github.com/miekg/dns v1.1.66/go.mod h1:jGFzBsSNbJw6z1HYut1RKBKHA9PBdxeHrZG8J+gC2WE=
+github.com/miekg/dns v1.1.67 h1:kg0EHj0G4bfT5/oOys6HhZw4vmMlnoZ+gDu8tJ/AlI0=
+github.com/miekg/dns v1.1.67/go.mod h1:fujopn7TB3Pu3JM69XaawiU0wqjpL9/8xGop5UrTPps=
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc=
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b/go.mod h1:lxPUiZwKoFL8DUUmalo2yJJUCxbPKtm8OKfqr2/FTNU=
github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc h1:PTfri+PuQmWDqERdnNMiD9ZejrlswWrCpBEZgWOiTrc=
@@ -660,8 +660,6 @@ github.com/sagikazarmark/locafero v0.6.0 h1:ON7AQg37yzcRPU69mt7gwhFEBwxI6P9T4Qu3
github.com/sagikazarmark/locafero v0.6.0/go.mod h1:77OmuIc6VTraTXKXIs/uvUxKGUXjE1GbemJYHqdNjX0=
github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=
github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ=
-github.com/samber/lo v1.47.0 h1:z7RynLwP5nbyRscyvcD043DWYoOcYRv3mV8lBeqOCLc=
-github.com/samber/lo v1.47.0/go.mod h1:RmDH9Ct32Qy3gduHQuKJ3gW1fMHAnE/fAzQuf6He5cU=
github.com/sanposhiho/wastedassign/v2 v2.0.7 h1:J+6nrY4VW+gC9xFzUc+XjPD3g3wF3je/NsJFwFK7Uxc=
github.com/sanposhiho/wastedassign/v2 v2.0.7/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI=
github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 h1:lZUw3E0/J3roVtGQ+SCrUrg3ON6NgVqpn3+iol9aGu4=
From bb58ca4737cc2740901a3d3e4322fe78ebfc7d1c Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Wed, 16 Jul 2025 01:53:42 -0700
Subject: [PATCH 294/499] remove unneeded thirdparty packages (#10871)
* remove unneeded thirdparty packages
Remove unnecessary packages from `thirdparty` in repo.
- Remove `thirdparty/assert` (replaced by `github.com/stretchr/testify/require`)
- Remove `thirdparty/dir` (replacd by `misc/fsutil`)
- Remove `thirdparty/notifier` (unused)
---
cmd/ipfswatch/ipfswatch_test.go | 8 +-
core/corehttp/p2p_proxy_test.go | 17 +-
docs/changelogs/v0.37.md | 9 +
repo/common/common_test.go | 12 +-
repo/fsrepo/fsrepo.go | 3 +-
repo/fsrepo/fsrepo_test.go | 65 +++---
thirdparty/README.md | 5 +-
thirdparty/assert/assert.go | 25 ---
thirdparty/dir/dir.go | 25 ---
thirdparty/notifier/notifier.go | 142 -------------
thirdparty/notifier/notifier_test.go | 289 ---------------------------
11 files changed, 59 insertions(+), 541 deletions(-)
delete mode 100644 thirdparty/assert/assert.go
delete mode 100644 thirdparty/dir/dir.go
delete mode 100644 thirdparty/notifier/notifier.go
delete mode 100644 thirdparty/notifier/notifier_test.go
diff --git a/cmd/ipfswatch/ipfswatch_test.go b/cmd/ipfswatch/ipfswatch_test.go
index 20397afef..75d007521 100644
--- a/cmd/ipfswatch/ipfswatch_test.go
+++ b/cmd/ipfswatch/ipfswatch_test.go
@@ -6,11 +6,11 @@ package main
import (
"testing"
- "github.com/ipfs/kubo/thirdparty/assert"
+ "github.com/stretchr/testify/require"
)
func TestIsHidden(t *testing.T) {
- assert.True(IsHidden("bar/.git"), t, "dirs beginning with . should be recognized as hidden")
- assert.False(IsHidden("."), t, ". for current dir should not be considered hidden")
- assert.False(IsHidden("bar/baz"), t, "normal dirs should not be hidden")
+ require.True(t, IsHidden("bar/.git"), "dirs beginning with . should be recognized as hidden")
+ require.False(t, IsHidden("."), ". for current dir should not be considered hidden")
+ require.False(t, IsHidden("bar/baz"), "normal dirs should not be hidden")
}
diff --git a/core/corehttp/p2p_proxy_test.go b/core/corehttp/p2p_proxy_test.go
index 969bc31e1..e915c0822 100644
--- a/core/corehttp/p2p_proxy_test.go
+++ b/core/corehttp/p2p_proxy_test.go
@@ -5,9 +5,8 @@ import (
"strings"
"testing"
- "github.com/ipfs/kubo/thirdparty/assert"
-
protocol "github.com/libp2p/go-libp2p/core/protocol"
+ "github.com/stretchr/testify/require"
)
type TestCase struct {
@@ -29,12 +28,10 @@ func TestParseRequest(t *testing.T) {
req, _ := http.NewRequest(http.MethodGet, url, strings.NewReader(""))
parsed, err := parseRequest(req)
- if err != nil {
- t.Fatal(err)
- }
- assert.True(parsed.httpPath == tc.path, t, "proxy request path")
- assert.True(parsed.name == protocol.ID(tc.name), t, "proxy request name")
- assert.True(parsed.target == tc.target, t, "proxy request peer-id")
+ require.NoError(t, err)
+ require.Equal(t, tc.path, parsed.httpPath, "proxy request path")
+ require.Equal(t, protocol.ID(tc.name), parsed.name, "proxy request name")
+ require.Equal(t, tc.target, parsed.target, "proxy request peer-id")
}
}
@@ -49,8 +46,6 @@ func TestParseRequestInvalidPath(t *testing.T) {
req, _ := http.NewRequest(http.MethodGet, url, strings.NewReader(""))
_, err := parseRequest(req)
- if err == nil {
- t.Fail()
- }
+ require.Error(t, err)
}
}
diff --git a/docs/changelogs/v0.37.md b/docs/changelogs/v0.37.md
index f34d5cd6f..d4b105e35 100644
--- a/docs/changelogs/v0.37.md
+++ b/docs/changelogs/v0.37.md
@@ -11,6 +11,7 @@ This release was brought to you by the [Interplanetary Shipyard](https://ipship
- [Overview](#overview)
- [๐ฆ Highlights](#-highlights)
- [Clear provide queue when reprovide strategy changes](#clear-provide-queue-when-reprovide-strategy-changes)
+ - [Remove unnecessary packages from thirdparty](#remove-unnecessary-packages-from-thirdparty)
- [๐ฆ๏ธ Important dependency updates](#-important-dependency-updates)
- [๐ Changelog](#-changelog)
- [๐จโ๐ฉโ๐งโ๐ฆ Contributors](#-contributors)
@@ -30,6 +31,14 @@ A new `ipfs provide clear` command also allows manual queue clearing for debuggi
> [!NOTE]
> Upgrading to Kubo 0.37 will automatically clear any preexisting provide queue. The next time `Reprovider.Interval` hits, `Reprovider.Strategy` will be executed on a clean slate, ensuring consistent behavior with your current configuration.
+#### Remove unnecessary packages from thirdparty
+
+Removed unnecessary packages from the `thirdparty` area of kubo repositroy.
+
+- Removed `thirdparty/assert` (replaced by `github.com/stretchr/testify/require`)
+- Removed `thirdparty/dir` (replaced by `misc/fsutil)`
+- Removed `thirdparty/notifier` (unused)
+
#### ๐ฆ๏ธ Important dependency updates
- update `boxo` to [v0.34.0](https://github.com/ipfs/boxo/releases/tag/v0.34.0)
diff --git a/repo/common/common_test.go b/repo/common/common_test.go
index b999db459..3fb7198ec 100644
--- a/repo/common/common_test.go
+++ b/repo/common/common_test.go
@@ -3,7 +3,7 @@ package common
import (
"testing"
- "github.com/ipfs/kubo/thirdparty/assert"
+ "github.com/stretchr/testify/require"
)
func TestMapMergeDeepReturnsNew(t *testing.T) {
@@ -15,7 +15,7 @@ func TestMapMergeDeepReturnsNew(t *testing.T) {
MapMergeDeep(leftMap, rightMap)
- assert.True(leftMap["A"] == "Hello World", t, "MapMergeDeep should return a new map instance")
+ require.Equal(t, "Hello World", leftMap["A"], "MapMergeDeep should return a new map instance")
}
func TestMapMergeDeepNewKey(t *testing.T) {
@@ -46,7 +46,7 @@ func TestMapMergeDeepNewKey(t *testing.T) {
}
*/
- assert.True(result["B"] == "Bar", t, "New keys in right map should exist in resulting map")
+ require.Equal(t, "Bar", result["B"], "New keys in right map should exist in resulting map")
}
func TestMapMergeDeepRecursesOnMaps(t *testing.T) {
@@ -92,8 +92,8 @@ func TestMapMergeDeepRecursesOnMaps(t *testing.T) {
*/
resultA := result["A"].(map[string]interface{})
- assert.True(resultA["B"] == "A value!", t, "Unaltered values should not change")
- assert.True(resultA["C"] == "A different value!", t, "Nested values should be altered")
+ require.Equal(t, "A value!", resultA["B"], "Unaltered values should not change")
+ require.Equal(t, "A different value!", resultA["C"], "Nested values should be altered")
}
func TestMapMergeDeepRightNotAMap(t *testing.T) {
@@ -128,5 +128,5 @@ func TestMapMergeDeepRightNotAMap(t *testing.T) {
}
*/
- assert.True(result["A"] == "Not a map!", t, "Right values that are not a map should be set on the result")
+ require.Equal(t, "Not a map!", result["A"], "Right values that are not a map should be set on the result")
}
diff --git a/repo/fsrepo/fsrepo.go b/repo/fsrepo/fsrepo.go
index 7c3093b7a..b670a615d 100644
--- a/repo/fsrepo/fsrepo.go
+++ b/repo/fsrepo/fsrepo.go
@@ -16,7 +16,6 @@ import (
keystore "github.com/ipfs/boxo/keystore"
repo "github.com/ipfs/kubo/repo"
"github.com/ipfs/kubo/repo/common"
- dir "github.com/ipfs/kubo/thirdparty/dir"
rcmgr "github.com/libp2p/go-libp2p/p2p/host/resource-manager"
ds "github.com/ipfs/go-datastore"
@@ -192,7 +191,7 @@ func open(repoPath string, userConfigFilePath string) (repo.Repo, error) {
}
// check repo path, then check all constituent parts.
- if err := dir.Writable(r.path); err != nil {
+ if err := fsutil.DirWritable(r.path); err != nil {
return nil, err
}
diff --git a/repo/fsrepo/fsrepo_test.go b/repo/fsrepo/fsrepo_test.go
index 6b30b107a..91d8e887a 100644
--- a/repo/fsrepo/fsrepo_test.go
+++ b/repo/fsrepo/fsrepo_test.go
@@ -7,17 +7,16 @@ import (
"path/filepath"
"testing"
- "github.com/ipfs/kubo/thirdparty/assert"
-
datastore "github.com/ipfs/go-datastore"
config "github.com/ipfs/kubo/config"
+ "github.com/stretchr/testify/require"
)
func TestInitIdempotence(t *testing.T) {
t.Parallel()
path := t.TempDir()
for i := 0; i < 10; i++ {
- assert.Nil(Init(path, &config.Config{Datastore: config.DefaultDatastoreConfig()}), t, "multiple calls to init should succeed")
+ require.NoError(t, Init(path, &config.Config{Datastore: config.DefaultDatastoreConfig()}), "multiple calls to init should succeed")
}
}
@@ -32,78 +31,78 @@ func TestCanManageReposIndependently(t *testing.T) {
pathB := t.TempDir()
t.Log("initialize two repos")
- assert.Nil(Init(pathA, &config.Config{Datastore: config.DefaultDatastoreConfig()}), t, "a", "should initialize successfully")
- assert.Nil(Init(pathB, &config.Config{Datastore: config.DefaultDatastoreConfig()}), t, "b", "should initialize successfully")
+ require.NoError(t, Init(pathA, &config.Config{Datastore: config.DefaultDatastoreConfig()}), "a", "should initialize successfully")
+ require.NoError(t, Init(pathB, &config.Config{Datastore: config.DefaultDatastoreConfig()}), "b", "should initialize successfully")
t.Log("ensure repos initialized")
- assert.True(IsInitialized(pathA), t, "a should be initialized")
- assert.True(IsInitialized(pathB), t, "b should be initialized")
+ require.True(t, IsInitialized(pathA), "a should be initialized")
+ require.True(t, IsInitialized(pathB), "b should be initialized")
t.Log("open the two repos")
repoA, err := Open(pathA)
- assert.Nil(err, t, "a")
+ require.NoError(t, err, "a")
repoB, err := Open(pathB)
- assert.Nil(err, t, "b")
+ require.NoError(t, err, "b")
t.Log("close and remove b while a is open")
- assert.Nil(repoB.Close(), t, "close b")
- assert.Nil(Remove(pathB), t, "remove b")
+ require.NoError(t, repoB.Close(), "close b")
+ require.NoError(t, Remove(pathB), "remove b")
t.Log("close and remove a")
- assert.Nil(repoA.Close(), t)
- assert.Nil(Remove(pathA), t)
+ require.NoError(t, repoA.Close())
+ require.NoError(t, Remove(pathA))
}
func TestDatastoreGetNotAllowedAfterClose(t *testing.T) {
t.Parallel()
path := t.TempDir()
- assert.True(!IsInitialized(path), t, "should NOT be initialized")
- assert.Nil(Init(path, &config.Config{Datastore: config.DefaultDatastoreConfig()}), t, "should initialize successfully")
+ require.False(t, IsInitialized(path), "should NOT be initialized")
+ require.NoError(t, Init(path, &config.Config{Datastore: config.DefaultDatastoreConfig()}), "should initialize successfully")
r, err := Open(path)
- assert.Nil(err, t, "should open successfully")
+ require.NoError(t, err, "should open successfully")
k := "key"
data := []byte(k)
- assert.Nil(r.Datastore().Put(context.Background(), datastore.NewKey(k), data), t, "Put should be successful")
+ require.NoError(t, r.Datastore().Put(context.Background(), datastore.NewKey(k), data), "Put should be successful")
- assert.Nil(r.Close(), t)
+ require.NoError(t, r.Close())
_, err = r.Datastore().Get(context.Background(), datastore.NewKey(k))
- assert.Err(err, t, "after closer, Get should be fail")
+ require.Error(t, err, "after closer, Get should be fail")
}
func TestDatastorePersistsFromRepoToRepo(t *testing.T) {
t.Parallel()
path := t.TempDir()
- assert.Nil(Init(path, &config.Config{Datastore: config.DefaultDatastoreConfig()}), t)
+ require.NoError(t, Init(path, &config.Config{Datastore: config.DefaultDatastoreConfig()}))
r1, err := Open(path)
- assert.Nil(err, t)
+ require.NoError(t, err)
k := "key"
expected := []byte(k)
- assert.Nil(r1.Datastore().Put(context.Background(), datastore.NewKey(k), expected), t, "using first repo, Put should be successful")
- assert.Nil(r1.Close(), t)
+ require.NoError(t, r1.Datastore().Put(context.Background(), datastore.NewKey(k), expected), "using first repo, Put should be successful")
+ require.NoError(t, r1.Close())
r2, err := Open(path)
- assert.Nil(err, t)
+ require.NoError(t, err)
actual, err := r2.Datastore().Get(context.Background(), datastore.NewKey(k))
- assert.Nil(err, t, "using second repo, Get should be successful")
- assert.Nil(r2.Close(), t)
- assert.True(bytes.Equal(expected, actual), t, "data should match")
+ require.NoError(t, err, "using second repo, Get should be successful")
+ require.NoError(t, r2.Close())
+ require.True(t, bytes.Equal(expected, actual), "data should match")
}
func TestOpenMoreThanOnceInSameProcess(t *testing.T) {
t.Parallel()
path := t.TempDir()
- assert.Nil(Init(path, &config.Config{Datastore: config.DefaultDatastoreConfig()}), t)
+ require.NoError(t, Init(path, &config.Config{Datastore: config.DefaultDatastoreConfig()}))
r1, err := Open(path)
- assert.Nil(err, t, "first repo should open successfully")
+ require.NoError(t, err, "first repo should open successfully")
r2, err := Open(path)
- assert.Nil(err, t, "second repo should open successfully")
- assert.True(r1 == r2, t, "second open returns same value")
+ require.NoError(t, err, "second repo should open successfully")
+ require.Equal(t, r1, r2, "second open returns same value")
- assert.Nil(r1.Close(), t)
- assert.Nil(r2.Close(), t)
+ require.NoError(t, r1.Close())
+ require.NoError(t, r2.Close())
}
diff --git a/thirdparty/README.md b/thirdparty/README.md
index a68b51c5d..a4774a4af 100644
--- a/thirdparty/README.md
+++ b/thirdparty/README.md
@@ -1,5 +1,2 @@
-thirdparty consists of Golang packages that contain no go-ipfs dependencies and
-may be vendored ipfs/go-ipfs at a later date.
-
packages under this directory _must not_ import packages under
-`ipfs/go-ipfs` that are not also under `thirdparty`.
+`ipfs/kubo` that are not also under `thirdparty`.
diff --git a/thirdparty/assert/assert.go b/thirdparty/assert/assert.go
deleted file mode 100644
index f737d191e..000000000
--- a/thirdparty/assert/assert.go
+++ /dev/null
@@ -1,25 +0,0 @@
-package assert
-
-import "testing"
-
-func Nil(err error, t *testing.T, msgs ...string) {
- if err != nil {
- t.Fatal(msgs, "error:", err)
- }
-}
-
-func True(v bool, t *testing.T, msgs ...string) {
- if !v {
- t.Fatal(msgs)
- }
-}
-
-func False(v bool, t *testing.T, msgs ...string) {
- True(!v, t, msgs...)
-}
-
-func Err(err error, t *testing.T, msgs ...string) {
- if err == nil {
- t.Fatal(msgs, "error:", err)
- }
-}
diff --git a/thirdparty/dir/dir.go b/thirdparty/dir/dir.go
deleted file mode 100644
index 5aa93c329..000000000
--- a/thirdparty/dir/dir.go
+++ /dev/null
@@ -1,25 +0,0 @@
-package dir
-
-// TODO move somewhere generic
-
-import (
- "errors"
- "os"
- "path/filepath"
-)
-
-// Writable ensures the directory exists and is writable.
-func Writable(path string) error {
- // Construct the path if missing
- if err := os.MkdirAll(path, os.ModePerm); err != nil {
- return err
- }
- // Check the directory is writable
- if f, err := os.Create(filepath.Join(path, "._check_writable")); err == nil {
- f.Close()
- os.Remove(f.Name())
- } else {
- return errors.New("'" + path + "' is not writable")
- }
- return nil
-}
diff --git a/thirdparty/notifier/notifier.go b/thirdparty/notifier/notifier.go
deleted file mode 100644
index bb8860702..000000000
--- a/thirdparty/notifier/notifier.go
+++ /dev/null
@@ -1,142 +0,0 @@
-// Package notifier provides a simple notification dispatcher
-// meant to be embedded in larger structures who wish to allow
-// clients to sign up for event notifications.
-package notifier
-
-import (
- "sync"
-
- process "github.com/jbenet/goprocess"
- ratelimit "github.com/jbenet/goprocess/ratelimit"
-)
-
-// Notifiee is a generic interface. Clients implement
-// their own Notifiee interfaces to ensure type-safety
-// of notifications:
-//
-// type RocketNotifiee interface{
-// Countdown(r Rocket, countdown time.Duration)
-// LiftedOff(Rocket)
-// ReachedOrbit(Rocket)
-// Detached(Rocket, Capsule)
-// Landed(Rocket)
-// }
-type Notifiee interface{}
-
-// Notifier is a notification dispatcher. It's meant
-// to be composed, and its zero-value is ready to be used.
-//
-// type Rocket struct {
-// notifier notifier.Notifier
-// }
-type Notifier struct {
- mu sync.RWMutex // guards notifiees
- nots map[Notifiee]struct{}
- lim *ratelimit.RateLimiter
-}
-
-// RateLimited returns a rate limited Notifier. only limit goroutines
-// will be spawned. If limit is zero, no rate limiting happens. This
-// is the same as `Notifier{}`.
-func RateLimited(limit int) *Notifier {
- n := &Notifier{}
- if limit > 0 {
- n.lim = ratelimit.NewRateLimiter(process.Background(), limit)
- }
- return n
-}
-
-// Notify signs up Notifiee e for notifications. This function
-// is meant to be called behind your own type-safe function(s):
-//
-// // generic function for pattern-following
-// func (r *Rocket) Notify(n Notifiee) {
-// r.notifier.Notify(n)
-// }
-//
-// // or as part of other functions
-// func (r *Rocket) Onboard(a Astronaut) {
-// r.astronauts = append(r.austronauts, a)
-// r.notifier.Notify(a)
-// }
-func (n *Notifier) Notify(e Notifiee) {
- n.mu.Lock()
- if n.nots == nil { // so that zero-value is ready to be used.
- n.nots = make(map[Notifiee]struct{})
- }
- n.nots[e] = struct{}{}
- n.mu.Unlock()
-}
-
-// StopNotify stops notifying Notifiee e. This function
-// is meant to be called behind your own type-safe function(s):
-//
-// // generic function for pattern-following
-// func (r *Rocket) StopNotify(n Notifiee) {
-// r.notifier.StopNotify(n)
-// }
-//
-// // or as part of other functions
-// func (r *Rocket) Detach(c Capsule) {
-// r.notifier.StopNotify(c)
-// r.capsule = nil
-// }
-func (n *Notifier) StopNotify(e Notifiee) {
- n.mu.Lock()
- if n.nots != nil { // so that zero-value is ready to be used.
- delete(n.nots, e)
- }
- n.mu.Unlock()
-}
-
-// NotifyAll messages the notifier's notifiees with a given notification.
-// This is done by calling the given function with each notifiee. It is
-// meant to be called with your own type-safe notification functions:
-//
-// func (r *Rocket) Launch() {
-// r.notifyAll(func(n Notifiee) {
-// n.Launched(r)
-// })
-// }
-//
-// // make it private so only you can use it. This function is necessary
-// // to make sure you only up-cast in one place. You control who you added
-// // to be a notifiee. If Go adds generics, maybe we can get rid of this
-// // method but for now it is like wrapping a type-less container with
-// // a type safe interface.
-// func (r *Rocket) notifyAll(notify func(Notifiee)) {
-// r.notifier.NotifyAll(func(n notifier.Notifiee) {
-// notify(n.(Notifiee))
-// })
-// }
-//
-// Note well: each notification is launched in its own goroutine, so they
-// can be processed concurrently, and so that whatever the notification does
-// it _never_ blocks out the client. This is so that consumers _cannot_ add
-// hooks into your object that block you accidentally.
-func (n *Notifier) NotifyAll(notify func(Notifiee)) {
- n.mu.Lock()
- defer n.mu.Unlock()
-
- if n.nots == nil { // so that zero-value is ready to be used.
- return
- }
-
- // no rate limiting.
- if n.lim == nil {
- for notifiee := range n.nots {
- go notify(notifiee)
- }
- return
- }
-
- // with rate limiting.
- n.lim.Go(func(worker process.Process) {
- for notifiee := range n.nots {
- notifiee := notifiee // rebind for loop data races
- n.lim.LimitedGo(func(worker process.Process) {
- notify(notifiee)
- })
- }
- })
-}
diff --git a/thirdparty/notifier/notifier_test.go b/thirdparty/notifier/notifier_test.go
deleted file mode 100644
index 401b3b02a..000000000
--- a/thirdparty/notifier/notifier_test.go
+++ /dev/null
@@ -1,289 +0,0 @@
-package notifier
-
-import (
- "fmt"
- "sync"
- "testing"
- "time"
-)
-
-// test data structures.
-type Router struct {
- queue chan Packet
- notifier Notifier
-}
-
-type Packet struct{}
-
-type RouterNotifiee interface {
- Enqueued(*Router, Packet)
- Forwarded(*Router, Packet)
- Dropped(*Router, Packet)
-}
-
-func (r *Router) Notify(n RouterNotifiee) {
- r.notifier.Notify(n)
-}
-
-func (r *Router) StopNotify(n RouterNotifiee) {
- r.notifier.StopNotify(n)
-}
-
-func (r *Router) notifyAll(notify func(n RouterNotifiee)) {
- r.notifier.NotifyAll(func(n Notifiee) {
- notify(n.(RouterNotifiee))
- })
-}
-
-func (r *Router) Receive(p Packet) {
- select {
- case r.queue <- p: // enqueued
- r.notifyAll(func(n RouterNotifiee) {
- n.Enqueued(r, p)
- })
-
- default: // drop
- r.notifyAll(func(n RouterNotifiee) {
- n.Dropped(r, p)
- })
- }
-}
-
-func (r *Router) Forward() {
- p := <-r.queue
- r.notifyAll(func(n RouterNotifiee) {
- n.Forwarded(r, p)
- })
-}
-
-type Metrics struct {
- enqueued int
- forwarded int
- dropped int
- received chan struct{}
- sync.Mutex
-}
-
-func (m *Metrics) Enqueued(*Router, Packet) {
- m.Lock()
- m.enqueued++
- m.Unlock()
- if m.received != nil {
- m.received <- struct{}{}
- }
-}
-
-func (m *Metrics) Forwarded(*Router, Packet) {
- m.Lock()
- m.forwarded++
- m.Unlock()
- if m.received != nil {
- m.received <- struct{}{}
- }
-}
-
-func (m *Metrics) Dropped(*Router, Packet) {
- m.Lock()
- m.dropped++
- m.Unlock()
- if m.received != nil {
- m.received <- struct{}{}
- }
-}
-
-func (m *Metrics) String() string {
- m.Lock()
- defer m.Unlock()
- return fmt.Sprintf("%d enqueued, %d forwarded, %d in queue, %d dropped",
- m.enqueued, m.forwarded, m.enqueued-m.forwarded, m.dropped)
-}
-
-func TestNotifies(t *testing.T) {
- m := Metrics{received: make(chan struct{})}
- r := Router{queue: make(chan Packet, 10)}
- r.Notify(&m)
-
- for i := 0; i < 10; i++ {
- r.Receive(Packet{})
- <-m.received
- if m.enqueued != (1 + i) {
- t.Error("not notifying correctly", m.enqueued, 1+i)
- }
-
- }
-
- for i := 0; i < 10; i++ {
- r.Receive(Packet{})
- <-m.received
- if m.enqueued != 10 {
- t.Error("not notifying correctly", m.enqueued, 10)
- }
- if m.dropped != (1 + i) {
- t.Error("not notifying correctly", m.dropped, 1+i)
- }
- }
-}
-
-func TestStopsNotifying(t *testing.T) {
- m := Metrics{received: make(chan struct{})}
- r := Router{queue: make(chan Packet, 10)}
- r.Notify(&m)
-
- for i := 0; i < 5; i++ {
- r.Receive(Packet{})
- <-m.received
- if m.enqueued != (1 + i) {
- t.Error("not notifying correctly")
- }
- }
-
- r.StopNotify(&m)
-
- for i := 0; i < 5; i++ {
- r.Receive(Packet{})
- select {
- case <-m.received:
- t.Error("did not stop notifying")
- default:
- }
- if m.enqueued != 5 {
- t.Error("did not stop notifying")
- }
- }
-}
-
-func TestThreadsafe(t *testing.T) {
- N := 1000
- r := Router{queue: make(chan Packet, 10)}
- m1 := Metrics{received: make(chan struct{})}
- m2 := Metrics{received: make(chan struct{})}
- m3 := Metrics{received: make(chan struct{})}
- r.Notify(&m1)
- r.Notify(&m2)
- r.Notify(&m3)
-
- var n int
- var wg sync.WaitGroup
- for i := 0; i < N; i++ {
- n++
- wg.Add(1)
- go func() {
- defer wg.Done()
- r.Receive(Packet{})
- }()
-
- if i%3 == 0 {
- n++
- wg.Add(1)
- go func() {
- defer wg.Done()
- r.Forward()
- }()
- }
- }
-
- // drain queues
- for i := 0; i < (n * 3); i++ {
- select {
- case <-m1.received:
- case <-m2.received:
- case <-m3.received:
- }
- }
-
- wg.Wait()
-
- // counts should be correct and all agree. and this should
- // run fine under `go test -race -cpu=5`
-
- t.Log("m1", m1.String())
- t.Log("m2", m2.String())
- t.Log("m3", m3.String())
-
- if m1.String() != m2.String() || m2.String() != m3.String() {
- t.Error("counts disagree")
- }
-}
-
-type highwatermark struct {
- mu sync.Mutex
- mark int
- limit int
- errs chan error
-}
-
-func (m *highwatermark) incr() {
- m.mu.Lock()
- m.mark++
- // fmt.Println("incr", m.mark)
- if m.mark > m.limit {
- m.errs <- fmt.Errorf("went over limit: %d/%d", m.mark, m.limit)
- }
- m.mu.Unlock()
-}
-
-func (m *highwatermark) decr() {
- m.mu.Lock()
- m.mark--
- // fmt.Println("decr", m.mark)
- if m.mark < 0 {
- m.errs <- fmt.Errorf("went under zero: %d/%d", m.mark, m.limit)
- }
- m.mu.Unlock()
-}
-
-func TestLimited(t *testing.T) {
- timeout := 10 * time.Second // huge timeout.
- limit := 9
-
- hwm := highwatermark{limit: limit, errs: make(chan error, 100)}
- n := RateLimited(limit) // will stop after 3 rounds
- n.Notify(1)
- n.Notify(2)
- n.Notify(3)
-
- entr := make(chan struct{})
- exit := make(chan struct{})
- done := make(chan struct{})
- go func() {
- for i := 0; i < 10; i++ {
- // fmt.Printf("round: %d\n", i)
- n.NotifyAll(func(e Notifiee) {
- hwm.incr()
- entr <- struct{}{}
- <-exit // wait
- hwm.decr()
- })
- }
- done <- struct{}{}
- }()
-
- for i := 0; i < 30; {
- select {
- case <-entr:
- continue // let as many enter as possible
- case <-time.After(1 * time.Millisecond):
- }
-
- // let one exit
- select {
- case <-entr:
- continue // in case of timing issues.
- case exit <- struct{}{}:
- case <-time.After(timeout):
- t.Error("got stuck")
- }
- i++
- }
-
- select {
- case <-done: // two parts done
- case <-time.After(timeout):
- t.Error("did not finish")
- }
-
- close(hwm.errs)
- for err := range hwm.errs {
- t.Error(err)
- }
-}
From 2a5b53c0b740aeae0e95c2c18d129d1fa0c9a6a8 Mon Sep 17 00:00:00 2001
From: gammazero <11790789+gammazero@users.noreply.github.com>
Date: Tue, 29 Jul 2025 13:02:01 -1000
Subject: [PATCH 295/499] Update to latest boxo PR #976
---
go.mod | 4 ++--
go.sum | 3 +++
test/dependencies/go.mod | 3 ++-
test/dependencies/go.sum | 10 ++++++----
4 files changed, 13 insertions(+), 7 deletions(-)
diff --git a/go.mod b/go.mod
index f150e066f..6e40429c4 100644
--- a/go.mod
+++ b/go.mod
@@ -22,7 +22,7 @@ require (
github.com/hashicorp/go-version v1.7.0
github.com/ipfs-shipyard/nopfs v0.0.14
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0
- github.com/ipfs/boxo v0.33.1-0.20250710085426-6cfa79448bb1
+ github.com/ipfs/boxo v0.33.1-0.20250729221248-7aa4fee5073e
github.com/ipfs/go-block-format v0.2.2
github.com/ipfs/go-cid v0.5.0
github.com/ipfs/go-cidutil v0.1.0
@@ -126,7 +126,7 @@ require (
github.com/flynn/noise v1.1.0 // indirect
github.com/francoispqt/gojay v1.2.13 // indirect
github.com/gabriel-vasile/mimetype v1.4.9 // indirect
- github.com/gammazero/chanqueue v1.1.0 // indirect
+ github.com/gammazero/chanqueue v1.1.1 // indirect
github.com/gammazero/deque v1.0.0 // indirect
github.com/getsentry/sentry-go v0.27.0 // indirect
github.com/go-jose/go-jose/v4 v4.0.5 // indirect
diff --git a/go.sum b/go.sum
index d88a92c76..964ab93ca 100644
--- a/go.sum
+++ b/go.sum
@@ -201,6 +201,7 @@ github.com/gabriel-vasile/mimetype v1.4.9 h1:5k+WDwEsD9eTLL8Tz3L0VnmVh9QxGjRmjBv
github.com/gabriel-vasile/mimetype v1.4.9/go.mod h1:WnSQhFKJuBlRyLiKohA/2DtIlPFAbguNaG7QCHcyGok=
github.com/gammazero/chanqueue v1.1.0 h1:yiwtloc1azhgGLFo2gMloJtQvkYD936Ai7tBfa+rYJw=
github.com/gammazero/chanqueue v1.1.0/go.mod h1:fMwpwEiuUgpab0sH4VHiVcEoji1pSi+EIzeG4TPeKPc=
+github.com/gammazero/chanqueue v1.1.1/go.mod h1:fMwpwEiuUgpab0sH4VHiVcEoji1pSi+EIzeG4TPeKPc=
github.com/gammazero/deque v1.0.0 h1:LTmimT8H7bXkkCy6gZX7zNLtkbz4NdS2z8LZuor3j34=
github.com/gammazero/deque v1.0.0/go.mod h1:iflpYvtGfM3U8S8j+sZEKIak3SAKYpA5/SQewgfXDKo=
github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps=
@@ -360,6 +361,8 @@ github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
github.com/ipfs/boxo v0.33.1-0.20250710085426-6cfa79448bb1 h1:ZzGKxEqait8lqsEiZ7/esJKELW1/+/Y8swpRgjOZHK0=
github.com/ipfs/boxo v0.33.1-0.20250710085426-6cfa79448bb1/go.mod h1:Cvy+GW4Noex2jaoTsOM+RYQdXhjNAk09s313vkOyYmA=
+github.com/ipfs/boxo v0.33.1-0.20250729221248-7aa4fee5073e h1:yawkShUI+t+tPlGFaM1a78BZ6tPTB0zHKqXnZBpL2So=
+github.com/ipfs/boxo v0.33.1-0.20250729221248-7aa4fee5073e/go.mod h1:+Q3VR9eJsbggxNJQHuduQNh5SAqfmq7Gtm0ptdcoSE0=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk=
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index 367cfd049..d58966eb4 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -31,6 +31,7 @@ require (
github.com/DataDog/zstd v1.5.6-0.20230824185856-869dae002e5e // indirect
github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 // indirect
github.com/GaijinEntertainment/go-exhaustruct/v3 v3.3.0 // indirect
+ github.com/Jorropo/jsync v1.0.1 // indirect
github.com/Masterminds/semver/v3 v3.2.1 // indirect
github.com/OpenPeeDeeP/depguard/v2 v2.2.0 // indirect
github.com/alecthomas/go-check-sumtype v0.1.4 // indirect
@@ -130,7 +131,7 @@ require (
github.com/huin/goupnp v1.3.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/ipfs/bbloom v0.0.4 // indirect
- github.com/ipfs/boxo v0.33.1-0.20250710085426-6cfa79448bb1 // indirect
+ github.com/ipfs/boxo v0.33.1-0.20250729221248-7aa4fee5073e // indirect
github.com/ipfs/go-bitfield v1.1.0 // indirect
github.com/ipfs/go-block-format v0.2.2 // indirect
github.com/ipfs/go-cid v0.5.0 // indirect
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index fd6eee283..4b8941ca1 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -33,6 +33,8 @@ github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 h1:sHglBQTwgx+rW
github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs=
github.com/GaijinEntertainment/go-exhaustruct/v3 v3.3.0 h1:/fTUt5vmbkAcMBt4YQiuC23cV0kEsN1MVMNqeOW43cU=
github.com/GaijinEntertainment/go-exhaustruct/v3 v3.3.0/go.mod h1:ONJg5sxcbsdQQ4pOW8TGdTidT2TMAUy/2Xhr8mrYaao=
+github.com/Jorropo/jsync v1.0.1 h1:6HgRolFZnsdfzRUj+ImB9og1JYOxQoReSywkHOGSaUU=
+github.com/Jorropo/jsync v1.0.1/go.mod h1:jCOZj3vrBCri3bSU3ErUYvevKlnbssrXeCivybS5ABQ=
github.com/Kubuxu/gocovmerge v0.0.0-20161216165753-7ecaa51963cd h1:HNhzThEtZW714v8Eda8sWWRcu9WSzJC+oCyjRjvZgRA=
github.com/Kubuxu/gocovmerge v0.0.0-20161216165753-7ecaa51963cd/go.mod h1:bqoB8kInrTeEtYAwaIXoSRqdwnjQmFhsfusnzyui6yY=
github.com/Masterminds/semver/v3 v3.2.1 h1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0=
@@ -175,8 +177,8 @@ github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nos
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo=
github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA=
-github.com/gammazero/chanqueue v1.1.0 h1:yiwtloc1azhgGLFo2gMloJtQvkYD936Ai7tBfa+rYJw=
-github.com/gammazero/chanqueue v1.1.0/go.mod h1:fMwpwEiuUgpab0sH4VHiVcEoji1pSi+EIzeG4TPeKPc=
+github.com/gammazero/chanqueue v1.1.1 h1:n9Y+zbBxw2f7uUE9wpgs0rOSkP/I/yhDLiNuhyVjojQ=
+github.com/gammazero/chanqueue v1.1.1/go.mod h1:fMwpwEiuUgpab0sH4VHiVcEoji1pSi+EIzeG4TPeKPc=
github.com/gammazero/deque v1.0.0 h1:LTmimT8H7bXkkCy6gZX7zNLtkbz4NdS2z8LZuor3j34=
github.com/gammazero/deque v1.0.0/go.mod h1:iflpYvtGfM3U8S8j+sZEKIak3SAKYpA5/SQewgfXDKo=
github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps=
@@ -319,8 +321,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.33.1-0.20250710085426-6cfa79448bb1 h1:ZzGKxEqait8lqsEiZ7/esJKELW1/+/Y8swpRgjOZHK0=
-github.com/ipfs/boxo v0.33.1-0.20250710085426-6cfa79448bb1/go.mod h1:Cvy+GW4Noex2jaoTsOM+RYQdXhjNAk09s313vkOyYmA=
+github.com/ipfs/boxo v0.33.1-0.20250729221248-7aa4fee5073e h1:yawkShUI+t+tPlGFaM1a78BZ6tPTB0zHKqXnZBpL2So=
+github.com/ipfs/boxo v0.33.1-0.20250729221248-7aa4fee5073e/go.mod h1:+Q3VR9eJsbggxNJQHuduQNh5SAqfmq7Gtm0ptdcoSE0=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-block-format v0.2.2 h1:uecCTgRwDIXyZPgYspaLXoMiMmxQpSx2aq34eNc4YvQ=
From fde0f8d0a1b47114c60b2ad2e012a87fdfbb416d Mon Sep 17 00:00:00 2001
From: gammazero <11790789+gammazero@users.noreply.github.com>
Date: Tue, 29 Jul 2025 13:07:02 -1000
Subject: [PATCH 296/499] Revert "Update to latest boxo PR #976"
This reverts commit 2a5b53c0b740aeae0e95c2c18d129d1fa0c9a6a8.
---
go.mod | 4 ++--
go.sum | 3 ---
test/dependencies/go.mod | 3 +--
test/dependencies/go.sum | 10 ++++------
4 files changed, 7 insertions(+), 13 deletions(-)
diff --git a/go.mod b/go.mod
index 6e40429c4..f150e066f 100644
--- a/go.mod
+++ b/go.mod
@@ -22,7 +22,7 @@ require (
github.com/hashicorp/go-version v1.7.0
github.com/ipfs-shipyard/nopfs v0.0.14
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0
- github.com/ipfs/boxo v0.33.1-0.20250729221248-7aa4fee5073e
+ github.com/ipfs/boxo v0.33.1-0.20250710085426-6cfa79448bb1
github.com/ipfs/go-block-format v0.2.2
github.com/ipfs/go-cid v0.5.0
github.com/ipfs/go-cidutil v0.1.0
@@ -126,7 +126,7 @@ require (
github.com/flynn/noise v1.1.0 // indirect
github.com/francoispqt/gojay v1.2.13 // indirect
github.com/gabriel-vasile/mimetype v1.4.9 // indirect
- github.com/gammazero/chanqueue v1.1.1 // indirect
+ github.com/gammazero/chanqueue v1.1.0 // indirect
github.com/gammazero/deque v1.0.0 // indirect
github.com/getsentry/sentry-go v0.27.0 // indirect
github.com/go-jose/go-jose/v4 v4.0.5 // indirect
diff --git a/go.sum b/go.sum
index 964ab93ca..d88a92c76 100644
--- a/go.sum
+++ b/go.sum
@@ -201,7 +201,6 @@ github.com/gabriel-vasile/mimetype v1.4.9 h1:5k+WDwEsD9eTLL8Tz3L0VnmVh9QxGjRmjBv
github.com/gabriel-vasile/mimetype v1.4.9/go.mod h1:WnSQhFKJuBlRyLiKohA/2DtIlPFAbguNaG7QCHcyGok=
github.com/gammazero/chanqueue v1.1.0 h1:yiwtloc1azhgGLFo2gMloJtQvkYD936Ai7tBfa+rYJw=
github.com/gammazero/chanqueue v1.1.0/go.mod h1:fMwpwEiuUgpab0sH4VHiVcEoji1pSi+EIzeG4TPeKPc=
-github.com/gammazero/chanqueue v1.1.1/go.mod h1:fMwpwEiuUgpab0sH4VHiVcEoji1pSi+EIzeG4TPeKPc=
github.com/gammazero/deque v1.0.0 h1:LTmimT8H7bXkkCy6gZX7zNLtkbz4NdS2z8LZuor3j34=
github.com/gammazero/deque v1.0.0/go.mod h1:iflpYvtGfM3U8S8j+sZEKIak3SAKYpA5/SQewgfXDKo=
github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps=
@@ -361,8 +360,6 @@ github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
github.com/ipfs/boxo v0.33.1-0.20250710085426-6cfa79448bb1 h1:ZzGKxEqait8lqsEiZ7/esJKELW1/+/Y8swpRgjOZHK0=
github.com/ipfs/boxo v0.33.1-0.20250710085426-6cfa79448bb1/go.mod h1:Cvy+GW4Noex2jaoTsOM+RYQdXhjNAk09s313vkOyYmA=
-github.com/ipfs/boxo v0.33.1-0.20250729221248-7aa4fee5073e h1:yawkShUI+t+tPlGFaM1a78BZ6tPTB0zHKqXnZBpL2So=
-github.com/ipfs/boxo v0.33.1-0.20250729221248-7aa4fee5073e/go.mod h1:+Q3VR9eJsbggxNJQHuduQNh5SAqfmq7Gtm0ptdcoSE0=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk=
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index d58966eb4..367cfd049 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -31,7 +31,6 @@ require (
github.com/DataDog/zstd v1.5.6-0.20230824185856-869dae002e5e // indirect
github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 // indirect
github.com/GaijinEntertainment/go-exhaustruct/v3 v3.3.0 // indirect
- github.com/Jorropo/jsync v1.0.1 // indirect
github.com/Masterminds/semver/v3 v3.2.1 // indirect
github.com/OpenPeeDeeP/depguard/v2 v2.2.0 // indirect
github.com/alecthomas/go-check-sumtype v0.1.4 // indirect
@@ -131,7 +130,7 @@ require (
github.com/huin/goupnp v1.3.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/ipfs/bbloom v0.0.4 // indirect
- github.com/ipfs/boxo v0.33.1-0.20250729221248-7aa4fee5073e // indirect
+ github.com/ipfs/boxo v0.33.1-0.20250710085426-6cfa79448bb1 // indirect
github.com/ipfs/go-bitfield v1.1.0 // indirect
github.com/ipfs/go-block-format v0.2.2 // indirect
github.com/ipfs/go-cid v0.5.0 // indirect
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index 4b8941ca1..fd6eee283 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -33,8 +33,6 @@ github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 h1:sHglBQTwgx+rW
github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs=
github.com/GaijinEntertainment/go-exhaustruct/v3 v3.3.0 h1:/fTUt5vmbkAcMBt4YQiuC23cV0kEsN1MVMNqeOW43cU=
github.com/GaijinEntertainment/go-exhaustruct/v3 v3.3.0/go.mod h1:ONJg5sxcbsdQQ4pOW8TGdTidT2TMAUy/2Xhr8mrYaao=
-github.com/Jorropo/jsync v1.0.1 h1:6HgRolFZnsdfzRUj+ImB9og1JYOxQoReSywkHOGSaUU=
-github.com/Jorropo/jsync v1.0.1/go.mod h1:jCOZj3vrBCri3bSU3ErUYvevKlnbssrXeCivybS5ABQ=
github.com/Kubuxu/gocovmerge v0.0.0-20161216165753-7ecaa51963cd h1:HNhzThEtZW714v8Eda8sWWRcu9WSzJC+oCyjRjvZgRA=
github.com/Kubuxu/gocovmerge v0.0.0-20161216165753-7ecaa51963cd/go.mod h1:bqoB8kInrTeEtYAwaIXoSRqdwnjQmFhsfusnzyui6yY=
github.com/Masterminds/semver/v3 v3.2.1 h1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0=
@@ -177,8 +175,8 @@ github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nos
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo=
github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA=
-github.com/gammazero/chanqueue v1.1.1 h1:n9Y+zbBxw2f7uUE9wpgs0rOSkP/I/yhDLiNuhyVjojQ=
-github.com/gammazero/chanqueue v1.1.1/go.mod h1:fMwpwEiuUgpab0sH4VHiVcEoji1pSi+EIzeG4TPeKPc=
+github.com/gammazero/chanqueue v1.1.0 h1:yiwtloc1azhgGLFo2gMloJtQvkYD936Ai7tBfa+rYJw=
+github.com/gammazero/chanqueue v1.1.0/go.mod h1:fMwpwEiuUgpab0sH4VHiVcEoji1pSi+EIzeG4TPeKPc=
github.com/gammazero/deque v1.0.0 h1:LTmimT8H7bXkkCy6gZX7zNLtkbz4NdS2z8LZuor3j34=
github.com/gammazero/deque v1.0.0/go.mod h1:iflpYvtGfM3U8S8j+sZEKIak3SAKYpA5/SQewgfXDKo=
github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps=
@@ -321,8 +319,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.33.1-0.20250729221248-7aa4fee5073e h1:yawkShUI+t+tPlGFaM1a78BZ6tPTB0zHKqXnZBpL2So=
-github.com/ipfs/boxo v0.33.1-0.20250729221248-7aa4fee5073e/go.mod h1:+Q3VR9eJsbggxNJQHuduQNh5SAqfmq7Gtm0ptdcoSE0=
+github.com/ipfs/boxo v0.33.1-0.20250710085426-6cfa79448bb1 h1:ZzGKxEqait8lqsEiZ7/esJKELW1/+/Y8swpRgjOZHK0=
+github.com/ipfs/boxo v0.33.1-0.20250710085426-6cfa79448bb1/go.mod h1:Cvy+GW4Noex2jaoTsOM+RYQdXhjNAk09s313vkOyYmA=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-block-format v0.2.2 h1:uecCTgRwDIXyZPgYspaLXoMiMmxQpSx2aq34eNc4YvQ=
From 02cf7519d02ca81e1d84071016169c626e3e86a7 Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Thu, 31 Jul 2025 04:53:14 -0700
Subject: [PATCH 297/499] Upgrade to Boxo v0.33.1 (#10888)
* Upgrade to Boxo v0.33.1
---
docs/changelogs/v0.37.md | 2 +-
docs/examples/kubo-as-a-library/go.mod | 18 +++++------
docs/examples/kubo-as-a-library/go.sum | 36 ++++++++++-----------
go.mod | 20 ++++++------
go.sum | 40 +++++++++++------------
test/dependencies/go.mod | 18 +++++------
test/dependencies/go.sum | 44 ++++++++++++++------------
7 files changed, 91 insertions(+), 87 deletions(-)
diff --git a/docs/changelogs/v0.37.md b/docs/changelogs/v0.37.md
index d4b105e35..c5b619633 100644
--- a/docs/changelogs/v0.37.md
+++ b/docs/changelogs/v0.37.md
@@ -41,7 +41,7 @@ Removed unnecessary packages from the `thirdparty` area of kubo repositroy.
#### ๐ฆ๏ธ Important dependency updates
-- update `boxo` to [v0.34.0](https://github.com/ipfs/boxo/releases/tag/v0.34.0)
+- update `boxo` to [v0.33.1](https://github.com/ipfs/boxo/releases/tag/v0.33.1)
### ๐ Changelog
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index c9b695d99..7e7593bb1 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -7,9 +7,9 @@ go 1.24
replace github.com/ipfs/kubo => ./../../..
require (
- github.com/ipfs/boxo v0.33.1-0.20250710085426-6cfa79448bb1
+ github.com/ipfs/boxo v0.33.1
github.com/ipfs/kubo v0.0.0-00010101000000-000000000000
- github.com/libp2p/go-libp2p v0.42.0
+ github.com/libp2p/go-libp2p v0.42.1
github.com/multiformats/go-multiaddr v0.16.0
)
@@ -51,7 +51,7 @@ require (
github.com/francoispqt/gojay v1.2.13 // indirect
github.com/fsnotify/fsnotify v1.7.0 // indirect
github.com/gabriel-vasile/mimetype v1.4.9 // indirect
- github.com/gammazero/chanqueue v1.1.0 // indirect
+ github.com/gammazero/chanqueue v1.1.1 // indirect
github.com/gammazero/deque v1.0.0 // indirect
github.com/getsentry/sentry-go v0.27.0 // indirect
github.com/go-jose/go-jose/v4 v4.0.5 // indirect
@@ -210,15 +210,15 @@ require (
go.uber.org/zap v1.27.0 // indirect
go.uber.org/zap/exp v0.3.0 // indirect
go4.org v0.0.0-20230225012048-214862532bf5 // indirect
- golang.org/x/crypto v0.39.0 // indirect
- golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b // indirect
- golang.org/x/mod v0.25.0 // indirect
- golang.org/x/net v0.41.0 // indirect
+ golang.org/x/crypto v0.40.0 // indirect
+ golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 // indirect
+ golang.org/x/mod v0.26.0 // indirect
+ golang.org/x/net v0.42.0 // indirect
golang.org/x/sync v0.16.0 // indirect
golang.org/x/sys v0.34.0 // indirect
- golang.org/x/text v0.26.0 // indirect
+ golang.org/x/text v0.27.0 // indirect
golang.org/x/time v0.12.0 // indirect
- golang.org/x/tools v0.34.0 // indirect
+ golang.org/x/tools v0.35.0 // indirect
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
gonum.org/v1/gonum v0.16.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 // indirect
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index fa0462bf5..d68a5ed46 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -161,8 +161,8 @@ github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nos
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
github.com/gabriel-vasile/mimetype v1.4.9 h1:5k+WDwEsD9eTLL8Tz3L0VnmVh9QxGjRmjBvAG7U/oYY=
github.com/gabriel-vasile/mimetype v1.4.9/go.mod h1:WnSQhFKJuBlRyLiKohA/2DtIlPFAbguNaG7QCHcyGok=
-github.com/gammazero/chanqueue v1.1.0 h1:yiwtloc1azhgGLFo2gMloJtQvkYD936Ai7tBfa+rYJw=
-github.com/gammazero/chanqueue v1.1.0/go.mod h1:fMwpwEiuUgpab0sH4VHiVcEoji1pSi+EIzeG4TPeKPc=
+github.com/gammazero/chanqueue v1.1.1 h1:n9Y+zbBxw2f7uUE9wpgs0rOSkP/I/yhDLiNuhyVjojQ=
+github.com/gammazero/chanqueue v1.1.1/go.mod h1:fMwpwEiuUgpab0sH4VHiVcEoji1pSi+EIzeG4TPeKPc=
github.com/gammazero/deque v1.0.0 h1:LTmimT8H7bXkkCy6gZX7zNLtkbz4NdS2z8LZuor3j34=
github.com/gammazero/deque v1.0.0/go.mod h1:iflpYvtGfM3U8S8j+sZEKIak3SAKYpA5/SQewgfXDKo=
github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps=
@@ -291,8 +291,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcd
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.33.1-0.20250710085426-6cfa79448bb1 h1:ZzGKxEqait8lqsEiZ7/esJKELW1/+/Y8swpRgjOZHK0=
-github.com/ipfs/boxo v0.33.1-0.20250710085426-6cfa79448bb1/go.mod h1:Cvy+GW4Noex2jaoTsOM+RYQdXhjNAk09s313vkOyYmA=
+github.com/ipfs/boxo v0.33.1 h1:89m+ksw+cYi0ecTNTJ71IRS5ZrLiovmO6XWHIOGhAEg=
+github.com/ipfs/boxo v0.33.1/go.mod h1:KwlJTzv5fb1GLlA9KyMqHQmvP+4mrFuiE3PnjdrPJHs=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk=
@@ -426,8 +426,8 @@ github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZ
github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs=
github.com/libp2p/go-flow-metrics v0.3.0 h1:q31zcHUvHnwDO0SHaukewPYgwOBSxtt830uJtUx6784=
github.com/libp2p/go-flow-metrics v0.3.0/go.mod h1:nuhlreIwEguM1IvHAew3ij7A8BMlyHQJ279ao24eZZo=
-github.com/libp2p/go-libp2p v0.42.0 h1:A8foZk+ZEhZTv0Jb++7xUFlrFhBDv4j2Vh/uq4YX+KE=
-github.com/libp2p/go-libp2p v0.42.0/go.mod h1:4NGcjbD9OIvFiSRb0XueCO19zJ4kSPK5vkyyOUYmMro=
+github.com/libp2p/go-libp2p v0.42.1 h1:Rt8+5thie729NQk1gx1h/2t/+VIafWcqR1I+Kvw+UTg=
+github.com/libp2p/go-libp2p v0.42.1/go.mod h1:4NGcjbD9OIvFiSRb0XueCO19zJ4kSPK5vkyyOUYmMro=
github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94=
github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8=
github.com/libp2p/go-libp2p-core v0.2.4/go.mod h1:STh4fdfa5vDYr0/SzYYeqnt+E6KfEV5VxfIrm0bcI0g=
@@ -844,8 +844,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
-golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM=
-golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U=
+golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=
+golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -854,8 +854,8 @@ golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE
golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
-golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/yqS/lQJ6PmkyIV3YP+o=
-golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8=
+golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 h1:R9PFI6EUdfVKgwKjZef7QIwGcBKu86OEFpJ9nUEP2l4=
+golang.org/x/exp v0.0.0-20250718183923-645b1fa84792/go.mod h1:A+z0yzpGtvnG90cToK5n2tu8UJVP2XUATh+r+sfOOOc=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -878,8 +878,8 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
-golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w=
-golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=
+golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg=
+golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -915,8 +915,8 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
-golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=
-golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=
+golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs=
+golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -1004,8 +1004,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
-golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M=
-golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA=
+golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=
+golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -1046,8 +1046,8 @@ golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4f
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
-golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo=
-golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg=
+golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0=
+golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
diff --git a/go.mod b/go.mod
index f150e066f..2b1c93567 100644
--- a/go.mod
+++ b/go.mod
@@ -22,7 +22,7 @@ require (
github.com/hashicorp/go-version v1.7.0
github.com/ipfs-shipyard/nopfs v0.0.14
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0
- github.com/ipfs/boxo v0.33.1-0.20250710085426-6cfa79448bb1
+ github.com/ipfs/boxo v0.33.1
github.com/ipfs/go-block-format v0.2.2
github.com/ipfs/go-cid v0.5.0
github.com/ipfs/go-cidutil v0.1.0
@@ -52,7 +52,7 @@ require (
github.com/jbenet/goprocess v0.1.4
github.com/julienschmidt/httprouter v1.3.0
github.com/libp2p/go-doh-resolver v0.5.0
- github.com/libp2p/go-libp2p v0.42.0
+ github.com/libp2p/go-libp2p v0.42.1
github.com/libp2p/go-libp2p-http v0.5.0
github.com/libp2p/go-libp2p-kad-dht v0.33.1
github.com/libp2p/go-libp2p-kbucket v0.7.0
@@ -86,9 +86,9 @@ require (
go.uber.org/fx v1.24.0
go.uber.org/multierr v1.11.0
go.uber.org/zap v1.27.0
- golang.org/x/crypto v0.39.0
- golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b
- golang.org/x/mod v0.25.0
+ golang.org/x/crypto v0.40.0
+ golang.org/x/exp v0.0.0-20250718183923-645b1fa84792
+ golang.org/x/mod v0.26.0
golang.org/x/sync v0.16.0
golang.org/x/sys v0.34.0
google.golang.org/protobuf v1.36.6
@@ -126,7 +126,7 @@ require (
github.com/flynn/noise v1.1.0 // indirect
github.com/francoispqt/gojay v1.2.13 // indirect
github.com/gabriel-vasile/mimetype v1.4.9 // indirect
- github.com/gammazero/chanqueue v1.1.0 // indirect
+ github.com/gammazero/chanqueue v1.1.1 // indirect
github.com/gammazero/deque v1.0.0 // indirect
github.com/getsentry/sentry-go v0.27.0 // indirect
github.com/go-jose/go-jose/v4 v4.0.5 // indirect
@@ -253,12 +253,12 @@ require (
go.uber.org/mock v0.5.2 // indirect
go.uber.org/zap/exp v0.3.0 // indirect
go4.org v0.0.0-20230225012048-214862532bf5 // indirect
- golang.org/x/net v0.41.0 // indirect
+ golang.org/x/net v0.42.0 // indirect
golang.org/x/oauth2 v0.30.0 // indirect
- golang.org/x/term v0.32.0 // indirect
- golang.org/x/text v0.26.0 // indirect
+ golang.org/x/term v0.33.0 // indirect
+ golang.org/x/text v0.27.0 // indirect
golang.org/x/time v0.12.0 // indirect
- golang.org/x/tools v0.34.0 // indirect
+ golang.org/x/tools v0.35.0 // indirect
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
gonum.org/v1/gonum v0.16.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 // indirect
diff --git a/go.sum b/go.sum
index d88a92c76..cde384a79 100644
--- a/go.sum
+++ b/go.sum
@@ -199,8 +199,8 @@ github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nos
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
github.com/gabriel-vasile/mimetype v1.4.9 h1:5k+WDwEsD9eTLL8Tz3L0VnmVh9QxGjRmjBvAG7U/oYY=
github.com/gabriel-vasile/mimetype v1.4.9/go.mod h1:WnSQhFKJuBlRyLiKohA/2DtIlPFAbguNaG7QCHcyGok=
-github.com/gammazero/chanqueue v1.1.0 h1:yiwtloc1azhgGLFo2gMloJtQvkYD936Ai7tBfa+rYJw=
-github.com/gammazero/chanqueue v1.1.0/go.mod h1:fMwpwEiuUgpab0sH4VHiVcEoji1pSi+EIzeG4TPeKPc=
+github.com/gammazero/chanqueue v1.1.1 h1:n9Y+zbBxw2f7uUE9wpgs0rOSkP/I/yhDLiNuhyVjojQ=
+github.com/gammazero/chanqueue v1.1.1/go.mod h1:fMwpwEiuUgpab0sH4VHiVcEoji1pSi+EIzeG4TPeKPc=
github.com/gammazero/deque v1.0.0 h1:LTmimT8H7bXkkCy6gZX7zNLtkbz4NdS2z8LZuor3j34=
github.com/gammazero/deque v1.0.0/go.mod h1:iflpYvtGfM3U8S8j+sZEKIak3SAKYpA5/SQewgfXDKo=
github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps=
@@ -358,8 +358,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcd
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.33.1-0.20250710085426-6cfa79448bb1 h1:ZzGKxEqait8lqsEiZ7/esJKELW1/+/Y8swpRgjOZHK0=
-github.com/ipfs/boxo v0.33.1-0.20250710085426-6cfa79448bb1/go.mod h1:Cvy+GW4Noex2jaoTsOM+RYQdXhjNAk09s313vkOyYmA=
+github.com/ipfs/boxo v0.33.1 h1:89m+ksw+cYi0ecTNTJ71IRS5ZrLiovmO6XWHIOGhAEg=
+github.com/ipfs/boxo v0.33.1/go.mod h1:KwlJTzv5fb1GLlA9KyMqHQmvP+4mrFuiE3PnjdrPJHs=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk=
@@ -509,8 +509,8 @@ github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZ
github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs=
github.com/libp2p/go-flow-metrics v0.3.0 h1:q31zcHUvHnwDO0SHaukewPYgwOBSxtt830uJtUx6784=
github.com/libp2p/go-flow-metrics v0.3.0/go.mod h1:nuhlreIwEguM1IvHAew3ij7A8BMlyHQJ279ao24eZZo=
-github.com/libp2p/go-libp2p v0.42.0 h1:A8foZk+ZEhZTv0Jb++7xUFlrFhBDv4j2Vh/uq4YX+KE=
-github.com/libp2p/go-libp2p v0.42.0/go.mod h1:4NGcjbD9OIvFiSRb0XueCO19zJ4kSPK5vkyyOUYmMro=
+github.com/libp2p/go-libp2p v0.42.1 h1:Rt8+5thie729NQk1gx1h/2t/+VIafWcqR1I+Kvw+UTg=
+github.com/libp2p/go-libp2p v0.42.1/go.mod h1:4NGcjbD9OIvFiSRb0XueCO19zJ4kSPK5vkyyOUYmMro=
github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94=
github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8=
github.com/libp2p/go-libp2p-core v0.2.4/go.mod h1:STh4fdfa5vDYr0/SzYYeqnt+E6KfEV5VxfIrm0bcI0g=
@@ -1010,8 +1010,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
-golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM=
-golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U=
+golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=
+golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -1022,8 +1022,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
-golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/yqS/lQJ6PmkyIV3YP+o=
-golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8=
+golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 h1:R9PFI6EUdfVKgwKjZef7QIwGcBKu86OEFpJ9nUEP2l4=
+golang.org/x/exp v0.0.0-20250718183923-645b1fa84792/go.mod h1:A+z0yzpGtvnG90cToK5n2tu8UJVP2XUATh+r+sfOOOc=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -1047,8 +1047,8 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
-golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w=
-golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=
+golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg=
+golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -1100,8 +1100,8 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
-golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=
-golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=
+golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs=
+golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -1207,8 +1207,8 @@ golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU=
golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY=
-golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg=
-golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ=
+golang.org/x/term v0.33.0 h1:NuFncQrRcaRvVmgRkvM3j/F00gWIAlcmlB8ACEKmGIg=
+golang.org/x/term v0.33.0/go.mod h1:s18+ql9tYWp1IfpV9DmCtQDDSRBUjKaw9M1eAv5UeF0=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -1220,8 +1220,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
-golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M=
-golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA=
+golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=
+golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -1279,8 +1279,8 @@ golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4f
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
-golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo=
-golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg=
+golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0=
+golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index 367cfd049..d206092f2 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -130,7 +130,7 @@ require (
github.com/huin/goupnp v1.3.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/ipfs/bbloom v0.0.4 // indirect
- github.com/ipfs/boxo v0.33.1-0.20250710085426-6cfa79448bb1 // indirect
+ github.com/ipfs/boxo v0.33.1 // indirect
github.com/ipfs/go-bitfield v1.1.0 // indirect
github.com/ipfs/go-block-format v0.2.2 // indirect
github.com/ipfs/go-cid v0.5.0 // indirect
@@ -168,7 +168,7 @@ require (
github.com/libp2p/go-buffer-pool v0.1.0 // indirect
github.com/libp2p/go-cidranger v1.1.0 // indirect
github.com/libp2p/go-flow-metrics v0.3.0 // indirect
- github.com/libp2p/go-libp2p v0.42.0 // indirect
+ github.com/libp2p/go-libp2p v0.42.1 // indirect
github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect
github.com/libp2p/go-libp2p-kad-dht v0.33.1 // indirect
github.com/libp2p/go-libp2p-kbucket v0.7.0 // indirect
@@ -310,17 +310,17 @@ require (
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.27.0 // indirect
go.uber.org/zap/exp v0.3.0 // indirect
- golang.org/x/crypto v0.39.0 // indirect
- golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b // indirect
+ golang.org/x/crypto v0.40.0 // indirect
+ golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 // indirect
golang.org/x/exp/typeparams v0.0.0-20240314144324-c7f7c6466f7f // indirect
- golang.org/x/mod v0.25.0 // indirect
- golang.org/x/net v0.41.0 // indirect
+ golang.org/x/mod v0.26.0 // indirect
+ golang.org/x/net v0.42.0 // indirect
golang.org/x/sync v0.16.0 // indirect
golang.org/x/sys v0.34.0 // indirect
- golang.org/x/term v0.32.0 // indirect
- golang.org/x/text v0.26.0 // indirect
+ golang.org/x/term v0.33.0 // indirect
+ golang.org/x/text v0.27.0 // indirect
golang.org/x/time v0.12.0 // indirect
- golang.org/x/tools v0.34.0 // indirect
+ golang.org/x/tools v0.35.0 // indirect
gonum.org/v1/gonum v0.16.0 // indirect
google.golang.org/protobuf v1.36.6 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index fd6eee283..5b9955d05 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -175,8 +175,8 @@ github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nos
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo=
github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA=
-github.com/gammazero/chanqueue v1.1.0 h1:yiwtloc1azhgGLFo2gMloJtQvkYD936Ai7tBfa+rYJw=
-github.com/gammazero/chanqueue v1.1.0/go.mod h1:fMwpwEiuUgpab0sH4VHiVcEoji1pSi+EIzeG4TPeKPc=
+github.com/gammazero/chanqueue v1.1.1 h1:n9Y+zbBxw2f7uUE9wpgs0rOSkP/I/yhDLiNuhyVjojQ=
+github.com/gammazero/chanqueue v1.1.1/go.mod h1:fMwpwEiuUgpab0sH4VHiVcEoji1pSi+EIzeG4TPeKPc=
github.com/gammazero/deque v1.0.0 h1:LTmimT8H7bXkkCy6gZX7zNLtkbz4NdS2z8LZuor3j34=
github.com/gammazero/deque v1.0.0/go.mod h1:iflpYvtGfM3U8S8j+sZEKIak3SAKYpA5/SQewgfXDKo=
github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps=
@@ -319,8 +319,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.33.1-0.20250710085426-6cfa79448bb1 h1:ZzGKxEqait8lqsEiZ7/esJKELW1/+/Y8swpRgjOZHK0=
-github.com/ipfs/boxo v0.33.1-0.20250710085426-6cfa79448bb1/go.mod h1:Cvy+GW4Noex2jaoTsOM+RYQdXhjNAk09s313vkOyYmA=
+github.com/ipfs/boxo v0.33.1 h1:89m+ksw+cYi0ecTNTJ71IRS5ZrLiovmO6XWHIOGhAEg=
+github.com/ipfs/boxo v0.33.1/go.mod h1:KwlJTzv5fb1GLlA9KyMqHQmvP+4mrFuiE3PnjdrPJHs=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-block-format v0.2.2 h1:uecCTgRwDIXyZPgYspaLXoMiMmxQpSx2aq34eNc4YvQ=
@@ -425,8 +425,8 @@ github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38y
github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic=
github.com/libp2p/go-flow-metrics v0.3.0 h1:q31zcHUvHnwDO0SHaukewPYgwOBSxtt830uJtUx6784=
github.com/libp2p/go-flow-metrics v0.3.0/go.mod h1:nuhlreIwEguM1IvHAew3ij7A8BMlyHQJ279ao24eZZo=
-github.com/libp2p/go-libp2p v0.42.0 h1:A8foZk+ZEhZTv0Jb++7xUFlrFhBDv4j2Vh/uq4YX+KE=
-github.com/libp2p/go-libp2p v0.42.0/go.mod h1:4NGcjbD9OIvFiSRb0XueCO19zJ4kSPK5vkyyOUYmMro=
+github.com/libp2p/go-libp2p v0.42.1 h1:Rt8+5thie729NQk1gx1h/2t/+VIafWcqR1I+Kvw+UTg=
+github.com/libp2p/go-libp2p v0.42.1/go.mod h1:4NGcjbD9OIvFiSRb0XueCO19zJ4kSPK5vkyyOUYmMro=
github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94=
github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8=
github.com/libp2p/go-libp2p-kad-dht v0.33.1 h1:hKFhHMf7WH69LDjaxsJUWOU6qZm71uO47M/a5ijkiP0=
@@ -864,11 +864,11 @@ golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
-golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM=
-golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U=
+golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=
+golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/yqS/lQJ6PmkyIV3YP+o=
-golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8=
+golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 h1:R9PFI6EUdfVKgwKjZef7QIwGcBKu86OEFpJ9nUEP2l4=
+golang.org/x/exp v0.0.0-20250718183923-645b1fa84792/go.mod h1:A+z0yzpGtvnG90cToK5n2tu8UJVP2XUATh+r+sfOOOc=
golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
golang.org/x/exp/typeparams v0.0.0-20240314144324-c7f7c6466f7f h1:phY1HzDcf18Aq9A8KkmRtY9WvOFIxN8wgfvy6Zm1DV8=
@@ -893,8 +893,8 @@ golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
-golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w=
-golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=
+golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg=
+golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -926,8 +926,8 @@ golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
-golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=
-golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=
+golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs=
+golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -1004,8 +1004,8 @@ golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY=
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58=
-golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg=
-golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ=
+golang.org/x/term v0.33.0 h1:NuFncQrRcaRvVmgRkvM3j/F00gWIAlcmlB8ACEKmGIg=
+golang.org/x/term v0.33.0/go.mod h1:s18+ql9tYWp1IfpV9DmCtQDDSRBUjKaw9M1eAv5UeF0=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
@@ -1020,8 +1020,8 @@ golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
-golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M=
-golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA=
+golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=
+golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE=
@@ -1059,8 +1059,12 @@ golang.org/x/tools v0.11.0/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8
golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg=
golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc=
-golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo=
-golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg=
+golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0=
+golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw=
+golang.org/x/tools/go/expect v0.1.0-deprecated h1:jY2C5HGYR5lqex3gEniOQL0r7Dq5+VGVgY1nudX5lXY=
+golang.org/x/tools/go/expect v0.1.0-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY=
+golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated h1:1h2MnaIAIXISqTFKdENegdpAgUXz6NrPEsbIeWaBRvM=
+golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated/go.mod h1:RVAQXBGNv1ib0J382/DPCRS/BPnsGebyM1Gj5VSDpG8=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
From 017d5003f269cfa19589420bdf5bf4a59472a158 Mon Sep 17 00:00:00 2001
From: Hector Sanjuan
Date: Thu, 31 Jul 2025 16:13:47 +0200
Subject: [PATCH 298/499] Bitswap: use a single ConnectEventManager.
After boxo v0.33.1, this is a recommended step to fix http retrieval bugs.
Having a single ConnectEventManager prevents misdirected operations in the
network.Router to change the Connectedness state in a way that the counterpart
(httpnet or bsnet) can later correct.
---
core/node/bitswap.go | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/core/node/bitswap.go b/core/node/bitswap.go
index 976d82765..cb2e832d8 100644
--- a/core/node/bitswap.go
+++ b/core/node/bitswap.go
@@ -88,9 +88,14 @@ func Bitswap(serverEnabled, libp2pEnabled, httpEnabled bool) interface{} {
var bitswapNetworks, bitswapLibp2p network.BitSwapNetwork
var bitswapBlockstore blockstore.Blockstore = in.Bs
+ connEvtMgr := network.NewConnectEventManager()
+
libp2pEnabled := in.Cfg.Bitswap.Libp2pEnabled.WithDefault(config.DefaultBitswapLibp2pEnabled)
if libp2pEnabled {
- bitswapLibp2p = bsnet.NewFromIpfsHost(in.Host)
+ bitswapLibp2p = bsnet.NewFromIpfsHost(
+ in.Host,
+ bsnet.WithConnectEventManager(connEvtMgr),
+ )
}
if httpEnabled {
@@ -112,6 +117,7 @@ func Bitswap(serverEnabled, libp2pEnabled, httpEnabled bool) interface{} {
httpnet.WithMaxBlockSize(int64(maxBlockSize)),
httpnet.WithUserAgent(version.GetUserAgentVersion()),
httpnet.WithMetricsLabelsForEndpoints(httpCfg.Allowlist),
+ httpnet.WithConnectEventManager(connEvtMgr),
)
bitswapNetworks = network.New(in.Host.Peerstore(), bitswapLibp2p, bitswapHTTP)
} else if libp2pEnabled {
From 8862a5e58e03c7f52358d475df5c67fd462a01c8 Mon Sep 17 00:00:00 2001
From: sukun
Date: Thu, 31 Jul 2025 20:00:13 +0530
Subject: [PATCH 299/499] chore: update go-libp2p and p2p-forge (#10887)
* chore: update go-libp2p and p2p-forge
* docs: changelog
---------
Co-authored-by: Marcin Rataj
---
docs/changelogs/v0.37.md | 2 ++
docs/examples/kubo-as-a-library/go.mod | 2 +-
docs/examples/kubo-as-a-library/go.sum | 4 ++--
go.mod | 2 +-
go.sum | 4 ++--
test/dependencies/go.mod | 2 +-
test/dependencies/go.sum | 4 ++--
7 files changed, 11 insertions(+), 9 deletions(-)
diff --git a/docs/changelogs/v0.37.md b/docs/changelogs/v0.37.md
index c5b619633..77406b8c9 100644
--- a/docs/changelogs/v0.37.md
+++ b/docs/changelogs/v0.37.md
@@ -41,6 +41,8 @@ Removed unnecessary packages from the `thirdparty` area of kubo repositroy.
#### ๐ฆ๏ธ Important dependency updates
+- update `go-libp2p` to [v0.42.1](https://github.com/libp2p/go-libp2p/releases/tag/v0.42.1)
+- update `p2p-forge/client` to [v0.6.1](https://github.com/ipshipyard/p2p-forge/releases/tag/v0.6.1)
- update `boxo` to [v0.33.1](https://github.com/ipfs/boxo/releases/tag/v0.33.1)
### ๐ Changelog
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index 7e7593bb1..5c01ebefe 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -99,7 +99,7 @@ require (
github.com/ipld/go-car/v2 v2.14.3 // indirect
github.com/ipld/go-codec-dagpb v1.7.0 // indirect
github.com/ipld/go-ipld-prime v0.21.0 // indirect
- github.com/ipshipyard/p2p-forge v0.6.0 // indirect
+ github.com/ipshipyard/p2p-forge v0.6.1 // indirect
github.com/jackpal/go-nat-pmp v1.0.2 // indirect
github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect
github.com/jbenet/goprocess v0.1.4 // indirect
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index d68a5ed46..40692a807 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -368,8 +368,8 @@ github.com/ipld/go-ipld-prime v0.21.0 h1:n4JmcpOlPDIxBcY037SVfpd1G+Sj1nKZah0m6QH
github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOanyMctpPjsvxQ=
github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd h1:gMlw/MhNr2Wtp5RwGdsW23cs+yCuj9k2ON7i9MiJlRo=
github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd/go.mod h1:wZ8hH8UxeryOs4kJEJaiui/s00hDSbE37OKsL47g+Sw=
-github.com/ipshipyard/p2p-forge v0.6.0 h1:kNhYxgYGtqF3MLts/i0hw+7ygtgNB4Qv8h6fo7j6Iq4=
-github.com/ipshipyard/p2p-forge v0.6.0/go.mod h1:pj8Zcs+ex5OMq5a1bFLHqW0oL3qYO0v5eGLZmit0l7U=
+github.com/ipshipyard/p2p-forge v0.6.1 h1:987/hUC1YxI56CcMX6iTB+9BLjFV0d2SJnig9Z1pf8A=
+github.com/ipshipyard/p2p-forge v0.6.1/go.mod h1:pj8Zcs+ex5OMq5a1bFLHqW0oL3qYO0v5eGLZmit0l7U=
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA=
diff --git a/go.mod b/go.mod
index 2b1c93567..79b803861 100644
--- a/go.mod
+++ b/go.mod
@@ -47,7 +47,7 @@ require (
github.com/ipld/go-car/v2 v2.14.3
github.com/ipld/go-codec-dagpb v1.7.0
github.com/ipld/go-ipld-prime v0.21.0
- github.com/ipshipyard/p2p-forge v0.6.0
+ github.com/ipshipyard/p2p-forge v0.6.1
github.com/jbenet/go-temp-err-catcher v0.1.0
github.com/jbenet/goprocess v0.1.4
github.com/julienschmidt/httprouter v1.3.0
diff --git a/go.sum b/go.sum
index cde384a79..1e225d83a 100644
--- a/go.sum
+++ b/go.sum
@@ -439,8 +439,8 @@ github.com/ipld/go-ipld-prime v0.21.0 h1:n4JmcpOlPDIxBcY037SVfpd1G+Sj1nKZah0m6QH
github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOanyMctpPjsvxQ=
github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd h1:gMlw/MhNr2Wtp5RwGdsW23cs+yCuj9k2ON7i9MiJlRo=
github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd/go.mod h1:wZ8hH8UxeryOs4kJEJaiui/s00hDSbE37OKsL47g+Sw=
-github.com/ipshipyard/p2p-forge v0.6.0 h1:kNhYxgYGtqF3MLts/i0hw+7ygtgNB4Qv8h6fo7j6Iq4=
-github.com/ipshipyard/p2p-forge v0.6.0/go.mod h1:pj8Zcs+ex5OMq5a1bFLHqW0oL3qYO0v5eGLZmit0l7U=
+github.com/ipshipyard/p2p-forge v0.6.1 h1:987/hUC1YxI56CcMX6iTB+9BLjFV0d2SJnig9Z1pf8A=
+github.com/ipshipyard/p2p-forge v0.6.1/go.mod h1:pj8Zcs+ex5OMq5a1bFLHqW0oL3qYO0v5eGLZmit0l7U=
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
github.com/jbenet/go-cienv v0.1.0 h1:Vc/s0QbQtoxX8MwwSLWWh+xNNZvM3Lw7NsTcHrvvhMc=
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index d206092f2..6fdd5cc38 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -141,7 +141,7 @@ require (
github.com/ipfs/kubo v0.31.0 // indirect
github.com/ipld/go-codec-dagpb v1.7.0 // indirect
github.com/ipld/go-ipld-prime v0.21.0 // indirect
- github.com/ipshipyard/p2p-forge v0.6.0 // indirect
+ github.com/ipshipyard/p2p-forge v0.6.1 // indirect
github.com/jackpal/go-nat-pmp v1.0.2 // indirect
github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect
github.com/jgautheron/goconst v1.7.1 // indirect
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index 5b9955d05..7fe8af796 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -359,8 +359,8 @@ github.com/ipld/go-codec-dagpb v1.7.0 h1:hpuvQjCSVSLnTnHXn+QAMR0mLmb1gA6wl10LExo
github.com/ipld/go-codec-dagpb v1.7.0/go.mod h1:rD3Zg+zub9ZnxcLwfol/OTQRVjaLzXypgy4UqHQvilM=
github.com/ipld/go-ipld-prime v0.21.0 h1:n4JmcpOlPDIxBcY037SVfpd1G+Sj1nKZah0m6QH9C2E=
github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOanyMctpPjsvxQ=
-github.com/ipshipyard/p2p-forge v0.6.0 h1:kNhYxgYGtqF3MLts/i0hw+7ygtgNB4Qv8h6fo7j6Iq4=
-github.com/ipshipyard/p2p-forge v0.6.0/go.mod h1:pj8Zcs+ex5OMq5a1bFLHqW0oL3qYO0v5eGLZmit0l7U=
+github.com/ipshipyard/p2p-forge v0.6.1 h1:987/hUC1YxI56CcMX6iTB+9BLjFV0d2SJnig9Z1pf8A=
+github.com/ipshipyard/p2p-forge v0.6.1/go.mod h1:pj8Zcs+ex5OMq5a1bFLHqW0oL3qYO0v5eGLZmit0l7U=
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
github.com/jbenet/go-temp-err-catcher v0.1.0 h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABoLk/+KKHggpk=
From 19300f2d3faa26d29892a5d46900b3f591114db9 Mon Sep 17 00:00:00 2001
From: Hector Sanjuan
Date: Fri, 1 Aug 2025 12:22:13 +0200
Subject: [PATCH 300/499] core: Add a ContentDiscovery field
No behaviour changes.
Currently we are using ProvideManyRouter for Bitswap, which is only meant to
use ContentDiscovery. This makes things more clear in that there is a
designated ContentDiscovery instance.
---
core/core.go | 1 +
core/node/bitswap.go | 6 +++---
core/node/groups.go | 2 ++
core/node/libp2p/routing.go | 8 +++++++-
4 files changed, 13 insertions(+), 4 deletions(-)
diff --git a/core/core.go b/core/core.go
index 186da1f09..085ca2c5f 100644
--- a/core/core.go
+++ b/core/core.go
@@ -98,6 +98,7 @@ type IpfsNode struct {
Filters *ma.Filters `optional:"true"`
Bootstrapper io.Closer `optional:"true"` // the periodic bootstrapper
Routing irouting.ProvideManyRouter `optional:"true"` // the routing system. recommend ipfs-dht
+ ContentDiscovery routing.ContentDiscovery `optional:"true"` // the discovery part of the routing system
DNSResolver *madns.Resolver // the DNS resolver
IPLDPathResolver pathresolver.Resolver `name:"ipldPathResolver"` // The IPLD path resolver
UnixFSPathResolver pathresolver.Resolver `name:"unixFSPathResolver"` // The UnixFS path resolver
diff --git a/core/node/bitswap.go b/core/node/bitswap.go
index 976d82765..dc3f7c207 100644
--- a/core/node/bitswap.go
+++ b/core/node/bitswap.go
@@ -21,9 +21,9 @@ import (
ipld "github.com/ipfs/go-ipld-format"
version "github.com/ipfs/kubo"
"github.com/ipfs/kubo/config"
- irouting "github.com/ipfs/kubo/routing"
"github.com/libp2p/go-libp2p/core/host"
peer "github.com/libp2p/go-libp2p/core/peer"
+ "github.com/libp2p/go-libp2p/core/routing"
"go.uber.org/fx"
blocks "github.com/ipfs/go-block-format"
@@ -75,7 +75,7 @@ type bitswapIn struct {
Mctx helpers.MetricsCtx
Cfg *config.Config
Host host.Host
- Rt irouting.ProvideManyRouter
+ Discovery routing.ContentDiscovery
Bs blockstore.GCBlockstore
BitswapOpts []bitswap.Option `group:"bitswap-options"`
}
@@ -178,7 +178,7 @@ func Bitswap(serverEnabled, libp2pEnabled, httpEnabled bool) interface{} {
ignoredPeerIDs = append(ignoredPeerIDs, pid)
}
providerQueryMgr, err := rpqm.New(bitswapNetworks,
- in.Rt,
+ in.Discovery,
rpqm.WithMaxProviders(maxProviders),
rpqm.WithIgnoreProviders(ignoredPeerIDs...),
)
diff --git a/core/node/groups.go b/core/node/groups.go
index 9d53aeef5..9925d3bd6 100644
--- a/core/node/groups.go
+++ b/core/node/groups.go
@@ -216,6 +216,7 @@ func LibP2P(bcfg *BuildCfg, cfg *config.Config, userResourceOverrides rcmgr.Part
fx.Provide(libp2p.Routing),
fx.Provide(libp2p.ContentRouting),
+ fx.Provide(libp2p.ContentDiscovery),
fx.Provide(libp2p.BaseRouting(cfg)),
maybeProvide(libp2p.PubsubRouter, bcfg.getOpt("ipnsps")),
@@ -380,6 +381,7 @@ func Offline(cfg *config.Config) fx.Option {
fx.Provide(libp2p.Routing),
fx.Provide(libp2p.ContentRouting),
fx.Provide(libp2p.OfflineRouting),
+ fx.Provide(libp2p.ContentDiscovery),
OfflineProviders(),
)
}
diff --git a/core/node/libp2p/routing.go b/core/node/libp2p/routing.go
index 94c99e5dd..86ead0277 100644
--- a/core/node/libp2p/routing.go
+++ b/core/node/libp2p/routing.go
@@ -177,6 +177,12 @@ func ContentRouting(in p2pOnlineContentRoutingIn) routing.ContentRouting {
}
}
+// ContentDiscovery narrows down the given content routing facility so that it
+// only does discovery.
+func ContentDiscovery(in irouting.ProvideManyRouter) routing.ContentDiscovery {
+ return in
+}
+
type p2pOnlineRoutingIn struct {
fx.In
@@ -185,7 +191,7 @@ type p2pOnlineRoutingIn struct {
}
// Routing will get all routers obtained from different methods (delegated
-// routers, pub-sub, and so on) and add them all together using a TieredRouter.
+// routers, pub-sub, and so on) and add them all together using a ParallelRouter.
func Routing(in p2pOnlineRoutingIn) irouting.ProvideManyRouter {
routers := in.Routers
From 458ad45bbef5a9799bb91e8b9ba44a1be4abfd85 Mon Sep 17 00:00:00 2001
From: Ankita Sahu <71656941+SAHU-01@users.noreply.github.com>
Date: Tue, 5 Aug 2025 19:58:09 +0530
Subject: [PATCH 301/499] docs:added GOLOG_LOG_LEVEL to debug-guide for logging
more info (#10894)
---
docs/debug-guide.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/docs/debug-guide.md b/docs/debug-guide.md
index 74034f41f..7268ef6bc 100644
--- a/docs/debug-guide.md
+++ b/docs/debug-guide.md
@@ -15,6 +15,8 @@ This is a document for helping debug Kubo. Please add to it if you can!
### Beginning
+> **Note:** Enable more logs by setting `GOLOG_LOG_LEVEL` env variable when troubleshooting. See [go-log documentation](https://github.com/ipfs/go-log#golog_log_level) for configuration options and available log levels.
+
When you see ipfs doing something (using lots of CPU, memory, or otherwise
being weird), the first thing you want to do is gather all the relevant
profiling information.
From 47b31fe0c37e5d0660654e20f33fca36c69057fb Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Tue, 5 Aug 2025 23:47:23 +0200
Subject: [PATCH 302/499] feat(daemon): accelerated client startup note
(#10859)
this ensures user is not expecting improved performance from the start
and also they know when they run accelerated client, which is pretty
expensive
---
cmd/ipfs/kubo/daemon.go | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/cmd/ipfs/kubo/daemon.go b/cmd/ipfs/kubo/daemon.go
index 94b633f79..c6fb6b8cb 100644
--- a/cmd/ipfs/kubo/daemon.go
+++ b/cmd/ipfs/kubo/daemon.go
@@ -646,6 +646,17 @@ take effect.
โ ๏ธ Local CIDs will not be announced to Amino DHT, making them impossible to retrieve without manual peering
โ ๏ธ If this is not intentional, call 'ipfs config profile apply announce-on', or set 'Reprovider.Interval=22h'
+`)
+ }
+
+ // Inform user about Routing.AcceleratedDHTClient when enabled
+ if cfg.Routing.AcceleratedDHTClient.WithDefault(config.DefaultAcceleratedDHTClient) {
+ fmt.Print(`
+
+โน๏ธ Routing.AcceleratedDHTClient is enabled for faster content discovery
+โน๏ธ and DHT provides. Routing table is initializing. IPFS is ready to use,
+โน๏ธ but performance will improve over time as more peers are discovered
+
`)
}
From 90b73d2ad2d74bf85983b8bb9d1178c92c88b55c Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Tue, 5 Aug 2025 15:33:45 -0700
Subject: [PATCH 303/499] refactor: remove goprocess (#10872)
* refactor: remove goprocess
The `goprocess` package is no longer needed. It can be replaces by modern `context` and `context.AfterFunc`.
* mod tidy
* log unmount errors on shutdown
* Do not log non-mounted errors on shutdown
* Use WaitGroup associated with IPFS node to wait for services to whutdown
* Prefer explicit Close to context.ArterFunc
* Do not use node-level WaitGroup
* Unmount for non-supported platforms
* fix return values
* test: daemon shuts down gracefully
make sure ongoing operations dont block shutdown
* test(cli): add TestFUSE
* test: smarter RequiresFUSE
opportunistically run FUSE tests if env has fusermount
and TEST_FUSE was not explicitly set
* docs: changelog
---------
Co-authored-by: gammazero
Co-authored-by: Marcin Rataj
---
cmd/ipfs/kubo/daemon.go | 49 +++++---
cmd/ipfswatch/main.go | 10 +-
core/core.go | 4 +-
core/corehttp/corehttp.go | 33 +++--
core/node/groups.go | 2 -
core/node/helpers.go | 12 --
docs/changelogs/v0.37.md | 11 +-
docs/examples/kubo-as-a-library/go.mod | 1 -
docs/examples/kubo-as-a-library/go.sum | 2 -
fuse/ipns/mount_unix.go | 2 +-
fuse/mfs/mount_unix.go | 2 +-
fuse/mount/fuse.go | 23 ++--
fuse/mount/mount.go | 5 -
fuse/node/mount_nofuse.go | 4 +
fuse/node/mount_notsupp.go | 4 +
fuse/node/mount_unix.go | 34 +++--
fuse/node/mount_windows.go | 6 +
fuse/readonly/mount_unix.go | 2 +-
go.mod | 1 -
go.sum | 3 -
test/cli/daemon_test.go | 131 +++++++++++++++++++
test/cli/fuse_test.go | 166 +++++++++++++++++++++++++
test/cli/testutils/requires.go | 44 ++++++-
23 files changed, 453 insertions(+), 98 deletions(-)
create mode 100644 test/cli/fuse_test.go
diff --git a/cmd/ipfs/kubo/daemon.go b/cmd/ipfs/kubo/daemon.go
index c6fb6b8cb..e52e68906 100644
--- a/cmd/ipfs/kubo/daemon.go
+++ b/cmd/ipfs/kubo/daemon.go
@@ -35,7 +35,6 @@ import (
fsrepo "github.com/ipfs/kubo/repo/fsrepo"
"github.com/ipfs/kubo/repo/fsrepo/migrations"
"github.com/ipfs/kubo/repo/fsrepo/migrations/ipfsfetcher"
- goprocess "github.com/jbenet/goprocess"
p2pcrypto "github.com/libp2p/go-libp2p/core/crypto"
pnet "github.com/libp2p/go-libp2p/core/pnet"
"github.com/libp2p/go-libp2p/core/protocol"
@@ -537,10 +536,19 @@ take effect.
if err != nil {
return err
}
+
+ pluginErrc := make(chan error, 1)
select {
- case <-node.Process.Closing():
+ case <-node.Context().Done():
+ close(pluginErrc)
default:
- node.Process.AddChild(goprocess.WithTeardown(cctx.Plugins.Close))
+ context.AfterFunc(node.Context(), func() {
+ err := cctx.Plugins.Close()
+ if err != nil {
+ pluginErrc <- fmt.Errorf("closing plugins: %w", err)
+ }
+ close(pluginErrc)
+ })
}
// construct api endpoint - every time
@@ -558,6 +566,11 @@ take effect.
if err := mountFuse(req, cctx); err != nil {
return err
}
+ defer func() {
+ if _err != nil {
+ nodeMount.Unmount(node)
+ }
+ }()
}
// repo blockstore GC - if --enable-gc flag is present
@@ -703,10 +716,17 @@ take effect.
log.Fatal("Support for IPFS_REUSEPORT was removed. Use LIBP2P_TCP_REUSEPORT instead.")
}
+ unmountErrc := make(chan error)
+ context.AfterFunc(node.Context(), func() {
+ <-node.Context().Done()
+ nodeMount.Unmount(node)
+ close(unmountErrc)
+ })
+
// collect long-running errors and block for shutdown
// TODO(cryptix): our fuse currently doesn't follow this pattern for graceful shutdown
var errs error
- for err := range merge(apiErrc, gwErrc, gcErrc, p2pGwErrc) {
+ for err := range merge(apiErrc, gwErrc, gcErrc, p2pGwErrc, pluginErrc, unmountErrc) {
if err != nil {
errs = multierr.Append(errs, err)
}
@@ -1053,14 +1073,13 @@ func serveTrustlessGatewayOverLibp2p(cctx *oldcmds.Context) (<-chan error, error
errc := make(chan error, 1)
go func() {
- defer close(errc)
errc <- h.Serve()
+ close(errc)
}()
- go func() {
- <-node.Process.Closing()
+ context.AfterFunc(node.Context(), func() {
h.Close()
- }()
+ })
return errc, nil
}
@@ -1145,14 +1164,14 @@ func maybeRunGC(req *cmds.Request, node *core.IpfsNode) (<-chan error, error) {
return errc, nil
}
-// merge does fan-in of multiple read-only error channels
-// taken from http://blog.golang.org/pipelines
+// merge does fan-in of multiple read-only error channels.
func merge(cs ...<-chan error) <-chan error {
var wg sync.WaitGroup
out := make(chan error)
- // Start an output goroutine for each input channel in cs. output
- // copies values from c to out until c is closed, then calls wg.Done.
+ // Start a goroutine for each input channel in cs, that copies values from
+ // the input channel to the output channel until the input channel is
+ // closed.
output := func(c <-chan error) {
for n := range c {
out <- n
@@ -1166,8 +1185,8 @@ func merge(cs ...<-chan error) <-chan error {
}
}
- // Start a goroutine to close out once all the output goroutines are
- // done. This must start after the wg.Add call.
+ // Start a goroutine to close out once all the output goroutines, and other
+ // things to wait on, are done.
go func() {
wg.Wait()
close(out)
@@ -1238,8 +1257,6 @@ Visit https://github.com/ipfs/kubo/releases or https://dist.ipfs.tech/#kubo and
select {
case <-ctx.Done():
return
- case <-nd.Process.Closing():
- return
case <-ticker.C:
continue
}
diff --git a/cmd/ipfswatch/main.go b/cmd/ipfswatch/main.go
index 6850f6423..3178cf564 100644
--- a/cmd/ipfswatch/main.go
+++ b/cmd/ipfswatch/main.go
@@ -21,7 +21,6 @@ import (
fsnotify "github.com/fsnotify/fsnotify"
"github.com/ipfs/boxo/files"
- process "github.com/jbenet/goprocess"
)
var (
@@ -54,7 +53,6 @@ func main() {
}
func run(ipfsPath, watchPath string) error {
- proc := process.WithParent(process.Background())
log.Printf("running IPFSWatch on '%s' using repo at '%s'...", watchPath, ipfsPath)
ipfsPath, err := fsutil.ExpandHome(ipfsPath)
@@ -99,11 +97,11 @@ func run(ipfsPath, watchPath string) error {
corehttp.WebUIOption,
corehttp.CommandsOption(cmdCtx(node, ipfsPath)),
}
- proc.Go(func(p process.Process) {
+ go func() {
if err := corehttp.ListenAndServe(node, addr, opts...); err != nil {
return
}
- })
+ }()
}
interrupts := make(chan os.Signal, 1)
@@ -137,7 +135,7 @@ func run(ipfsPath, watchPath string) error {
}
}
}
- proc.Go(func(p process.Process) {
+ go func() {
file, err := os.Open(e.Name)
if err != nil {
log.Println(err)
@@ -162,7 +160,7 @@ func run(ipfsPath, watchPath string) error {
log.Println(err)
}
log.Printf("added %s... key: %s", e.Name, k)
- })
+ }()
}
case err := <-watcher.Errors:
log.Println(err)
diff --git a/core/core.go b/core/core.go
index 085ca2c5f..c693600f7 100644
--- a/core/core.go
+++ b/core/core.go
@@ -29,7 +29,6 @@ import (
provider "github.com/ipfs/boxo/provider"
ipld "github.com/ipfs/go-ipld-format"
logging "github.com/ipfs/go-log/v2"
- goprocess "github.com/jbenet/goprocess"
ddht "github.com/libp2p/go-libp2p-kad-dht/dual"
pubsub "github.com/libp2p/go-libp2p-pubsub"
psrouter "github.com/libp2p/go-libp2p-pubsub-router"
@@ -119,8 +118,7 @@ type IpfsNode struct {
P2P *p2p.P2P `optional:"true"`
- Process goprocess.Process
- ctx context.Context
+ ctx context.Context
stop func() error
diff --git a/core/corehttp/corehttp.go b/core/corehttp/corehttp.go
index 595a0aa5f..344991923 100644
--- a/core/corehttp/corehttp.go
+++ b/core/corehttp/corehttp.go
@@ -13,8 +13,6 @@ import (
logging "github.com/ipfs/go-log/v2"
core "github.com/ipfs/kubo/core"
- "github.com/jbenet/goprocess"
- periodicproc "github.com/jbenet/goprocess/periodic"
ma "github.com/multiformats/go-multiaddr"
manet "github.com/multiformats/go-multiaddr/net"
)
@@ -97,7 +95,7 @@ func Serve(node *core.IpfsNode, lis net.Listener, options ...ServeOption) error
}
select {
- case <-node.Process.Closing():
+ case <-node.Context().Done():
return fmt.Errorf("failed to start server, process closing")
default:
}
@@ -107,20 +105,31 @@ func Serve(node *core.IpfsNode, lis net.Listener, options ...ServeOption) error
}
var serverError error
- serverProc := node.Process.Go(func(p goprocess.Process) {
+ serverClosed := make(chan struct{})
+ go func() {
serverError = server.Serve(lis)
- })
+ close(serverClosed)
+ }()
// wait for server to exit.
select {
- case <-serverProc.Closed():
+ case <-serverClosed:
// if node being closed before server exits, close server
- case <-node.Process.Closing():
+ case <-node.Context().Done():
log.Infof("server at %s terminating...", addr)
- warnProc := periodicproc.Tick(5*time.Second, func(_ goprocess.Process) {
- log.Infof("waiting for server at %s to terminate...", addr)
- })
+ go func() {
+ ticker := time.NewTicker(5 * time.Second)
+ defer ticker.Stop()
+ for {
+ select {
+ case <-ticker.C:
+ log.Infof("waiting for server at %s to terminate...", addr)
+ case <-serverClosed:
+ return
+ }
+ }
+ }()
// This timeout shouldn't be necessary if all of our commands
// are obeying their contexts but we should have *some* timeout.
@@ -130,10 +139,8 @@ func Serve(node *core.IpfsNode, lis net.Listener, options ...ServeOption) error
// Should have already closed but we still need to wait for it
// to set the error.
- <-serverProc.Closed()
+ <-serverClosed
serverError = err
-
- warnProc.Close()
}
log.Infof("server at %s terminated", addr)
diff --git a/core/node/groups.go b/core/node/groups.go
index 9925d3bd6..5b16b5527 100644
--- a/core/node/groups.go
+++ b/core/node/groups.go
@@ -445,8 +445,6 @@ func IPFS(ctx context.Context, bcfg *BuildCfg) fx.Option {
return fx.Options(
bcfgOpts,
- fx.Provide(baseProcess),
-
Storage(bcfg, cfg),
Identity(cfg),
IPNS,
diff --git a/core/node/helpers.go b/core/node/helpers.go
index 491d627bf..05cccfd01 100644
--- a/core/node/helpers.go
+++ b/core/node/helpers.go
@@ -4,7 +4,6 @@ import (
"context"
"errors"
- "github.com/jbenet/goprocess"
"go.uber.org/fx"
)
@@ -55,14 +54,3 @@ func maybeInvoke(opt interface{}, enable bool) fx.Option {
}
return fx.Options()
}
-
-// baseProcess creates a goprocess which is closed when the lifecycle signals it to stop
-func baseProcess(lc fx.Lifecycle) goprocess.Process {
- p := goprocess.WithParent(goprocess.Background())
- lc.Append(fx.Hook{
- OnStop: func(_ context.Context) error {
- return p.Close()
- },
- })
- return p
-}
diff --git a/docs/changelogs/v0.37.md b/docs/changelogs/v0.37.md
index 77406b8c9..72e15d2da 100644
--- a/docs/changelogs/v0.37.md
+++ b/docs/changelogs/v0.37.md
@@ -11,7 +11,7 @@ This release was brought to you by the [Interplanetary Shipyard](https://ipship
- [Overview](#overview)
- [๐ฆ Highlights](#-highlights)
- [Clear provide queue when reprovide strategy changes](#clear-provide-queue-when-reprovide-strategy-changes)
- - [Remove unnecessary packages from thirdparty](#remove-unnecessary-packages-from-thirdparty)
+ - [Removed unnecessary dependencies](#removed-unnecessary-dependencies)
- [๐ฆ๏ธ Important dependency updates](#-important-dependency-updates)
- [๐ Changelog](#-changelog)
- [๐จโ๐ฉโ๐งโ๐ฆ Contributors](#-contributors)
@@ -31,13 +31,16 @@ A new `ipfs provide clear` command also allows manual queue clearing for debuggi
> [!NOTE]
> Upgrading to Kubo 0.37 will automatically clear any preexisting provide queue. The next time `Reprovider.Interval` hits, `Reprovider.Strategy` will be executed on a clean slate, ensuring consistent behavior with your current configuration.
-#### Remove unnecessary packages from thirdparty
+#### Removed unnecessary dependencies
-Removed unnecessary packages from the `thirdparty` area of kubo repositroy.
+Kubo has been cleaned up by removing unnecessary dependencies and packages:
- Removed `thirdparty/assert` (replaced by `github.com/stretchr/testify/require`)
-- Removed `thirdparty/dir` (replaced by `misc/fsutil)`
+- Removed `thirdparty/dir` (replaced by `misc/fsutil`)
- Removed `thirdparty/notifier` (unused)
+- Removed `goprocess` dependency (replaced with native Go `context` patterns)
+
+These changes reduce the dependency footprint while improving code maintainability and following Go best practices.
#### ๐ฆ๏ธ Important dependency updates
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index 5c01ebefe..55ef762a4 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -102,7 +102,6 @@ require (
github.com/ipshipyard/p2p-forge v0.6.1 // indirect
github.com/jackpal/go-nat-pmp v1.0.2 // indirect
github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect
- github.com/jbenet/goprocess v0.1.4 // indirect
github.com/klauspost/compress v1.18.0 // indirect
github.com/klauspost/cpuid/v2 v2.2.10 // indirect
github.com/koron/go-ssdp v0.0.6 // indirect
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index 40692a807..47158688c 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -377,8 +377,6 @@ github.com/jbenet/go-temp-err-catcher v0.1.0 h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABo
github.com/jbenet/go-temp-err-catcher v0.1.0/go.mod h1:0kJRvmDZXNMIiJirNPEYfhpPwbGVtZVWC34vc5WLsDk=
github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY=
github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4=
-github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o=
-github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4=
github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU=
github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
diff --git a/fuse/ipns/mount_unix.go b/fuse/ipns/mount_unix.go
index 34a8eef51..8c8ea8afe 100644
--- a/fuse/ipns/mount_unix.go
+++ b/fuse/ipns/mount_unix.go
@@ -29,5 +29,5 @@ func Mount(ipfs *core.IpfsNode, ipnsmp, ipfsmp string) (mount.Mount, error) {
return nil, err
}
- return mount.NewMount(ipfs.Process, fsys, ipnsmp, allowOther)
+ return mount.NewMount(fsys, ipnsmp, allowOther)
}
diff --git a/fuse/mfs/mount_unix.go b/fuse/mfs/mount_unix.go
index 7fe72e8df..bd7021e28 100644
--- a/fuse/mfs/mount_unix.go
+++ b/fuse/mfs/mount_unix.go
@@ -17,5 +17,5 @@ func Mount(ipfs *core.IpfsNode, mountpoint string) (mount.Mount, error) {
}
allowOther := cfg.Mounts.FuseAllowOther
fsys := NewFileSystem(ipfs)
- return mount.NewMount(ipfs.Process, fsys, mountpoint, allowOther)
+ return mount.NewMount(fsys, mountpoint, allowOther)
}
diff --git a/fuse/mount/fuse.go b/fuse/mount/fuse.go
index 02d733b89..e18c0b4a9 100644
--- a/fuse/mount/fuse.go
+++ b/fuse/mount/fuse.go
@@ -11,7 +11,6 @@ import (
"bazil.org/fuse"
"bazil.org/fuse/fs"
- "github.com/jbenet/goprocess"
)
var ErrNotMounted = errors.New("not mounted")
@@ -25,12 +24,12 @@ type mount struct {
active bool
activeLock *sync.RWMutex
- proc goprocess.Process
+ unmountOnce sync.Once
}
// Mount mounts a fuse fs.FS at a given location, and returns a Mount instance.
-// parent is a ContextGroup to bind the mount's ContextGroup to.
-func NewMount(p goprocess.Process, fsys fs.FS, mountpoint string, allowOther bool) (Mount, error) {
+// ctx is parent is a ContextGroup to bind the mount's ContextGroup to.
+func NewMount(fsys fs.FS, mountpoint string, allowOther bool) (Mount, error) {
var conn *fuse.Conn
var err error
@@ -54,12 +53,10 @@ func NewMount(p goprocess.Process, fsys fs.FS, mountpoint string, allowOther boo
filesys: fsys,
active: false,
activeLock: &sync.RWMutex{},
- proc: goprocess.WithParent(p), // link it to parent.
}
- m.proc.SetTeardown(m.unmount)
// launch the mounting process.
- if err := m.mount(); err != nil {
+ if err = m.mount(); err != nil {
_ = m.Unmount() // just in case.
return nil, err
}
@@ -135,10 +132,6 @@ func (m *mount) unmount() error {
return nil
}
-func (m *mount) Process() goprocess.Process {
- return m.proc
-}
-
func (m *mount) MountPoint() string {
return m.mpoint
}
@@ -148,8 +141,12 @@ func (m *mount) Unmount() error {
return ErrNotMounted
}
- // call Process Close(), which calls unmount() exactly once.
- return m.proc.Close()
+ var err error
+ m.unmountOnce.Do(func() {
+ err = m.unmount()
+ })
+
+ return err
}
func (m *mount) IsActive() bool {
diff --git a/fuse/mount/mount.go b/fuse/mount/mount.go
index b9008bc46..ca10405fe 100644
--- a/fuse/mount/mount.go
+++ b/fuse/mount/mount.go
@@ -9,7 +9,6 @@ import (
"time"
logging "github.com/ipfs/go-log/v2"
- goprocess "github.com/jbenet/goprocess"
)
var log = logging.Logger("mount")
@@ -26,10 +25,6 @@ type Mount interface {
// Checks if the mount is still active.
IsActive() bool
-
- // Process returns the mount's Process to be able to link it
- // to other processes. Unmount upon closing.
- Process() goprocess.Process
}
// ForceUnmount attempts to forcibly unmount a given mount.
diff --git a/fuse/node/mount_nofuse.go b/fuse/node/mount_nofuse.go
index 7423cb24d..6d4e102e2 100644
--- a/fuse/node/mount_nofuse.go
+++ b/fuse/node/mount_nofuse.go
@@ -12,3 +12,7 @@ import (
func Mount(node *core.IpfsNode, fsdir, nsdir, mfsdir string) error {
return errors.New("not compiled in")
}
+
+func Unmount(node *core.IpfsNode) {
+ return
+}
diff --git a/fuse/node/mount_notsupp.go b/fuse/node/mount_notsupp.go
index 79ac0e791..15f98c40e 100644
--- a/fuse/node/mount_notsupp.go
+++ b/fuse/node/mount_notsupp.go
@@ -12,3 +12,7 @@ import (
func Mount(node *core.IpfsNode, fsdir, nsdir, mfsdir string) error {
return errors.New("FUSE not supported on OpenBSD or NetBSD. See #5334 (https://github.com/ipfs/kubo/issues/5334).")
}
+
+func Unmount(node *core.IpfsNode) {
+ return
+}
diff --git a/fuse/node/mount_unix.go b/fuse/node/mount_unix.go
index c628a85f4..6c63f6e50 100644
--- a/fuse/node/mount_unix.go
+++ b/fuse/node/mount_unix.go
@@ -36,18 +36,7 @@ func Mount(node *core.IpfsNode, fsdir, nsdir, mfsdir string) error {
// check if we already have live mounts.
// if the user said "Mount", then there must be something wrong.
// so, close them and try again.
- if node.Mounts.Ipfs != nil && node.Mounts.Ipfs.IsActive() {
- // best effort
- _ = node.Mounts.Ipfs.Unmount()
- }
- if node.Mounts.Ipns != nil && node.Mounts.Ipns.IsActive() {
- // best effort
- _ = node.Mounts.Ipns.Unmount()
- }
- if node.Mounts.Mfs != nil && node.Mounts.Mfs.IsActive() {
- // best effort
- _ = node.Mounts.Mfs.Unmount()
- }
+ Unmount(node)
if err := platformFuseChecks(node); err != nil {
return err
@@ -56,6 +45,27 @@ func Mount(node *core.IpfsNode, fsdir, nsdir, mfsdir string) error {
return doMount(node, fsdir, nsdir, mfsdir)
}
+func Unmount(node *core.IpfsNode) {
+ if node.Mounts.Ipfs != nil && node.Mounts.Ipfs.IsActive() {
+ // best effort
+ if err := node.Mounts.Ipfs.Unmount(); err != nil {
+ log.Errorf("error unmounting IPFS: %s", err)
+ }
+ }
+ if node.Mounts.Ipns != nil && node.Mounts.Ipns.IsActive() {
+ // best effort
+ if err := node.Mounts.Ipns.Unmount(); err != nil {
+ log.Errorf("error unmounting IPNS: %s", err)
+ }
+ }
+ if node.Mounts.Mfs != nil && node.Mounts.Mfs.IsActive() {
+ // best effort
+ if err := node.Mounts.Mfs.Unmount(); err != nil {
+ log.Errorf("error unmounting MFS: %s", err)
+ }
+ }
+}
+
func doMount(node *core.IpfsNode, fsdir, nsdir, mfsdir string) error {
fmtFuseErr := func(err error, mountpoint string) error {
s := err.Error()
diff --git a/fuse/node/mount_windows.go b/fuse/node/mount_windows.go
index 42e6bc10b..9f22fe59e 100644
--- a/fuse/node/mount_windows.go
+++ b/fuse/node/mount_windows.go
@@ -9,3 +9,9 @@ func Mount(node *core.IpfsNode, fsdir, nsdir, mfsdir string) error {
// currently a no-op, but we don't want to return an error
return nil
}
+
+func Unmount(node *core.IpfsNode) {
+ // TODO
+ // currently a no-op
+ return
+}
diff --git a/fuse/readonly/mount_unix.go b/fuse/readonly/mount_unix.go
index 19be37abe..0ee198409 100644
--- a/fuse/readonly/mount_unix.go
+++ b/fuse/readonly/mount_unix.go
@@ -17,5 +17,5 @@ func Mount(ipfs *core.IpfsNode, mountpoint string) (mount.Mount, error) {
}
allowOther := cfg.Mounts.FuseAllowOther
fsys := NewFileSystem(ipfs)
- return mount.NewMount(ipfs.Process, fsys, mountpoint, allowOther)
+ return mount.NewMount(fsys, mountpoint, allowOther)
}
diff --git a/go.mod b/go.mod
index 79b803861..c7a89e9ef 100644
--- a/go.mod
+++ b/go.mod
@@ -49,7 +49,6 @@ require (
github.com/ipld/go-ipld-prime v0.21.0
github.com/ipshipyard/p2p-forge v0.6.1
github.com/jbenet/go-temp-err-catcher v0.1.0
- github.com/jbenet/goprocess v0.1.4
github.com/julienschmidt/httprouter v1.3.0
github.com/libp2p/go-doh-resolver v0.5.0
github.com/libp2p/go-libp2p v0.42.1
diff --git a/go.sum b/go.sum
index 1e225d83a..c8ab14151 100644
--- a/go.sum
+++ b/go.sum
@@ -443,14 +443,11 @@ github.com/ipshipyard/p2p-forge v0.6.1 h1:987/hUC1YxI56CcMX6iTB+9BLjFV0d2SJnig9Z
github.com/ipshipyard/p2p-forge v0.6.1/go.mod h1:pj8Zcs+ex5OMq5a1bFLHqW0oL3qYO0v5eGLZmit0l7U=
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
-github.com/jbenet/go-cienv v0.1.0 h1:Vc/s0QbQtoxX8MwwSLWWh+xNNZvM3Lw7NsTcHrvvhMc=
github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA=
github.com/jbenet/go-temp-err-catcher v0.1.0 h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABoLk/+KKHggpk=
github.com/jbenet/go-temp-err-catcher v0.1.0/go.mod h1:0kJRvmDZXNMIiJirNPEYfhpPwbGVtZVWC34vc5WLsDk=
github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY=
github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4=
-github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o=
-github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4=
github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU=
github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
diff --git a/test/cli/daemon_test.go b/test/cli/daemon_test.go
index 7a8c583a2..f87a21651 100644
--- a/test/cli/daemon_test.go
+++ b/test/cli/daemon_test.go
@@ -1,10 +1,20 @@
package cli
import (
+ "bytes"
+ "crypto/rand"
+ "fmt"
+ "io"
+ "net/http"
"os/exec"
"testing"
+ "time"
+ "github.com/ipfs/kubo/config"
"github.com/ipfs/kubo/test/cli/harness"
+ "github.com/multiformats/go-multiaddr"
+ manet "github.com/multiformats/go-multiaddr/net"
+ "github.com/stretchr/testify/require"
)
func TestDaemon(t *testing.T) {
@@ -22,4 +32,125 @@ func TestDaemon(t *testing.T) {
node.StopDaemon()
})
+
+ t.Run("daemon shuts down gracefully with active operations", func(t *testing.T) {
+ t.Parallel()
+
+ // Start daemon with multiple components active via config
+ node := harness.NewT(t).NewNode().Init()
+
+ // Enable experimental features and pubsub via config
+ node.UpdateConfig(func(cfg *config.Config) {
+ cfg.Pubsub.Enabled = config.True // Instead of --enable-pubsub-experiment
+ cfg.Experimental.P2pHttpProxy = true // Enable P2P HTTP proxy
+ cfg.Experimental.GatewayOverLibp2p = true // Enable gateway over libp2p
+ })
+
+ node.StartDaemon("--enable-gc")
+
+ // Start background operations to simulate real daemon workload:
+ // 1. "ipfs add" simulates content onboarding/ingestion work
+ // 2. Gateway request simulates content retrieval and gateway processing work
+
+ // Background operation 1: Continuous add of random data to simulate onboarding
+ addDone := make(chan struct{})
+ go func() {
+ defer close(addDone)
+
+ // Start the add command asynchronously
+ res := node.Runner.Run(harness.RunRequest{
+ Path: node.IPFSBin,
+ Args: []string{"add", "--progress=false", "-"},
+ RunFunc: (*exec.Cmd).Start,
+ CmdOpts: []harness.CmdOpt{
+ harness.RunWithStdin(&infiniteReader{}),
+ },
+ })
+
+ // Wait for command to finish (when daemon stops)
+ if res.Cmd != nil {
+ _ = res.Cmd.Wait() // Ignore error, expect command to be killed during shutdown
+ }
+ }()
+
+ // Background operation 2: Gateway CAR request to simulate retrieval work
+ gatewayDone := make(chan struct{})
+ go func() {
+ defer close(gatewayDone)
+
+ // First add a file sized to ensure gateway request takes ~1 minute
+ largeData := make([]byte, 512*1024) // 512KB of data
+ _, _ = rand.Read(largeData) // Always succeeds for crypto/rand
+ testCID := node.IPFSAdd(bytes.NewReader(largeData))
+
+ // Get gateway address from config
+ cfg := node.ReadConfig()
+ gatewayMaddr, err := multiaddr.NewMultiaddr(cfg.Addresses.Gateway[0])
+ if err != nil {
+ return
+ }
+ gatewayAddr, err := manet.ToNetAddr(gatewayMaddr)
+ if err != nil {
+ return
+ }
+
+ // Request CAR but slow reading to simulate heavy gateway load
+ gatewayURL := fmt.Sprintf("http://%s/ipfs/%s?format=car", gatewayAddr, testCID)
+
+ client := &http.Client{Timeout: 90 * time.Second}
+ resp, err := client.Get(gatewayURL)
+ if err == nil {
+ defer resp.Body.Close()
+ // Read response slowly: 512KB รท 1KB ร 125ms = ~64 seconds (1+ minute) total
+ // This ensures operation is still active when we shutdown at 2 seconds
+ buf := make([]byte, 1024) // 1KB buffer
+ for {
+ if _, err := io.ReadFull(resp.Body, buf); err != nil {
+ return
+ }
+ time.Sleep(125 * time.Millisecond) // 125ms delay = ~64s total for 512KB
+ }
+ }
+ }()
+
+ // Let operations run for 2 seconds to ensure they're active
+ time.Sleep(2 * time.Second)
+
+ // Trigger graceful shutdown
+ shutdownStart := time.Now()
+ node.StopDaemon()
+ shutdownDuration := time.Since(shutdownStart)
+
+ // Verify clean shutdown:
+ // - Daemon should stop within reasonable time (not hang)
+ require.Less(t, shutdownDuration, 10*time.Second, "daemon should shut down within 10 seconds")
+
+ // Wait for background operations to complete (with timeout)
+ select {
+ case <-addDone:
+ // Good, add operation terminated
+ case <-time.After(5 * time.Second):
+ t.Error("add operation did not terminate within 5 seconds after daemon shutdown")
+ }
+
+ select {
+ case <-gatewayDone:
+ // Good, gateway operation terminated
+ case <-time.After(5 * time.Second):
+ t.Error("gateway operation did not terminate within 5 seconds after daemon shutdown")
+ }
+
+ // Verify we can restart with same repo (no lock issues)
+ node.StartDaemon()
+ node.StopDaemon()
+ })
+}
+
+// infiniteReader provides an infinite stream of random data
+type infiniteReader struct{}
+
+func (r *infiniteReader) Read(p []byte) (n int, err error) {
+ _, _ = rand.Read(p) // Always succeeds for crypto/rand
+ time.Sleep(50 * time.Millisecond) // Rate limit to simulate steady stream
+ return len(p), nil
}
diff --git a/test/cli/fuse_test.go b/test/cli/fuse_test.go
new file mode 100644
index 000000000..6182a069a
--- /dev/null
+++ b/test/cli/fuse_test.go
@@ -0,0 +1,166 @@
+package cli
+
+import (
+ "os"
+ "os/exec"
+ "path/filepath"
+ "runtime"
+ "strings"
+ "testing"
+
+ "github.com/ipfs/kubo/test/cli/harness"
+ "github.com/ipfs/kubo/test/cli/testutils"
+ "github.com/stretchr/testify/require"
+)
+
+func TestFUSE(t *testing.T) {
+ testutils.RequiresFUSE(t)
+ t.Parallel()
+
+ t.Run("mount and unmount work correctly", func(t *testing.T) {
+ t.Parallel()
+
+ // Create a node and start daemon
+ node := harness.NewT(t).NewNode().Init()
+ node.StartDaemon()
+
+ // Create mount directories in the node's working directory
+ nodeDir := node.Dir
+ ipfsMount := filepath.Join(nodeDir, "ipfs")
+ ipnsMount := filepath.Join(nodeDir, "ipns")
+ mfsMount := filepath.Join(nodeDir, "mfs")
+
+ err := os.MkdirAll(ipfsMount, 0755)
+ require.NoError(t, err)
+ err = os.MkdirAll(ipnsMount, 0755)
+ require.NoError(t, err)
+ err = os.MkdirAll(mfsMount, 0755)
+ require.NoError(t, err)
+
+ // Ensure any existing mounts are cleaned up first
+ failOnError := false // mount points might not exist from previous runs
+ doUnmount(t, ipfsMount, failOnError)
+ doUnmount(t, ipnsMount, failOnError)
+ doUnmount(t, mfsMount, failOnError)
+
+ // Test mount operation
+ result := node.IPFS("mount", "-f", ipfsMount, "-n", ipnsMount, "-m", mfsMount)
+
+ // Verify mount output
+ expectedOutput := "IPFS mounted at: " + ipfsMount + "\n" +
+ "IPNS mounted at: " + ipnsMount + "\n" +
+ "MFS mounted at: " + mfsMount + "\n"
+ require.Equal(t, expectedOutput, result.Stdout.String())
+
+ // Test basic MFS functionality via FUSE mount
+ testFile := filepath.Join(mfsMount, "testfile")
+ testContent := "hello fuse world"
+
+ // Create file via FUSE mount
+ err = os.WriteFile(testFile, []byte(testContent), 0644)
+ require.NoError(t, err)
+
+ // Verify file appears in MFS via IPFS commands
+ result = node.IPFS("files", "ls", "/")
+ require.Contains(t, result.Stdout.String(), "testfile")
+
+ // Read content back via MFS FUSE mount
+ readContent, err := os.ReadFile(testFile)
+ require.NoError(t, err)
+ require.Equal(t, testContent, string(readContent))
+
+ // Get the CID of the MFS file
+ result = node.IPFS("files", "stat", "/testfile", "--format=")
+ fileCID := strings.TrimSpace(result.Stdout.String())
+ require.NotEmpty(t, fileCID, "should have a CID for the MFS file")
+
+ // Read the same content via IPFS FUSE mount using the CID
+ ipfsFile := filepath.Join(ipfsMount, fileCID)
+ ipfsContent, err := os.ReadFile(ipfsFile)
+ require.NoError(t, err)
+ require.Equal(t, testContent, string(ipfsContent), "content should match between MFS and IPFS mounts")
+
+ // Verify both FUSE mounts return identical data
+ require.Equal(t, readContent, ipfsContent, "MFS and IPFS FUSE mounts should return identical data")
+
+ // Test that mount directories cannot be removed while mounted
+ err = os.Remove(ipfsMount)
+ require.Error(t, err, "should not be able to remove mounted directory")
+
+ // Stop daemon - this should trigger automatic unmount via context cancellation
+ node.StopDaemon()
+
+ // Daemon shutdown should handle unmount synchronously via context.AfterFunc
+
+ // Verify directories can now be removed (indicating successful unmount)
+ err = os.Remove(ipfsMount)
+ require.NoError(t, err, "should be able to remove directory after unmount")
+ err = os.Remove(ipnsMount)
+ require.NoError(t, err, "should be able to remove directory after unmount")
+ err = os.Remove(mfsMount)
+ require.NoError(t, err, "should be able to remove directory after unmount")
+ })
+
+ t.Run("explicit unmount works", func(t *testing.T) {
+ t.Parallel()
+
+ node := harness.NewT(t).NewNode().Init()
+ node.StartDaemon()
+
+ // Create mount directories
+ nodeDir := node.Dir
+ ipfsMount := filepath.Join(nodeDir, "ipfs")
+ ipnsMount := filepath.Join(nodeDir, "ipns")
+ mfsMount := filepath.Join(nodeDir, "mfs")
+
+ err := os.MkdirAll(ipfsMount, 0755)
+ require.NoError(t, err)
+ err = os.MkdirAll(ipnsMount, 0755)
+ require.NoError(t, err)
+ err = os.MkdirAll(mfsMount, 0755)
+ require.NoError(t, err)
+
+ // Clean up any existing mounts
+ failOnError := false // mount points might not exist from previous runs
+ doUnmount(t, ipfsMount, failOnError)
+ doUnmount(t, ipnsMount, failOnError)
+ doUnmount(t, mfsMount, failOnError)
+
+ // Mount
+ node.IPFS("mount", "-f", ipfsMount, "-n", ipnsMount, "-m", mfsMount)
+
+ // Explicit unmount via platform-specific command
+ failOnError = true // test that explicit unmount works correctly
+ doUnmount(t, ipfsMount, failOnError)
+ doUnmount(t, ipnsMount, failOnError)
+ doUnmount(t, mfsMount, failOnError)
+
+ // Verify directories can be removed after explicit unmount
+ err = os.Remove(ipfsMount)
+ require.NoError(t, err)
+ err = os.Remove(ipnsMount)
+ require.NoError(t, err)
+ err = os.Remove(mfsMount)
+ require.NoError(t, err)
+
+ node.StopDaemon()
+ })
+}
+
+// doUnmount performs platform-specific unmount, similar to sharness do_umount
+// failOnError: if true, unmount errors cause test failure; if false, errors are ignored (useful for cleanup)
+func doUnmount(t *testing.T, mountPoint string, failOnError bool) {
+ t.Helper()
+ var cmd *exec.Cmd
+ if runtime.GOOS == "linux" {
+ // fusermount -u: unmount filesystem (strict - fails if busy)
+ cmd = exec.Command("fusermount", "-u", mountPoint)
+ } else {
+ cmd = exec.Command("umount", mountPoint)
+ }
+
+ err := cmd.Run()
+ if err != nil && failOnError {
+ t.Fatalf("failed to unmount %s: %v", mountPoint, err)
+ }
+}
diff --git a/test/cli/testutils/requires.go b/test/cli/testutils/requires.go
index 1462b7fee..b0070e441 100644
--- a/test/cli/testutils/requires.go
+++ b/test/cli/testutils/requires.go
@@ -2,6 +2,7 @@ package testutils
import (
"os"
+ "os/exec"
"runtime"
"testing"
)
@@ -13,9 +14,48 @@ func RequiresDocker(t *testing.T) {
}
func RequiresFUSE(t *testing.T) {
- if os.Getenv("TEST_FUSE") != "1" {
- t.SkipNow()
+ // Skip if FUSE tests are explicitly disabled
+ if os.Getenv("TEST_FUSE") == "0" {
+ t.Skip("FUSE tests disabled via TEST_FUSE=0")
}
+
+ // If TEST_FUSE=1 is set, always run (for backwards compatibility)
+ if os.Getenv("TEST_FUSE") == "1" {
+ return
+ }
+
+ // Auto-detect FUSE availability based on platform and tools
+ if !isFUSEAvailable(t) {
+ t.Skip("FUSE not available (no fusermount/umount found or unsupported platform)")
+ }
+}
+
+// isFUSEAvailable checks if FUSE is available on the current system
+func isFUSEAvailable(t *testing.T) bool {
+ t.Helper()
+
+ // Check platform support
+ switch runtime.GOOS {
+ case "linux", "darwin", "freebsd", "openbsd", "netbsd":
+ // These platforms potentially support FUSE
+ case "windows":
+ // Windows has limited FUSE support via WinFsp, but skip for now
+ return false
+ default:
+ // Unknown platform, assume no FUSE support
+ return false
+ }
+
+ // Check for required unmount tools
+ var unmountCmd string
+ if runtime.GOOS == "linux" {
+ unmountCmd = "fusermount"
+ } else {
+ unmountCmd = "umount"
+ }
+
+ _, err := exec.LookPath(unmountCmd)
+ return err == nil
}
func RequiresExpensive(t *testing.T) {
From 10abb9073d6e7fe4041d463eac9f29597d104f2c Mon Sep 17 00:00:00 2001
From: Kapil Sareen
Date: Wed, 6 Aug 2025 05:46:16 +0530
Subject: [PATCH 304/499] feat(add): add support for naming pinned CIDs
(#10877)
* feat(add): add support for naming pinned CID
Signed-off-by: kapil
* fix(add): no double pinning and simplify pin-name
- modify PinRoot to accept name parameter, eliminating double pinning
- remove automatic filename fallback logic for cleaner behavior
- only create named pins when explicitly requested via --pin-name=value
- replace NoPinName constant with idiomatic empty string literals
- Update help text and tests to reflect explicit-only behavior
* docs: changelog
* chore: lint
* test: negative case for empty pin-name
* chore: gofmt
---------
Signed-off-by: kapil
Co-authored-by: Marcin Rataj
---
cmd/ipfs/kubo/add_migrations.go | 2 +-
config/import.go | 1 -
core/commands/add.go | 11 +++++++--
core/coreapi/test/path_test.go | 2 +-
core/coreapi/unixfs.go | 4 ++++
core/coreiface/options/unixfs.go | 7 +++++-
core/coreiface/tests/unixfs.go | 2 +-
core/coreunix/add.go | 19 +++++++++++-----
docs/changelogs/v0.37.md | 13 +++++++++++
test/cli/add_test.go | 38 ++++++++++++++++++++++++++++++++
10 files changed, 86 insertions(+), 13 deletions(-)
diff --git a/cmd/ipfs/kubo/add_migrations.go b/cmd/ipfs/kubo/add_migrations.go
index 557a8de84..d77d0afdf 100644
--- a/cmd/ipfs/kubo/add_migrations.go
+++ b/cmd/ipfs/kubo/add_migrations.go
@@ -86,7 +86,7 @@ func addMigrationFiles(ctx context.Context, node *core.IpfsNode, paths []string,
return err
}
- ipfsPath, err := ufs.Add(ctx, files.NewReaderStatFile(f, fi), options.Unixfs.Pin(pin))
+ ipfsPath, err := ufs.Add(ctx, files.NewReaderStatFile(f, fi), options.Unixfs.Pin(pin, ""))
if err != nil {
return err
}
diff --git a/config/import.go b/config/import.go
index 21bf232c1..c51917286 100644
--- a/config/import.go
+++ b/config/import.go
@@ -21,7 +21,6 @@ const (
// write-batch. The total size of the batch is limited by
// BatchMaxnodes and BatchMaxSize.
DefaultBatchMaxSize = 100 << 20 // 20MiB
-
)
var (
diff --git a/core/commands/add.go b/core/commands/add.go
index f800e4f42..f9e374b80 100644
--- a/core/commands/add.go
+++ b/core/commands/add.go
@@ -37,6 +37,7 @@ type AddEvent struct {
}
const (
+ pinNameOptionName = "pin-name"
quietOptionName = "quiet"
quieterOptionName = "quieter"
silentOptionName = "silent"
@@ -184,6 +185,7 @@ See 'dag export' and 'dag import' for more information.
cmds.BoolOption(inlineOptionName, "Inline small blocks into CIDs. (experimental)"),
cmds.IntOption(inlineLimitOptionName, "Maximum block size to inline. (experimental)").WithDefault(32),
cmds.BoolOption(pinOptionName, "Pin locally to protect added files from garbage collection.").WithDefault(true),
+ cmds.StringOption(pinNameOptionName, "Name to use for the pin. Requires explicit value (e.g., --pin-name=myname)."),
cmds.StringOption(toFilesOptionName, "Add reference to Files API (MFS) at the provided path."),
cmds.BoolOption(preserveModeOptionName, "Apply existing POSIX permissions to created UnixFS entries. Disables raw-leaves. (experimental)"),
cmds.BoolOption(preserveMtimeOptionName, "Apply existing POSIX modification time to created UnixFS entries. Disables raw-leaves. (experimental)"),
@@ -230,6 +232,7 @@ See 'dag export' and 'dag import' for more information.
silent, _ := req.Options[silentOptionName].(bool)
chunker, _ := req.Options[chunkerOptionName].(string)
dopin, _ := req.Options[pinOptionName].(bool)
+ pinName, pinNameSet := req.Options[pinNameOptionName].(string)
rawblks, rbset := req.Options[rawLeavesOptionName].(bool)
maxFileLinks, maxFileLinksSet := req.Options[maxFileLinksOptionName].(int)
maxDirectoryLinks, maxDirectoryLinksSet := req.Options[maxDirectoryLinksOptionName].(int)
@@ -260,6 +263,8 @@ See 'dag export' and 'dag import' for more information.
cidVer = int(cfg.Import.CidVersion.WithDefault(config.DefaultCidVersion))
}
+ // Pin names are only used when explicitly provided via --pin-name=value
+
if !rbset && cfg.Import.UnixFSRawLeaves != config.Default {
rbset = true
rawblks = cfg.Import.UnixFSRawLeaves.WithDefault(config.DefaultUnixFSRawLeaves)
@@ -296,7 +301,9 @@ See 'dag export' and 'dag import' for more information.
if onlyHash && toFilesSet {
return fmt.Errorf("%s and %s options are not compatible", onlyHashOptionName, toFilesOptionName)
}
-
+ if !dopin && pinNameSet {
+ return fmt.Errorf("%s option requires %s to be set", pinNameOptionName, pinOptionName)
+ }
if wrap && toFilesSet {
return fmt.Errorf("%s and %s options are not compatible", wrapOptionName, toFilesOptionName)
}
@@ -326,7 +333,7 @@ See 'dag export' and 'dag import' for more information.
options.Unixfs.Chunker(chunker),
- options.Unixfs.Pin(dopin),
+ options.Unixfs.Pin(dopin, pinName),
options.Unixfs.HashOnly(onlyHash),
options.Unixfs.FsCache(fscache),
options.Unixfs.Nocopy(nocopy),
diff --git a/core/coreapi/test/path_test.go b/core/coreapi/test/path_test.go
index 692853a9a..f1337e809 100644
--- a/core/coreapi/test/path_test.go
+++ b/core/coreapi/test/path_test.go
@@ -39,7 +39,7 @@ func TestPathUnixFSHAMTPartial(t *testing.T) {
dir[strconv.Itoa(i)] = files.NewBytesFile([]byte(strconv.Itoa(i)))
}
- r, err := a.Unixfs().Add(ctx, files.NewMapDirectory(dir), options.Unixfs.Pin(false))
+ r, err := a.Unixfs().Add(ctx, files.NewMapDirectory(dir), options.Unixfs.Pin(false, ""))
if err != nil {
t.Fatal(err)
}
diff --git a/core/coreapi/unixfs.go b/core/coreapi/unixfs.go
index eece797a5..6c78a869a 100644
--- a/core/coreapi/unixfs.go
+++ b/core/coreapi/unixfs.go
@@ -58,6 +58,7 @@ func (api *UnixfsAPI) Add(ctx context.Context, files files.Node, opts ...options
attribute.Bool("maxhamtfanoutset", settings.MaxHAMTFanoutSet),
attribute.Int("layout", int(settings.Layout)),
attribute.Bool("pin", settings.Pin),
+ attribute.String("pin-name", settings.PinName),
attribute.Bool("onlyhash", settings.OnlyHash),
attribute.Bool("fscache", settings.FsCache),
attribute.Bool("nocopy", settings.NoCopy),
@@ -136,6 +137,9 @@ func (api *UnixfsAPI) Add(ctx context.Context, files files.Node, opts ...options
fileAdder.Progress = settings.Progress
}
fileAdder.Pin = settings.Pin && !settings.OnlyHash
+ if settings.Pin {
+ fileAdder.PinName = settings.PinName
+ }
fileAdder.Silent = settings.Silent
fileAdder.RawLeaves = settings.RawLeaves
if settings.MaxFileLinksSet {
diff --git a/core/coreiface/options/unixfs.go b/core/coreiface/options/unixfs.go
index 20f18d1e0..45e880ed1 100644
--- a/core/coreiface/options/unixfs.go
+++ b/core/coreiface/options/unixfs.go
@@ -39,6 +39,7 @@ type UnixfsAddSettings struct {
Layout Layout
Pin bool
+ PinName string
OnlyHash bool
FsCache bool
NoCopy bool
@@ -83,6 +84,7 @@ func UnixfsAddOptions(opts ...UnixfsAddOption) (*UnixfsAddSettings, cid.Prefix,
Layout: BalancedLayout,
Pin: false,
+ PinName: "",
OnlyHash: false,
FsCache: false,
NoCopy: false,
@@ -280,9 +282,12 @@ func (unixfsOpts) Layout(layout Layout) UnixfsAddOption {
}
// Pin tells the adder to pin the file root recursively after adding
-func (unixfsOpts) Pin(pin bool) UnixfsAddOption {
+func (unixfsOpts) Pin(pin bool, pinName string) UnixfsAddOption {
return func(settings *UnixfsAddSettings) error {
settings.Pin = pin
+ if pin {
+ settings.PinName = pinName
+ }
return nil
}
}
diff --git a/core/coreiface/tests/unixfs.go b/core/coreiface/tests/unixfs.go
index 43447990e..c2717216c 100644
--- a/core/coreiface/tests/unixfs.go
+++ b/core/coreiface/tests/unixfs.go
@@ -539,7 +539,7 @@ func (tp *TestSuite) TestAddPinned(t *testing.T) {
t.Fatal(err)
}
- _, err = api.Unixfs().Add(ctx, strFile(helloStr)(), options.Unixfs.Pin(true))
+ _, err = api.Unixfs().Add(ctx, strFile(helloStr)(), options.Unixfs.Pin(true, ""))
if err != nil {
t.Fatal(err)
}
diff --git a/core/coreunix/add.go b/core/coreunix/add.go
index eb6f25e0f..c693773f9 100644
--- a/core/coreunix/add.go
+++ b/core/coreunix/add.go
@@ -76,6 +76,7 @@ type Adder struct {
Out chan<- interface{}
Progress bool
Pin bool
+ PinName string
Trickle bool
RawLeaves bool
MaxLinks int
@@ -182,9 +183,10 @@ func (adder *Adder) curRootNode() (ipld.Node, error) {
return root, err
}
-// Recursively pins the root node of Adder and
-// writes the pin state to the backing datastore.
-func (adder *Adder) PinRoot(ctx context.Context, root ipld.Node) error {
+// PinRoot recursively pins the root node of Adder with an optional name and
+// writes the pin state to the backing datastore. If name is empty, the pin
+// will be created without a name.
+func (adder *Adder) PinRoot(ctx context.Context, root ipld.Node, name string) error {
ctx, span := tracing.Span(ctx, "CoreUnix.Adder", "PinRoot")
defer span.End()
@@ -207,7 +209,7 @@ func (adder *Adder) PinRoot(ctx context.Context, root ipld.Node) error {
adder.tempRoot = rnk
}
- err = adder.pinning.PinWithMode(ctx, rnk, pin.Recursive, "")
+ err = adder.pinning.PinWithMode(ctx, rnk, pin.Recursive, name)
if err != nil {
return err
}
@@ -369,7 +371,12 @@ func (adder *Adder) AddAllAndPin(ctx context.Context, file files.Node) (ipld.Nod
if !adder.Pin {
return nd, nil
}
- return nd, adder.PinRoot(ctx, nd)
+
+ if err := adder.PinRoot(ctx, nd, adder.PinName); err != nil {
+ return nil, err
+ }
+
+ return nd, nil
}
func (adder *Adder) addFileNode(ctx context.Context, path string, file files.Node, toplevel bool) error {
@@ -530,7 +537,7 @@ func (adder *Adder) maybePauseForGC(ctx context.Context) error {
return err
}
- err = adder.PinRoot(ctx, rn)
+ err = adder.PinRoot(ctx, rn, "")
if err != nil {
return err
}
diff --git a/docs/changelogs/v0.37.md b/docs/changelogs/v0.37.md
index 72e15d2da..8c264275b 100644
--- a/docs/changelogs/v0.37.md
+++ b/docs/changelogs/v0.37.md
@@ -11,6 +11,7 @@ This release was brought to you by the [Interplanetary Shipyard](https://ipship
- [Overview](#overview)
- [๐ฆ Highlights](#-highlights)
- [Clear provide queue when reprovide strategy changes](#clear-provide-queue-when-reprovide-strategy-changes)
+ - [Named pins in `ipfs add` command](#-named-pins-in-ipfs-add-command)
- [Removed unnecessary dependencies](#removed-unnecessary-dependencies)
- [๐ฆ๏ธ Important dependency updates](#-important-dependency-updates)
- [๐ Changelog](#-changelog)
@@ -31,6 +32,18 @@ A new `ipfs provide clear` command also allows manual queue clearing for debuggi
> [!NOTE]
> Upgrading to Kubo 0.37 will automatically clear any preexisting provide queue. The next time `Reprovider.Interval` hits, `Reprovider.Strategy` will be executed on a clean slate, ensuring consistent behavior with your current configuration.
+#### ๐งท Named pins in `ipfs add` command
+
+Added `--pin-name` flag to `ipfs add` for assigning names to pins.
+
+```console
+$ ipfs add --pin-name=testname cat.jpg
+added bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi cat.jpg
+
+$ ipfs pin ls --names
+bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi recursive testname
+```
+
#### Removed unnecessary dependencies
Kubo has been cleaned up by removing unnecessary dependencies and packages:
diff --git a/test/cli/add_test.go b/test/cli/add_test.go
index 775a6063b..e4138b624 100644
--- a/test/cli/add_test.go
+++ b/test/cli/add_test.go
@@ -108,6 +108,44 @@ func TestAdd(t *testing.T) {
require.Equal(t, shortStringCidV1NoRawLeaves, cidStr)
})
+ t.Run("ipfs add --pin-name=foo", func(t *testing.T) {
+ t.Parallel()
+ node := harness.NewT(t).NewNode().Init().StartDaemon()
+ defer node.StopDaemon()
+
+ pinName := "test-pin-name"
+ cidStr := node.IPFSAddStr(shortString, "--pin-name", pinName)
+ require.Equal(t, shortStringCidV0, cidStr)
+
+ pinList := node.IPFS("pin", "ls", "--names").Stdout.Trimmed()
+ require.Contains(t, pinList, shortStringCidV0)
+ require.Contains(t, pinList, pinName)
+ })
+
+ t.Run("ipfs add --pin=false --pin-name=foo returns an error", func(t *testing.T) {
+ t.Parallel()
+
+ node := harness.NewT(t).NewNode().Init().StartDaemon()
+ defer node.StopDaemon()
+
+ // Use RunIPFS to allow for errors without assertion
+ result := node.RunIPFS("add", "--pin=false", "--pin-name=foo")
+ require.Error(t, result.Err, "Expected an error due to incompatible --pin and --pin-name")
+ require.Contains(t, result.Stderr.String(), "pin-name option requires pin to be set")
+ })
+
+ t.Run("ipfs add --pin-name without value should fail", func(t *testing.T) {
+ t.Parallel()
+
+ node := harness.NewT(t).NewNode().Init().StartDaemon()
+ defer node.StopDaemon()
+
+ // When --pin-name is passed without any value, it should fail
+ result := node.RunIPFS("add", "--pin-name")
+ require.Error(t, result.Err, "Expected an error when --pin-name has no value")
+ require.Contains(t, result.Stderr.String(), "missing argument for option \"pin-name\"")
+ })
+
t.Run("produced unixfs max file links: command flag --max-file-links overrides configuration in Import.UnixFSFileMaxLinks", func(t *testing.T) {
t.Parallel()
From 918aa07c9ee64500f57eab8b8e12e9a4c727a94e Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Thu, 7 Aug 2025 17:17:00 -0700
Subject: [PATCH 305/499] refactor: move `ipfs stat provide/reprovide` to `ipfs
provide stat` (#10896)
- Move `ipfs stat reprovide` to `ipfs provide stat`
- Mark `ipfs stat provide` as deprecated and replaces by `ipfs provide stat`
- Mark `ipfs stat reprovide` as deprecated and replaces by `ipfs provide stat`
- Remove redundant code from deprecated subcommands
Closes #10869
---
core/commands/commands_test.go | 1 +
core/commands/provide.go | 102 +++++++++++++++++++++++++++++++-
core/commands/stat_provide.go | 55 ++---------------
core/commands/stat_reprovide.go | 101 +++----------------------------
docs/changelogs/v0.37.md | 9 +++
5 files changed, 124 insertions(+), 144 deletions(-)
diff --git a/core/commands/commands_test.go b/core/commands/commands_test.go
index f12fbe40b..2ab3f1733 100644
--- a/core/commands/commands_test.go
+++ b/core/commands/commands_test.go
@@ -165,6 +165,7 @@ func TestCommands(t *testing.T) {
"/ping",
"/provide",
"/provide/clear",
+ "/provide/stat",
"/pubsub",
"/pubsub/ls",
"/pubsub/peers",
diff --git a/core/commands/provide.go b/core/commands/provide.go
index 97d4d8c94..ba52ca50b 100644
--- a/core/commands/provide.go
+++ b/core/commands/provide.go
@@ -3,9 +3,15 @@ package commands
import (
"fmt"
"io"
+ "text/tabwriter"
+ "time"
+ humanize "github.com/dustin/go-humanize"
+ "github.com/ipfs/boxo/provider"
cmds "github.com/ipfs/go-ipfs-cmds"
- cmdenv "github.com/ipfs/kubo/core/commands/cmdenv"
+ "github.com/ipfs/kubo/core/commands/cmdenv"
+ "github.com/libp2p/go-libp2p-kad-dht/fullrt"
+ "golang.org/x/exp/constraints"
)
const (
@@ -28,11 +34,12 @@ reprovide' provides statistics. Additionally, 'ipfs bitswap reprovide' and
},
Subcommands: map[string]*cmds.Command{
- "clear": ProvideClearCmd,
+ "clear": provideClearCmd,
+ "stat": provideStatCmd,
},
}
-var ProvideClearCmd = &cmds.Command{
+var provideClearCmd = &cmds.Command{
Status: cmds.Experimental,
Helptext: cmds.HelpText{
Tagline: "Clear all CIDs from the provide queue.",
@@ -80,3 +87,92 @@ https://github.com/ipfs/kubo/blob/master/docs/config.md#reproviderstrategy
}),
},
}
+
+type provideStats struct {
+ provider.ReproviderStats
+ fullRT bool
+}
+
+var provideStatCmd = &cmds.Command{
+ Status: cmds.Experimental,
+ Helptext: cmds.HelpText{
+ Tagline: "Returns statistics about the node's provider system.",
+ ShortDescription: `
+Returns statistics about the content the node is reproviding every
+Reprovider.Interval according to Reprovider.Strategy:
+https://github.com/ipfs/kubo/blob/master/docs/config.md#reprovider
+
+This interface is not stable and may change from release to release.
+
+`,
+ },
+ Arguments: []cmds.Argument{},
+ Options: []cmds.Option{},
+ Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
+ nd, err := cmdenv.GetNode(env)
+ if err != nil {
+ return err
+ }
+
+ if !nd.IsOnline {
+ return ErrNotOnline
+ }
+
+ stats, err := nd.Provider.Stat()
+ if err != nil {
+ return err
+ }
+ _, fullRT := nd.DHTClient.(*fullrt.FullRT)
+
+ if err := res.Emit(provideStats{stats, fullRT}); err != nil {
+ return err
+ }
+
+ return nil
+ },
+ Encoders: cmds.EncoderMap{
+ cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, s provideStats) error {
+ wtr := tabwriter.NewWriter(w, 1, 2, 1, ' ', 0)
+ defer wtr.Flush()
+
+ fmt.Fprintf(wtr, "TotalReprovides:\t%s\n", humanNumber(s.TotalReprovides))
+ fmt.Fprintf(wtr, "AvgReprovideDuration:\t%s\n", humanDuration(s.AvgReprovideDuration))
+ fmt.Fprintf(wtr, "LastReprovideDuration:\t%s\n", humanDuration(s.LastReprovideDuration))
+ if !s.LastRun.IsZero() {
+ fmt.Fprintf(wtr, "LastReprovide:\t%s\n", humanTime(s.LastRun))
+ if s.fullRT {
+ fmt.Fprintf(wtr, "NextReprovide:\t%s\n", humanTime(s.LastRun.Add(s.ReprovideInterval)))
+ }
+ }
+ return nil
+ }),
+ },
+ Type: provideStats{},
+}
+
+func humanDuration(val time.Duration) string {
+ return val.Truncate(time.Microsecond).String()
+}
+
+func humanTime(val time.Time) string {
+ return val.Format("2006-01-02 15:04:05")
+}
+
+func humanNumber[T constraints.Float | constraints.Integer](n T) string {
+ nf := float64(n)
+ str := humanSI(nf, 0)
+ fullStr := humanFull(nf, 0)
+ if str != fullStr {
+ return fmt.Sprintf("%s\t(%s)", str, fullStr)
+ }
+ return str
+}
+
+func humanSI(val float64, decimals int) string {
+ v, unit := humanize.ComputeSI(val)
+ return fmt.Sprintf("%s%s", humanFull(v, decimals), unit)
+}
+
+func humanFull(val float64, decimals int) string {
+ return humanize.CommafWithDigits(val, decimals)
+}
diff --git a/core/commands/stat_provide.go b/core/commands/stat_provide.go
index ef06d8e28..56a0f3dc4 100644
--- a/core/commands/stat_provide.go
+++ b/core/commands/stat_provide.go
@@ -1,65 +1,22 @@
package commands
import (
- "fmt"
- "io"
- "text/tabwriter"
-
cmds "github.com/ipfs/go-ipfs-cmds"
- "github.com/ipfs/kubo/core/commands/cmdenv"
- "github.com/libp2p/go-libp2p-kad-dht/fullrt"
)
var statProvideCmd = &cmds.Command{
Status: cmds.Deprecated,
Helptext: cmds.HelpText{
- Tagline: "Deprecated command, use 'ipfs stats reprovide' instead.",
+ Tagline: "Deprecated command, use 'ipfs provide stat' instead.",
ShortDescription: `
'ipfs stats provide' is deprecated because provide and reprovide operations
are now distinct. This command may be replaced by provide only stats in the
future.
`,
},
- Arguments: []cmds.Argument{},
- Options: []cmds.Option{},
- Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
- nd, err := cmdenv.GetNode(env)
- if err != nil {
- return err
- }
-
- if !nd.IsOnline {
- return ErrNotOnline
- }
-
- stats, err := nd.Provider.Stat()
- if err != nil {
- return err
- }
- _, fullRT := nd.DHTClient.(*fullrt.FullRT)
-
- if err := res.Emit(reprovideStats{stats, fullRT}); err != nil {
- return err
- }
-
- return nil
- },
- Encoders: cmds.EncoderMap{
- cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, s reprovideStats) error {
- wtr := tabwriter.NewWriter(w, 1, 2, 1, ' ', 0)
- defer wtr.Flush()
-
- fmt.Fprintf(wtr, "TotalProvides:\t%s\n", humanNumber(s.TotalReprovides))
- fmt.Fprintf(wtr, "AvgProvideDuration:\t%s\n", humanDuration(s.AvgReprovideDuration))
- fmt.Fprintf(wtr, "LastReprovideDuration:\t%s\n", humanDuration(s.LastReprovideDuration))
- if !s.LastRun.IsZero() {
- fmt.Fprintf(wtr, "LastRun:\t%s\n", humanTime(s.LastRun))
- if s.fullRT {
- fmt.Fprintf(wtr, "NextRun:\t%s\n", humanTime(s.LastRun.Add(s.ReprovideInterval)))
- }
- }
- return nil
- }),
- },
- Type: reprovideStats{},
+ Arguments: provideStatCmd.Arguments,
+ Options: provideStatCmd.Options,
+ Run: provideStatCmd.Run,
+ Encoders: provideStatCmd.Encoders,
+ Type: provideStatCmd.Type,
}
diff --git a/core/commands/stat_reprovide.go b/core/commands/stat_reprovide.go
index 10dbc727d..0e18ceedd 100644
--- a/core/commands/stat_reprovide.go
+++ b/core/commands/stat_reprovide.go
@@ -1,104 +1,21 @@
package commands
import (
- "fmt"
- "io"
- "text/tabwriter"
- "time"
-
- humanize "github.com/dustin/go-humanize"
- "github.com/ipfs/boxo/provider"
cmds "github.com/ipfs/go-ipfs-cmds"
- "github.com/ipfs/kubo/core/commands/cmdenv"
- "github.com/libp2p/go-libp2p-kad-dht/fullrt"
- "golang.org/x/exp/constraints"
)
-type reprovideStats struct {
- provider.ReproviderStats
- fullRT bool
-}
-
var statReprovideCmd = &cmds.Command{
- Status: cmds.Experimental,
+ Status: cmds.Deprecated,
Helptext: cmds.HelpText{
- Tagline: "Returns statistics about the node's reprovider system.",
+ Tagline: "Deprecated command, use 'ipfs provide stat' instead.",
ShortDescription: `
-Returns statistics about the content the node is reproviding every
-Reprovider.Interval according to Reprovider.Strategy:
-https://github.com/ipfs/kubo/blob/master/docs/config.md#reprovider
-
-This interface is not stable and may change from release to release.
-
+'ipfs stats reprovide' is deprecated because provider stats are now
+available fomr 'ipfs provide stat'.
`,
},
- Arguments: []cmds.Argument{},
- Options: []cmds.Option{},
- Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
- nd, err := cmdenv.GetNode(env)
- if err != nil {
- return err
- }
-
- if !nd.IsOnline {
- return ErrNotOnline
- }
-
- stats, err := nd.Provider.Stat()
- if err != nil {
- return err
- }
- _, fullRT := nd.DHTClient.(*fullrt.FullRT)
-
- if err := res.Emit(reprovideStats{stats, fullRT}); err != nil {
- return err
- }
-
- return nil
- },
- Encoders: cmds.EncoderMap{
- cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, s reprovideStats) error {
- wtr := tabwriter.NewWriter(w, 1, 2, 1, ' ', 0)
- defer wtr.Flush()
-
- fmt.Fprintf(wtr, "TotalReprovides:\t%s\n", humanNumber(s.TotalReprovides))
- fmt.Fprintf(wtr, "AvgReprovideDuration:\t%s\n", humanDuration(s.AvgReprovideDuration))
- fmt.Fprintf(wtr, "LastReprovideDuration:\t%s\n", humanDuration(s.LastReprovideDuration))
- if !s.LastRun.IsZero() {
- fmt.Fprintf(wtr, "LastReprovide:\t%s\n", humanTime(s.LastRun))
- if s.fullRT {
- fmt.Fprintf(wtr, "NextReprovide:\t%s\n", humanTime(s.LastRun.Add(s.ReprovideInterval)))
- }
- }
- return nil
- }),
- },
- Type: reprovideStats{},
-}
-
-func humanDuration(val time.Duration) string {
- return val.Truncate(time.Microsecond).String()
-}
-
-func humanTime(val time.Time) string {
- return val.Format("2006-01-02 15:04:05")
-}
-
-func humanNumber[T constraints.Float | constraints.Integer](n T) string {
- nf := float64(n)
- str := humanSI(nf, 0)
- fullStr := humanFull(nf, 0)
- if str != fullStr {
- return fmt.Sprintf("%s\t(%s)", str, fullStr)
- }
- return str
-}
-
-func humanSI(val float64, decimals int) string {
- v, unit := humanize.ComputeSI(val)
- return fmt.Sprintf("%s%s", humanFull(v, decimals), unit)
-}
-
-func humanFull(val float64, decimals int) string {
- return humanize.CommafWithDigits(val, decimals)
+ Arguments: provideStatCmd.Arguments,
+ Options: provideStatCmd.Options,
+ Run: provideStatCmd.Run,
+ Encoders: provideStatCmd.Encoders,
+ Type: provideStatCmd.Type,
}
diff --git a/docs/changelogs/v0.37.md b/docs/changelogs/v0.37.md
index 8c264275b..03d181eaa 100644
--- a/docs/changelogs/v0.37.md
+++ b/docs/changelogs/v0.37.md
@@ -13,6 +13,7 @@ This release was brought to you by the [Interplanetary Shipyard](https://ipship
- [Clear provide queue when reprovide strategy changes](#clear-provide-queue-when-reprovide-strategy-changes)
- [Named pins in `ipfs add` command](#-named-pins-in-ipfs-add-command)
- [Removed unnecessary dependencies](#removed-unnecessary-dependencies)
+ - [Deprecated `ipfs stats reprovide`](#deprecated-ipfs-stats-reprovide)
- [๐ฆ๏ธ Important dependency updates](#-important-dependency-updates)
- [๐ Changelog](#-changelog)
- [๐จโ๐ฉโ๐งโ๐ฆ Contributors](#-contributors)
@@ -55,6 +56,14 @@ Kubo has been cleaned up by removing unnecessary dependencies and packages:
These changes reduce the dependency footprint while improving code maintainability and following Go best practices.
+#### Deprecated `ipfs stats reprovide`
+
+The `ipfs stats reprovide` command has moved to `ipfs provide stat`. This was done to organize provider commands in one location.
+
+> [!NOTE]
+> `ipfs stats reprovide` still works, but is marked as deprecated and will be removed in a future release.
+
+
#### ๐ฆ๏ธ Important dependency updates
- update `go-libp2p` to [v0.42.1](https://github.com/libp2p/go-libp2p/releases/tag/v0.42.1)
From cfbc64845c2674bbf8280e0b0375ad69abd0849d Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Fri, 8 Aug 2025 03:58:12 +0200
Subject: [PATCH 306/499] feat: ipfs-webui v4.8.0 (#10902)
https://github.com/ipfs/ipfs-webui/releases/tag/v4.8.0
---
core/corehttp/webui.go | 3 ++-
docs/changelogs/v0.37.md | 2 +-
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/core/corehttp/webui.go b/core/corehttp/webui.go
index 387a5b9ca..9c3244ad2 100644
--- a/core/corehttp/webui.go
+++ b/core/corehttp/webui.go
@@ -1,11 +1,12 @@
package corehttp
// WebUI version confirmed to work with this Kubo version
-const WebUIPath = "/ipfs/bafybeibfd5kbebqqruouji6ct5qku3tay273g7mt24mmrfzrsfeewaal5y" // v4.7.0
+const WebUIPath = "/ipfs/bafybeifplj2s3yegn7ko7tdnwpoxa4c5uaqnk2ajnw5geqm34slcj6b6mu" // v4.8.0
// WebUIPaths is a list of all past webUI paths.
var WebUIPaths = []string{
WebUIPath,
+ "/ipfs/bafybeibfd5kbebqqruouji6ct5qku3tay273g7mt24mmrfzrsfeewaal5y", // v4.7.0
"/ipfs/bafybeibpaa5kqrj4gkemiswbwndjqiryl65cks64ypwtyerxixu56gnvvm", // v4.6.0
"/ipfs/bafybeiata4qg7xjtwgor6r5dw63jjxyouenyromrrb4lrewxrlvav7gzgi", // v4.5.0
"/ipfs/bafybeigp3zm7cqoiciqk5anlheenqjsgovp7j7zq6hah4nu6iugdgb4nby", // v4.4.2
diff --git a/docs/changelogs/v0.37.md b/docs/changelogs/v0.37.md
index 03d181eaa..c35f21556 100644
--- a/docs/changelogs/v0.37.md
+++ b/docs/changelogs/v0.37.md
@@ -63,12 +63,12 @@ The `ipfs stats reprovide` command has moved to `ipfs provide stat`. This was do
> [!NOTE]
> `ipfs stats reprovide` still works, but is marked as deprecated and will be removed in a future release.
-
#### ๐ฆ๏ธ Important dependency updates
- update `go-libp2p` to [v0.42.1](https://github.com/libp2p/go-libp2p/releases/tag/v0.42.1)
- update `p2p-forge/client` to [v0.6.1](https://github.com/ipshipyard/p2p-forge/releases/tag/v0.6.1)
- update `boxo` to [v0.33.1](https://github.com/ipfs/boxo/releases/tag/v0.33.1)
+- update `ipfs-webui` to [v4.8.0](https://github.com/ipfs/ipfs-webui/releases/tag/v4.8.0)
### ๐ Changelog
From a673c2ec95b81b92a99bbea9d6c4c2de17472aa5 Mon Sep 17 00:00:00 2001
From: Hector Sanjuan
Date: Fri, 8 Aug 2025 10:56:44 +0200
Subject: [PATCH 307/499] fix: Provide according to Reprovider.Strategy
(#10886)
* Provide according to strategy
Updates boxo to a version with the changes from https://github.com/ipfs/boxo/pull/976, which decentralize the providing responsibilities (from a central providing.Exchange to blockstore, pinner, mfs).
The changes consist in initializing the Pinner, MFS and the blockstore with the provider.System, which is created first.
Since the provider.System is created first, the reproviding KeyChanFunc is set
later when we can create it once we have the Pinner, MFS and the blockstore.
Some additional work applies to the Add() workflow. Normally, blocks would get provided at the Blockstore or the Pinner, but when adding blocks AND a "pinned" strategy is used, the blockstore does not provide, and the
pinner does not traverse the DAG (and thus doesn't provide either), so we need to provide directly from the Adder. This is resolved by wrapping the DAGService in a "providingDAGService" which provides every added block, when using the "pinned" strategy.
`ipfs --offline add` when the ONLINE daemon is running will now announce blocks per the chosen strategy, where before it did not announce them. This is documented in the changelog. A couple of releases ago, adding with `ipfs --offline add` was faster, but this is no longer the case so we are not incurring in any penalties by sticking to the fact that the daemon is online and has a providing strategy that we follow.
Co-authored-by: gammazero <11790789+gammazero@users.noreply.github.com>
Co-authored-by: Marcin Rataj
---
client/rpc/api_test.go | 4 +
config/reprovider.go | 34 ++-
core/core.go | 2 +
core/coreapi/coreapi.go | 11 +-
core/coreapi/pin.go | 4 -
core/coreapi/test/api_test.go | 3 +
core/coreapi/unixfs.go | 69 +++++-
core/coreiface/tests/routing.go | 7 +
core/coreunix/add.go | 8 +-
core/node/bitswap.go | 28 ---
core/node/core.go | 168 +++++++++------
core/node/groups.go | 15 +-
core/node/provider.go | 222 +++++++++++++------
core/node/storage.go | 29 ++-
docs/changelogs/v0.37.md | 17 +-
docs/examples/kubo-as-a-library/go.mod | 2 +-
docs/examples/kubo-as-a-library/go.sum | 4 +-
fuse/ipns/ipns_unix.go | 5 +-
go.mod | 2 +-
go.sum | 4 +-
test/cli/harness/ipfs.go | 28 +++
test/cli/provider_test.go | 281 ++++++++++++++++++++++---
test/dependencies/go.mod | 3 +-
test/dependencies/go.sum | 6 +-
24 files changed, 727 insertions(+), 229 deletions(-)
diff --git a/client/rpc/api_test.go b/client/rpc/api_test.go
index c0da3d7b0..e51aebfba 100644
--- a/client/rpc/api_test.go
+++ b/client/rpc/api_test.go
@@ -12,6 +12,7 @@ import (
"time"
"github.com/ipfs/boxo/path"
+ "github.com/ipfs/kubo/config"
iface "github.com/ipfs/kubo/core/coreiface"
"github.com/ipfs/kubo/core/coreiface/tests"
"github.com/ipfs/kubo/test/cli/harness"
@@ -45,6 +46,9 @@ func (np NodeProvider) MakeAPISwarm(t *testing.T, ctx context.Context, fullIdent
c := n.ReadConfig()
c.Experimental.FilestoreEnabled = true
+ // only provide things we pin. Allows to test
+ // provide operations.
+ c.Reprovider.Strategy = config.NewOptionalString("roots")
n.WriteConfig(c)
n.StartDaemon("--enable-pubsub-experiment", "--offline="+strconv.FormatBool(!online))
diff --git a/config/reprovider.go b/config/reprovider.go
index 3e8a5b476..c02b64e85 100644
--- a/config/reprovider.go
+++ b/config/reprovider.go
@@ -1,15 +1,47 @@
package config
-import "time"
+import (
+ "strings"
+ "time"
+)
const (
DefaultReproviderInterval = time.Hour * 22 // https://github.com/ipfs/kubo/pull/9326
DefaultReproviderStrategy = "all"
)
+type ReproviderStrategy int
+
+const (
+ ReproviderStrategyAll ReproviderStrategy = 1 << iota // 1 (0b00001)
+ ReproviderStrategyFlat // 2 (0b00010)
+ ReproviderStrategyPinned // 4 (0b00100)
+ ReproviderStrategyRoots // 8 (0b01000)
+ ReproviderStrategyMFS // 16 (0b10000)
+)
+
// Reprovider configuration describes how CID from local datastore are periodically re-announced to routing systems.
// For provide behavior of ad-hoc or newly created CIDs and their first-time announcement, see Provider.*
type Reprovider struct {
Interval *OptionalDuration `json:",omitempty"` // Time period to reprovide locally stored objects to the network
Strategy *OptionalString `json:",omitempty"` // Which keys to announce
}
+
+func ParseReproviderStrategy(s string) ReproviderStrategy {
+ var strategy ReproviderStrategy
+ for _, part := range strings.Split(s, "+") {
+ switch part {
+ case "all", "": // special case, does not mix with others
+ return ReproviderStrategyAll
+ case "flat":
+ strategy |= ReproviderStrategyFlat
+ case "pinned":
+ strategy |= ReproviderStrategyPinned
+ case "roots":
+ strategy |= ReproviderStrategyRoots
+ case "mfs":
+ strategy |= ReproviderStrategyMFS
+ }
+ }
+ return strategy
+}
diff --git a/core/core.go b/core/core.go
index c693600f7..10571ba3e 100644
--- a/core/core.go
+++ b/core/core.go
@@ -107,6 +107,8 @@ type IpfsNode struct {
Bitswap *bitswap.Bitswap `optional:"true"` // The Bitswap instance
Namesys namesys.NameSystem // the name system, resolves paths to hashes
Provider provider.System // the value provider system
+ ProvidingStrategy config.ReproviderStrategy `optional:"true"`
+ ProvidingKeyChanFunc provider.KeyChanFunc `optional:"true"`
IpnsRepub *ipnsrp.Republisher `optional:"true"`
ResourceManager network.ResourceManager `optional:"true"`
diff --git a/core/coreapi/coreapi.go b/core/coreapi/coreapi.go
index 6e099e5fd..66763e884 100644
--- a/core/coreapi/coreapi.go
+++ b/core/coreapi/coreapi.go
@@ -26,6 +26,7 @@ import (
provider "github.com/ipfs/boxo/provider"
offlineroute "github.com/ipfs/boxo/routing/offline"
ipld "github.com/ipfs/go-ipld-format"
+ logging "github.com/ipfs/go-log/v2"
"github.com/ipfs/kubo/config"
coreiface "github.com/ipfs/kubo/core/coreiface"
"github.com/ipfs/kubo/core/coreiface/options"
@@ -44,6 +45,8 @@ import (
"github.com/ipfs/kubo/repo"
)
+var log = logging.Logger("coreapi")
+
type CoreAPI struct {
nctx context.Context
@@ -70,7 +73,8 @@ type CoreAPI struct {
ipldPathResolver pathresolver.Resolver
unixFSPathResolver pathresolver.Resolver
- provider provider.System
+ provider provider.System
+ providingStrategy config.ReproviderStrategy
pubSub *pubsub.PubSub
@@ -185,7 +189,8 @@ func (api *CoreAPI) WithOptions(opts ...options.ApiOption) (coreiface.CoreAPI, e
ipldPathResolver: n.IPLDPathResolver,
unixFSPathResolver: n.UnixFSPathResolver,
- provider: n.Provider,
+ provider: n.Provider,
+ providingStrategy: n.ProvidingStrategy,
pubSub: n.PubSub,
@@ -235,8 +240,6 @@ func (api *CoreAPI) WithOptions(opts ...options.ApiOption) (coreiface.CoreAPI, e
return nil, fmt.Errorf("error constructing namesys: %w", err)
}
- subAPI.provider = provider.NewNoopProvider()
-
subAPI.peerstore = nil
subAPI.peerHost = nil
subAPI.recordValidator = nil
diff --git a/core/coreapi/pin.go b/core/coreapi/pin.go
index 878b4c28d..9bb44bac5 100644
--- a/core/coreapi/pin.go
+++ b/core/coreapi/pin.go
@@ -44,10 +44,6 @@ func (api *PinAPI) Add(ctx context.Context, p path.Path, opts ...caopts.PinAddOp
return fmt.Errorf("pin: %s", err)
}
- if err := api.provider.Provide(ctx, dagNode.Cid(), true); err != nil {
- return err
- }
-
return api.pinning.Flush(ctx)
}
diff --git a/core/coreapi/test/api_test.go b/core/coreapi/test/api_test.go
index dfd8cf685..7867e1f1c 100644
--- a/core/coreapi/test/api_test.go
+++ b/core/coreapi/test/api_test.go
@@ -70,6 +70,9 @@ func (NodeProvider) MakeAPISwarm(t *testing.T, ctx context.Context, fullIdentity
c.Identity = ident
c.Experimental.FilestoreEnabled = true
c.AutoTLS.Enabled = config.False // disable so no /ws listener is added
+ // For provider tests, avoid that content gets
+ // auto-provided without calling "provide" (unless pinned).
+ c.Reprovider.Strategy = config.NewOptionalString("roots")
ds := syncds.MutexWrap(datastore.NewMapDatastore())
r := &repo.Mock{
diff --git a/core/coreapi/unixfs.go b/core/coreapi/unixfs.go
index 6c78a869a..b0206e7b9 100644
--- a/core/coreapi/unixfs.go
+++ b/core/coreapi/unixfs.go
@@ -16,6 +16,7 @@ import (
uio "github.com/ipfs/boxo/ipld/unixfs/io"
"github.com/ipfs/boxo/mfs"
"github.com/ipfs/boxo/path"
+ provider "github.com/ipfs/boxo/provider"
cid "github.com/ipfs/go-cid"
cidutil "github.com/ipfs/go-cidutil"
ds "github.com/ipfs/go-datastore"
@@ -102,7 +103,22 @@ func (api *UnixfsAPI) Add(ctx context.Context, files files.Node, opts ...options
bserv := blockservice.New(addblockstore, exch,
blockservice.WriteThrough(cfg.Datastore.WriteThrough.WithDefault(config.DefaultWriteThrough)),
) // hash security 001
- dserv := merkledag.NewDAGService(bserv)
+
+ var dserv ipld.DAGService = merkledag.NewDAGService(bserv)
+
+ // wrap the DAGService in a providingDAG service which provides every block written.
+ // note about strategies:
+ // - "all"/"flat" gets handled directly at the blockstore so no need to provide
+ // - "roots" gets handled in the pinner
+ // - "mfs" gets handled in mfs
+ // We need to provide the "pinned" cases only. Added blocks are not
+ // going to be provided by the blockstore (wrong strategy for that),
+ // nor by the pinner (the pinner doesn't traverse the pinned DAG itself, it only
+ // handles roots). This wrapping ensures all blocks of pinned content get provided.
+ if settings.Pin && !settings.OnlyHash &&
+ (api.providingStrategy&config.ReproviderStrategyPinned) != 0 {
+ dserv = &providingDagService{dserv, api.provider}
+ }
// add a sync call to the DagService
// this ensures that data written to the DagService is persisted to the underlying datastore
@@ -126,6 +142,11 @@ func (api *UnixfsAPI) Add(ctx context.Context, files files.Node, opts ...options
}
}
+ // Note: the dag service gets wrapped multiple times:
+ // 1. providingDagService (if pinned strategy) - provides blocks as they're added
+ // 2. syncDagService - ensures data persistence
+ // 3. batchingDagService (in coreunix.Adder) - batches operations for efficiency
+
fileAdder, err := coreunix.NewAdder(ctx, pinning, addblockstore, syncDserv)
if err != nil {
return path.ImmutablePath{}, err
@@ -183,7 +204,8 @@ func (api *UnixfsAPI) Add(ctx context.Context, files files.Node, opts ...options
if err != nil {
return path.ImmutablePath{}, err
}
- mr, err := mfs.NewRoot(ctx, md, emptyDirNode, nil)
+ // MFS root for OnlyHash mode: provider is nil since we're not storing/providing anything
+ mr, err := mfs.NewRoot(ctx, md, emptyDirNode, nil, nil)
if err != nil {
return path.ImmutablePath{}, err
}
@@ -196,12 +218,6 @@ func (api *UnixfsAPI) Add(ctx context.Context, files files.Node, opts ...options
return path.ImmutablePath{}, err
}
- if !settings.OnlyHash {
- if err := api.provider.Provide(ctx, nd.Cid(), true); err != nil {
- return path.ImmutablePath{}, err
- }
- }
-
return path.FromCid(nd.Cid()), nil
}
@@ -367,3 +383,40 @@ type syncDagService struct {
func (s *syncDagService) Sync() error {
return s.syncFn()
}
+
+type providingDagService struct {
+ ipld.DAGService
+ provider provider.System
+}
+
+func (pds *providingDagService) Add(ctx context.Context, n ipld.Node) error {
+ if err := pds.DAGService.Add(ctx, n); err != nil {
+ return err
+ }
+ // Provider errors are logged but not propagated.
+ // We don't want DAG operations to fail due to providing issues.
+ // The user's data is still stored successfully even if the
+ // announcement to the routing system fails temporarily.
+ if err := pds.provider.Provide(ctx, n.Cid(), true); err != nil {
+ log.Error(err)
+ }
+ return nil
+}
+
+func (pds *providingDagService) AddMany(ctx context.Context, nds []ipld.Node) error {
+ if err := pds.DAGService.AddMany(ctx, nds); err != nil {
+ return err
+ }
+ // Same error handling philosophy as Add(): log but don't fail.
+ // Note: Provide calls are intentionally blocking here - the Provider
+ // implementation should handle concurrency/queuing internally.
+ for _, n := range nds {
+ if err := pds.provider.Provide(ctx, n.Cid(), true); err != nil {
+ log.Error(err)
+ break
+ }
+ }
+ return nil
+}
+
+var _ ipld.DAGService = (*providingDagService)(nil)
diff --git a/core/coreiface/tests/routing.go b/core/coreiface/tests/routing.go
index 753d49550..147cb9b74 100644
--- a/core/coreiface/tests/routing.go
+++ b/core/coreiface/tests/routing.go
@@ -171,6 +171,13 @@ func (tp *TestSuite) TestRoutingFindProviders(t *testing.T) {
t.Fatal(err)
}
+ // Pin so that it is provided, given that providing strategy is
+ // "roots" and addTestObject does not pin.
+ err = apis[0].Pin().Add(ctx, p)
+ if err != nil {
+ t.Fatal(err)
+ }
+
time.Sleep(3 * time.Second)
out, err := apis[2].Routing().FindProviders(ctx, p, options.Routing.NumProviders(1))
diff --git a/core/coreunix/add.go b/core/coreunix/add.go
index c693773f9..55a9d5bec 100644
--- a/core/coreunix/add.go
+++ b/core/coreunix/add.go
@@ -103,7 +103,7 @@ func (adder *Adder) mfsRoot() (*mfs.Root, error) {
}
// Note, this adds it to DAGService already.
- mr, err := mfs.NewEmptyRoot(adder.ctx, adder.dagService, nil, mfs.MkdirOpts{
+ mr, err := mfs.NewEmptyRoot(adder.ctx, adder.dagService, nil, nil, mfs.MkdirOpts{
CidBuilder: adder.CidBuilder,
MaxLinks: adder.MaxDirectoryLinks,
MaxHAMTFanout: adder.MaxHAMTFanout,
@@ -416,7 +416,7 @@ func (adder *Adder) addFileNode(ctx context.Context, path string, file files.Nod
case files.Directory:
return adder.addDir(ctx, path, f, toplevel)
case *files.Symlink:
- return adder.addSymlink(path, f)
+ return adder.addSymlink(ctx, path, f)
case files.File:
return adder.addFile(path, f)
default:
@@ -424,7 +424,7 @@ func (adder *Adder) addFileNode(ctx context.Context, path string, file files.Nod
}
}
-func (adder *Adder) addSymlink(path string, l *files.Symlink) error {
+func (adder *Adder) addSymlink(ctx context.Context, path string, l *files.Symlink) error {
sdata, err := unixfs.SymlinkData(l.Target)
if err != nil {
return err
@@ -482,7 +482,7 @@ func (adder *Adder) addDir(ctx context.Context, path string, dir files.Directory
// if we need to store mode or modification time then create a new root which includes that data
if toplevel && (adder.FileMode != 0 || !adder.FileMtime.IsZero()) {
- mr, err := mfs.NewEmptyRoot(ctx, adder.dagService, nil,
+ mr, err := mfs.NewEmptyRoot(ctx, adder.dagService, nil, nil,
mfs.MkdirOpts{
CidBuilder: adder.CidBuilder,
MaxLinks: adder.MaxDirectoryLinks,
diff --git a/core/node/bitswap.go b/core/node/bitswap.go
index 250dc89f6..e73145292 100644
--- a/core/node/bitswap.go
+++ b/core/node/bitswap.go
@@ -14,8 +14,6 @@ import (
"github.com/ipfs/boxo/bitswap/network/httpnet"
blockstore "github.com/ipfs/boxo/blockstore"
exchange "github.com/ipfs/boxo/exchange"
- "github.com/ipfs/boxo/exchange/providing"
- provider "github.com/ipfs/boxo/provider"
rpqm "github.com/ipfs/boxo/routing/providerquerymanager"
"github.com/ipfs/go-cid"
ipld "github.com/ipfs/go-ipld-format"
@@ -222,32 +220,6 @@ func OnlineExchange(isBitswapActive bool) interface{} {
}
}
-type providingExchangeIn struct {
- fx.In
-
- BaseExch exchange.Interface
- Provider provider.System
-}
-
-// ProvidingExchange creates a providing.Exchange with the existing exchange
-// and the provider.System.
-// We cannot do this in OnlineExchange because it causes cycles so this is for
-// a decorator.
-func ProvidingExchange(provide bool) interface{} {
- return func(in providingExchangeIn, lc fx.Lifecycle) exchange.Interface {
- exch := in.BaseExch
- if provide {
- exch = providing.New(in.BaseExch, in.Provider)
- lc.Append(fx.Hook{
- OnStop: func(ctx context.Context) error {
- return exch.Close()
- },
- })
- }
- return exch
- }
-}
-
type noopExchange struct {
closer io.Closer
}
diff --git a/core/node/core.go b/core/node/core.go
index cb3439939..38e68f285 100644
--- a/core/node/core.go
+++ b/core/node/core.go
@@ -2,6 +2,7 @@ package node
import (
"context"
+ "errors"
"fmt"
"github.com/ipfs/boxo/blockservice"
@@ -17,6 +18,7 @@ import (
pathresolver "github.com/ipfs/boxo/path/resolver"
pin "github.com/ipfs/boxo/pinning/pinner"
"github.com/ipfs/boxo/pinning/pinner/dspinner"
+ provider "github.com/ipfs/boxo/provider"
"github.com/ipfs/go-cid"
"github.com/ipfs/go-datastore"
format "github.com/ipfs/go-ipld-format"
@@ -47,25 +49,50 @@ func BlockService(cfg *config.Config) func(lc fx.Lifecycle, bs blockstore.Blocks
}
// Pinning creates new pinner which tells GC which blocks should be kept
-func Pinning(bstore blockstore.Blockstore, ds format.DAGService, repo repo.Repo) (pin.Pinner, error) {
- rootDS := repo.Datastore()
+func Pinning(strategy string) func(bstore blockstore.Blockstore, ds format.DAGService, repo repo.Repo, prov provider.System) (pin.Pinner, error) {
+ // Parse strategy at function creation time (not inside the returned function)
+ // This happens before the provider is created, which is why we pass the strategy
+ // string and parse it here, rather than using fx-provided ProvidingStrategy.
+ strategyFlag := config.ParseReproviderStrategy(strategy)
- syncFn := func(ctx context.Context) error {
- if err := rootDS.Sync(ctx, blockstore.BlockPrefix); err != nil {
- return err
+ return func(bstore blockstore.Blockstore,
+ ds format.DAGService,
+ repo repo.Repo,
+ prov provider.System) (pin.Pinner, error) {
+ rootDS := repo.Datastore()
+
+ syncFn := func(ctx context.Context) error {
+ if err := rootDS.Sync(ctx, blockstore.BlockPrefix); err != nil {
+ return err
+ }
+ return rootDS.Sync(ctx, filestore.FilestorePrefix)
}
- return rootDS.Sync(ctx, filestore.FilestorePrefix)
+ syncDs := &syncDagService{ds, syncFn}
+
+ ctx := context.TODO()
+
+ var opts []dspinner.Option
+ roots := (strategyFlag & config.ReproviderStrategyRoots) != 0
+ pinned := (strategyFlag & config.ReproviderStrategyPinned) != 0
+
+ // Important: Only one of WithPinnedProvider or WithRootsProvider should be active.
+ // Having both would cause duplicate root advertisements since "pinned" includes all
+ // pinned content (roots + children), while "roots" is just the root CIDs.
+ // We prioritize "pinned" if both are somehow set (though this shouldn't happen
+ // with proper strategy parsing).
+ if pinned {
+ opts = append(opts, dspinner.WithPinnedProvider(prov))
+ } else if roots {
+ opts = append(opts, dspinner.WithRootsProvider(prov))
+ }
+
+ pinning, err := dspinner.New(ctx, rootDS, syncDs, opts...)
+ if err != nil {
+ return nil, err
+ }
+
+ return pinning, nil
}
- syncDs := &syncDagService{ds, syncFn}
-
- ctx := context.TODO()
-
- pinning, err := dspinner.New(ctx, rootDS, syncDs)
- if err != nil {
- return nil, err
- }
-
- return pinning, nil
}
var (
@@ -152,63 +179,76 @@ func Dag(bs blockservice.BlockService) format.DAGService {
}
// Files loads persisted MFS root
-func Files(mctx helpers.MetricsCtx, lc fx.Lifecycle, repo repo.Repo, dag format.DAGService, bs blockstore.Blockstore) (*mfs.Root, error) {
- dsk := datastore.NewKey("/local/filesroot")
- pf := func(ctx context.Context, c cid.Cid) error {
- rootDS := repo.Datastore()
- if err := rootDS.Sync(ctx, blockstore.BlockPrefix); err != nil {
- return err
- }
- if err := rootDS.Sync(ctx, filestore.FilestorePrefix); err != nil {
- return err
+func Files(strategy string) func(mctx helpers.MetricsCtx, lc fx.Lifecycle, repo repo.Repo, dag format.DAGService, bs blockstore.Blockstore, prov provider.System) (*mfs.Root, error) {
+ return func(mctx helpers.MetricsCtx, lc fx.Lifecycle, repo repo.Repo, dag format.DAGService, bs blockstore.Blockstore, prov provider.System) (*mfs.Root, error) {
+ dsk := datastore.NewKey("/local/filesroot")
+ pf := func(ctx context.Context, c cid.Cid) error {
+ rootDS := repo.Datastore()
+ if err := rootDS.Sync(ctx, blockstore.BlockPrefix); err != nil {
+ return err
+ }
+ if err := rootDS.Sync(ctx, filestore.FilestorePrefix); err != nil {
+ return err
+ }
+
+ if err := rootDS.Put(ctx, dsk, c.Bytes()); err != nil {
+ return err
+ }
+ return rootDS.Sync(ctx, dsk)
}
- if err := rootDS.Put(ctx, dsk, c.Bytes()); err != nil {
- return err
- }
- return rootDS.Sync(ctx, dsk)
- }
+ var nd *merkledag.ProtoNode
+ ctx := helpers.LifecycleCtx(mctx, lc)
+ val, err := repo.Datastore().Get(ctx, dsk)
- var nd *merkledag.ProtoNode
- ctx := helpers.LifecycleCtx(mctx, lc)
- val, err := repo.Datastore().Get(ctx, dsk)
+ switch {
+ case errors.Is(err, datastore.ErrNotFound):
+ nd = unixfs.EmptyDirNode()
+ err := dag.Add(ctx, nd)
+ if err != nil {
+ return nil, fmt.Errorf("failure writing filesroot to dagstore: %s", err)
+ }
+ case err == nil:
+ c, err := cid.Cast(val)
+ if err != nil {
+ return nil, err
+ }
- switch {
- case err == datastore.ErrNotFound || val == nil:
- nd = unixfs.EmptyDirNode()
- err := dag.Add(ctx, nd)
- if err != nil {
- return nil, fmt.Errorf("failure writing filesroot to dagstore: %s", err)
- }
- case err == nil:
- c, err := cid.Cast(val)
- if err != nil {
+ offineDag := merkledag.NewDAGService(blockservice.New(bs, offline.Exchange(bs)))
+ rnd, err := offineDag.Get(ctx, c)
+ if err != nil {
+ return nil, fmt.Errorf("error loading filesroot from dagservice: %s", err)
+ }
+
+ pbnd, ok := rnd.(*merkledag.ProtoNode)
+ if !ok {
+ return nil, merkledag.ErrNotProtobuf
+ }
+
+ nd = pbnd
+ default:
return nil, err
}
- offineDag := merkledag.NewDAGService(blockservice.New(bs, offline.Exchange(bs)))
- rnd, err := offineDag.Get(ctx, c)
- if err != nil {
- return nil, fmt.Errorf("error loading filesroot from dagservice: %s", err)
+ // MFS (Mutable File System) provider integration:
+ // Only pass the provider to MFS when the strategy includes "mfs".
+ // MFS will call Provide() on every DAGService.Add() operation,
+ // which is sufficient for the "mfs" strategy - it ensures all
+ // MFS content gets announced as it's added or modified.
+ // For non-mfs strategies, we set provider to nil to avoid unnecessary providing.
+ strategyFlag := config.ParseReproviderStrategy(strategy)
+ if strategyFlag&config.ReproviderStrategyMFS == 0 {
+ prov = nil
}
- pbnd, ok := rnd.(*merkledag.ProtoNode)
- if !ok {
- return nil, merkledag.ErrNotProtobuf
- }
+ root, err := mfs.NewRoot(ctx, dag, nd, pf, prov)
- nd = pbnd
- default:
- return nil, err
+ lc.Append(fx.Hook{
+ OnStop: func(ctx context.Context) error {
+ return root.Close()
+ },
+ })
+
+ return root, err
}
-
- root, err := mfs.NewRoot(ctx, dag, nd, pf)
-
- lc.Append(fx.Hook{
- OnStop: func(ctx context.Context) error {
- return root.Close()
- },
- })
-
- return root, err
}
diff --git a/core/node/groups.go b/core/node/groups.go
index 5b16b5527..9904574a8 100644
--- a/core/node/groups.go
+++ b/core/node/groups.go
@@ -250,7 +250,12 @@ func Storage(bcfg *BuildCfg, cfg *config.Config) fx.Option {
return fx.Options(
fx.Provide(RepoConfig),
fx.Provide(Datastore),
- fx.Provide(BaseBlockstoreCtor(cacheOpts, cfg.Datastore.HashOnRead, cfg.Datastore.WriteThrough.WithDefault(config.DefaultWriteThrough))),
+ fx.Provide(BaseBlockstoreCtor(
+ cacheOpts,
+ cfg.Datastore.HashOnRead,
+ cfg.Datastore.WriteThrough.WithDefault(config.DefaultWriteThrough),
+ cfg.Reprovider.Strategy.WithDefault(config.DefaultReproviderStrategy),
+ )),
finalBstore,
)
}
@@ -350,8 +355,6 @@ func Online(bcfg *BuildCfg, cfg *config.Config, userResourceOverrides rcmgr.Part
fx.Provide(BitswapOptions(cfg)),
fx.Provide(Bitswap(isBitswapServerEnabled, isBitswapLibp2pEnabled, isHTTPRetrievalEnabled)),
fx.Provide(OnlineExchange(isBitswapLibp2pEnabled)),
- // Replace our Exchange with a Providing exchange!
- fx.Decorate(ProvidingExchange(isProviderEnabled && isBitswapServerEnabled)),
fx.Provide(DNSResolver),
fx.Provide(Namesys(ipnsCacheSize, cfg.Ipns.MaxCacheTTL.WithDefault(config.DefaultIpnsMaxCacheTTL))),
fx.Provide(Peering),
@@ -391,8 +394,6 @@ var Core = fx.Options(
fx.Provide(Dag),
fx.Provide(FetcherConfig),
fx.Provide(PathResolverConfig),
- fx.Provide(Pinning),
- fx.Provide(Files),
)
func Networked(bcfg *BuildCfg, cfg *config.Config, userResourceOverrides rcmgr.PartialLimitConfig) fx.Option {
@@ -442,6 +443,8 @@ func IPFS(ctx context.Context, bcfg *BuildCfg) fx.Option {
uio.HAMTShardingSize = int(shardSingThresholdInt)
uio.DefaultShardWidth = int(shardMaxFanout)
+ providerStrategy := cfg.Reprovider.Strategy.WithDefault(config.DefaultReproviderStrategy)
+
return fx.Options(
bcfgOpts,
@@ -450,6 +453,8 @@ func IPFS(ctx context.Context, bcfg *BuildCfg) fx.Option {
IPNS,
Networked(bcfg, cfg, userResourceOverrides),
fx.Provide(BlockService(cfg)),
+ fx.Provide(Pinning(providerStrategy)),
+ fx.Provide(Files(providerStrategy)),
Core,
)
}
diff --git a/core/node/provider.go b/core/node/provider.go
index d1237da97..5858c11dc 100644
--- a/core/node/provider.go
+++ b/core/node/provider.go
@@ -10,9 +10,12 @@ import (
"github.com/ipfs/boxo/fetcher"
"github.com/ipfs/boxo/mfs"
pin "github.com/ipfs/boxo/pinning/pinner"
+ "github.com/ipfs/boxo/pinning/pinner/dspinner"
provider "github.com/ipfs/boxo/provider"
"github.com/ipfs/go-cid"
"github.com/ipfs/go-datastore"
+ "github.com/ipfs/go-datastore/query"
+ "github.com/ipfs/kubo/config"
"github.com/ipfs/kubo/repo"
irouting "github.com/ipfs/kubo/routing"
"go.uber.org/fx"
@@ -26,12 +29,14 @@ const sampledBatchSize = 1000
// Datastore key used to store previous reprovide strategy.
const reprovideStrategyKey = "/reprovideStrategy"
-func ProviderSys(reprovideInterval time.Duration, acceleratedDHTClient bool, provideWorkerCount int, reprovideStrategy string) fx.Option {
- return fx.Provide(func(lc fx.Lifecycle, cr irouting.ProvideManyRouter, keyProvider provider.KeyChanFunc, repo repo.Repo, bs blockstore.Blockstore) (provider.System, error) {
+func ProviderSys(reprovideInterval time.Duration, acceleratedDHTClient bool, provideWorkerCount int) fx.Option {
+ return fx.Provide(func(lc fx.Lifecycle, cr irouting.ProvideManyRouter, repo repo.Repo) (provider.System, error) {
+ // Initialize provider.System first, before pinner/blockstore/etc.
+ // The KeyChanFunc will be set later via SetKeyProvider() once we have
+ // created the pinner, blockstore and other dependencies.
opts := []provider.Option{
provider.Online(cr),
provider.ReproviderInterval(reprovideInterval),
- provider.KeyProvider(keyProvider),
provider.ProvideWorkerCount(provideWorkerCount),
}
if !acceleratedDHTClient && reprovideInterval > 0 {
@@ -50,16 +55,20 @@ func ProviderSys(reprovideInterval time.Duration, acceleratedDHTClient bool, pro
defer cancel()
// FIXME: I want a running counter of blocks so size of blockstore can be an O(1) lookup.
- ch, err := bs.AllKeysChan(ctx)
+ // Note: talk to datastore directly, as to not depend on Blockstore here.
+ qr, err := repo.Datastore().Query(ctx, query.Query{
+ Prefix: blockstore.BlockPrefix.String(),
+ KeysOnly: true})
if err != nil {
logger.Errorf("fetching AllKeysChain in provider ThroughputReport: %v", err)
return false
}
+ defer qr.Close()
count = 0
countLoop:
for {
select {
- case _, ok := <-ch:
+ case _, ok := <-qr.Next():
if !ok {
break countLoop
}
@@ -120,34 +129,10 @@ https://github.com/ipfs/kubo/blob/master/docs/config.md#routingaccelerateddhtcli
}, sampledBatchSize))
}
- var strategyChanged bool
- ctx := context.Background()
- ds := repo.Datastore()
- strategyKey := datastore.NewKey(reprovideStrategyKey)
-
- prev, err := ds.Get(ctx, strategyKey)
- if err != nil && !errors.Is(err, datastore.ErrNotFound) {
- logger.Error("cannot read previous reprovide strategy", "err", err)
- } else if string(prev) != reprovideStrategy {
- strategyChanged = true
- }
-
- sys, err := provider.New(ds, opts...)
+ sys, err := provider.New(repo.Datastore(), opts...)
if err != nil {
return nil, err
}
- if strategyChanged {
- logger.Infow("Reprovider.Strategy changed, clearing provide queue", "previous", string(prev), "current", reprovideStrategy)
- sys.Clear()
- if reprovideStrategy == "" {
- err = ds.Delete(ctx, strategyKey)
- } else {
- err = ds.Put(ctx, strategyKey, []byte(reprovideStrategy))
- }
- if err != nil {
- logger.Error("cannot update reprovide strategy", "err", err)
- }
- }
lc.Append(fx.Hook{
OnStop: func(ctx context.Context) error {
@@ -162,22 +147,19 @@ https://github.com/ipfs/kubo/blob/master/docs/config.md#routingaccelerateddhtcli
// ONLINE/OFFLINE
// OnlineProviders groups units managing provider routing records online
-func OnlineProviders(provide bool, reprovideStrategy string, reprovideInterval time.Duration, acceleratedDHTClient bool, provideWorkerCount int) fx.Option {
+func OnlineProviders(provide bool, providerStrategy string, reprovideInterval time.Duration, acceleratedDHTClient bool, provideWorkerCount int) fx.Option {
if !provide {
return OfflineProviders()
}
- var keyProvider fx.Option
- switch reprovideStrategy {
- case "all", "", "roots", "pinned", "mfs", "pinned+mfs", "flat":
- keyProvider = fx.Provide(newProvidingStrategy(reprovideStrategy))
- default:
- return fx.Error(fmt.Errorf("unknown reprovider strategy %q", reprovideStrategy))
+ strategyFlag := config.ParseReproviderStrategy(providerStrategy)
+ if strategyFlag == 0 {
+ return fx.Error(fmt.Errorf("unknown reprovider strategy %q", providerStrategy))
}
return fx.Options(
- keyProvider,
- ProviderSys(reprovideInterval, acceleratedDHTClient, provideWorkerCount, reprovideStrategy),
+ fx.Provide(setReproviderKeyProvider(providerStrategy)),
+ ProviderSys(reprovideInterval, acceleratedDHTClient, provideWorkerCount),
)
}
@@ -215,38 +197,138 @@ func mfsRootProvider(mfsRoot *mfs.Root) provider.KeyChanFunc {
}
}
-func newProvidingStrategy(strategy string) interface{} {
- type input struct {
- fx.In
- Pinner pin.Pinner
- Blockstore blockstore.Blockstore
- OfflineIPLDFetcher fetcher.Factory `name:"offlineIpldFetcher"`
- OfflineUnixFSFetcher fetcher.Factory `name:"offlineUnixfsFetcher"`
- MFSRoot *mfs.Root
+type provStrategyIn struct {
+ fx.In
+ Pinner pin.Pinner
+ Blockstore blockstore.Blockstore
+ OfflineIPLDFetcher fetcher.Factory `name:"offlineIpldFetcher"`
+ OfflineUnixFSFetcher fetcher.Factory `name:"offlineUnixfsFetcher"`
+ MFSRoot *mfs.Root
+ Provider provider.System
+ Repo repo.Repo
+}
+
+type provStrategyOut struct {
+ fx.Out
+ ProvidingStrategy config.ReproviderStrategy
+ ProvidingKeyChanFunc provider.KeyChanFunc
+}
+
+// createKeyProvider creates the appropriate KeyChanFunc based on strategy.
+// Each strategy has different behavior:
+// - "roots": Only root CIDs of pinned content
+// - "pinned": All pinned content (roots + children)
+// - "mfs": Only MFS content
+// - "flat": All blocks, no prioritization
+// - "all": Prioritized: pins first, then MFS roots, then all blocks
+func createKeyProvider(strategyFlag config.ReproviderStrategy, in provStrategyIn) provider.KeyChanFunc {
+ switch strategyFlag {
+ case config.ReproviderStrategyRoots:
+ return provider.NewBufferedProvider(dspinner.NewPinnedProvider(true, in.Pinner, in.OfflineIPLDFetcher))
+ case config.ReproviderStrategyPinned:
+ return provider.NewBufferedProvider(dspinner.NewPinnedProvider(false, in.Pinner, in.OfflineIPLDFetcher))
+ case config.ReproviderStrategyPinned | config.ReproviderStrategyMFS:
+ return provider.NewPrioritizedProvider(
+ provider.NewBufferedProvider(dspinner.NewPinnedProvider(false, in.Pinner, in.OfflineIPLDFetcher)),
+ mfsProvider(in.MFSRoot, in.OfflineUnixFSFetcher),
+ )
+ case config.ReproviderStrategyMFS:
+ return mfsProvider(in.MFSRoot, in.OfflineUnixFSFetcher)
+ case config.ReproviderStrategyFlat:
+ return in.Blockstore.AllKeysChan
+ default: // "all", ""
+ return createAllStrategyProvider(in)
}
- return func(in input) provider.KeyChanFunc {
- switch strategy {
- case "roots":
- return provider.NewBufferedProvider(provider.NewPinnedProvider(true, in.Pinner, in.OfflineIPLDFetcher))
- case "pinned":
- return provider.NewBufferedProvider(provider.NewPinnedProvider(false, in.Pinner, in.OfflineIPLDFetcher))
- case "pinned+mfs":
- return provider.NewPrioritizedProvider(
- provider.NewBufferedProvider(provider.NewPinnedProvider(false, in.Pinner, in.OfflineIPLDFetcher)),
- mfsProvider(in.MFSRoot, in.OfflineUnixFSFetcher),
- )
- case "mfs":
- return mfsProvider(in.MFSRoot, in.OfflineUnixFSFetcher)
- case "flat":
- return provider.NewBlockstoreProvider(in.Blockstore)
- default: // "all", ""
- return provider.NewPrioritizedProvider(
- provider.NewPrioritizedProvider(
- provider.NewBufferedProvider(provider.NewPinnedProvider(true, in.Pinner, in.OfflineIPLDFetcher)),
- mfsRootProvider(in.MFSRoot),
- ),
- provider.NewBlockstoreProvider(in.Blockstore),
- )
+}
+
+// createAllStrategyProvider creates the complex "all" strategy provider.
+// This implements a three-tier priority system:
+// 1. Root blocks of direct and recursive pins (highest priority)
+// 2. MFS root (medium priority)
+// 3. All other blocks in blockstore (lowest priority)
+func createAllStrategyProvider(in provStrategyIn) provider.KeyChanFunc {
+ return provider.NewPrioritizedProvider(
+ provider.NewPrioritizedProvider(
+ provider.NewBufferedProvider(dspinner.NewPinnedProvider(true, in.Pinner, in.OfflineIPLDFetcher)),
+ mfsRootProvider(in.MFSRoot),
+ ),
+ in.Blockstore.AllKeysChan,
+ )
+}
+
+// detectStrategyChange checks if the reproviding strategy has changed from what's persisted.
+// Returns: (previousStrategy, hasChanged, error)
+func detectStrategyChange(ctx context.Context, strategy string, ds datastore.Datastore) (string, bool, error) {
+ strategyKey := datastore.NewKey(reprovideStrategyKey)
+
+ prev, err := ds.Get(ctx, strategyKey)
+ if err != nil {
+ if errors.Is(err, datastore.ErrNotFound) {
+ return "", strategy != "", nil
+ }
+ return "", false, err
+ }
+
+ previousStrategy := string(prev)
+ return previousStrategy, previousStrategy != strategy, nil
+}
+
+// persistStrategy saves the current reproviding strategy to the datastore.
+// Empty string strategies are deleted rather than stored.
+func persistStrategy(ctx context.Context, strategy string, ds datastore.Datastore) error {
+ strategyKey := datastore.NewKey(reprovideStrategyKey)
+
+ if strategy == "" {
+ return ds.Delete(ctx, strategyKey)
+ }
+ return ds.Put(ctx, strategyKey, []byte(strategy))
+}
+
+// handleStrategyChange manages strategy change detection and queue clearing.
+// Strategy change detection: when the reproviding strategy changes,
+// we clear the provide queue to avoid unexpected behavior from mixing
+// strategies. This ensures a clean transition between different providing modes.
+func handleStrategyChange(strategy string, provider provider.System, ds datastore.Datastore) {
+ ctx := context.Background()
+
+ previous, changed, err := detectStrategyChange(ctx, strategy, ds)
+ if err != nil {
+ logger.Error("cannot read previous reprovide strategy", "err", err)
+ return
+ }
+
+ if !changed {
+ return
+ }
+
+ logger.Infow("Reprovider.Strategy changed, clearing provide queue", "previous", previous, "current", strategy)
+ provider.Clear()
+
+ if err := persistStrategy(ctx, strategy, ds); err != nil {
+ logger.Error("cannot update reprovide strategy", "err", err)
+ }
+}
+
+func setReproviderKeyProvider(strategy string) func(in provStrategyIn) provStrategyOut {
+ strategyFlag := config.ParseReproviderStrategy(strategy)
+
+ return func(in provStrategyIn) provStrategyOut {
+ // Create the appropriate key provider based on strategy
+ kcf := createKeyProvider(strategyFlag, in)
+
+ // SetKeyProvider breaks the circular dependency between provider, blockstore, and pinner.
+ // We cannot create the blockstore without the provider (it needs to provide blocks),
+ // and we cannot determine the reproviding strategy without the pinner/blockstore.
+ // This deferred initialization allows us to create provider.System first,
+ // then set the actual key provider function after all dependencies are ready.
+ in.Provider.SetKeyProvider(kcf)
+
+ // Handle strategy changes (detection, queue clearing, persistence)
+ handleStrategyChange(strategy, in.Provider, in.Repo.Datastore())
+
+ return provStrategyOut{
+ ProvidingStrategy: strategyFlag,
+ ProvidingKeyChanFunc: kcf,
}
}
}
diff --git a/core/node/storage.go b/core/node/storage.go
index fd8dfb82e..5115d9403 100644
--- a/core/node/storage.go
+++ b/core/node/storage.go
@@ -2,6 +2,7 @@ package node
import (
blockstore "github.com/ipfs/boxo/blockstore"
+ provider "github.com/ipfs/boxo/provider"
"github.com/ipfs/go-datastore"
config "github.com/ipfs/kubo/config"
"go.uber.org/fx"
@@ -27,11 +28,31 @@ func Datastore(repo repo.Repo) datastore.Datastore {
type BaseBlocks blockstore.Blockstore
// BaseBlockstoreCtor creates cached blockstore backed by the provided datastore
-func BaseBlockstoreCtor(cacheOpts blockstore.CacheOpts, hashOnRead bool, writeThrough bool) func(mctx helpers.MetricsCtx, repo repo.Repo, lc fx.Lifecycle) (bs BaseBlocks, err error) {
- return func(mctx helpers.MetricsCtx, repo repo.Repo, lc fx.Lifecycle) (bs BaseBlocks, err error) {
+func BaseBlockstoreCtor(
+ cacheOpts blockstore.CacheOpts,
+ hashOnRead bool,
+ writeThrough bool,
+ providingStrategy string,
+
+) func(mctx helpers.MetricsCtx, repo repo.Repo, prov provider.System, lc fx.Lifecycle) (bs BaseBlocks, err error) {
+ return func(mctx helpers.MetricsCtx, repo repo.Repo, prov provider.System, lc fx.Lifecycle) (bs BaseBlocks, err error) {
+ opts := []blockstore.Option{blockstore.WriteThrough(writeThrough)}
+
+ // Blockstore providing integration:
+ // When strategy includes "all" or "flat", the blockstore directly provides blocks as they're Put.
+ // Important: Provide calls from blockstore are intentionally BLOCKING.
+ // The Provider implementation (not the blockstore) should handle concurrency/queuing.
+ // This avoids spawning unbounded goroutines for concurrent block additions.
+ strategyFlag := config.ParseReproviderStrategy(providingStrategy)
+ shouldProvide := config.ReproviderStrategyAll | config.ReproviderStrategyFlat
+ if strategyFlag&shouldProvide != 0 {
+ opts = append(opts, blockstore.Provider(prov))
+ }
+
// hash security
- bs = blockstore.NewBlockstore(repo.Datastore(),
- blockstore.WriteThrough(writeThrough),
+ bs = blockstore.NewBlockstore(
+ repo.Datastore(),
+ opts...,
)
bs = &verifbs.VerifBS{Blockstore: bs}
bs, err = blockstore.CachedBlockstore(helpers.LifecycleCtx(mctx, lc), bs, cacheOpts)
diff --git a/docs/changelogs/v0.37.md b/docs/changelogs/v0.37.md
index c35f21556..f64834881 100644
--- a/docs/changelogs/v0.37.md
+++ b/docs/changelogs/v0.37.md
@@ -2,7 +2,7 @@
-This release was brought to you by the [Interplanetary Shipyard](https://ipshipyard.com/) team.
+This release was brought to you by the [Shipyard](https://ipshipyard.com/) team.
- [v0.37.0](#v0370)
@@ -12,6 +12,7 @@ This release was brought to you by the [Interplanetary Shipyard](https://ipship
- [๐ฆ Highlights](#-highlights)
- [Clear provide queue when reprovide strategy changes](#clear-provide-queue-when-reprovide-strategy-changes)
- [Named pins in `ipfs add` command](#-named-pins-in-ipfs-add-command)
+ - [โ๏ธ `Reprovider.Strategy` is now consistently respected](#-reprovider-strategy-is-now-consistently-respected)
- [Removed unnecessary dependencies](#removed-unnecessary-dependencies)
- [Deprecated `ipfs stats reprovide`](#deprecated-ipfs-stats-reprovide)
- [๐ฆ๏ธ Important dependency updates](#-important-dependency-updates)
@@ -45,6 +46,20 @@ $ ipfs pin ls --names
bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi recursive testname
```
+#### โ๏ธ `Reprovider.Strategy` is now consistently respected
+
+Prior to this version, files added, blocks received etc. were "provided" to the network (announced on the DHT) regardless of the ["reproviding strategy" setting](https://github.com/ipfs/kubo/blob/master/docs/config.md#reproviderstrategy). For example:
+
+- Strategy set to "pinned" + `ipfs add --pin=false` โ file was provided regardless
+- Strategy set to "roots" + `ipfs pin add` โ all blocks (not only the root) were provided
+
+Only the periodic "reproviding" action (runs every 22h by default) respected the strategy.
+
+This was inefficient as content that should not be provided was getting provided once. Now all operations respect `Reprovider.Strategy`. If set to "roots", no blocks other than pin roots will be provided regardless of what is fetched, added etc.
+
+> [!NOTE]
+> **Behavior change:** The `--offline` flag no longer affects providing behavior. Both `ipfs add` and `ipfs --offline add` now provide blocks according to the reproviding strategy when run against an online daemon (previously `--offline add` did not provide). Since `ipfs add` has been nearly as fast as offline mode [since v0.35](https://github.com/ipfs/kubo/blob/master/docs/changelogs/v0.35.md#fast-ipfs-add-in-online-mode), `--offline` is rarely needed. To run truly offline operations, use `ipfs --offline daemon`.
+
#### Removed unnecessary dependencies
Kubo has been cleaned up by removing unnecessary dependencies and packages:
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index 55ef762a4..5fbd71ded 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -7,7 +7,7 @@ go 1.24
replace github.com/ipfs/kubo => ./../../..
require (
- github.com/ipfs/boxo v0.33.1
+ github.com/ipfs/boxo v0.33.2-0.20250804224807-e5da058ebb08
github.com/ipfs/kubo v0.0.0-00010101000000-000000000000
github.com/libp2p/go-libp2p v0.42.1
github.com/multiformats/go-multiaddr v0.16.0
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index 47158688c..d970aa54d 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -291,8 +291,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcd
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.33.1 h1:89m+ksw+cYi0ecTNTJ71IRS5ZrLiovmO6XWHIOGhAEg=
-github.com/ipfs/boxo v0.33.1/go.mod h1:KwlJTzv5fb1GLlA9KyMqHQmvP+4mrFuiE3PnjdrPJHs=
+github.com/ipfs/boxo v0.33.2-0.20250804224807-e5da058ebb08 h1:PtntQQtYOh7YTCRnrU1idTuOwxEi0ZmYM4u7ZfSAExY=
+github.com/ipfs/boxo v0.33.2-0.20250804224807-e5da058ebb08/go.mod h1:KwlJTzv5fb1GLlA9KyMqHQmvP+4mrFuiE3PnjdrPJHs=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk=
diff --git a/fuse/ipns/ipns_unix.go b/fuse/ipns/ipns_unix.go
index de475dd89..9c36c9a26 100644
--- a/fuse/ipns/ipns_unix.go
+++ b/fuse/ipns/ipns_unix.go
@@ -108,7 +108,10 @@ func loadRoot(ctx context.Context, ipfs iface.CoreAPI, key iface.Key) (*mfs.Root
return nil, nil, dag.ErrNotProtobuf
}
- root, err := mfs.NewRoot(ctx, ipfs.Dag(), pbnode, ipnsPubFunc(ipfs, key))
+ // We have no access to provider.System from the CoreAPI. The Routing
+ // part offers Provide through the router so it may be slow/risky
+ // to give that here to MFS. Therefore we leave as nil.
+ root, err := mfs.NewRoot(ctx, ipfs.Dag(), pbnode, ipnsPubFunc(ipfs, key), nil)
if err != nil {
return nil, nil, err
}
diff --git a/go.mod b/go.mod
index c7a89e9ef..b1969ea8d 100644
--- a/go.mod
+++ b/go.mod
@@ -22,7 +22,7 @@ require (
github.com/hashicorp/go-version v1.7.0
github.com/ipfs-shipyard/nopfs v0.0.14
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0
- github.com/ipfs/boxo v0.33.1
+ github.com/ipfs/boxo v0.33.2-0.20250804224807-e5da058ebb08
github.com/ipfs/go-block-format v0.2.2
github.com/ipfs/go-cid v0.5.0
github.com/ipfs/go-cidutil v0.1.0
diff --git a/go.sum b/go.sum
index c8ab14151..a2052ae5b 100644
--- a/go.sum
+++ b/go.sum
@@ -358,8 +358,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcd
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.33.1 h1:89m+ksw+cYi0ecTNTJ71IRS5ZrLiovmO6XWHIOGhAEg=
-github.com/ipfs/boxo v0.33.1/go.mod h1:KwlJTzv5fb1GLlA9KyMqHQmvP+4mrFuiE3PnjdrPJHs=
+github.com/ipfs/boxo v0.33.2-0.20250804224807-e5da058ebb08 h1:PtntQQtYOh7YTCRnrU1idTuOwxEi0ZmYM4u7ZfSAExY=
+github.com/ipfs/boxo v0.33.2-0.20250804224807-e5da058ebb08/go.mod h1:KwlJTzv5fb1GLlA9KyMqHQmvP+4mrFuiE3PnjdrPJHs=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk=
diff --git a/test/cli/harness/ipfs.go b/test/cli/harness/ipfs.go
index 0842d3627..2f7a8f18e 100644
--- a/test/cli/harness/ipfs.go
+++ b/test/cli/harness/ipfs.go
@@ -101,6 +101,34 @@ func (n *Node) IPFSAdd(content io.Reader, args ...string) string {
return out
}
+func (n *Node) IPFSBlockPut(content io.Reader, args ...string) string {
+ log.Debugf("node %d block put with args: %v", n.ID, args)
+ fullArgs := []string{"block", "put"}
+ fullArgs = append(fullArgs, args...)
+ res := n.Runner.MustRun(RunRequest{
+ Path: n.IPFSBin,
+ Args: fullArgs,
+ CmdOpts: []CmdOpt{RunWithStdin(content)},
+ })
+ out := strings.TrimSpace(res.Stdout.String())
+ log.Debugf("block put result: %q", out)
+ return out
+}
+
+func (n *Node) IPFSDAGPut(content io.Reader, args ...string) string {
+ log.Debugf("node %d dag put with args: %v", n.ID, args)
+ fullArgs := []string{"dag", "put"}
+ fullArgs = append(fullArgs, args...)
+ res := n.Runner.MustRun(RunRequest{
+ Path: n.IPFSBin,
+ Args: fullArgs,
+ CmdOpts: []CmdOpt{RunWithStdin(content)},
+ })
+ out := strings.TrimSpace(res.Stdout.String())
+ log.Debugf("dag put result: %q", out)
+ return out
+}
+
func (n *Node) IPFSDagImport(content io.Reader, cid string, args ...string) error {
log.Debugf("node %d dag import with args: %v", n.ID, args)
fullArgs := []string{"dag", "import", "--pin-roots=false"}
diff --git a/test/cli/provider_test.go b/test/cli/provider_test.go
index 4fd74ef8b..a3cb4c086 100644
--- a/test/cli/provider_test.go
+++ b/test/cli/provider_test.go
@@ -21,6 +21,12 @@ func TestProvider(t *testing.T) {
return nodes.StartDaemons().Connect()
}
+ initNodesWithoutStart := func(t *testing.T, n int, fn func(n *harness.Node)) harness.Nodes {
+ nodes := harness.NewT(t).NewNodes(n).Init()
+ nodes.ForEachPar(fn)
+ return nodes
+ }
+
expectNoProviders := func(t *testing.T, cid string, nodes ...*harness.Node) {
for _, node := range nodes {
res := node.IPFS("routing", "findprovs", "-n=1", cid)
@@ -44,9 +50,47 @@ func TestProvider(t *testing.T) {
defer nodes.StopDaemons()
cid := nodes[0].IPFSAddStr(time.Now().String())
- // Reprovide as initialProviderDelay still ongoing
- res := nodes[0].IPFS("routing", "reprovide")
- require.NoError(t, res.Err)
+ expectProviders(t, cid, nodes[0].PeerID().String(), nodes[1:]...)
+ })
+
+ t.Run("Provider.Enabled=true announces new CIDs created by ipfs add --pin=false with default strategy", func(t *testing.T) {
+ t.Parallel()
+
+ nodes := initNodes(t, 2, func(n *harness.Node) {
+ n.SetIPFSConfig("Provider.Enabled", true)
+ // Default strategy is "all" which should provide even unpinned content
+ })
+ defer nodes.StopDaemons()
+
+ cid := nodes[0].IPFSAddStr(time.Now().String(), "--pin=false")
+ expectProviders(t, cid, nodes[0].PeerID().String(), nodes[1:]...)
+ })
+
+ t.Run("Provider.Enabled=true announces new CIDs created by ipfs block put --pin=false with default strategy", func(t *testing.T) {
+ t.Parallel()
+
+ nodes := initNodes(t, 2, func(n *harness.Node) {
+ n.SetIPFSConfig("Provider.Enabled", true)
+ // Default strategy is "all" which should provide unpinned content from block put
+ })
+ defer nodes.StopDaemons()
+
+ data := testutils.RandomBytes(256)
+ cid := nodes[0].IPFSBlockPut(bytes.NewReader(data), "--pin=false")
+ expectProviders(t, cid, nodes[0].PeerID().String(), nodes[1:]...)
+ })
+
+ t.Run("Provider.Enabled=true announces new CIDs created by ipfs dag put --pin=false with default strategy", func(t *testing.T) {
+ t.Parallel()
+
+ nodes := initNodes(t, 2, func(n *harness.Node) {
+ n.SetIPFSConfig("Provider.Enabled", true)
+ // Default strategy is "all" which should provide unpinned content from dag put
+ })
+ defer nodes.StopDaemons()
+
+ dagData := `{"hello": "world", "timestamp": "` + time.Now().String() + `"}`
+ cid := nodes[0].IPFSDAGPut(bytes.NewReader([]byte(dagData)), "--pin=false")
expectProviders(t, cid, nodes[0].PeerID().String(), nodes[1:]...)
})
@@ -100,7 +144,7 @@ func TestProvider(t *testing.T) {
})
defer nodes.StopDaemons()
- cid := nodes[0].IPFSAddStr(time.Now().String(), "--offline")
+ cid := nodes[0].IPFSAddStr(time.Now().String())
expectNoProviders(t, cid, nodes[1:]...)
@@ -120,7 +164,7 @@ func TestProvider(t *testing.T) {
})
defer nodes.StopDaemons()
- cid := nodes[0].IPFSAddStr(time.Now().String(), "--offline")
+ cid := nodes[0].IPFSAddStr(time.Now().String())
expectNoProviders(t, cid, nodes[1:]...)
@@ -131,7 +175,7 @@ func TestProvider(t *testing.T) {
expectNoProviders(t, cid, nodes[1:]...)
})
- t.Run("Reprovides with 'all' strategy", func(t *testing.T) {
+ t.Run("Provide with 'all' strategy", func(t *testing.T) {
t.Parallel()
nodes := initNodes(t, 2, func(n *harness.Node) {
@@ -139,8 +183,124 @@ func TestProvider(t *testing.T) {
})
defer nodes.StopDaemons()
- cid := nodes[0].IPFSAddStr(time.Now().String(), "--local")
+ cid := nodes[0].IPFSAddStr("all strategy")
+ expectProviders(t, cid, nodes[0].PeerID().String(), nodes[1:]...)
+ })
+ t.Run("Provide with 'flat' strategy", func(t *testing.T) {
+ t.Parallel()
+
+ nodes := initNodes(t, 2, func(n *harness.Node) {
+ n.SetIPFSConfig("Reprovider.Strategy", "flat")
+ })
+ defer nodes.StopDaemons()
+
+ cid := nodes[0].IPFSAddStr("flat strategy")
+ expectProviders(t, cid, nodes[0].PeerID().String(), nodes[1:]...)
+ })
+
+ t.Run("Provide with 'pinned' strategy", func(t *testing.T) {
+ t.Parallel()
+
+ nodes := initNodes(t, 2, func(n *harness.Node) {
+ n.SetIPFSConfig("Reprovider.Strategy", "pinned")
+ })
+ defer nodes.StopDaemons()
+
+ // Add a non-pinned CID (should not be provided)
+ cid := nodes[0].IPFSAddStr("pinned strategy", "--pin=false")
+ expectNoProviders(t, cid, nodes[1:]...)
+
+ // Pin the CID (should now be provided)
+ nodes[0].IPFS("pin", "add", cid)
+ expectProviders(t, cid, nodes[0].PeerID().String(), nodes[1:]...)
+ })
+
+ t.Run("Provide with 'pinned+mfs' strategy", func(t *testing.T) {
+ t.Parallel()
+
+ nodes := initNodes(t, 2, func(n *harness.Node) {
+ n.SetIPFSConfig("Reprovider.Strategy", "pinned+mfs")
+ })
+ defer nodes.StopDaemons()
+
+ // Add a pinned CID (should be provided)
+ cidPinned := nodes[0].IPFSAddStr("pinned content")
+ cidUnpinned := nodes[0].IPFSAddStr("unpinned content", "--pin=false")
+ cidMFS := nodes[0].IPFSAddStr("mfs content", "--pin=false")
+ nodes[0].IPFS("files", "cp", "/ipfs/"+cidMFS, "/myfile")
+
+ n0pid := nodes[0].PeerID().String()
+ expectProviders(t, cidPinned, n0pid, nodes[1:]...)
+ expectNoProviders(t, cidUnpinned, nodes[1:]...)
+ expectProviders(t, cidMFS, n0pid, nodes[1:]...)
+ })
+
+ t.Run("Provide with 'roots' strategy", func(t *testing.T) {
+ t.Parallel()
+
+ nodes := initNodes(t, 2, func(n *harness.Node) {
+ n.SetIPFSConfig("Reprovider.Strategy", "roots")
+ })
+ defer nodes.StopDaemons()
+
+ // Add a root CID (should be provided)
+ cidRoot := nodes[0].IPFSAddStr("roots strategy", "-w", "-Q")
+ // the same without wrapping should give us a child node.
+ cidChild := nodes[0].IPFSAddStr("root strategy", "--pin=false")
+
+ expectProviders(t, cidRoot, nodes[0].PeerID().String(), nodes[1:]...)
+ expectNoProviders(t, cidChild, nodes[1:]...)
+ })
+
+ t.Run("Provide with 'mfs' strategy", func(t *testing.T) {
+ t.Parallel()
+
+ nodes := initNodes(t, 2, func(n *harness.Node) {
+ n.SetIPFSConfig("Reprovider.Strategy", "mfs")
+ })
+ defer nodes.StopDaemons()
+
+ // Add a file to MFS (should be provided)
+ data := testutils.RandomBytes(1000)
+ cid := nodes[0].IPFSAdd(bytes.NewReader(data), "-Q")
+
+ // not yet in MFS
+ expectNoProviders(t, cid, nodes[1:]...)
+
+ nodes[0].IPFS("files", "cp", "/ipfs/"+cid, "/myfile")
+ expectProviders(t, cid, nodes[0].PeerID().String(), nodes[1:]...)
+ })
+
+ t.Run("Reprovides with 'all' strategy when strategy is '' (empty)", func(t *testing.T) {
+ t.Parallel()
+
+ nodes := initNodesWithoutStart(t, 2, func(n *harness.Node) {
+ n.SetIPFSConfig("Reprovider.Strategy", "")
+ })
+
+ cid := nodes[0].IPFSAddStr(time.Now().String())
+
+ nodes = nodes.StartDaemons().Connect()
+ defer nodes.StopDaemons()
+ expectNoProviders(t, cid, nodes[1:]...)
+
+ nodes[0].IPFS("routing", "reprovide")
+
+ expectProviders(t, cid, nodes[0].PeerID().String(), nodes[1:]...)
+ })
+
+ t.Run("Reprovides with 'all' strategy", func(t *testing.T) {
+ t.Parallel()
+
+ nodes := initNodesWithoutStart(t, 2, func(n *harness.Node) {
+ n.SetIPFSConfig("Reprovider.Strategy", "all")
+ })
+
+ cid := nodes[0].IPFSAddStr(time.Now().String())
+
+ nodes = nodes.StartDaemons().Connect()
+ defer nodes.StopDaemons()
expectNoProviders(t, cid, nodes[1:]...)
nodes[0].IPFS("routing", "reprovide")
@@ -151,13 +311,14 @@ func TestProvider(t *testing.T) {
t.Run("Reprovides with 'flat' strategy", func(t *testing.T) {
t.Parallel()
- nodes := initNodes(t, 2, func(n *harness.Node) {
+ nodes := initNodesWithoutStart(t, 2, func(n *harness.Node) {
n.SetIPFSConfig("Reprovider.Strategy", "flat")
})
+
+ cid := nodes[0].IPFSAddStr(time.Now().String())
+
+ nodes = nodes.StartDaemons().Connect()
defer nodes.StopDaemons()
-
- cid := nodes[0].IPFSAddStr(time.Now().String(), "--local")
-
expectNoProviders(t, cid, nodes[1:]...)
nodes[0].IPFS("routing", "reprovide")
@@ -171,22 +332,31 @@ func TestProvider(t *testing.T) {
foo := testutils.RandomBytes(1000)
bar := testutils.RandomBytes(1000)
- nodes := initNodes(t, 2, func(n *harness.Node) {
+ nodes := initNodesWithoutStart(t, 2, func(n *harness.Node) {
n.SetIPFSConfig("Reprovider.Strategy", "pinned")
})
+
+ // Add a pin while offline so it cannot be provided
+ cidBarDir := nodes[0].IPFSAdd(bytes.NewReader(bar), "-Q", "-w")
+
+ nodes = nodes.StartDaemons().Connect()
defer nodes.StopDaemons()
- cidFoo := nodes[0].IPFSAdd(bytes.NewReader(foo), "--offline", "--pin=false")
- cidBar := nodes[0].IPFSAdd(bytes.NewReader(bar), "--offline", "--pin=false")
- cidBarDir := nodes[0].IPFSAdd(bytes.NewReader(bar), "-Q", "--offline", "-w")
+ // Add content without pinning while daemon line
+ cidFoo := nodes[0].IPFSAdd(bytes.NewReader(foo), "--pin=false")
+ cidBar := nodes[0].IPFSAdd(bytes.NewReader(bar), "--pin=false")
+ // Nothing should have been provided. The pin was offline, and
+ // the others should not be provided per the strategy.
expectNoProviders(t, cidFoo, nodes[1:]...)
expectNoProviders(t, cidBar, nodes[1:]...)
expectNoProviders(t, cidBarDir, nodes[1:]...)
nodes[0].IPFS("routing", "reprovide")
+ // cidFoo is not pinned so should not be provided.
expectNoProviders(t, cidFoo, nodes[1:]...)
+ // cidBar gets provided by being a child from cidBarDir even though we added with pin=false.
expectProviders(t, cidBar, nodes[0].PeerID().String(), nodes[1:]...)
expectProviders(t, cidBarDir, nodes[0].PeerID().String(), nodes[1:]...)
})
@@ -196,28 +366,87 @@ func TestProvider(t *testing.T) {
foo := testutils.RandomBytes(1000)
bar := testutils.RandomBytes(1000)
- baz := testutils.RandomBytes(1000)
- nodes := initNodes(t, 2, func(n *harness.Node) {
+ nodes := initNodesWithoutStart(t, 2, func(n *harness.Node) {
n.SetIPFSConfig("Reprovider.Strategy", "roots")
})
+ n0pid := nodes[0].PeerID().String()
+
+ // Add a pin. Only root should get pinned but not provided
+ // because node not started
+ cidBarDir := nodes[0].IPFSAdd(bytes.NewReader(bar), "-Q", "-w")
+
+ nodes = nodes.StartDaemons().Connect()
defer nodes.StopDaemons()
- cidFoo := nodes[0].IPFSAdd(bytes.NewReader(foo), "--offline", "--pin=false")
- cidBar := nodes[0].IPFSAdd(bytes.NewReader(bar), "--offline", "--pin=false")
- cidBaz := nodes[0].IPFSAdd(bytes.NewReader(baz), "--offline")
- cidBarDir := nodes[0].IPFSAdd(bytes.NewReader(bar), "-Q", "--offline", "-w")
+ cidFoo := nodes[0].IPFSAdd(bytes.NewReader(foo))
+ cidBar := nodes[0].IPFSAdd(bytes.NewReader(bar), "--pin=false")
- expectNoProviders(t, cidFoo, nodes[1:]...)
+ // cidFoo will get provided per the strategy but cidBar will not.
+ expectProviders(t, cidFoo, n0pid, nodes[1:]...)
expectNoProviders(t, cidBar, nodes[1:]...)
- expectNoProviders(t, cidBarDir, nodes[1:]...)
nodes[0].IPFS("routing", "reprovide")
- expectNoProviders(t, cidFoo, nodes[1:]...)
+ expectProviders(t, cidFoo, n0pid, nodes[1:]...)
expectNoProviders(t, cidBar, nodes[1:]...)
- expectProviders(t, cidBaz, nodes[0].PeerID().String(), nodes[1:]...)
- expectProviders(t, cidBarDir, nodes[0].PeerID().String(), nodes[1:]...)
+ expectProviders(t, cidBarDir, n0pid, nodes[1:]...)
+ })
+
+ t.Run("Reprovides with 'mfs' strategy", func(t *testing.T) {
+ t.Parallel()
+
+ bar := testutils.RandomBytes(1000)
+
+ nodes := initNodesWithoutStart(t, 2, func(n *harness.Node) {
+ n.SetIPFSConfig("Reprovider.Strategy", "mfs")
+ })
+ n0pid := nodes[0].PeerID().String()
+
+ // add something and lets put it in MFS
+ cidBar := nodes[0].IPFSAdd(bytes.NewReader(bar), "--pin=false", "-Q")
+ nodes[0].IPFS("files", "cp", "/ipfs/"+cidBar, "/myfile")
+
+ nodes = nodes.StartDaemons().Connect()
+ defer nodes.StopDaemons()
+
+ // cidBar is in MFS but not provided
+ expectNoProviders(t, cidBar, nodes[1:]...)
+
+ nodes[0].IPFS("routing", "reprovide")
+
+ // And now is provided
+ expectProviders(t, cidBar, n0pid, nodes[1:]...)
+ })
+
+ t.Run("Reprovides with 'pinned+mfs' strategy", func(t *testing.T) {
+ t.Parallel()
+
+ nodes := initNodesWithoutStart(t, 2, func(n *harness.Node) {
+ n.SetIPFSConfig("Reprovider.Strategy", "pinned+mfs")
+ })
+ n0pid := nodes[0].PeerID().String()
+
+ // Add a pinned CID (should be provided)
+ cidPinned := nodes[0].IPFSAddStr("pinned content", "--pin=true")
+ // Add a CID to MFS (should be provided)
+ cidMFS := nodes[0].IPFSAddStr("mfs content")
+ nodes[0].IPFS("files", "cp", "/ipfs/"+cidMFS, "/myfile")
+ // Add a CID that is neither pinned nor in MFS (should not be provided)
+ cidNeither := nodes[0].IPFSAddStr("neither content", "--pin=false")
+
+ nodes = nodes.StartDaemons().Connect()
+ defer nodes.StopDaemons()
+
+ // Trigger reprovide
+ nodes[0].IPFS("routing", "reprovide")
+
+ // Check that pinned CID is provided
+ expectProviders(t, cidPinned, n0pid, nodes[1:]...)
+ // Check that MFS CID is provided
+ expectProviders(t, cidMFS, n0pid, nodes[1:]...)
+ // Check that neither CID is not provided
+ expectNoProviders(t, cidNeither, nodes[1:]...)
})
t.Run("provide clear command removes items from provide queue", func(t *testing.T) {
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index 6fdd5cc38..0ae5db95f 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -31,6 +31,7 @@ require (
github.com/DataDog/zstd v1.5.6-0.20230824185856-869dae002e5e // indirect
github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 // indirect
github.com/GaijinEntertainment/go-exhaustruct/v3 v3.3.0 // indirect
+ github.com/Jorropo/jsync v1.0.1 // indirect
github.com/Masterminds/semver/v3 v3.2.1 // indirect
github.com/OpenPeeDeeP/depguard/v2 v2.2.0 // indirect
github.com/alecthomas/go-check-sumtype v0.1.4 // indirect
@@ -130,7 +131,7 @@ require (
github.com/huin/goupnp v1.3.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/ipfs/bbloom v0.0.4 // indirect
- github.com/ipfs/boxo v0.33.1 // indirect
+ github.com/ipfs/boxo v0.33.2-0.20250804224807-e5da058ebb08 // indirect
github.com/ipfs/go-bitfield v1.1.0 // indirect
github.com/ipfs/go-block-format v0.2.2 // indirect
github.com/ipfs/go-cid v0.5.0 // indirect
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index 7fe8af796..18cf795e1 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -33,6 +33,8 @@ github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 h1:sHglBQTwgx+rW
github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs=
github.com/GaijinEntertainment/go-exhaustruct/v3 v3.3.0 h1:/fTUt5vmbkAcMBt4YQiuC23cV0kEsN1MVMNqeOW43cU=
github.com/GaijinEntertainment/go-exhaustruct/v3 v3.3.0/go.mod h1:ONJg5sxcbsdQQ4pOW8TGdTidT2TMAUy/2Xhr8mrYaao=
+github.com/Jorropo/jsync v1.0.1 h1:6HgRolFZnsdfzRUj+ImB9og1JYOxQoReSywkHOGSaUU=
+github.com/Jorropo/jsync v1.0.1/go.mod h1:jCOZj3vrBCri3bSU3ErUYvevKlnbssrXeCivybS5ABQ=
github.com/Kubuxu/gocovmerge v0.0.0-20161216165753-7ecaa51963cd h1:HNhzThEtZW714v8Eda8sWWRcu9WSzJC+oCyjRjvZgRA=
github.com/Kubuxu/gocovmerge v0.0.0-20161216165753-7ecaa51963cd/go.mod h1:bqoB8kInrTeEtYAwaIXoSRqdwnjQmFhsfusnzyui6yY=
github.com/Masterminds/semver/v3 v3.2.1 h1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0=
@@ -319,8 +321,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.33.1 h1:89m+ksw+cYi0ecTNTJ71IRS5ZrLiovmO6XWHIOGhAEg=
-github.com/ipfs/boxo v0.33.1/go.mod h1:KwlJTzv5fb1GLlA9KyMqHQmvP+4mrFuiE3PnjdrPJHs=
+github.com/ipfs/boxo v0.33.2-0.20250804224807-e5da058ebb08 h1:PtntQQtYOh7YTCRnrU1idTuOwxEi0ZmYM4u7ZfSAExY=
+github.com/ipfs/boxo v0.33.2-0.20250804224807-e5da058ebb08/go.mod h1:KwlJTzv5fb1GLlA9KyMqHQmvP+4mrFuiE3PnjdrPJHs=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-block-format v0.2.2 h1:uecCTgRwDIXyZPgYspaLXoMiMmxQpSx2aq34eNc4YvQ=
From 6e039a4e1e1f7015fb4a5f72513116656582e2c8 Mon Sep 17 00:00:00 2001
From: Hector Sanjuan
Date: Fri, 8 Aug 2025 11:22:51 +0200
Subject: [PATCH 308/499] client/rpc: re-enable tests on windows. (#10895)
Fixes #9905.
Co-authored-by: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
---
client/rpc/api_test.go | 5 -----
1 file changed, 5 deletions(-)
diff --git a/client/rpc/api_test.go b/client/rpc/api_test.go
index e51aebfba..dd1e1db04 100644
--- a/client/rpc/api_test.go
+++ b/client/rpc/api_test.go
@@ -4,7 +4,6 @@ import (
"context"
"net/http"
"net/http/httptest"
- "runtime"
"strconv"
"strings"
"sync"
@@ -98,10 +97,6 @@ func (np NodeProvider) MakeAPISwarm(t *testing.T, ctx context.Context, fullIdent
func TestHttpApi(t *testing.T) {
t.Parallel()
- if runtime.GOOS == "windows" {
- t.Skip("skipping due to #9905")
- }
-
tests.TestApi(NodeProvider{})(t)
}
From 1c9fe273d944630e5fb3ca0e47a522aa0ea30c86 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Fri, 8 Aug 2025 16:39:34 +0200
Subject: [PATCH 309/499] fix: `ipfs cid` without repo (#10897)
* fix: `ipfs cid format` without repo
these commands should work without daemon or repo
but were missing SetDoesNotUseRepo(true)
* test: test/cli/commands_without_repo_test.go
---
core/commands/cid.go | 11 ++-
test/cli/commands_without_repo_test.go | 130 +++++++++++++++++++++++++
2 files changed, 138 insertions(+), 3 deletions(-)
create mode 100644 test/cli/commands_without_repo_test.go
diff --git a/core/commands/cid.go b/core/commands/cid.go
index 8491715be..9afb226d5 100644
--- a/core/commands/cid.go
+++ b/core/commands/cid.go
@@ -121,7 +121,8 @@ The optional format string is a printf style format string:
return ""
}),
},
- Type: CidFormatRes{},
+ Type: CidFormatRes{},
+ Extra: CreateCmdExtras(SetDoesNotUseRepo(true)),
}
type CidFormatRes struct {
@@ -151,6 +152,7 @@ Useful when processing third-party CIDs which could come with arbitrary formats.
},
PostRun: cidFmtCmd.PostRun,
Type: cidFmtCmd.Type,
+ Extra: CreateCmdExtras(SetDoesNotUseRepo(true)),
}
type cidFormatOpts struct {
@@ -309,7 +311,8 @@ var basesCmd = &cmds.Command{
return nil
}),
},
- Type: []CodeAndName{},
+ Type: []CodeAndName{},
+ Extra: CreateCmdExtras(SetDoesNotUseRepo(true)),
}
const (
@@ -369,7 +372,8 @@ var codecsCmd = &cmds.Command{
return nil
}),
},
- Type: []CodeAndName{},
+ Type: []CodeAndName{},
+ Extra: CreateCmdExtras(SetDoesNotUseRepo(true)),
}
var hashesCmd = &cmds.Command{
@@ -393,6 +397,7 @@ var hashesCmd = &cmds.Command{
},
Encoders: codecsCmd.Encoders,
Type: codecsCmd.Type,
+ Extra: CreateCmdExtras(SetDoesNotUseRepo(true)),
}
type multibaseSorter struct {
diff --git a/test/cli/commands_without_repo_test.go b/test/cli/commands_without_repo_test.go
new file mode 100644
index 000000000..55469adae
--- /dev/null
+++ b/test/cli/commands_without_repo_test.go
@@ -0,0 +1,130 @@
+package cli
+
+import (
+ "os"
+ "os/exec"
+ "strings"
+ "testing"
+)
+
+func TestCommandsWithoutRepo(t *testing.T) {
+ t.Run("cid", func(t *testing.T) {
+ t.Run("base32", func(t *testing.T) {
+ cmd := exec.Command("ipfs", "cid", "base32", "QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv")
+ cmd.Env = append(os.Environ(), "IPFS_PATH="+t.TempDir())
+ stdout, err := cmd.Output()
+ if err != nil {
+ t.Fatal(err)
+ }
+ expected := "bafybeibxm2nsadl3fnxv2sxcxmxaco2jl53wpeorjdzidjwf5aqdg7wa6u\n"
+ if string(stdout) != expected {
+ t.Fatalf("expected %q, got: %q", expected, stdout)
+ }
+ })
+
+ t.Run("format", func(t *testing.T) {
+ cmd := exec.Command("ipfs", "cid", "format", "-v", "1", "QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv")
+ cmd.Env = append(os.Environ(), "IPFS_PATH="+t.TempDir())
+ stdout, err := cmd.Output()
+ if err != nil {
+ t.Fatal(err)
+ }
+ expected := "zdj7WZAAFKPvYPPzyJLso2hhxo8a7ZACFQ4DvvfrNXTHidofr\n"
+ if string(stdout) != expected {
+ t.Fatalf("expected %q, got: %q", expected, stdout)
+ }
+ })
+
+ t.Run("bases", func(t *testing.T) {
+ cmd := exec.Command("ipfs", "cid", "bases")
+ cmd.Env = append(os.Environ(), "IPFS_PATH="+t.TempDir())
+ stdout, err := cmd.Output()
+ if err != nil {
+ t.Fatal(err)
+ }
+ if !strings.Contains(string(stdout), "base32") {
+ t.Fatalf("expected base32 in output, got: %s", stdout)
+ }
+ })
+
+ t.Run("codecs", func(t *testing.T) {
+ cmd := exec.Command("ipfs", "cid", "codecs")
+ cmd.Env = append(os.Environ(), "IPFS_PATH="+t.TempDir())
+ stdout, err := cmd.Output()
+ if err != nil {
+ t.Fatal(err)
+ }
+ if !strings.Contains(string(stdout), "dag-pb") {
+ t.Fatalf("expected dag-pb in output, got: %s", stdout)
+ }
+ })
+
+ t.Run("hashes", func(t *testing.T) {
+ cmd := exec.Command("ipfs", "cid", "hashes")
+ cmd.Env = append(os.Environ(), "IPFS_PATH="+t.TempDir())
+ stdout, err := cmd.Output()
+ if err != nil {
+ t.Fatal(err)
+ }
+ if !strings.Contains(string(stdout), "sha2-256") {
+ t.Fatalf("expected sha2-256 in output, got: %s", stdout)
+ }
+ })
+ })
+
+ t.Run("multibase", func(t *testing.T) {
+ t.Run("list", func(t *testing.T) {
+ cmd := exec.Command("ipfs", "multibase", "list")
+ cmd.Env = append(os.Environ(), "IPFS_PATH="+t.TempDir())
+ stdout, err := cmd.Output()
+ if err != nil {
+ t.Fatal(err)
+ }
+ if !strings.Contains(string(stdout), "base32") {
+ t.Fatalf("expected base32 in output, got: %s", stdout)
+ }
+ })
+
+ t.Run("encode", func(t *testing.T) {
+ cmd := exec.Command("ipfs", "multibase", "encode", "-b", "base32")
+ cmd.Env = append(os.Environ(), "IPFS_PATH="+t.TempDir())
+ cmd.Stdin = strings.NewReader("hello\n")
+ stdout, err := cmd.Output()
+ if err != nil {
+ t.Fatal(err)
+ }
+ expected := "bnbswy3dpbi"
+ if string(stdout) != expected {
+ t.Fatalf("expected %q, got: %q", expected, stdout)
+ }
+ })
+
+ t.Run("decode", func(t *testing.T) {
+ cmd := exec.Command("ipfs", "multibase", "decode")
+ cmd.Env = append(os.Environ(), "IPFS_PATH="+t.TempDir())
+ cmd.Stdin = strings.NewReader("bnbswy3dpbi")
+ stdout, err := cmd.Output()
+ if err != nil {
+ t.Fatal(err)
+ }
+ expected := "hello\n"
+ if string(stdout) != expected {
+ t.Fatalf("expected %q, got: %q", expected, stdout)
+ }
+ })
+
+ t.Run("transcode", func(t *testing.T) {
+ cmd := exec.Command("ipfs", "multibase", "transcode", "-b", "base64")
+ cmd.Env = append(os.Environ(), "IPFS_PATH="+t.TempDir())
+ cmd.Stdin = strings.NewReader("bnbswy3dpbi")
+ stdout, err := cmd.Output()
+ if err != nil {
+ t.Fatal(err)
+ }
+ expected := "maGVsbG8K"
+ if string(stdout) != expected {
+ t.Fatalf("expected %q, got: %q", expected, stdout)
+ }
+ })
+ })
+}
From b139df165813262e8831adbadf9386d46a0960b4 Mon Sep 17 00:00:00 2001
From: sukun
Date: Fri, 8 Aug 2025 21:23:08 +0530
Subject: [PATCH 310/499] feat: go-libp2p v0.43.0 (#10892)
https://github.com/libp2p/go-libp2p/releases/tag/v0.43.0
---------
Co-authored-by: Marcin Rataj
---
docs/changelogs/v0.37.md | 2 +-
docs/examples/kubo-as-a-library/go.mod | 10 +++-------
docs/examples/kubo-as-a-library/go.sum | 22 ++++++----------------
go.mod | 11 ++++-------
go.sum | 22 ++++++----------------
test/dependencies/go.mod | 9 +++------
test/dependencies/go.sum | 13 +++++++------
7 files changed, 30 insertions(+), 59 deletions(-)
diff --git a/docs/changelogs/v0.37.md b/docs/changelogs/v0.37.md
index f64834881..531757427 100644
--- a/docs/changelogs/v0.37.md
+++ b/docs/changelogs/v0.37.md
@@ -80,7 +80,7 @@ The `ipfs stats reprovide` command has moved to `ipfs provide stat`. This was do
#### ๐ฆ๏ธ Important dependency updates
-- update `go-libp2p` to [v0.42.1](https://github.com/libp2p/go-libp2p/releases/tag/v0.42.1)
+- update `go-libp2p` to [v0.43.0](https://github.com/libp2p/go-libp2p/releases/tag/v0.43.0) (incl. [v0.42.1](https://github.com/libp2p/go-libp2p/releases/tag/v0.42.1))
- update `p2p-forge/client` to [v0.6.1](https://github.com/ipshipyard/p2p-forge/releases/tag/v0.6.1)
- update `boxo` to [v0.33.1](https://github.com/ipfs/boxo/releases/tag/v0.33.1)
- update `ipfs-webui` to [v4.8.0](https://github.com/ipfs/ipfs-webui/releases/tag/v4.8.0)
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index 5fbd71ded..6eb207e06 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -9,7 +9,7 @@ replace github.com/ipfs/kubo => ./../../..
require (
github.com/ipfs/boxo v0.33.2-0.20250804224807-e5da058ebb08
github.com/ipfs/kubo v0.0.0-00010101000000-000000000000
- github.com/libp2p/go-libp2p v0.42.1
+ github.com/libp2p/go-libp2p v0.43.0
github.com/multiformats/go-multiaddr v0.16.0
)
@@ -57,13 +57,11 @@ require (
github.com/go-jose/go-jose/v4 v4.0.5 // indirect
github.com/go-logr/logr v1.4.3 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
- github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/glog v1.2.4 // indirect
github.com/golang/protobuf v1.5.4 // indirect
github.com/golang/snappy v0.0.5-0.20231225225746-43d5d4cd4e0e // indirect
github.com/google/gopacket v1.1.19 // indirect
- github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/gorilla/websocket v1.5.3 // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 // indirect
@@ -143,7 +141,6 @@ require (
github.com/multiformats/go-multistream v0.6.1 // indirect
github.com/multiformats/go-varint v0.0.7 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
- github.com/onsi/ginkgo/v2 v2.23.4 // indirect
github.com/opentracing/opentracing-go v1.2.0 // indirect
github.com/openzipkin/zipkin-go v0.4.3 // indirect
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect
@@ -174,8 +171,8 @@ require (
github.com/prometheus/common v0.64.0 // indirect
github.com/prometheus/procfs v0.16.1 // indirect
github.com/quic-go/qpack v0.5.1 // indirect
- github.com/quic-go/quic-go v0.52.0 // indirect
- github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 // indirect
+ github.com/quic-go/quic-go v0.54.0 // indirect
+ github.com/quic-go/webtransport-go v0.9.0 // indirect
github.com/rogpeppe/go-internal v1.13.1 // indirect
github.com/spaolacci/murmur3 v1.1.0 // indirect
github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect
@@ -201,7 +198,6 @@ require (
go.opentelemetry.io/otel/sdk v1.37.0 // indirect
go.opentelemetry.io/otel/trace v1.37.0 // indirect
go.opentelemetry.io/proto/otlp v1.7.0 // indirect
- go.uber.org/automaxprocs v1.6.0 // indirect
go.uber.org/dig v1.19.0 // indirect
go.uber.org/fx v1.24.0 // indirect
go.uber.org/mock v0.5.2 // indirect
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index d970aa54d..2e1ffc0a9 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -185,8 +185,6 @@ github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ4
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
-github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
-github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
@@ -248,8 +246,6 @@ github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OI
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a h1://KbezygeMJZCSHH+HgUZiTeSoiuFspbMg1ge+eFj18=
-github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a/go.mod h1:5hDyRhoBCxViHszMt12TnOpEI4VVi+U8Gm9iphldiMA=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
@@ -424,8 +420,8 @@ github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZ
github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs=
github.com/libp2p/go-flow-metrics v0.3.0 h1:q31zcHUvHnwDO0SHaukewPYgwOBSxtt830uJtUx6784=
github.com/libp2p/go-flow-metrics v0.3.0/go.mod h1:nuhlreIwEguM1IvHAew3ij7A8BMlyHQJ279ao24eZZo=
-github.com/libp2p/go-libp2p v0.42.1 h1:Rt8+5thie729NQk1gx1h/2t/+VIafWcqR1I+Kvw+UTg=
-github.com/libp2p/go-libp2p v0.42.1/go.mod h1:4NGcjbD9OIvFiSRb0XueCO19zJ4kSPK5vkyyOUYmMro=
+github.com/libp2p/go-libp2p v0.43.0 h1:b2bg2cRNmY4HpLK8VHYQXLX2d3iND95OjodLFymvqXU=
+github.com/libp2p/go-libp2p v0.43.0/go.mod h1:IiSqAXDyP2sWH+J2gs43pNmB/y4FOi2XQPbsb+8qvzc=
github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94=
github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8=
github.com/libp2p/go-libp2p-core v0.2.4/go.mod h1:STh4fdfa5vDYr0/SzYYeqnt+E6KfEV5VxfIrm0bcI0g=
@@ -554,8 +550,6 @@ github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vv
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
-github.com/onsi/ginkgo/v2 v2.23.4 h1:ktYTpKJAVZnDT4VjxSbiBenUjmlL/5QkBEocaWXiQus=
-github.com/onsi/ginkgo/v2 v2.23.4/go.mod h1:Bt66ApGPBFzHyR+JO10Zbt0Gsp4uWxu5mIOTusL46e8=
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
@@ -628,8 +622,6 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH
github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o=
github.com/polydawn/refmt v0.89.0 h1:ADJTApkvkeBZsN0tBTx8QjpD9JkmxbKp0cxfr9qszm4=
github.com/polydawn/refmt v0.89.0/go.mod h1:/zvteZs/GwLtCgZ4BL6CBsk9IKIlexP43ObX9AxTqTw=
-github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g=
-github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U=
github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q=
github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0=
@@ -645,10 +637,10 @@ github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzM
github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is=
github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI=
github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg=
-github.com/quic-go/quic-go v0.52.0 h1:/SlHrCRElyaU6MaEPKqKr9z83sBg2v4FLLvWM+Z47pA=
-github.com/quic-go/quic-go v0.52.0/go.mod h1:MFlGGpcpJqRAfmYi6NC2cptDPSxRWTOGNuP4wqrWmzQ=
-github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 h1:4WFk6u3sOT6pLa1kQ50ZVdm8BQFgJNA117cepZxtLIg=
-github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66/go.mod h1:Vp72IJajgeOL6ddqrAhmp7IM9zbTcgkQxD/YdxrVwMw=
+github.com/quic-go/quic-go v0.54.0 h1:6s1YB9QotYI6Ospeiguknbp2Znb/jZYjZLRXn9kMQBg=
+github.com/quic-go/quic-go v0.54.0/go.mod h1:e68ZEaCdyviluZmy44P6Iey98v/Wfz6HCjQEm+l8zTY=
+github.com/quic-go/webtransport-go v0.9.0 h1:jgys+7/wm6JarGDrW+lD/r9BGqBAmqY/ssklE09bA70=
+github.com/quic-go/webtransport-go v0.9.0/go.mod h1:4FUYIiUc75XSsF6HShcLeXXYZJ9AGwo/xh3L8M/P1ao=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
@@ -803,8 +795,6 @@ go.opentelemetry.io/proto/otlp v1.7.0 h1:jX1VolD6nHuFzOYso2E73H85i92Mv8JQYk0K9vz
go.opentelemetry.io/proto/otlp v1.7.0/go.mod h1:fSKjH6YJ7HDlwzltzyMj036AJ3ejJLCgCSHGj4efDDo=
go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
-go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
-go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8=
go.uber.org/dig v1.19.0 h1:BACLhebsYdpQ7IROQ1AGPjrXcP5dF80U3gKoFzbaq/4=
go.uber.org/dig v1.19.0/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE=
go.uber.org/fx v1.24.0 h1:wE8mruvpg2kiiL1Vqd0CC+tr0/24XIB10Iwp2lLWzkg=
diff --git a/go.mod b/go.mod
index b1969ea8d..f58ade570 100644
--- a/go.mod
+++ b/go.mod
@@ -51,7 +51,7 @@ require (
github.com/jbenet/go-temp-err-catcher v0.1.0
github.com/julienschmidt/httprouter v1.3.0
github.com/libp2p/go-doh-resolver v0.5.0
- github.com/libp2p/go-libp2p v0.42.1
+ github.com/libp2p/go-libp2p v0.43.0
github.com/libp2p/go-libp2p-http v0.5.0
github.com/libp2p/go-libp2p-kad-dht v0.33.1
github.com/libp2p/go-libp2p-kbucket v0.7.0
@@ -133,13 +133,11 @@ require (
github.com/go-logfmt/logfmt v0.6.0 // indirect
github.com/go-logr/logr v1.4.3 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
- github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/golang/protobuf v1.5.4 // indirect
github.com/golang/snappy v0.0.5-0.20231225225746-43d5d4cd4e0e // indirect
github.com/google/gopacket v1.1.19 // indirect
- github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a // indirect
github.com/gorilla/mux v1.8.1 // indirect
github.com/gorilla/websocket v1.5.3 // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 // indirect
@@ -188,7 +186,7 @@ require (
github.com/multiformats/go-multistream v0.6.1 // indirect
github.com/multiformats/go-varint v0.0.7 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
- github.com/onsi/ginkgo/v2 v2.23.4 // indirect
+ github.com/onsi/gomega v1.36.3 // indirect
github.com/openzipkin/zipkin-go v0.4.3 // indirect
github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 // indirect
github.com/pion/datachannel v1.5.10 // indirect
@@ -218,8 +216,8 @@ require (
github.com/prometheus/procfs v0.16.1 // indirect
github.com/prometheus/statsd_exporter v0.27.1 // indirect
github.com/quic-go/qpack v0.5.1 // indirect
- github.com/quic-go/quic-go v0.52.0 // indirect
- github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 // indirect
+ github.com/quic-go/quic-go v0.54.0 // indirect
+ github.com/quic-go/webtransport-go v0.9.0 // indirect
github.com/rivo/uniseg v0.4.4 // indirect
github.com/rogpeppe/go-internal v1.13.1 // indirect
github.com/rs/cors v1.11.1 // indirect
@@ -248,7 +246,6 @@ require (
go.opentelemetry.io/otel/exporters/zipkin v1.37.0 // indirect
go.opentelemetry.io/otel/metric v1.37.0 // indirect
go.opentelemetry.io/proto/otlp v1.7.0 // indirect
- go.uber.org/automaxprocs v1.6.0 // indirect
go.uber.org/mock v0.5.2 // indirect
go.uber.org/zap/exp v0.3.0 // indirect
go4.org v0.0.0-20230225012048-214862532bf5 // indirect
diff --git a/go.sum b/go.sum
index a2052ae5b..5f217d258 100644
--- a/go.sum
+++ b/go.sum
@@ -237,8 +237,6 @@ github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
-github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
-github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0=
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
@@ -313,8 +311,6 @@ github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hf
github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a h1://KbezygeMJZCSHH+HgUZiTeSoiuFspbMg1ge+eFj18=
-github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a/go.mod h1:5hDyRhoBCxViHszMt12TnOpEI4VVi+U8Gm9iphldiMA=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
@@ -506,8 +502,8 @@ github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZ
github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs=
github.com/libp2p/go-flow-metrics v0.3.0 h1:q31zcHUvHnwDO0SHaukewPYgwOBSxtt830uJtUx6784=
github.com/libp2p/go-flow-metrics v0.3.0/go.mod h1:nuhlreIwEguM1IvHAew3ij7A8BMlyHQJ279ao24eZZo=
-github.com/libp2p/go-libp2p v0.42.1 h1:Rt8+5thie729NQk1gx1h/2t/+VIafWcqR1I+Kvw+UTg=
-github.com/libp2p/go-libp2p v0.42.1/go.mod h1:4NGcjbD9OIvFiSRb0XueCO19zJ4kSPK5vkyyOUYmMro=
+github.com/libp2p/go-libp2p v0.43.0 h1:b2bg2cRNmY4HpLK8VHYQXLX2d3iND95OjodLFymvqXU=
+github.com/libp2p/go-libp2p v0.43.0/go.mod h1:IiSqAXDyP2sWH+J2gs43pNmB/y4FOi2XQPbsb+8qvzc=
github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94=
github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8=
github.com/libp2p/go-libp2p-core v0.2.4/go.mod h1:STh4fdfa5vDYr0/SzYYeqnt+E6KfEV5VxfIrm0bcI0g=
@@ -657,8 +653,6 @@ github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vv
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
-github.com/onsi/ginkgo/v2 v2.23.4 h1:ktYTpKJAVZnDT4VjxSbiBenUjmlL/5QkBEocaWXiQus=
-github.com/onsi/ginkgo/v2 v2.23.4/go.mod h1:Bt66ApGPBFzHyR+JO10Zbt0Gsp4uWxu5mIOTusL46e8=
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
@@ -732,8 +726,6 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH
github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o=
github.com/polydawn/refmt v0.89.0 h1:ADJTApkvkeBZsN0tBTx8QjpD9JkmxbKp0cxfr9qszm4=
github.com/polydawn/refmt v0.89.0/go.mod h1:/zvteZs/GwLtCgZ4BL6CBsk9IKIlexP43ObX9AxTqTw=
-github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g=
-github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U=
github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
@@ -773,10 +765,10 @@ github.com/prometheus/statsd_exporter v0.27.1 h1:tcRJOmwlA83HPfWzosAgr2+zEN5XDFv
github.com/prometheus/statsd_exporter v0.27.1/go.mod h1:vA6ryDfsN7py/3JApEst6nLTJboq66XsNcJGNmC88NQ=
github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI=
github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg=
-github.com/quic-go/quic-go v0.52.0 h1:/SlHrCRElyaU6MaEPKqKr9z83sBg2v4FLLvWM+Z47pA=
-github.com/quic-go/quic-go v0.52.0/go.mod h1:MFlGGpcpJqRAfmYi6NC2cptDPSxRWTOGNuP4wqrWmzQ=
-github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 h1:4WFk6u3sOT6pLa1kQ50ZVdm8BQFgJNA117cepZxtLIg=
-github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66/go.mod h1:Vp72IJajgeOL6ddqrAhmp7IM9zbTcgkQxD/YdxrVwMw=
+github.com/quic-go/quic-go v0.54.0 h1:6s1YB9QotYI6Ospeiguknbp2Znb/jZYjZLRXn9kMQBg=
+github.com/quic-go/quic-go v0.54.0/go.mod h1:e68ZEaCdyviluZmy44P6Iey98v/Wfz6HCjQEm+l8zTY=
+github.com/quic-go/webtransport-go v0.9.0 h1:jgys+7/wm6JarGDrW+lD/r9BGqBAmqY/ssklE09bA70=
+github.com/quic-go/webtransport-go v0.9.0/go.mod h1:4FUYIiUc75XSsF6HShcLeXXYZJ9AGwo/xh3L8M/P1ao=
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis=
github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
@@ -968,8 +960,6 @@ go.opentelemetry.io/proto/otlp v1.7.0 h1:jX1VolD6nHuFzOYso2E73H85i92Mv8JQYk0K9vz
go.opentelemetry.io/proto/otlp v1.7.0/go.mod h1:fSKjH6YJ7HDlwzltzyMj036AJ3ejJLCgCSHGj4efDDo=
go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
-go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
-go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8=
go.uber.org/dig v1.19.0 h1:BACLhebsYdpQ7IROQ1AGPjrXcP5dF80U3gKoFzbaq/4=
go.uber.org/dig v1.19.0/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE=
go.uber.org/fx v1.24.0 h1:wE8mruvpg2kiiL1Vqd0CC+tr0/24XIB10Iwp2lLWzkg=
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index 0ae5db95f..4cdae1c8a 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -92,7 +92,6 @@ require (
github.com/go-critic/go-critic v0.11.4 // indirect
github.com/go-logr/logr v1.4.3 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
- github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
github.com/go-toolsmith/astcast v1.1.0 // indirect
github.com/go-toolsmith/astcopy v1.1.0 // indirect
github.com/go-toolsmith/astequal v1.2.0 // indirect
@@ -115,7 +114,6 @@ require (
github.com/golangci/unconvert v0.0.0-20240309020433-c5143eacb3ed // indirect
github.com/google/go-cmp v0.7.0 // indirect
github.com/google/gopacket v1.1.19 // indirect
- github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a // indirect
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/gordonklaus/ineffassign v0.1.0 // indirect
@@ -169,7 +167,7 @@ require (
github.com/libp2p/go-buffer-pool v0.1.0 // indirect
github.com/libp2p/go-cidranger v1.1.0 // indirect
github.com/libp2p/go-flow-metrics v0.3.0 // indirect
- github.com/libp2p/go-libp2p v0.42.1 // indirect
+ github.com/libp2p/go-libp2p v0.43.0 // indirect
github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect
github.com/libp2p/go-libp2p-kad-dht v0.33.1 // indirect
github.com/libp2p/go-libp2p-kbucket v0.7.0 // indirect
@@ -210,7 +208,6 @@ require (
github.com/nishanths/predeclared v0.2.2 // indirect
github.com/nunnatsa/ginkgolinter v0.16.2 // indirect
github.com/olekukonko/tablewriter v0.0.5 // indirect
- github.com/onsi/ginkgo/v2 v2.23.4 // indirect
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
github.com/pion/datachannel v1.5.10 // indirect
@@ -246,8 +243,8 @@ require (
github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 // indirect
github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 // indirect
github.com/quic-go/qpack v0.5.1 // indirect
- github.com/quic-go/quic-go v0.52.0 // indirect
- github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 // indirect
+ github.com/quic-go/quic-go v0.54.0 // indirect
+ github.com/quic-go/webtransport-go v0.9.0 // indirect
github.com/rivo/uniseg v0.4.7 // indirect
github.com/rogpeppe/go-internal v1.13.1 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index 18cf795e1..5e5428ac8 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -427,8 +427,8 @@ github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38y
github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic=
github.com/libp2p/go-flow-metrics v0.3.0 h1:q31zcHUvHnwDO0SHaukewPYgwOBSxtt830uJtUx6784=
github.com/libp2p/go-flow-metrics v0.3.0/go.mod h1:nuhlreIwEguM1IvHAew3ij7A8BMlyHQJ279ao24eZZo=
-github.com/libp2p/go-libp2p v0.42.1 h1:Rt8+5thie729NQk1gx1h/2t/+VIafWcqR1I+Kvw+UTg=
-github.com/libp2p/go-libp2p v0.42.1/go.mod h1:4NGcjbD9OIvFiSRb0XueCO19zJ4kSPK5vkyyOUYmMro=
+github.com/libp2p/go-libp2p v0.43.0 h1:b2bg2cRNmY4HpLK8VHYQXLX2d3iND95OjodLFymvqXU=
+github.com/libp2p/go-libp2p v0.43.0/go.mod h1:IiSqAXDyP2sWH+J2gs43pNmB/y4FOi2XQPbsb+8qvzc=
github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94=
github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8=
github.com/libp2p/go-libp2p-kad-dht v0.33.1 h1:hKFhHMf7WH69LDjaxsJUWOU6qZm71uO47M/a5ijkiP0=
@@ -542,6 +542,7 @@ github.com/nunnatsa/ginkgolinter v0.16.2 h1:8iLqHIZvN4fTLDC0Ke9tbSZVcyVHoBs0HIbn
github.com/nunnatsa/ginkgolinter v0.16.2/go.mod h1:4tWRinDN1FeJgU+iJANW/kz7xKN5nYRAOfJDQUS9dOQ=
github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
+github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
github.com/onsi/ginkgo/v2 v2.23.4 h1:ktYTpKJAVZnDT4VjxSbiBenUjmlL/5QkBEocaWXiQus=
github.com/onsi/ginkgo/v2 v2.23.4/go.mod h1:Bt66ApGPBFzHyR+JO10Zbt0Gsp4uWxu5mIOTusL46e8=
github.com/onsi/gomega v1.36.3 h1:hID7cr8t3Wp26+cYnfcjR6HpJ00fdogN6dqZ1t6IylU=
@@ -639,10 +640,10 @@ github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 h1:M8mH9eK4OUR4l
github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ=
github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI=
github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg=
-github.com/quic-go/quic-go v0.52.0 h1:/SlHrCRElyaU6MaEPKqKr9z83sBg2v4FLLvWM+Z47pA=
-github.com/quic-go/quic-go v0.52.0/go.mod h1:MFlGGpcpJqRAfmYi6NC2cptDPSxRWTOGNuP4wqrWmzQ=
-github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 h1:4WFk6u3sOT6pLa1kQ50ZVdm8BQFgJNA117cepZxtLIg=
-github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66/go.mod h1:Vp72IJajgeOL6ddqrAhmp7IM9zbTcgkQxD/YdxrVwMw=
+github.com/quic-go/quic-go v0.54.0 h1:6s1YB9QotYI6Ospeiguknbp2Znb/jZYjZLRXn9kMQBg=
+github.com/quic-go/quic-go v0.54.0/go.mod h1:e68ZEaCdyviluZmy44P6Iey98v/Wfz6HCjQEm+l8zTY=
+github.com/quic-go/webtransport-go v0.9.0 h1:jgys+7/wm6JarGDrW+lD/r9BGqBAmqY/ssklE09bA70=
+github.com/quic-go/webtransport-go v0.9.0/go.mod h1:4FUYIiUc75XSsF6HShcLeXXYZJ9AGwo/xh3L8M/P1ao=
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
From d4ab5129e92fd681a42db8982b454e03003f9291 Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Fri, 8 Aug 2025 17:25:05 -0700
Subject: [PATCH 311/499] fix(cmd): exit 1 on error (#10903)
* Fix command stream result handling
Do not close the stream prematurely in a deferred function. Also, avoid possible shadowing errors.
Closes #9007
* test(cli): test/cli/cid_test.go
includes regression tests for https://github.com/ipfs/kubo/issues/9007
and better coverage than the old test/sharness/t0290-cid.sh
(identified bug in basemoji)
* fix: base256emoji in cid bases --prefix
changed the character display logic from ASCII range check to
unicode.IsPrint() to properly handle Unicode characters including
emojis.
* docs: changelog
---------
Co-authored-by: Marcin Rataj
---
core/commands/cid.go | 2 +-
core/commands/commands.go | 12 +-
docs/changelogs/v0.37.md | 6 +
test/cli/cid_test.go | 609 ++++++++++++++++++++++++++++++++++
test/sharness/t0018-indent.sh | 3 +
test/sharness/t0290-cid.sh | 55 ++-
6 files changed, 677 insertions(+), 10 deletions(-)
create mode 100644 test/cli/cid_test.go
diff --git a/core/commands/cid.go b/core/commands/cid.go
index 9afb226d5..a1660e509 100644
--- a/core/commands/cid.go
+++ b/core/commands/cid.go
@@ -293,7 +293,7 @@ var basesCmd = &cmds.Command{
multibaseSorter{val}.Sort()
for _, v := range val {
code := v.Code
- if code < 32 || code >= 127 {
+ if !unicode.IsPrint(rune(code)) {
// don't display non-printable prefixes
code = ' '
}
diff --git a/core/commands/commands.go b/core/commands/commands.go
index 9e2b60dc8..b1cd6c45d 100644
--- a/core/commands/commands.go
+++ b/core/commands/commands.go
@@ -233,12 +233,11 @@ type nonFatalError string
// contain non-fatal errors. The helper function is allowed to panic
// on internal errors.
func streamResult(procVal func(interface{}, io.Writer) nonFatalError) func(cmds.Response, cmds.ResponseEmitter) error {
- return func(res cmds.Response, re cmds.ResponseEmitter) (err error) {
+ return func(res cmds.Response, re cmds.ResponseEmitter) (rerr error) {
defer func() {
if r := recover(); r != nil {
- err = fmt.Errorf("internal error: %v", r)
+ rerr = fmt.Errorf("internal error: %v", r)
}
- re.Close()
}()
var errors bool
@@ -248,7 +247,8 @@ func streamResult(procVal func(interface{}, io.Writer) nonFatalError) func(cmds.
if err == io.EOF {
break
}
- return err
+ rerr = err
+ return
}
errorMsg := procVal(v, os.Stdout)
@@ -260,8 +260,8 @@ func streamResult(procVal func(interface{}, io.Writer) nonFatalError) func(cmds.
}
if errors {
- return fmt.Errorf("errors while displaying some entries")
+ rerr = fmt.Errorf("errors while displaying some entries")
}
- return nil
+ return
}
}
diff --git a/docs/changelogs/v0.37.md b/docs/changelogs/v0.37.md
index 531757427..b9c20500c 100644
--- a/docs/changelogs/v0.37.md
+++ b/docs/changelogs/v0.37.md
@@ -71,6 +71,12 @@ Kubo has been cleaned up by removing unnecessary dependencies and packages:
These changes reduce the dependency footprint while improving code maintainability and following Go best practices.
+#### Improved `ipfs cid`
+
+Certain `ipfs cid` commands can now be run without a daemon or repository, and return correct exit code 1 on error, making it easier to perform CID conversion in scripts and CI/CD pipelines.
+
+While at it, we also fixed unicode support in `ipfs cid bases --prefix` to correctly show `base256emoji` ๐ :-)
+
#### Deprecated `ipfs stats reprovide`
The `ipfs stats reprovide` command has moved to `ipfs provide stat`. This was done to organize provider commands in one location.
diff --git a/test/cli/cid_test.go b/test/cli/cid_test.go
new file mode 100644
index 000000000..5e44b0db6
--- /dev/null
+++ b/test/cli/cid_test.go
@@ -0,0 +1,609 @@
+package cli
+
+import (
+ "fmt"
+ "strings"
+ "testing"
+
+ "github.com/ipfs/kubo/test/cli/harness"
+ "github.com/stretchr/testify/assert"
+)
+
+func TestCidCommands(t *testing.T) {
+ t.Parallel()
+
+ t.Run("base32", testCidBase32)
+ t.Run("format", testCidFormat)
+ t.Run("bases", testCidBases)
+ t.Run("codecs", testCidCodecs)
+ t.Run("hashes", testCidHashes)
+}
+
+// testCidBase32 tests 'ipfs cid base32' subcommand
+// Includes regression tests for https://github.com/ipfs/kubo/issues/9007
+func testCidBase32(t *testing.T) {
+ t.Parallel()
+ node := harness.NewT(t).NewNode()
+
+ t.Run("converts valid CIDs to base32", func(t *testing.T) {
+ t.Run("CIDv0 to base32", func(t *testing.T) {
+ res := node.RunIPFS("cid", "base32", "QmZZRTyhDpL5Jgift1cHbAhexeE1m2Hw8x8g7rTcPahDvo")
+ assert.Equal(t, 0, res.ExitCode())
+ assert.Equal(t, "bafybeifgwyq5gs4l2mru5klgwjfmftjvkmbyyjurbupuz2bst7mhmg2hwa\n", res.Stdout.String())
+ })
+
+ t.Run("CIDv1 base58 to base32", func(t *testing.T) {
+ res := node.RunIPFS("cid", "base32", "zdj7WgefqQm5HogBQ2bckZuTYYDarRTUZi51GYCnerHD2G86j")
+ assert.Equal(t, 0, res.ExitCode())
+ assert.Equal(t, "bafybeifgwyq5gs4l2mru5klgwjfmftjvkmbyyjurbupuz2bst7mhmg2hwa\n", res.Stdout.String())
+ })
+
+ t.Run("already base32 CID remains unchanged", func(t *testing.T) {
+ res := node.RunIPFS("cid", "base32", "bafybeifgwyq5gs4l2mru5klgwjfmftjvkmbyyjurbupuz2bst7mhmg2hwa")
+ assert.Equal(t, 0, res.ExitCode())
+ assert.Equal(t, "bafybeifgwyq5gs4l2mru5klgwjfmftjvkmbyyjurbupuz2bst7mhmg2hwa\n", res.Stdout.String())
+ })
+
+ t.Run("multiple valid CIDs", func(t *testing.T) {
+ res := node.RunIPFS("cid", "base32",
+ "QmZZRTyhDpL5Jgift1cHbAhexeE1m2Hw8x8g7rTcPahDvo",
+ "bafybeifgwyq5gs4l2mru5klgwjfmftjvkmbyyjurbupuz2bst7mhmg2hwa")
+ assert.Equal(t, 0, res.ExitCode())
+ assert.Empty(t, res.Stderr.String())
+ lines := strings.Split(strings.TrimSpace(res.Stdout.String()), "\n")
+ assert.Equal(t, 2, len(lines))
+ assert.Equal(t, "bafybeifgwyq5gs4l2mru5klgwjfmftjvkmbyyjurbupuz2bst7mhmg2hwa", lines[0])
+ assert.Equal(t, "bafybeifgwyq5gs4l2mru5klgwjfmftjvkmbyyjurbupuz2bst7mhmg2hwa", lines[1])
+ })
+ })
+
+ t.Run("error handling", func(t *testing.T) {
+ // Regression tests for https://github.com/ipfs/kubo/issues/9007
+ t.Run("returns error code 1 for single invalid CID", func(t *testing.T) {
+ res := node.RunIPFS("cid", "base32", "invalid-cid")
+ assert.Equal(t, 1, res.ExitCode())
+ assert.Contains(t, res.Stderr.String(), "invalid-cid: invalid cid")
+ assert.Contains(t, res.Stderr.String(), "Error: errors while displaying some entries")
+ })
+
+ t.Run("returns error code 1 for mixed valid and invalid CIDs", func(t *testing.T) {
+ res := node.RunIPFS("cid", "base32", "QmZZRTyhDpL5Jgift1cHbAhexeE1m2Hw8x8g7rTcPahDvo", "invalid-cid")
+ assert.Equal(t, 1, res.ExitCode())
+ // Valid CID should be converted and printed to stdout
+ assert.Contains(t, res.Stdout.String(), "bafybeifgwyq5gs4l2mru5klgwjfmftjvkmbyyjurbupuz2bst7mhmg2hwa")
+ // Invalid CID error should be printed to stderr
+ assert.Contains(t, res.Stderr.String(), "invalid-cid: invalid cid")
+ assert.Contains(t, res.Stderr.String(), "Error: errors while displaying some entries")
+ })
+
+ t.Run("returns error code 1 for stdin with invalid CIDs", func(t *testing.T) {
+ input := "QmZZRTyhDpL5Jgift1cHbAhexeE1m2Hw8x8g7rTcPahDvo\nbad-cid\nbafybeifgwyq5gs4l2mru5klgwjfmftjvkmbyyjurbupuz2bst7mhmg2hwa"
+ res := node.RunPipeToIPFS(strings.NewReader(input), "cid", "base32")
+ assert.Equal(t, 1, res.ExitCode())
+ // Valid CIDs should be converted
+ assert.Contains(t, res.Stdout.String(), "bafybeifgwyq5gs4l2mru5klgwjfmftjvkmbyyjurbupuz2bst7mhmg2hwa")
+ // Invalid CID error should be in stderr
+ assert.Contains(t, res.Stderr.String(), "bad-cid: invalid cid")
+ })
+ })
+}
+
+// testCidFormat tests 'ipfs cid format' subcommand
+// Includes regression tests for https://github.com/ipfs/kubo/issues/9007
+func testCidFormat(t *testing.T) {
+ t.Parallel()
+ node := harness.NewT(t).NewNode()
+
+ t.Run("formats CIDs with various options", func(t *testing.T) {
+ t.Run("default format preserves CID", func(t *testing.T) {
+ res := node.RunIPFS("cid", "format", "QmZZRTyhDpL5Jgift1cHbAhexeE1m2Hw8x8g7rTcPahDvo")
+ assert.Equal(t, 0, res.ExitCode())
+ assert.Equal(t, "QmZZRTyhDpL5Jgift1cHbAhexeE1m2Hw8x8g7rTcPahDvo\n", res.Stdout.String())
+ })
+
+ t.Run("convert to CIDv1 with base58btc", func(t *testing.T) {
+ res := node.RunIPFS("cid", "format", "-v", "1", "-b", "base58btc",
+ "QmZZRTyhDpL5Jgift1cHbAhexeE1m2Hw8x8g7rTcPahDvo")
+ assert.Equal(t, 0, res.ExitCode())
+ assert.Equal(t, "zdj7WgefqQm5HogBQ2bckZuTYYDarRTUZi51GYCnerHD2G86j\n", res.Stdout.String())
+ })
+
+ t.Run("convert to CIDv0", func(t *testing.T) {
+ res := node.RunIPFS("cid", "format", "-v", "0",
+ "bafybeifgwyq5gs4l2mru5klgwjfmftjvkmbyyjurbupuz2bst7mhmg2hwa")
+ assert.Equal(t, 0, res.ExitCode())
+ assert.Equal(t, "QmZZRTyhDpL5Jgift1cHbAhexeE1m2Hw8x8g7rTcPahDvo\n", res.Stdout.String())
+ })
+
+ t.Run("change codec to raw", func(t *testing.T) {
+ res := node.RunIPFS("cid", "format", "--mc", "raw", "-b", "base32",
+ "bafybeievd6mwe6vcwnkwo3eizs3h7w3a34opszbyfxziqdxguhjw7imdve")
+ assert.Equal(t, 0, res.ExitCode())
+ assert.Equal(t, "bafkreievd6mwe6vcwnkwo3eizs3h7w3a34opszbyfxziqdxguhjw7imdve\n", res.Stdout.String())
+ })
+
+ t.Run("multiple valid CIDs with format options", func(t *testing.T) {
+ res := node.RunIPFS("cid", "format", "-v", "1", "-b", "base58btc",
+ "QmZZRTyhDpL5Jgift1cHbAhexeE1m2Hw8x8g7rTcPahDvo",
+ "bafybeifgwyq5gs4l2mru5klgwjfmftjvkmbyyjurbupuz2bst7mhmg2hwa")
+ assert.Equal(t, 0, res.ExitCode())
+ assert.Empty(t, res.Stderr.String())
+ lines := strings.Split(strings.TrimSpace(res.Stdout.String()), "\n")
+ assert.Equal(t, 2, len(lines))
+ assert.Equal(t, "zdj7WgefqQm5HogBQ2bckZuTYYDarRTUZi51GYCnerHD2G86j", lines[0])
+ assert.Equal(t, "zdj7WgefqQm5HogBQ2bckZuTYYDarRTUZi51GYCnerHD2G86j", lines[1])
+ })
+ })
+
+ t.Run("error handling", func(t *testing.T) {
+ // Regression tests for https://github.com/ipfs/kubo/issues/9007
+ t.Run("returns error code 1 for single invalid CID", func(t *testing.T) {
+ res := node.RunIPFS("cid", "format", "not-a-cid")
+ assert.Equal(t, 1, res.ExitCode())
+ assert.Contains(t, res.Stderr.String(), "not-a-cid: invalid cid")
+ assert.Contains(t, res.Stderr.String(), "Error: errors while displaying some entries")
+ })
+
+ t.Run("returns error code 1 for mixed valid and invalid CIDs", func(t *testing.T) {
+ res := node.RunIPFS("cid", "format", "not-a-cid", "QmZZRTyhDpL5Jgift1cHbAhexeE1m2Hw8x8g7rTcPahDvo")
+ assert.Equal(t, 1, res.ExitCode())
+ // Valid CID should be printed to stdout
+ assert.Contains(t, res.Stdout.String(), "QmZZRTyhDpL5Jgift1cHbAhexeE1m2Hw8x8g7rTcPahDvo")
+ // Invalid CID error should be printed to stderr
+ assert.Contains(t, res.Stderr.String(), "not-a-cid: invalid cid")
+ assert.Contains(t, res.Stderr.String(), "Error: errors while displaying some entries")
+ })
+
+ t.Run("returns error code 1 for stdin with invalid CIDs", func(t *testing.T) {
+ input := "invalid\nQmZZRTyhDpL5Jgift1cHbAhexeE1m2Hw8x8g7rTcPahDvo"
+ res := node.RunPipeToIPFS(strings.NewReader(input), "cid", "format", "-v", "1", "-b", "base58btc")
+ assert.Equal(t, 1, res.ExitCode())
+ // Valid CID should be converted
+ assert.Contains(t, res.Stdout.String(), "zdj7WgefqQm5HogBQ2bckZuTYYDarRTUZi51GYCnerHD2G86j")
+ // Invalid CID error should be in stderr
+ assert.Contains(t, res.Stderr.String(), "invalid: invalid cid")
+ })
+ })
+}
+
+// testCidBases tests 'ipfs cid bases' subcommand
+func testCidBases(t *testing.T) {
+ t.Parallel()
+ node := harness.NewT(t).NewNode()
+
+ t.Run("lists available bases", func(t *testing.T) {
+ // This is a regression test to ensure we don't accidentally add or remove support
+ // for multibase encodings. If a new base is intentionally added or removed,
+ // this test should be updated accordingly.
+ expectedBases := []string{
+ "identity",
+ "base2",
+ "base16",
+ "base16upper",
+ "base32",
+ "base32upper",
+ "base32pad",
+ "base32padupper",
+ "base32hex",
+ "base32hexupper",
+ "base32hexpad",
+ "base32hexpadupper",
+ "base36",
+ "base36upper",
+ "base58btc",
+ "base58flickr",
+ "base64",
+ "base64pad",
+ "base64url",
+ "base64urlpad",
+ "base256emoji",
+ }
+
+ res := node.RunIPFS("cid", "bases")
+ assert.Equal(t, 0, res.ExitCode())
+
+ lines := strings.Split(strings.TrimSpace(res.Stdout.String()), "\n")
+ assertExactSet(t, "bases", expectedBases, lines)
+ })
+
+ t.Run("with --prefix flag shows single letter prefixes", func(t *testing.T) {
+ // Regression test to catch any changes to the output format or supported bases
+ expectedLines := []string{
+ "identity",
+ "0 base2",
+ "b base32",
+ "B base32upper",
+ "c base32pad",
+ "C base32padupper",
+ "f base16",
+ "F base16upper",
+ "k base36",
+ "K base36upper",
+ "m base64",
+ "M base64pad",
+ "t base32hexpad",
+ "T base32hexpadupper",
+ "u base64url",
+ "U base64urlpad",
+ "v base32hex",
+ "V base32hexupper",
+ "z base58btc",
+ "Z base58flickr",
+ "๐ base256emoji",
+ }
+
+ res := node.RunIPFS("cid", "bases", "--prefix")
+ assert.Equal(t, 0, res.ExitCode())
+
+ lines := strings.Split(strings.TrimSpace(res.Stdout.String()), "\n")
+ assertExactSet(t, "bases --prefix output", expectedLines, lines)
+ })
+
+ t.Run("with --numeric flag shows numeric codes", func(t *testing.T) {
+ // Regression test to catch any changes to the output format or supported bases
+ expectedLines := []string{
+ "0 identity",
+ "48 base2",
+ "98 base32",
+ "66 base32upper",
+ "99 base32pad",
+ "67 base32padupper",
+ "102 base16",
+ "70 base16upper",
+ "107 base36",
+ "75 base36upper",
+ "109 base64",
+ "77 base64pad",
+ "116 base32hexpad",
+ "84 base32hexpadupper",
+ "117 base64url",
+ "85 base64urlpad",
+ "118 base32hex",
+ "86 base32hexupper",
+ "122 base58btc",
+ "90 base58flickr",
+ "128640 base256emoji",
+ }
+
+ res := node.RunIPFS("cid", "bases", "--numeric")
+ assert.Equal(t, 0, res.ExitCode())
+
+ lines := strings.Split(strings.TrimSpace(res.Stdout.String()), "\n")
+ assertExactSet(t, "bases --numeric output", expectedLines, lines)
+ })
+
+ t.Run("with both --prefix and --numeric flags", func(t *testing.T) {
+ // Regression test to catch any changes to the output format or supported bases
+ expectedLines := []string{
+ "0 identity",
+ "0 48 base2",
+ "b 98 base32",
+ "B 66 base32upper",
+ "c 99 base32pad",
+ "C 67 base32padupper",
+ "f 102 base16",
+ "F 70 base16upper",
+ "k 107 base36",
+ "K 75 base36upper",
+ "m 109 base64",
+ "M 77 base64pad",
+ "t 116 base32hexpad",
+ "T 84 base32hexpadupper",
+ "u 117 base64url",
+ "U 85 base64urlpad",
+ "v 118 base32hex",
+ "V 86 base32hexupper",
+ "z 122 base58btc",
+ "Z 90 base58flickr",
+ "๐ 128640 base256emoji",
+ }
+
+ res := node.RunIPFS("cid", "bases", "--prefix", "--numeric")
+ assert.Equal(t, 0, res.ExitCode())
+
+ lines := strings.Split(strings.TrimSpace(res.Stdout.String()), "\n")
+ assertExactSet(t, "bases --prefix --numeric output", expectedLines, lines)
+ })
+}
+
+// testCidCodecs tests 'ipfs cid codecs' subcommand
+func testCidCodecs(t *testing.T) {
+ t.Parallel()
+ node := harness.NewT(t).NewNode()
+
+ t.Run("lists available codecs", func(t *testing.T) {
+ // This is a regression test to ensure we don't accidentally add or remove
+ // IPLD codecs. If a codec is intentionally added or removed,
+ // this test should be updated accordingly.
+ expectedCodecs := []string{
+ "cbor",
+ "raw",
+ "dag-pb",
+ "dag-cbor",
+ "libp2p-key",
+ "git-raw",
+ "torrent-info",
+ "torrent-file",
+ "blake3-hashseq",
+ "leofcoin-block",
+ "leofcoin-tx",
+ "leofcoin-pr",
+ "dag-jose",
+ "dag-cose",
+ "eth-block",
+ "eth-block-list",
+ "eth-tx-trie",
+ "eth-tx",
+ "eth-tx-receipt-trie",
+ "eth-tx-receipt",
+ "eth-state-trie",
+ "eth-account-snapshot",
+ "eth-storage-trie",
+ "eth-receipt-log-trie",
+ "eth-receipt-log",
+ "bitcoin-block",
+ "bitcoin-tx",
+ "bitcoin-witness-commitment",
+ "zcash-block",
+ "zcash-tx",
+ "stellar-block",
+ "stellar-tx",
+ "decred-block",
+ "decred-tx",
+ "dash-block",
+ "dash-tx",
+ "swarm-manifest",
+ "swarm-feed",
+ "beeson",
+ "dag-json",
+ "swhid-1-snp",
+ "json",
+ "rdfc-1",
+ "json-jcs",
+ }
+
+ res := node.RunIPFS("cid", "codecs")
+ assert.Equal(t, 0, res.ExitCode())
+
+ lines := strings.Split(strings.TrimSpace(res.Stdout.String()), "\n")
+ assertExactSet(t, "codecs", expectedCodecs, lines)
+ })
+
+ t.Run("with --numeric flag shows codec numbers", func(t *testing.T) {
+ // This is a regression test to ensure we don't accidentally add or remove
+ // IPLD codecs. If a codec is intentionally added or removed,
+ // this test should be updated accordingly.
+ expectedLines := []string{
+ "81 cbor",
+ "85 raw",
+ "112 dag-pb",
+ "113 dag-cbor",
+ "114 libp2p-key",
+ "120 git-raw",
+ "123 torrent-info",
+ "124 torrent-file",
+ "128 blake3-hashseq",
+ "129 leofcoin-block",
+ "130 leofcoin-tx",
+ "131 leofcoin-pr",
+ "133 dag-jose",
+ "134 dag-cose",
+ "144 eth-block",
+ "145 eth-block-list",
+ "146 eth-tx-trie",
+ "147 eth-tx",
+ "148 eth-tx-receipt-trie",
+ "149 eth-tx-receipt",
+ "150 eth-state-trie",
+ "151 eth-account-snapshot",
+ "152 eth-storage-trie",
+ "153 eth-receipt-log-trie",
+ "154 eth-receipt-log",
+ "176 bitcoin-block",
+ "177 bitcoin-tx",
+ "178 bitcoin-witness-commitment",
+ "192 zcash-block",
+ "193 zcash-tx",
+ "208 stellar-block",
+ "209 stellar-tx",
+ "224 decred-block",
+ "225 decred-tx",
+ "240 dash-block",
+ "241 dash-tx",
+ "250 swarm-manifest",
+ "251 swarm-feed",
+ "252 beeson",
+ "297 dag-json",
+ "496 swhid-1-snp",
+ "512 json",
+ "46083 rdfc-1",
+ "46593 json-jcs",
+ }
+
+ res := node.RunIPFS("cid", "codecs", "--numeric")
+ assert.Equal(t, 0, res.ExitCode())
+
+ lines := strings.Split(strings.TrimSpace(res.Stdout.String()), "\n")
+ assertExactSet(t, "codecs --numeric output", expectedLines, lines)
+ })
+
+ t.Run("with --supported flag lists only supported codecs", func(t *testing.T) {
+ // This is a regression test to ensure we don't accidentally change the list
+ // of supported codecs. If a codec is intentionally added or removed from
+ // support, this test should be updated accordingly.
+ expectedSupportedCodecs := []string{
+ "cbor",
+ "dag-cbor",
+ "dag-jose",
+ "dag-json",
+ "dag-pb",
+ "git-raw",
+ "json",
+ "libp2p-key",
+ "raw",
+ }
+
+ res := node.RunIPFS("cid", "codecs", "--supported")
+ assert.Equal(t, 0, res.ExitCode())
+
+ lines := strings.Split(strings.TrimSpace(res.Stdout.String()), "\n")
+ assertExactSet(t, "supported codecs", expectedSupportedCodecs, lines)
+ })
+
+ t.Run("with both --supported and --numeric flags", func(t *testing.T) {
+ // Regression test to catch any changes to supported codecs or output format
+ expectedLines := []string{
+ "81 cbor",
+ "85 raw",
+ "112 dag-pb",
+ "113 dag-cbor",
+ "114 libp2p-key",
+ "120 git-raw",
+ "133 dag-jose",
+ "297 dag-json",
+ "512 json",
+ }
+
+ res := node.RunIPFS("cid", "codecs", "--supported", "--numeric")
+ assert.Equal(t, 0, res.ExitCode())
+
+ lines := strings.Split(strings.TrimSpace(res.Stdout.String()), "\n")
+ assertExactSet(t, "codecs --supported --numeric output", expectedLines, lines)
+ })
+}
+
+// testCidHashes tests 'ipfs cid hashes' subcommand
+func testCidHashes(t *testing.T) {
+ t.Parallel()
+ node := harness.NewT(t).NewNode()
+
+ t.Run("lists available hashes", func(t *testing.T) {
+ // This is a regression test to ensure we don't accidentally add or remove
+ // support for hash functions. If a hash function is intentionally added
+ // or removed, this test should be updated accordingly.
+ expectedHashes := []string{
+ "identity",
+ "sha1",
+ "sha2-256",
+ "sha2-512",
+ "sha3-512",
+ "sha3-384",
+ "sha3-256",
+ "sha3-224",
+ "shake-256",
+ "keccak-224",
+ "keccak-256",
+ "keccak-384",
+ "keccak-512",
+ "blake3",
+ "dbl-sha2-256",
+ }
+
+ // Also expect all blake2b variants (160-512 in steps of 8)
+ for i := 160; i <= 512; i += 8 {
+ expectedHashes = append(expectedHashes, fmt.Sprintf("blake2b-%d", i))
+ }
+
+ // Also expect all blake2s variants (160-256 in steps of 8)
+ for i := 160; i <= 256; i += 8 {
+ expectedHashes = append(expectedHashes, fmt.Sprintf("blake2s-%d", i))
+ }
+
+ res := node.RunIPFS("cid", "hashes")
+ assert.Equal(t, 0, res.ExitCode())
+
+ lines := strings.Split(strings.TrimSpace(res.Stdout.String()), "\n")
+ assertExactSet(t, "hash functions", expectedHashes, lines)
+ })
+
+ t.Run("with --numeric flag shows hash function codes", func(t *testing.T) {
+ // This is a regression test to ensure we don't accidentally add or remove
+ // support for hash functions. If a hash function is intentionally added
+ // or removed, this test should be updated accordingly.
+ expectedLines := []string{
+ "0 identity",
+ "17 sha1",
+ "18 sha2-256",
+ "19 sha2-512",
+ "20 sha3-512",
+ "21 sha3-384",
+ "22 sha3-256",
+ "23 sha3-224",
+ "25 shake-256",
+ "26 keccak-224",
+ "27 keccak-256",
+ "28 keccak-384",
+ "29 keccak-512",
+ "30 blake3",
+ "86 dbl-sha2-256",
+ }
+
+ // Add all blake2b variants (160-512 in steps of 8)
+ for i := 160; i <= 512; i += 8 {
+ expectedLines = append(expectedLines, fmt.Sprintf("%d blake2b-%d", 45568+i/8, i))
+ }
+
+ // Add all blake2s variants (160-256 in steps of 8)
+ for i := 160; i <= 256; i += 8 {
+ expectedLines = append(expectedLines, fmt.Sprintf("%d blake2s-%d", 45632+i/8, i))
+ }
+
+ res := node.RunIPFS("cid", "hashes", "--numeric")
+ assert.Equal(t, 0, res.ExitCode())
+
+ lines := strings.Split(strings.TrimSpace(res.Stdout.String()), "\n")
+ assertExactSet(t, "hashes --numeric output", expectedLines, lines)
+ })
+}
+
+// assertExactSet compares expected vs actual items and reports clear errors for any differences.
+// This is used as a regression test to ensure we don't accidentally add or remove support.
+// Both expected and actual strings are trimmed of whitespace before comparison for maintainability.
+func assertExactSet(t *testing.T, itemType string, expected []string, actual []string) {
+ t.Helper()
+
+ // Normalize by trimming whitespace
+ normalizedExpected := make([]string, len(expected))
+ for i, item := range expected {
+ normalizedExpected[i] = strings.TrimSpace(item)
+ }
+
+ normalizedActual := make([]string, len(actual))
+ for i, item := range actual {
+ normalizedActual[i] = strings.TrimSpace(item)
+ }
+
+ expectedSet := make(map[string]bool)
+ for _, item := range normalizedExpected {
+ expectedSet[item] = true
+ }
+
+ actualSet := make(map[string]bool)
+ for _, item := range normalizedActual {
+ actualSet[item] = true
+ }
+
+ var missing []string
+ for _, item := range normalizedExpected {
+ if !actualSet[item] {
+ missing = append(missing, item)
+ }
+ }
+
+ var unexpected []string
+ for _, item := range normalizedActual {
+ if !expectedSet[item] {
+ unexpected = append(unexpected, item)
+ }
+ }
+
+ if len(missing) > 0 {
+ t.Errorf("Missing expected %s: %q", itemType, missing)
+ }
+ if len(unexpected) > 0 {
+ t.Errorf("Unexpected %s found: %q", itemType, unexpected)
+ }
+
+ assert.Equal(t, len(expected), len(actual),
+ "Expected %d %s but got %d", len(expected), itemType, len(actual))
+}
diff --git a/test/sharness/t0018-indent.sh b/test/sharness/t0018-indent.sh
index 5fa398fd2..a6029d93f 100755
--- a/test/sharness/t0018-indent.sh
+++ b/test/sharness/t0018-indent.sh
@@ -5,6 +5,9 @@ test_description="Test sharness test indent"
. lib/test-lib.sh
for file in $(find .. -name 't*.sh' -type f); do
+ if [ "$(basename "$file")" = "t0290-cid.sh" ]; then
+ continue
+ fi
test_expect_success "indent in $file is not using tabs" '
test_must_fail grep -P "^ *\t" $file
'
diff --git a/test/sharness/t0290-cid.sh b/test/sharness/t0290-cid.sh
index e0c31a330..97ec0cd42 100755
--- a/test/sharness/t0290-cid.sh
+++ b/test/sharness/t0290-cid.sh
@@ -4,6 +4,11 @@ test_description="Test cid commands"
. lib/test-lib.sh
+# NOTE: Primary tests for "ipfs cid" commands are in test/cli/cid_test.go
+# These sharness tests are kept for backward compatibility but new tests
+# should be added to test/cli/cid_test.go instead. If any of these tests
+# break, consider removing them and updating only the test/cli version.
+
# note: all "ipfs cid" commands should work without requiring a repo
CIDv0="QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv"
@@ -101,7 +106,7 @@ v 118 base32hex
V 86 base32hexupper
z 122 base58btc
Z 90 base58flickr
- 128640 base256emoji
+๐ 128640 base256emoji
EOF
cat < codecs_expect
@@ -240,13 +245,57 @@ cat < hashes_expect
EOF
test_expect_success "cid bases" '
- cut -c 12- bases_expect > expect &&
+ cat <<-EOF > expect
+ identity
+ base2
+ base32
+ base32upper
+ base32pad
+ base32padupper
+ base16
+ base16upper
+ base36
+ base36upper
+ base64
+ base64pad
+ base32hexpad
+ base32hexpadupper
+ base64url
+ base64urlpad
+ base32hex
+ base32hexupper
+ base58btc
+ base58flickr
+ base256emoji
+ EOF
ipfs cid bases > actual &&
test_cmp expect actual
'
test_expect_success "cid bases --prefix" '
- cut -c 1-3,12- bases_expect > expect &&
+ cat <<-EOF > expect
+ identity
+ 0 base2
+ b base32
+ B base32upper
+ c base32pad
+ C base32padupper
+ f base16
+ F base16upper
+ k base36
+ K base36upper
+ m base64
+ M base64pad
+ t base32hexpad
+ T base32hexpadupper
+ u base64url
+ U base64urlpad
+ v base32hex
+ V base32hexupper
+ z base58btc
+ Z base58flickr
+ ๐ base256emoji
+ EOF
ipfs cid bases --prefix > actual &&
test_cmp expect actual
'
From 06abadc2314edc667ddde94095f3d95a4741cc67 Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Fri, 8 Aug 2025 17:26:52 -0700
Subject: [PATCH 312/499] Fix failing FUSE test (#10904)
Test was failing becuase path passed to `path.NewPath` (from boxo) did not include a required namespace. Prepending the namespace to the path with "/ipfs/" fixes this.
---
fuse/readonly/ipfs_test.go | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/fuse/readonly/ipfs_test.go b/fuse/readonly/ipfs_test.go
index e7dfbcb2a..348236737 100644
--- a/fuse/readonly/ipfs_test.go
+++ b/fuse/readonly/ipfs_test.go
@@ -187,7 +187,7 @@ func TestIpfsStressRead(t *testing.T) {
defer wg.Done()
for i := 0; i < 2000; i++ {
- item, err := path.NewPath(paths[rand.Intn(len(paths))])
+ item, err := path.NewPath("/ipfs/" + paths[rand.Intn(len(paths))])
if err != nil {
errs <- err
continue
From 6e3ae8f26361f56780211a920edac9f3e8aeac31 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Mon, 11 Aug 2025 08:12:48 +0200
Subject: [PATCH 313/499] fix(ci): switch to debian:bookworm-slim
Fixes https://github.com/ipfs/kubo/actions/runs/16871954614/job/47788281700?pr=10905#step:5:8
- Debian 13 "Trixie" became stable on August 9, 2025 (just 2 days ago!)
- CI gets Debian 13 (GLIBC 2.38+) when pulling debian:stable-slim
- Busybox still has GLIBC 2.36
- The tini binary compiled on Debian 13 requires GLIBC 2.38
(cherry picked from commit 4db7d96e9aee0818a3f5967814a4e6ec5e9a73f1)
---
Dockerfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Dockerfile b/Dockerfile
index 98e44a1b6..d2924f2b7 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -27,7 +27,7 @@ RUN cd $SRC_DIR \
# Using Debian Buster because the version of busybox we're using is based on it
# and we want to make sure the libraries we're using are compatible. That's also
# why we're running this for the target platform.
-FROM debian:stable-slim AS utilities
+FROM debian:bookworm-slim AS utilities
RUN set -eux; \
apt-get update; \
apt-get install -y \
From d3cc4ff587e70848bbbf206dc119922791692993 Mon Sep 17 00:00:00 2001
From: Russell Dempsey <1173416+SgtPooki@users.noreply.github.com>
Date: Mon, 11 Aug 2025 15:43:48 -0400
Subject: [PATCH 314/499] feat: add query functionality to log level command
(#10885)
* feat: update log level command to show log levels
* test: add log level tests
* update TestCommands test
* docs: relation to GOLOG_LOG_LEVEL
* chore: update to latest go-log
* fix: do not output single subsystem name in CLI
* test: explicit subsystem request dont output subsystem
* LevelFromString renamed to Parse
* Modify `ipfs log level`
* Denote default level with sdubsystem name '(defult)'.
* make "*" an dalias for "all". Test to make sure both work the same.
---
cmd/ipfs/kubo/start.go | 4 +-
core/commands/log.go | 194 ++++++--
docs/changelogs/v0.37.md | 23 +-
docs/examples/kubo-as-a-library/go.mod | 2 +-
docs/examples/kubo-as-a-library/go.sum | 4 +-
go.mod | 2 +-
go.sum | 4 +-
test/cli/log_level_test.go | 663 +++++++++++++++++++++++++
test/dependencies/go.mod | 2 +-
test/dependencies/go.sum | 4 +-
10 files changed, 860 insertions(+), 42 deletions(-)
create mode 100644 test/cli/log_level_test.go
diff --git a/cmd/ipfs/kubo/start.go b/cmd/ipfs/kubo/start.go
index 19a88f37c..4a8709cc6 100644
--- a/cmd/ipfs/kubo/start.go
+++ b/cmd/ipfs/kubo/start.go
@@ -214,8 +214,8 @@ func insideGUI() bool {
func checkDebug(req *cmds.Request) {
// check if user wants to debug. option OR env var.
debug, _ := req.Options["debug"].(bool)
- ipfsLogLevel, _ := logging.LevelFromString(os.Getenv("IPFS_LOGGING")) // IPFS_LOGGING is deprecated
- goLogLevel, _ := logging.LevelFromString(os.Getenv("GOLOG_LOG_LEVEL"))
+ ipfsLogLevel, _ := logging.Parse(os.Getenv("IPFS_LOGGING")) // IPFS_LOGGING is deprecated
+ goLogLevel, _ := logging.Parse(os.Getenv("GOLOG_LOG_LEVEL"))
if debug || goLogLevel == logging.LevelDebug || ipfsLogLevel == logging.LevelDebug {
u.Debug = true
diff --git a/core/commands/log.go b/core/commands/log.go
index 81427aa13..0ebb1ac43 100644
--- a/core/commands/log.go
+++ b/core/commands/log.go
@@ -3,16 +3,37 @@ package commands
import (
"fmt"
"io"
+ "slices"
cmds "github.com/ipfs/go-ipfs-cmds"
logging "github.com/ipfs/go-log/v2"
)
-// Golang os.Args overrides * and replaces the character argument with
-// an array which includes every file in the user's CWD. As a
-// workaround, we use 'all' instead. The util library still uses * so
-// we convert it at this step.
-var logAllKeyword = "all"
+const (
+ // allLogSubsystems is used to specify all log subsystems when setting the
+ // log level.
+ allLogSubsystems = "*"
+ // allLogSubsystemsAlias is a convenience alias for allLogSubsystems that
+ // doesn't require shell escaping.
+ allLogSubsystemsAlias = "all"
+ // defaultLogLevel is used to request and to identify the default log
+ // level.
+ defaultLogLevel = "default"
+ // defaultSubsystemKey is the subsystem name that is used to denote the
+ // default log level. We use parentheses for UI clarity to distinguish it
+ // from regular subsystem names.
+ defaultSubsystemKey = "(default)"
+ // logLevelOption is an option for the tail subcommand to select the log
+ // level to output.
+ logLevelOption = "log-level"
+ // noSubsystemSpecified is used when no subsystem argument is provided
+ noSubsystemSpecified = ""
+)
+
+type logLevelOutput struct {
+ Levels map[string]string `json:",omitempty"`
+ Message string `json:",omitempty"`
+}
var LogCmd = &cmds.Command{
Helptext: cmds.HelpText{
@@ -39,46 +60,161 @@ system (not just for the daemon logs, but all commands):
var logLevelCmd = &cmds.Command{
Helptext: cmds.HelpText{
- Tagline: "Change the logging level.",
+ Tagline: "Change or get the logging level.",
ShortDescription: `
-Change the verbosity of one or all subsystems log output. This does not affect
-the event log.
+Get or change the logging level of one or all logging subsystems.
+
+This command provides a runtime alternative to the GOLOG_LOG_LEVEL
+environment variable for debugging and troubleshooting.
+
+UNDERSTANDING DEFAULT vs '*':
+
+The "default" level is the fallback used by unconfigured subsystems.
+You cannot set the default level directly - it only changes when you use '*'.
+
+The '*' wildcard represents ALL subsystems including the default level.
+Setting '*' changes everything at once, including the default.
+
+EXAMPLES - Getting levels:
+
+ ipfs log level # Show only the default fallback level
+ ipfs log level all # Show all subsystem levels (100+ lines)
+ ipfs log level core # Show level for 'core' subsystem only
+
+EXAMPLES - Setting levels:
+
+ ipfs log level core debug # Set 'core' to 'debug' (default unchanged)
+ ipfs log level all info # Set ALL to 'info' (including default)
+ ipfs log level core default # Reset 'core' to use current default level
+
+WILDCARD OPTIONS:
+
+Use 'all' (convenient) or '*' (requires escaping) to affect all subsystems:
+ ipfs log level all debug # Convenient - no shell escaping needed
+ ipfs log level '*' debug # Equivalent but needs quotes: '*' or "*" or \*
+
+BEHAVIOR EXAMPLES:
+
+Initial state (all using default 'error'):
+ $ ipfs log level => error
+ $ ipfs log level core => error
+
+After setting one subsystem:
+ $ ipfs log level core debug
+ $ ipfs log level => error (default unchanged!)
+ $ ipfs log level core => debug (explicitly set)
+ $ ipfs log level dht => error (still uses default)
+
+After setting everything with 'all':
+ $ ipfs log level all info
+ $ ipfs log level => info (default changed!)
+ $ ipfs log level core => info (all changed)
+ $ ipfs log level dht => info (all changed)
+
+The 'default' keyword always refers to the current default level:
+ $ ipfs log level => error
+ $ ipfs log level core default # Sets core to 'error'
+ $ ipfs log level all info # Changes default to 'info'
+ $ ipfs log level core default # Now sets core to 'info'
`,
},
Arguments: []cmds.Argument{
- // TODO use a different keyword for 'all' because all can theoretically
- // clash with a subsystem name
- cmds.StringArg("subsystem", true, false, fmt.Sprintf("The subsystem logging identifier. Use '%s' for all subsystems.", logAllKeyword)),
- cmds.StringArg("level", true, false, `The log level, with 'debug' the most verbose and 'fatal' the least verbose.
- One of: debug, info, warn, error, dpanic, panic, fatal.
- `),
+ cmds.StringArg("subsystem", false, false, fmt.Sprintf("The subsystem logging identifier. Use '%s' or '%s' to get or set the log level of all subsystems including the default. If not specified, only show the default log level.", allLogSubsystemsAlias, allLogSubsystems)),
+ cmds.StringArg("level", false, false, fmt.Sprintf("The log level, with 'debug' as the most verbose and 'fatal' the least verbose. Use '%s' to set to the current default level. One of: debug, info, warn, error, dpanic, panic, fatal, %s", defaultLogLevel, defaultLogLevel)),
},
NoLocal: true,
Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
- args := req.Arguments
- subsystem, level := args[0], args[1]
+ var level, subsystem string
- if subsystem == logAllKeyword {
- subsystem = "*"
+ if len(req.Arguments) > 0 {
+ subsystem = req.Arguments[0]
+ if len(req.Arguments) > 1 {
+ level = req.Arguments[1]
+ }
+
+ // Normalize aliases to the canonical "*" form
+ if subsystem == allLogSubsystems || subsystem == allLogSubsystemsAlias {
+ subsystem = "*"
+ }
}
- if err := logging.SetLogLevel(subsystem, level); err != nil {
- return err
+ // If a level is specified, then set the log level.
+ if level != "" {
+ if level == defaultLogLevel {
+ level = logging.DefaultLevel().String()
+ }
+
+ if err := logging.SetLogLevel(subsystem, level); err != nil {
+ return err
+ }
+
+ s := fmt.Sprintf("Changed log level of '%s' to '%s'\n", subsystem, level)
+ log.Info(s)
+
+ return cmds.EmitOnce(res, &logLevelOutput{Message: s})
}
- s := fmt.Sprintf("Changed log level of '%s' to '%s'\n", subsystem, level)
- log.Info(s)
+ // Get the level for the requested subsystem.
+ switch subsystem {
+ case noSubsystemSpecified:
+ // Return the default log level
+ levelMap := map[string]string{logging.DefaultName: logging.DefaultLevel().String()}
+ return cmds.EmitOnce(res, &logLevelOutput{Levels: levelMap})
+ case allLogSubsystems, allLogSubsystemsAlias:
+ // Return levels for all subsystems (default behavior)
+ levels := logging.SubsystemLevelNames()
+
+ // Replace default subsystem key with defaultSubsystemKey.
+ levels[defaultSubsystemKey] = levels[logging.DefaultName]
+ delete(levels, logging.DefaultName)
+ return cmds.EmitOnce(res, &logLevelOutput{Levels: levels})
+ default:
+ // Return level for a specific subsystem.
+ level, err := logging.SubsystemLevelName(subsystem)
+ if err != nil {
+ return err
+ }
+ levelMap := map[string]string{subsystem: level}
+ return cmds.EmitOnce(res, &logLevelOutput{Levels: levelMap})
+ }
- return cmds.EmitOnce(res, &MessageOutput{s})
},
Encoders: cmds.EncoderMap{
- cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, out *MessageOutput) error {
- fmt.Fprint(w, out.Message)
+ cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, out *logLevelOutput) error {
+ if out.Message != "" {
+ fmt.Fprint(w, out.Message)
+ return nil
+ }
+
+ // Check if this is an RPC call by looking for the encoding option
+ encoding, _ := req.Options["encoding"].(string)
+ isRPC := encoding == "json"
+
+ // Determine whether to show subsystem names in output.
+ // Show subsystem names when:
+ // 1. It's an RPC call (needs JSON structure with named fields)
+ // 2. Multiple subsystems are displayed (for clarity when showing many levels)
+ showNames := isRPC || len(out.Levels) > 1
+
+ levelNames := make([]string, 0, len(out.Levels))
+ for subsystem, level := range out.Levels {
+ if showNames {
+ // Show subsystem name when it's RPC or when showing multiple subsystems
+ levelNames = append(levelNames, fmt.Sprintf("%s: %s", subsystem, level))
+ } else {
+ // For CLI calls with single subsystem, only show the level
+ levelNames = append(levelNames, level)
+ }
+ }
+ slices.Sort(levelNames)
+ for _, ln := range levelNames {
+ fmt.Fprintln(w, ln)
+ }
return nil
}),
},
- Type: MessageOutput{},
+ Type: logLevelOutput{},
}
var logLsCmd = &cmds.Command{
@@ -103,12 +239,10 @@ subsystems of a running daemon.
Type: stringList{},
}
-const logLevelOption = "log-level"
-
var logTailCmd = &cmds.Command{
Status: cmds.Experimental,
Helptext: cmds.HelpText{
- Tagline: "Read and outpt log messages.",
+ Tagline: "Read and output log messages.",
ShortDescription: `
Outputs log messages as they are generated.
@@ -130,7 +264,7 @@ This will only return 'info' logs from bitswap and skip 'debug'.
var pipeReader *logging.PipeReader
logLevelString, _ := req.Options[logLevelOption].(string)
if logLevelString != "" {
- logLevel, err := logging.LevelFromString(logLevelString)
+ logLevel, err := logging.Parse(logLevelString)
if err != nil {
return fmt.Errorf("setting log level %s: %w", logLevelString, err)
}
diff --git a/docs/changelogs/v0.37.md b/docs/changelogs/v0.37.md
index b9c20500c..802772eed 100644
--- a/docs/changelogs/v0.37.md
+++ b/docs/changelogs/v0.37.md
@@ -11,7 +11,8 @@ This release was brought to you by the [Shipyard](https://ipshipyard.com/) team.
- [Overview](#overview)
- [๐ฆ Highlights](#-highlights)
- [Clear provide queue when reprovide strategy changes](#clear-provide-queue-when-reprovide-strategy-changes)
- - [Named pins in `ipfs add` command](#-named-pins-in-ipfs-add-command)
+ - [๐ชต Revamped `ipfs log level` command](#-revamped-ipfs-log-level-command)
+ - [๐ Named pins in `ipfs add` command](#-named-pins-in-ipfs-add-command)
- [โ๏ธ `Reprovider.Strategy` is now consistently respected](#-reprovider-strategy-is-now-consistently-respected)
- [Removed unnecessary dependencies](#removed-unnecessary-dependencies)
- [Deprecated `ipfs stats reprovide`](#deprecated-ipfs-stats-reprovide)
@@ -34,6 +35,26 @@ A new `ipfs provide clear` command also allows manual queue clearing for debuggi
> [!NOTE]
> Upgrading to Kubo 0.37 will automatically clear any preexisting provide queue. The next time `Reprovider.Interval` hits, `Reprovider.Strategy` will be executed on a clean slate, ensuring consistent behavior with your current configuration.
+#### ๐ชต Revamped `ipfs log level` command
+
+The `ipfs log level` command has been completely revamped to support both getting and setting log levels with a unified interface.
+
+**New: Getting log levels**
+
+- `ipfs log level` - Shows default level only
+- `ipfs log level all` - Shows log level for every subsystem, including default level
+- `ipfs log level foo` - Shows log level for a specific subsystem only
+- Kubo RPC API: `POST /api/v0/log/level?arg=`
+
+**Enhanced: Setting log levels**
+
+- `ipfs log level foo debug` - Sets "foo" subsystem to "debug" level
+- `ipfs log level all info` - Sets all subsystems to "info" level (convenient, no escaping)
+- `ipfs log level '*' info` - Equivalent to above but requires shell escaping
+- `ipfs log level foo default` - Sets "foo" subsystem to current default level
+
+The command now provides full visibility into your current logging configuration while maintaining full backward compatibility. Both `all` and `*` work for specifying all subsystems, with `all` being more convenient since it doesn't require shell escaping.
+
#### ๐งท Named pins in `ipfs add` command
Added `--pin-name` flag to `ipfs add` for assigning names to pins.
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index 6eb207e06..62a426a24 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -90,7 +90,7 @@ require (
github.com/ipfs/go-ipld-format v0.6.2 // indirect
github.com/ipfs/go-ipld-git v0.1.1 // indirect
github.com/ipfs/go-ipld-legacy v0.2.2 // indirect
- github.com/ipfs/go-log/v2 v2.6.0 // indirect
+ github.com/ipfs/go-log/v2 v2.8.0 // indirect
github.com/ipfs/go-metrics-interface v0.3.0 // indirect
github.com/ipfs/go-peertaskqueue v0.8.2 // indirect
github.com/ipfs/go-unixfsnode v1.10.1 // indirect
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index 2e1ffc0a9..dd36ec029 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -345,8 +345,8 @@ github.com/ipfs/go-ipld-legacy v0.2.2/go.mod h1:hhkj+b3kG9b2BcUNw8IFYAsfeNo8E3U7
github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM=
github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8=
github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo=
-github.com/ipfs/go-log/v2 v2.6.0 h1:2Nu1KKQQ2ayonKp4MPo6pXCjqw1ULc9iohRqWV5EYqg=
-github.com/ipfs/go-log/v2 v2.6.0/go.mod h1:p+Efr3qaY5YXpx9TX7MoLCSEZX5boSWj9wh86P5HJa8=
+github.com/ipfs/go-log/v2 v2.8.0 h1:SptNTPJQV3s5EF4FdrTu/yVdOKfGbDgn1EBZx4til2o=
+github.com/ipfs/go-log/v2 v2.8.0/go.mod h1:2LEEhdv8BGubPeSFTyzbqhCqrwqxCbuTNTLWqgNAipo=
github.com/ipfs/go-metrics-interface v0.3.0 h1:YwG7/Cy4R94mYDUuwsBfeziJCVm9pBMJ6q/JR9V40TU=
github.com/ipfs/go-metrics-interface v0.3.0/go.mod h1:OxxQjZDGocXVdyTPocns6cOLwHieqej/jos7H4POwoY=
github.com/ipfs/go-peertaskqueue v0.8.2 h1:PaHFRaVFdxQk1Qo3OKiHPYjmmusQy7gKQUaL8JDszAU=
diff --git a/go.mod b/go.mod
index f58ade570..ea43881ea 100644
--- a/go.mod
+++ b/go.mod
@@ -39,7 +39,7 @@ require (
github.com/ipfs/go-ipld-format v0.6.2
github.com/ipfs/go-ipld-git v0.1.1
github.com/ipfs/go-ipld-legacy v0.2.2
- github.com/ipfs/go-log/v2 v2.6.0
+ github.com/ipfs/go-log/v2 v2.8.0
github.com/ipfs/go-metrics-interface v0.3.0
github.com/ipfs/go-metrics-prometheus v0.1.0
github.com/ipfs/go-test v0.2.2
diff --git a/go.sum b/go.sum
index 5f217d258..b2e033f9d 100644
--- a/go.sum
+++ b/go.sum
@@ -414,8 +414,8 @@ github.com/ipfs/go-ipld-legacy v0.2.2/go.mod h1:hhkj+b3kG9b2BcUNw8IFYAsfeNo8E3U7
github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM=
github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8=
github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo=
-github.com/ipfs/go-log/v2 v2.6.0 h1:2Nu1KKQQ2ayonKp4MPo6pXCjqw1ULc9iohRqWV5EYqg=
-github.com/ipfs/go-log/v2 v2.6.0/go.mod h1:p+Efr3qaY5YXpx9TX7MoLCSEZX5boSWj9wh86P5HJa8=
+github.com/ipfs/go-log/v2 v2.8.0 h1:SptNTPJQV3s5EF4FdrTu/yVdOKfGbDgn1EBZx4til2o=
+github.com/ipfs/go-log/v2 v2.8.0/go.mod h1:2LEEhdv8BGubPeSFTyzbqhCqrwqxCbuTNTLWqgNAipo=
github.com/ipfs/go-metrics-interface v0.3.0 h1:YwG7/Cy4R94mYDUuwsBfeziJCVm9pBMJ6q/JR9V40TU=
github.com/ipfs/go-metrics-interface v0.3.0/go.mod h1:OxxQjZDGocXVdyTPocns6cOLwHieqej/jos7H4POwoY=
github.com/ipfs/go-metrics-prometheus v0.1.0 h1:bApWOHkrH3VTBHzTHrZSfq4n4weOZDzZFxUXv+HyKcA=
diff --git a/test/cli/log_level_test.go b/test/cli/log_level_test.go
new file mode 100644
index 000000000..e5c9eb8f8
--- /dev/null
+++ b/test/cli/log_level_test.go
@@ -0,0 +1,663 @@
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "net/http"
+ "strings"
+ "testing"
+
+ "github.com/ipfs/kubo/test/cli/harness"
+ . "github.com/ipfs/kubo/test/cli/testutils"
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+)
+
+func TestLogLevel(t *testing.T) {
+
+ t.Run("CLI", func(t *testing.T) {
+ t.Run("level '*' shows all subsystems", func(t *testing.T) {
+ t.Parallel()
+ node := harness.NewT(t).NewNode().Init().StartDaemon()
+ defer node.StopDaemon()
+
+ expectedSubsystems := getExpectedSubsystems(t, node)
+
+ res := node.IPFS("log", "level", "*")
+ assert.NoError(t, res.Err)
+ assert.Empty(t, res.Stderr.Lines())
+
+ actualSubsystems := parseCLIOutput(t, res.Stdout.String())
+
+ // Should show all subsystems plus the (default) entry
+ assert.GreaterOrEqual(t, len(actualSubsystems), len(expectedSubsystems))
+
+ validateAllSubsystemsPresentCLI(t, expectedSubsystems, actualSubsystems, "CLI output")
+
+ // Should have the (default) entry
+ _, hasDefault := actualSubsystems["(default)"]
+ assert.True(t, hasDefault, "Should have '(default)' entry")
+ })
+
+ t.Run("level 'all' shows all subsystems (alias for '*')", func(t *testing.T) {
+ t.Parallel()
+ node := harness.NewT(t).NewNode().Init().StartDaemon()
+ defer node.StopDaemon()
+
+ expectedSubsystems := getExpectedSubsystems(t, node)
+
+ res := node.IPFS("log", "level", "all")
+ assert.NoError(t, res.Err)
+ assert.Empty(t, res.Stderr.Lines())
+
+ actualSubsystems := parseCLIOutput(t, res.Stdout.String())
+
+ // Should show all subsystems plus the (default) entry
+ assert.GreaterOrEqual(t, len(actualSubsystems), len(expectedSubsystems))
+
+ validateAllSubsystemsPresentCLI(t, expectedSubsystems, actualSubsystems, "CLI output")
+
+ // Should have the (default) entry
+ _, hasDefault := actualSubsystems["(default)"]
+ assert.True(t, hasDefault, "Should have '(default)' entry")
+ })
+
+ t.Run("get level for specific subsystem", func(t *testing.T) {
+ t.Parallel()
+ node := harness.NewT(t).NewNode().Init().StartDaemon()
+ defer node.StopDaemon()
+
+ node.IPFS("log", "level", "core", "debug")
+ res := node.IPFS("log", "level", "core")
+ assert.NoError(t, res.Err)
+ assert.Empty(t, res.Stderr.Lines())
+
+ output := res.Stdout.String()
+ lines := SplitLines(output)
+
+ assert.Equal(t, 1, len(lines))
+
+ line := strings.TrimSpace(lines[0])
+ assert.Equal(t, "debug", line)
+ })
+
+ t.Run("get level with no args returns default level", func(t *testing.T) {
+ t.Parallel()
+ node := harness.NewT(t).NewNode().Init().StartDaemon()
+ defer node.StopDaemon()
+
+ res1 := node.IPFS("log", "level", "*", "fatal")
+ assert.NoError(t, res1.Err)
+ assert.Empty(t, res1.Stderr.Lines())
+
+ res := node.IPFS("log", "level")
+ assert.NoError(t, res.Err)
+ assert.Equal(t, 0, len(res.Stderr.Lines()))
+
+ output := res.Stdout.String()
+ lines := SplitLines(output)
+
+ assert.Equal(t, 1, len(lines))
+
+ line := strings.TrimSpace(lines[0])
+ assert.Equal(t, "fatal", line)
+ })
+
+ t.Run("get level reflects runtime log level changes", func(t *testing.T) {
+ t.Parallel()
+ node := harness.NewT(t).NewNode().Init().StartDaemon("--offline")
+ defer node.StopDaemon()
+
+ node.IPFS("log", "level", "core", "debug")
+ res := node.IPFS("log", "level", "core")
+ assert.NoError(t, res.Err)
+
+ output := res.Stdout.String()
+ lines := SplitLines(output)
+
+ assert.Equal(t, 1, len(lines))
+
+ line := strings.TrimSpace(lines[0])
+ assert.Equal(t, "debug", line)
+ })
+
+ t.Run("get level with non-existent subsystem returns error", func(t *testing.T) {
+ t.Parallel()
+ node := harness.NewT(t).NewNode().Init().StartDaemon()
+ defer node.StopDaemon()
+
+ res := node.RunIPFS("log", "level", "non-existent-subsystem")
+ assert.Error(t, res.Err)
+ assert.NotEqual(t, 0, len(res.Stderr.Lines()))
+ })
+
+ t.Run("set level to 'default' keyword", func(t *testing.T) {
+ t.Parallel()
+ node := harness.NewT(t).NewNode().Init().StartDaemon()
+ defer node.StopDaemon()
+
+ // First set a specific subsystem to a different level
+ res1 := node.IPFS("log", "level", "core", "debug")
+ assert.NoError(t, res1.Err)
+ assert.Contains(t, res1.Stdout.String(), "Changed log level of 'core' to 'debug'")
+
+ // Verify it was set to debug
+ res2 := node.IPFS("log", "level", "core")
+ assert.NoError(t, res2.Err)
+ assert.Equal(t, "debug", strings.TrimSpace(res2.Stdout.String()))
+
+ // Get the current default level (should be 'error' since unchanged)
+ res3 := node.IPFS("log", "level")
+ assert.NoError(t, res3.Err)
+ defaultLevel := strings.TrimSpace(res3.Stdout.String())
+ assert.Equal(t, "error", defaultLevel, "Default level should be 'error' when unchanged")
+
+ // Now set the subsystem back to default
+ res4 := node.IPFS("log", "level", "core", "default")
+ assert.NoError(t, res4.Err)
+ assert.Contains(t, res4.Stdout.String(), "Changed log level of 'core' to")
+
+ // Verify it's now at the default level (should be 'error')
+ res5 := node.IPFS("log", "level", "core")
+ assert.NoError(t, res5.Err)
+ assert.Equal(t, "error", strings.TrimSpace(res5.Stdout.String()))
+ })
+
+ t.Run("set all subsystems with 'all' changes default (alias for '*')", func(t *testing.T) {
+ t.Parallel()
+ node := harness.NewT(t).NewNode().Init().StartDaemon()
+ defer node.StopDaemon()
+
+ // Initial state - default should be 'error'
+ res := node.IPFS("log", "level")
+ assert.NoError(t, res.Err)
+ assert.Equal(t, "error", strings.TrimSpace(res.Stdout.String()))
+
+ // Set one subsystem to a different level
+ res = node.IPFS("log", "level", "core", "debug")
+ assert.NoError(t, res.Err)
+
+ // Default should still be 'error'
+ res = node.IPFS("log", "level")
+ assert.NoError(t, res.Err)
+ assert.Equal(t, "error", strings.TrimSpace(res.Stdout.String()))
+
+ // Now use 'all' to set everything to 'info'
+ res = node.IPFS("log", "level", "all", "info")
+ assert.NoError(t, res.Err)
+ assert.Contains(t, res.Stdout.String(), "Changed log level of '*' to 'info'")
+
+ // Default should now be 'info'
+ res = node.IPFS("log", "level")
+ assert.NoError(t, res.Err)
+ assert.Equal(t, "info", strings.TrimSpace(res.Stdout.String()))
+
+ // Core should also be 'info' (overwritten by 'all')
+ res = node.IPFS("log", "level", "core")
+ assert.NoError(t, res.Err)
+ assert.Equal(t, "info", strings.TrimSpace(res.Stdout.String()))
+
+ // Any other subsystem should also be 'info'
+ res = node.IPFS("log", "level", "dht")
+ assert.NoError(t, res.Err)
+ assert.Equal(t, "info", strings.TrimSpace(res.Stdout.String()))
+ })
+
+ t.Run("set all subsystems with '*' changes default", func(t *testing.T) {
+ t.Parallel()
+ node := harness.NewT(t).NewNode().Init().StartDaemon()
+ defer node.StopDaemon()
+
+ // Initial state - default should be 'error'
+ res := node.IPFS("log", "level")
+ assert.NoError(t, res.Err)
+ assert.Equal(t, "error", strings.TrimSpace(res.Stdout.String()))
+
+ // Set one subsystem to a different level
+ res = node.IPFS("log", "level", "core", "debug")
+ assert.NoError(t, res.Err)
+
+ // Default should still be 'error'
+ res = node.IPFS("log", "level")
+ assert.NoError(t, res.Err)
+ assert.Equal(t, "error", strings.TrimSpace(res.Stdout.String()))
+
+ // Now use '*' to set everything to 'info'
+ res = node.IPFS("log", "level", "*", "info")
+ assert.NoError(t, res.Err)
+ assert.Contains(t, res.Stdout.String(), "Changed log level of '*' to 'info'")
+
+ // Default should now be 'info'
+ res = node.IPFS("log", "level")
+ assert.NoError(t, res.Err)
+ assert.Equal(t, "info", strings.TrimSpace(res.Stdout.String()))
+
+ // Core should also be 'info' (overwritten by '*')
+ res = node.IPFS("log", "level", "core")
+ assert.NoError(t, res.Err)
+ assert.Equal(t, "info", strings.TrimSpace(res.Stdout.String()))
+
+ // Any other subsystem should also be 'info'
+ res = node.IPFS("log", "level", "dht")
+ assert.NoError(t, res.Err)
+ assert.Equal(t, "info", strings.TrimSpace(res.Stdout.String()))
+ })
+
+ t.Run("'all' in get mode shows (default) entry (alias for '*')", func(t *testing.T) {
+ t.Parallel()
+ node := harness.NewT(t).NewNode().Init().StartDaemon()
+ defer node.StopDaemon()
+
+ // Get all levels with 'all'
+ res := node.IPFS("log", "level", "all")
+ assert.NoError(t, res.Err)
+
+ output := res.Stdout.String()
+
+ // Should contain "(default): error" entry
+ assert.Contains(t, output, "(default): error", "Should show default level with (default) key")
+
+ // Should also contain various subsystems
+ assert.Contains(t, output, "core: error")
+ assert.Contains(t, output, "dht: error")
+ })
+
+ t.Run("'*' in get mode shows (default) entry", func(t *testing.T) {
+ t.Parallel()
+ node := harness.NewT(t).NewNode().Init().StartDaemon()
+ defer node.StopDaemon()
+
+ // Get all levels with '*'
+ res := node.IPFS("log", "level", "*")
+ assert.NoError(t, res.Err)
+
+ output := res.Stdout.String()
+
+ // Should contain "(default): error" entry
+ assert.Contains(t, output, "(default): error", "Should show default level with (default) key")
+
+ // Should also contain various subsystems
+ assert.Contains(t, output, "core: error")
+ assert.Contains(t, output, "dht: error")
+ })
+
+ t.Run("set all subsystems to 'default' using 'all' (alias for '*')", func(t *testing.T) {
+ t.Parallel()
+ node := harness.NewT(t).NewNode().Init().StartDaemon()
+ defer node.StopDaemon()
+
+ // Get the original default level (just for reference, it should be "error")
+ res0 := node.IPFS("log", "level")
+ assert.NoError(t, res0.Err)
+ assert.Equal(t, "error", strings.TrimSpace(res0.Stdout.String()))
+
+ // First set all subsystems to debug using 'all'
+ res1 := node.IPFS("log", "level", "all", "debug")
+ assert.NoError(t, res1.Err)
+ assert.Contains(t, res1.Stdout.String(), "Changed log level of '*' to 'debug'")
+
+ // Verify a specific subsystem is at debug
+ res2 := node.IPFS("log", "level", "core")
+ assert.NoError(t, res2.Err)
+ assert.Equal(t, "debug", strings.TrimSpace(res2.Stdout.String()))
+
+ // Verify the default level is now debug
+ res3 := node.IPFS("log", "level")
+ assert.NoError(t, res3.Err)
+ assert.Equal(t, "debug", strings.TrimSpace(res3.Stdout.String()))
+
+ // Now set all subsystems back to default (which is now "debug") using 'all'
+ res4 := node.IPFS("log", "level", "all", "default")
+ assert.NoError(t, res4.Err)
+ assert.Contains(t, res4.Stdout.String(), "Changed log level of '*' to")
+
+ // The subsystem should still be at debug (because that's what default is now)
+ res5 := node.IPFS("log", "level", "core")
+ assert.NoError(t, res5.Err)
+ assert.Equal(t, "debug", strings.TrimSpace(res5.Stdout.String()))
+
+ // The behavior is correct: "default" uses the current default level,
+ // which was changed to "debug" when we set "all" to "debug"
+ })
+
+ t.Run("set all subsystems to 'default' keyword", func(t *testing.T) {
+ t.Parallel()
+ node := harness.NewT(t).NewNode().Init().StartDaemon()
+ defer node.StopDaemon()
+
+ // Get the original default level (just for reference, it should be "error")
+ res0 := node.IPFS("log", "level")
+ assert.NoError(t, res0.Err)
+ // originalDefault := strings.TrimSpace(res0.Stdout.String())
+ assert.Equal(t, "error", strings.TrimSpace(res0.Stdout.String()))
+
+ // First set all subsystems to debug
+ res1 := node.IPFS("log", "level", "*", "debug")
+ assert.NoError(t, res1.Err)
+ assert.Contains(t, res1.Stdout.String(), "Changed log level of '*' to 'debug'")
+
+ // Verify a specific subsystem is at debug
+ res2 := node.IPFS("log", "level", "core")
+ assert.NoError(t, res2.Err)
+ assert.Equal(t, "debug", strings.TrimSpace(res2.Stdout.String()))
+
+ // Verify the default level is now debug
+ res3 := node.IPFS("log", "level")
+ assert.NoError(t, res3.Err)
+ assert.Equal(t, "debug", strings.TrimSpace(res3.Stdout.String()))
+
+ // Now set all subsystems back to default (which is now "debug")
+ res4 := node.IPFS("log", "level", "*", "default")
+ assert.NoError(t, res4.Err)
+ assert.Contains(t, res4.Stdout.String(), "Changed log level of '*' to")
+
+ // The subsystem should still be at debug (because that's what default is now)
+ res5 := node.IPFS("log", "level", "core")
+ assert.NoError(t, res5.Err)
+ assert.Equal(t, "debug", strings.TrimSpace(res5.Stdout.String()))
+
+ // The behavior is correct: "default" uses the current default level,
+ // which was changed to "debug" when we set "*" to "debug"
+ })
+
+ t.Run("shell escaping variants for '*' wildcard", func(t *testing.T) {
+ t.Parallel()
+ h := harness.NewT(t)
+ node := h.NewNode().Init().StartDaemon()
+ defer node.StopDaemon()
+
+ // Test different shell escaping methods work for '*'
+ // This tests the behavior documented in help text: '*' or "*" or \*
+
+ // Test 1: Single quotes '*' (should work)
+ cmd1 := fmt.Sprintf("IPFS_PATH='%s' %s --api='%s' log level '*' info",
+ node.Dir, node.IPFSBin, node.APIAddr())
+ res1 := h.Sh(cmd1)
+ assert.NoError(t, res1.Err)
+ assert.Contains(t, res1.Stdout.String(), "Changed log level of '*' to 'info'")
+
+ // Test 2: Double quotes "*" (should work)
+ cmd2 := fmt.Sprintf("IPFS_PATH='%s' %s --api='%s' log level \"*\" debug",
+ node.Dir, node.IPFSBin, node.APIAddr())
+ res2 := h.Sh(cmd2)
+ assert.NoError(t, res2.Err)
+ assert.Contains(t, res2.Stdout.String(), "Changed log level of '*' to 'debug'")
+
+ // Test 3: Backslash escape \* (should work)
+ cmd3 := fmt.Sprintf("IPFS_PATH='%s' %s --api='%s' log level \\* warn",
+ node.Dir, node.IPFSBin, node.APIAddr())
+ res3 := h.Sh(cmd3)
+ assert.NoError(t, res3.Err)
+ assert.Contains(t, res3.Stdout.String(), "Changed log level of '*' to 'warn'")
+
+ // Test 4: Verify the final state - should show 'warn' as default
+ res4 := node.IPFS("log", "level")
+ assert.NoError(t, res4.Err)
+ assert.Equal(t, "warn", strings.TrimSpace(res4.Stdout.String()))
+
+ // Test 5: Get all levels using escaped '*' to verify it shows all subsystems
+ cmd5 := fmt.Sprintf("IPFS_PATH='%s' %s --api='%s' log level \\*",
+ node.Dir, node.IPFSBin, node.APIAddr())
+ res5 := h.Sh(cmd5)
+ assert.NoError(t, res5.Err)
+ output := res5.Stdout.String()
+ assert.Contains(t, output, "(default): warn", "Should show updated default level")
+ assert.Contains(t, output, "core: warn", "Should show core subsystem at warn level")
+ })
+ })
+
+ t.Run("HTTP RPC", func(t *testing.T) {
+ t.Run("get default level returns JSON", func(t *testing.T) {
+ t.Parallel()
+ node := harness.NewT(t).NewNode().Init().StartDaemon()
+ defer node.StopDaemon()
+
+ // Make HTTP request to get default log level
+ resp, err := http.Post(node.APIURL()+"/api/v0/log/level", "", nil)
+ require.NoError(t, err)
+ defer resp.Body.Close()
+
+ // Parse JSON response
+ var result map[string]interface{}
+ err = json.NewDecoder(resp.Body).Decode(&result)
+ require.NoError(t, err)
+
+ // Check that we have the Levels field
+ levels, ok := result["Levels"].(map[string]interface{})
+ require.True(t, ok, "Response should have 'Levels' field")
+
+ // Should have exactly one entry for the default level
+ assert.Equal(t, 1, len(levels))
+
+ // The default level should be present
+ defaultLevel, ok := levels[""]
+ require.True(t, ok, "Should have empty string key for default level")
+ assert.Equal(t, "error", defaultLevel, "Default level should be 'error'")
+ })
+
+ t.Run("get all levels using 'all' returns JSON (alias for '*')", func(t *testing.T) {
+ t.Parallel()
+ node := harness.NewT(t).NewNode().Init().StartDaemon()
+ defer node.StopDaemon()
+
+ expectedSubsystems := getExpectedSubsystems(t, node)
+
+ // Make HTTP request to get all log levels using 'all'
+ resp, err := http.Post(node.APIURL()+"/api/v0/log/level?arg=all", "", nil)
+ require.NoError(t, err)
+ defer resp.Body.Close()
+
+ levels := parseHTTPResponse(t, resp)
+ validateAllSubsystemsPresent(t, expectedSubsystems, levels, "JSON response")
+
+ // Should have the (default) entry
+ defaultLevel, ok := levels["(default)"]
+ require.True(t, ok, "Should have '(default)' key")
+ assert.Equal(t, "error", defaultLevel, "Default level should be 'error'")
+ })
+
+ t.Run("get all levels returns JSON", func(t *testing.T) {
+ t.Parallel()
+ node := harness.NewT(t).NewNode().Init().StartDaemon()
+ defer node.StopDaemon()
+
+ expectedSubsystems := getExpectedSubsystems(t, node)
+
+ // Make HTTP request to get all log levels
+ resp, err := http.Post(node.APIURL()+"/api/v0/log/level?arg=*", "", nil)
+ require.NoError(t, err)
+ defer resp.Body.Close()
+
+ levels := parseHTTPResponse(t, resp)
+ validateAllSubsystemsPresent(t, expectedSubsystems, levels, "JSON response")
+
+ // Should have the (default) entry
+ defaultLevel, ok := levels["(default)"]
+ require.True(t, ok, "Should have '(default)' key")
+ assert.Equal(t, "error", defaultLevel, "Default level should be 'error'")
+ })
+
+ t.Run("get specific subsystem level returns JSON", func(t *testing.T) {
+ t.Parallel()
+ node := harness.NewT(t).NewNode().Init().StartDaemon()
+ defer node.StopDaemon()
+
+ // First set a specific level for a subsystem
+ resp, err := http.Post(node.APIURL()+"/api/v0/log/level?arg=core&arg=debug", "", nil)
+ require.NoError(t, err)
+ resp.Body.Close()
+
+ // Now get the level for that subsystem
+ resp, err = http.Post(node.APIURL()+"/api/v0/log/level?arg=core", "", nil)
+ require.NoError(t, err)
+ defer resp.Body.Close()
+
+ // Parse JSON response
+ var result map[string]interface{}
+ err = json.NewDecoder(resp.Body).Decode(&result)
+ require.NoError(t, err)
+
+ // Check that we have the Levels field
+ levels, ok := result["Levels"].(map[string]interface{})
+ require.True(t, ok, "Response should have 'Levels' field")
+
+ // Should have exactly one entry
+ assert.Equal(t, 1, len(levels))
+
+ // Check the level for 'core' subsystem
+ coreLevel, ok := levels["core"]
+ require.True(t, ok, "Should have 'core' key")
+ assert.Equal(t, "debug", coreLevel, "Core level should be 'debug'")
+ })
+
+ t.Run("set level using 'all' returns JSON message (alias for '*')", func(t *testing.T) {
+ t.Parallel()
+ node := harness.NewT(t).NewNode().Init().StartDaemon()
+ defer node.StopDaemon()
+
+ // Set a log level using 'all'
+ resp, err := http.Post(node.APIURL()+"/api/v0/log/level?arg=all&arg=info", "", nil)
+ require.NoError(t, err)
+ defer resp.Body.Close()
+
+ // Parse JSON response
+ var result map[string]interface{}
+ err = json.NewDecoder(resp.Body).Decode(&result)
+ require.NoError(t, err)
+
+ // Check that we have the Message field
+ message, ok := result["Message"].(string)
+ require.True(t, ok, "Response should have 'Message' field")
+
+ // Check the message content (should show '*' in message even when 'all' was used)
+ assert.Contains(t, message, "Changed log level of '*' to 'info'")
+ })
+
+ t.Run("set level returns JSON message", func(t *testing.T) {
+ t.Parallel()
+ node := harness.NewT(t).NewNode().Init().StartDaemon()
+ defer node.StopDaemon()
+
+ // Set a log level
+ resp, err := http.Post(node.APIURL()+"/api/v0/log/level?arg=core&arg=info", "", nil)
+ require.NoError(t, err)
+ defer resp.Body.Close()
+
+ // Parse JSON response
+ var result map[string]interface{}
+ err = json.NewDecoder(resp.Body).Decode(&result)
+ require.NoError(t, err)
+
+ // Check that we have the Message field
+ message, ok := result["Message"].(string)
+ require.True(t, ok, "Response should have 'Message' field")
+
+ // Check the message content
+ assert.Contains(t, message, "Changed log level of 'core' to 'info'")
+ })
+
+ t.Run("set level to 'default' keyword", func(t *testing.T) {
+ t.Parallel()
+ node := harness.NewT(t).NewNode().Init().StartDaemon()
+ defer node.StopDaemon()
+
+ // First set a subsystem to debug
+ resp, err := http.Post(node.APIURL()+"/api/v0/log/level?arg=core&arg=debug", "", nil)
+ require.NoError(t, err)
+ resp.Body.Close()
+
+ // Now set it back to default
+ resp, err = http.Post(node.APIURL()+"/api/v0/log/level?arg=core&arg=default", "", nil)
+ require.NoError(t, err)
+ defer resp.Body.Close()
+
+ // Parse JSON response
+ var result map[string]interface{}
+ err = json.NewDecoder(resp.Body).Decode(&result)
+ require.NoError(t, err)
+
+ // Check that we have the Message field
+ message, ok := result["Message"].(string)
+ require.True(t, ok, "Response should have 'Message' field")
+
+ // The message should indicate the change
+ assert.True(t, strings.Contains(message, "Changed log level of 'core' to"),
+ "Message should indicate level change")
+
+ // Verify the level is back to error (default)
+ resp, err = http.Post(node.APIURL()+"/api/v0/log/level?arg=core", "", nil)
+ require.NoError(t, err)
+ defer resp.Body.Close()
+
+ var getResult map[string]interface{}
+ err = json.NewDecoder(resp.Body).Decode(&getResult)
+ require.NoError(t, err)
+
+ levels, _ := getResult["Levels"].(map[string]interface{})
+ coreLevel, _ := levels["core"].(string)
+ assert.Equal(t, "error", coreLevel, "Core level should be back to 'error' (default)")
+ })
+ })
+
+}
+
+func getExpectedSubsystems(t *testing.T, node *harness.Node) []string {
+ t.Helper()
+ lsRes := node.IPFS("log", "ls")
+ require.NoError(t, lsRes.Err)
+ expectedSubsystems := SplitLines(lsRes.Stdout.String())
+ assert.Greater(t, len(expectedSubsystems), 10, "Should have many subsystems")
+ return expectedSubsystems
+}
+
+func parseCLIOutput(t *testing.T, output string) map[string]string {
+ t.Helper()
+ lines := SplitLines(output)
+ actualSubsystems := make(map[string]string)
+ for _, line := range lines {
+ if strings.TrimSpace(line) == "" {
+ continue
+ }
+ parts := strings.Split(line, ": ")
+ assert.Equal(t, 2, len(parts), "Line should have format 'subsystem: level', got: %s", line)
+ assert.NotEmpty(t, parts[0], "Subsystem should not be empty")
+ assert.NotEmpty(t, parts[1], "Level should not be empty")
+ actualSubsystems[parts[0]] = parts[1]
+ }
+ return actualSubsystems
+}
+
+func parseHTTPResponse(t *testing.T, resp *http.Response) map[string]interface{} {
+ t.Helper()
+ var result map[string]interface{}
+ err := json.NewDecoder(resp.Body).Decode(&result)
+ require.NoError(t, err)
+ levels, ok := result["Levels"].(map[string]interface{})
+ require.True(t, ok, "Response should have 'Levels' field")
+ assert.Greater(t, len(levels), 10, "Should have many subsystems")
+ return levels
+}
+
+func validateAllSubsystemsPresent(t *testing.T, expectedSubsystems []string, actualLevels map[string]interface{}, context string) {
+ t.Helper()
+ for _, expectedSub := range expectedSubsystems {
+ expectedSub = strings.TrimSpace(expectedSub)
+ if expectedSub == "" {
+ continue
+ }
+ _, found := actualLevels[expectedSub]
+ assert.True(t, found, "Expected subsystem '%s' should be present in %s", expectedSub, context)
+ }
+}
+
+func validateAllSubsystemsPresentCLI(t *testing.T, expectedSubsystems []string, actualLevels map[string]string, context string) {
+ t.Helper()
+ for _, expectedSub := range expectedSubsystems {
+ expectedSub = strings.TrimSpace(expectedSub)
+ if expectedSub == "" {
+ continue
+ }
+ _, found := actualLevels[expectedSub]
+ assert.True(t, found, "Expected subsystem '%s' should be present in %s", expectedSub, context)
+ }
+}
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index 4cdae1c8a..16fade132 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -8,7 +8,7 @@ require (
github.com/Kubuxu/gocovmerge v0.0.0-20161216165753-7ecaa51963cd
github.com/golangci/golangci-lint v1.60.2
github.com/ipfs/go-cidutil v0.1.0
- github.com/ipfs/go-log/v2 v2.6.0
+ github.com/ipfs/go-log/v2 v2.8.0
github.com/ipfs/go-test v0.2.2
github.com/ipfs/hang-fds v0.1.0
github.com/ipfs/iptb v1.4.1
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index 5e5428ac8..30c4d1fd5 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -343,8 +343,8 @@ github.com/ipfs/go-ipld-format v0.6.2 h1:bPZQ+A05ol0b3lsJSl0bLvwbuQ+HQbSsdGTy4xt
github.com/ipfs/go-ipld-format v0.6.2/go.mod h1:nni2xFdHKx5lxvXJ6brt/pndtGxKAE+FPR1rg4jTkyk=
github.com/ipfs/go-ipld-legacy v0.2.2 h1:DThbqCPVLpWBcGtU23KDLiY2YRZZnTkXQyfz8aOfBkQ=
github.com/ipfs/go-ipld-legacy v0.2.2/go.mod h1:hhkj+b3kG9b2BcUNw8IFYAsfeNo8E3U7eYlWeAOPyDU=
-github.com/ipfs/go-log/v2 v2.6.0 h1:2Nu1KKQQ2ayonKp4MPo6pXCjqw1ULc9iohRqWV5EYqg=
-github.com/ipfs/go-log/v2 v2.6.0/go.mod h1:p+Efr3qaY5YXpx9TX7MoLCSEZX5boSWj9wh86P5HJa8=
+github.com/ipfs/go-log/v2 v2.8.0 h1:SptNTPJQV3s5EF4FdrTu/yVdOKfGbDgn1EBZx4til2o=
+github.com/ipfs/go-log/v2 v2.8.0/go.mod h1:2LEEhdv8BGubPeSFTyzbqhCqrwqxCbuTNTLWqgNAipo=
github.com/ipfs/go-metrics-interface v0.3.0 h1:YwG7/Cy4R94mYDUuwsBfeziJCVm9pBMJ6q/JR9V40TU=
github.com/ipfs/go-metrics-interface v0.3.0/go.mod h1:OxxQjZDGocXVdyTPocns6cOLwHieqej/jos7H4POwoY=
github.com/ipfs/go-peertaskqueue v0.8.2 h1:PaHFRaVFdxQk1Qo3OKiHPYjmmusQy7gKQUaL8JDszAU=
From c08e24b8138a2c6293dc927d1a83126e113c28c3 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Mon, 11 Aug 2025 21:45:05 +0200
Subject: [PATCH 315/499] fix(sharness): no blocking on unclean FUSE unmount
(#10906)
this is rare, but if someone runs a lot of tests and had some unrelated
FUSE failures, sharness can get stuck on lsof step.
this ensures we never get stuck + there is more visibility so people
who care about FUSE have better time debugging
---
test/sharness/lib/test-lib.sh | 33 ++++++++++++++++++++++++++++++---
1 file changed, 30 insertions(+), 3 deletions(-)
diff --git a/test/sharness/lib/test-lib.sh b/test/sharness/lib/test-lib.sh
index f9292cb23..e8030dcc4 100644
--- a/test/sharness/lib/test-lib.sh
+++ b/test/sharness/lib/test-lib.sh
@@ -54,7 +54,7 @@ cur_test_pwd="$(pwd)"
while true ; do
echo -n > stuck_cwd_list
- lsof -c ipfs -Ffn 2>/dev/null | grep -A1 '^fcwd$' | grep '^n' | cut -b 2- | while read -r pwd_of_stuck ; do
+ timeout 5 lsof -c ipfs -Ffn 2>/dev/null | grep -A1 '^fcwd$' | grep '^n' | cut -b 2- | while read -r pwd_of_stuck ; do
case "$pwd_of_stuck" in
"$cur_test_pwd"*)
echo "$pwd_of_stuck" >> stuck_cwd_list
@@ -309,10 +309,37 @@ test_launch_ipfs_daemon_without_network() {
}
do_umount() {
+ local mount_point="$1"
+ local max_retries=3
+ local retry_delay=0.5
+
+ # Try normal unmount first (without lazy flag)
+ for i in $(seq 1 $max_retries); do
+ if [ "$(uname -s)" = "Linux" ]; then
+ # First attempt: standard unmount
+ if fusermount -u "$mount_point" 2>/dev/null; then
+ return 0
+ fi
+ else
+ if umount "$mount_point" 2>/dev/null; then
+ return 0
+ fi
+ fi
+
+ # If not last attempt, wait before retry
+ if [ $i -lt $max_retries ]; then
+ go-sleep "${retry_delay}s"
+ fi
+ done
+
+ # If normal unmount failed, try lazy unmount as last resort (Linux only)
if [ "$(uname -s)" = "Linux" ]; then
- fusermount -z -u "$1"
+ # Log that we're falling back to lazy unmount
+ test "$TEST_VERBOSE" = 1 && echo "# Warning: falling back to lazy unmount for $mount_point"
+ fusermount -z -u "$mount_point" 2>/dev/null
else
- umount "$1"
+ # On non-Linux, try force unmount
+ umount -f "$mount_point" 2>/dev/null || true
fi
}
From c513e1adfa94f0c5c2b174935ec1ab6da41200c6 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Mon, 11 Aug 2025 23:59:00 +0200
Subject: [PATCH 316/499] fix(relay): feed connected peers to AutoRelay
discovery (#10901)
* fix(relay): feed connected peers to AutoRelay discovery
Feed all connected swarm peers to AutoRelay as potential relay
candidates. This allows peers from HTTP routing and manual connections
to serve as relays, not just DHT-discovered peers.
Fixes #10899
* docs: changelog
---
core/node/libp2p/routing.go | 36 ++++++++++++++++++++++++------------
docs/changelogs/v0.37.md | 5 +++++
2 files changed, 29 insertions(+), 12 deletions(-)
diff --git a/core/node/libp2p/routing.go b/core/node/libp2p/routing.go
index 86ead0277..5e16564de 100644
--- a/core/node/libp2p/routing.go
+++ b/core/node/libp2p/routing.go
@@ -297,24 +297,36 @@ func autoRelayFeeder(cfgPeering config.Peering, peerChan chan<- peer.AddrInfo) f
}
// Additionally, feed closest peers discovered via DHT
- if dht == nil {
- /* noop due to missing dht.WAN. happens in some unit tests,
- not worth fixing as we will refactor this after go-libp2p 0.20 */
- continue
+ if dht != nil {
+ closestPeers, err := dht.WAN.GetClosestPeers(ctx, h.ID().String())
+ if err == nil {
+ for _, p := range closestPeers {
+ addrs := h.Peerstore().Addrs(p)
+ if len(addrs) == 0 {
+ continue
+ }
+ dhtPeer := peer.AddrInfo{ID: p, Addrs: addrs}
+ select {
+ case peerChan <- dhtPeer:
+ case <-ctx.Done():
+ return
+ }
+ }
+ }
}
- closestPeers, err := dht.WAN.GetClosestPeers(ctx, h.ID().String())
- if err != nil {
- // no-op: usually 'failed to find any peer in table' during startup
- continue
- }
- for _, p := range closestPeers {
+
+ // Additionally, feed all connected swarm peers as potential relay candidates.
+ // This includes peers from HTTP routing, manual swarm connect, mDNS discovery, etc.
+ // (fixes https://github.com/ipfs/kubo/issues/10899)
+ connectedPeers := h.Network().Peers()
+ for _, p := range connectedPeers {
addrs := h.Peerstore().Addrs(p)
if len(addrs) == 0 {
continue
}
- dhtPeer := peer.AddrInfo{ID: p, Addrs: addrs}
+ swarmPeer := peer.AddrInfo{ID: p, Addrs: addrs}
select {
- case peerChan <- dhtPeer:
+ case peerChan <- swarmPeer:
case <-ctx.Done():
return
}
diff --git a/docs/changelogs/v0.37.md b/docs/changelogs/v0.37.md
index 802772eed..63a1501d1 100644
--- a/docs/changelogs/v0.37.md
+++ b/docs/changelogs/v0.37.md
@@ -16,6 +16,7 @@ This release was brought to you by the [Shipyard](https://ipshipyard.com/) team.
- [โ๏ธ `Reprovider.Strategy` is now consistently respected](#-reprovider-strategy-is-now-consistently-respected)
- [Removed unnecessary dependencies](#removed-unnecessary-dependencies)
- [Deprecated `ipfs stats reprovide`](#deprecated-ipfs-stats-reprovide)
+ - [๐ AutoRelay now uses all connected peers for relay discovery](#-autorelay-now-uses-all-connected-peers-for-relay-discovery)
- [๐ฆ๏ธ Important dependency updates](#-important-dependency-updates)
- [๐ Changelog](#-changelog)
- [๐จโ๐ฉโ๐งโ๐ฆ Contributors](#-contributors)
@@ -105,6 +106,10 @@ The `ipfs stats reprovide` command has moved to `ipfs provide stat`. This was do
> [!NOTE]
> `ipfs stats reprovide` still works, but is marked as deprecated and will be removed in a future release.
+#### ๐ AutoRelay now uses all connected peers for relay discovery
+
+AutoRelay's relay discovery now includes all connected peers as potential relay candidates, not just peers discovered through the DHT. This allows peers connected via HTTP routing and manual `ipfs swarm connect` commands to serve as relays, improving connectivity for nodes using non-DHT routing configurations.
+
#### ๐ฆ๏ธ Important dependency updates
- update `go-libp2p` to [v0.43.0](https://github.com/libp2p/go-libp2p/releases/tag/v0.43.0) (incl. [v0.42.1](https://github.com/libp2p/go-libp2p/releases/tag/v0.42.1))
From 7250eb8786b6b01872193c0c885a9ff008d5ea26 Mon Sep 17 00:00:00 2001
From: Guillaume Michel
Date: Wed, 13 Aug 2025 02:09:56 +0200
Subject: [PATCH 317/499] bump go-libp2p-kad-dht (#10911)
---
docs/examples/kubo-as-a-library/go.mod | 30 ++++++------
docs/examples/kubo-as-a-library/go.sum | 60 +++++++++++------------
go.mod | 32 ++++++------
go.sum | 64 ++++++++++++------------
test/dependencies/go.mod | 32 ++++++------
test/dependencies/go.sum | 68 +++++++++++++-------------
6 files changed, 143 insertions(+), 143 deletions(-)
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index 62a426a24..a4decfb45 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -10,7 +10,7 @@ require (
github.com/ipfs/boxo v0.33.2-0.20250804224807-e5da058ebb08
github.com/ipfs/kubo v0.0.0-00010101000000-000000000000
github.com/libp2p/go-libp2p v0.43.0
- github.com/multiformats/go-multiaddr v0.16.0
+ github.com/multiformats/go-multiaddr v0.16.1
)
require (
@@ -101,7 +101,7 @@ require (
github.com/jackpal/go-nat-pmp v1.0.2 // indirect
github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect
github.com/klauspost/compress v1.18.0 // indirect
- github.com/klauspost/cpuid/v2 v2.2.10 // indirect
+ github.com/klauspost/cpuid/v2 v2.3.0 // indirect
github.com/koron/go-ssdp v0.0.6 // indirect
github.com/kr/pretty v0.3.1 // indirect
github.com/kr/text v0.2.0 // indirect
@@ -111,7 +111,7 @@ require (
github.com/libp2p/go-doh-resolver v0.5.0 // indirect
github.com/libp2p/go-flow-metrics v0.3.0 // indirect
github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect
- github.com/libp2p/go-libp2p-kad-dht v0.33.1 // indirect
+ github.com/libp2p/go-libp2p-kad-dht v0.34.0 // indirect
github.com/libp2p/go-libp2p-kbucket v0.7.0 // indirect
github.com/libp2p/go-libp2p-pubsub v0.14.2 // indirect
github.com/libp2p/go-libp2p-pubsub-router v0.6.0 // indirect
@@ -126,7 +126,7 @@ require (
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mholt/acmez/v3 v3.1.2 // indirect
- github.com/miekg/dns v1.1.67 // indirect
+ github.com/miekg/dns v1.1.68 // indirect
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect
github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect
github.com/minio/sha256-simd v1.0.1 // indirect
@@ -166,10 +166,10 @@ require (
github.com/pion/webrtc/v4 v4.1.2 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/polydawn/refmt v0.89.0 // indirect
- github.com/prometheus/client_golang v1.22.0 // indirect
+ github.com/prometheus/client_golang v1.23.0 // indirect
github.com/prometheus/client_model v0.6.2 // indirect
- github.com/prometheus/common v0.64.0 // indirect
- github.com/prometheus/procfs v0.16.1 // indirect
+ github.com/prometheus/common v0.65.0 // indirect
+ github.com/prometheus/procfs v0.17.0 // indirect
github.com/quic-go/qpack v0.5.1 // indirect
github.com/quic-go/quic-go v0.54.0 // indirect
github.com/quic-go/webtransport-go v0.9.0 // indirect
@@ -205,21 +205,21 @@ require (
go.uber.org/zap v1.27.0 // indirect
go.uber.org/zap/exp v0.3.0 // indirect
go4.org v0.0.0-20230225012048-214862532bf5 // indirect
- golang.org/x/crypto v0.40.0 // indirect
- golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 // indirect
- golang.org/x/mod v0.26.0 // indirect
- golang.org/x/net v0.42.0 // indirect
+ golang.org/x/crypto v0.41.0 // indirect
+ golang.org/x/exp v0.0.0-20250811191247-51f88131bc50 // indirect
+ golang.org/x/mod v0.27.0 // indirect
+ golang.org/x/net v0.43.0 // indirect
golang.org/x/sync v0.16.0 // indirect
- golang.org/x/sys v0.34.0 // indirect
- golang.org/x/text v0.27.0 // indirect
+ golang.org/x/sys v0.35.0 // indirect
+ golang.org/x/text v0.28.0 // indirect
golang.org/x/time v0.12.0 // indirect
- golang.org/x/tools v0.35.0 // indirect
+ golang.org/x/tools v0.36.0 // indirect
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
gonum.org/v1/gonum v0.16.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 // indirect
google.golang.org/grpc v1.73.0 // indirect
- google.golang.org/protobuf v1.36.6 // indirect
+ google.golang.org/protobuf v1.36.7 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
lukechampine.com/blake3 v1.4.1 // indirect
)
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index dd36ec029..821d8f8da 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -391,8 +391,8 @@ github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6
github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
-github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE=
-github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
+github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y=
+github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/koron/go-ssdp v0.0.6 h1:Jb0h04599eq/CY7rB5YEqPS83HmRfHP2azkxMN2rFtU=
github.com/koron/go-ssdp v0.0.6/go.mod h1:0R9LfRJGek1zWTjN3JUNlm5INCDYGpRDfAptnct63fI=
@@ -426,8 +426,8 @@ github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl9
github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8=
github.com/libp2p/go-libp2p-core v0.2.4/go.mod h1:STh4fdfa5vDYr0/SzYYeqnt+E6KfEV5VxfIrm0bcI0g=
github.com/libp2p/go-libp2p-core v0.3.0/go.mod h1:ACp3DmS3/N64c2jDzcV429ukDpicbL6+TrrxANBjPGw=
-github.com/libp2p/go-libp2p-kad-dht v0.33.1 h1:hKFhHMf7WH69LDjaxsJUWOU6qZm71uO47M/a5ijkiP0=
-github.com/libp2p/go-libp2p-kad-dht v0.33.1/go.mod h1:CdmNk4VeGJa9EXM9SLNyNVySEvduKvb+5rSC/H4pLAo=
+github.com/libp2p/go-libp2p-kad-dht v0.34.0 h1:yvJ/Vrt36GVjsqPxiGcuuwOloKuZLV9Aa7awIKyNXy0=
+github.com/libp2p/go-libp2p-kad-dht v0.34.0/go.mod h1:JNbkES4W5tajS6uYivw6MPs0842cPHAwhgaPw8sQG4o=
github.com/libp2p/go-libp2p-kbucket v0.3.1/go.mod h1:oyjT5O7tS9CQurok++ERgc46YLwEpuGoFq9ubvoUOio=
github.com/libp2p/go-libp2p-kbucket v0.7.0 h1:vYDvRjkyJPeWunQXqcW2Z6E93Ywx7fX0jgzb/dGOKCs=
github.com/libp2p/go-libp2p-kbucket v0.7.0/go.mod h1:blOINGIj1yiPYlVEX0Rj9QwEkmVnz3EP8LK1dRKBC6g=
@@ -475,8 +475,8 @@ github.com/mholt/acmez/v3 v3.1.2 h1:auob8J/0FhmdClQicvJvuDavgd5ezwLBfKuYmynhYzc=
github.com/mholt/acmez/v3 v3.1.2/go.mod h1:L1wOU06KKvq7tswuMDwKdcHeKpFFgkppZy/y0DFxagQ=
github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4=
github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4=
-github.com/miekg/dns v1.1.67 h1:kg0EHj0G4bfT5/oOys6HhZw4vmMlnoZ+gDu8tJ/AlI0=
-github.com/miekg/dns v1.1.67/go.mod h1:fujopn7TB3Pu3JM69XaawiU0wqjpL9/8xGop5UrTPps=
+github.com/miekg/dns v1.1.68 h1:jsSRkNozw7G/mnmXULynzMNIsgY2dHC8LO6U6Ij2JEA=
+github.com/miekg/dns v1.1.68/go.mod h1:fujopn7TB3Pu3JM69XaawiU0wqjpL9/8xGop5UrTPps=
github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8=
github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms=
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc=
@@ -508,8 +508,8 @@ github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a
github.com/multiformats/go-multiaddr v0.1.0/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44=
github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo=
github.com/multiformats/go-multiaddr v0.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4=
-github.com/multiformats/go-multiaddr v0.16.0 h1:oGWEVKioVQcdIOBlYM8BH1rZDWOGJSqr9/BKl6zQ4qc=
-github.com/multiformats/go-multiaddr v0.16.0/go.mod h1:JSVUmXDjsVFiW7RjIFMP7+Ev+h1DTbiJgVeTV/tcmP0=
+github.com/multiformats/go-multiaddr v0.16.1 h1:fgJ0Pitow+wWXzN9do+1b8Pyjmo8m5WhGfzpL82MpCw=
+github.com/multiformats/go-multiaddr v0.16.1/go.mod h1:JSVUmXDjsVFiW7RjIFMP7+Ev+h1DTbiJgVeTV/tcmP0=
github.com/multiformats/go-multiaddr-dns v0.4.1 h1:whi/uCLbDS3mSEUMb1MsoT4uzUeZB0N32yzufqS0i5M=
github.com/multiformats/go-multiaddr-dns v0.4.1/go.mod h1:7hfthtB4E4pQwirrz+J0CcDUfbWzTqEzVyYKKIKpgkc=
github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E=
@@ -623,18 +623,18 @@ github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e/go.mod h1:uIp+gprXx
github.com/polydawn/refmt v0.89.0 h1:ADJTApkvkeBZsN0tBTx8QjpD9JkmxbKp0cxfr9qszm4=
github.com/polydawn/refmt v0.89.0/go.mod h1:/zvteZs/GwLtCgZ4BL6CBsk9IKIlexP43ObX9AxTqTw=
github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
-github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q=
-github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0=
+github.com/prometheus/client_golang v1.23.0 h1:ust4zpdl9r4trLY/gSjlm07PuiBq2ynaXXlptpfy8Uc=
+github.com/prometheus/client_golang v1.23.0/go.mod h1:i/o0R9ByOnHX0McrTMTyhYvKE4haaf2mW08I+jGAjEE=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=
github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
-github.com/prometheus/common v0.64.0 h1:pdZeA+g617P7oGv1CzdTzyeShxAGrTBsolKNOLQPGO4=
-github.com/prometheus/common v0.64.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8=
+github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2VzE=
+github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8=
github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
-github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg=
-github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is=
+github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7DuK0=
+github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw=
github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI=
github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg=
github.com/quic-go/quic-go v0.54.0 h1:6s1YB9QotYI6Ospeiguknbp2Znb/jZYjZLRXn9kMQBg=
@@ -832,8 +832,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
-golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=
-golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=
+golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4=
+golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -842,8 +842,8 @@ golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE
golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
-golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 h1:R9PFI6EUdfVKgwKjZef7QIwGcBKu86OEFpJ9nUEP2l4=
-golang.org/x/exp v0.0.0-20250718183923-645b1fa84792/go.mod h1:A+z0yzpGtvnG90cToK5n2tu8UJVP2XUATh+r+sfOOOc=
+golang.org/x/exp v0.0.0-20250811191247-51f88131bc50 h1:3yiSh9fhy5/RhCSntf4Sy0Tnx50DmMpQ4MQdKKk4yg4=
+golang.org/x/exp v0.0.0-20250811191247-51f88131bc50/go.mod h1:rT6SFzZ7oxADUDx58pcaKFTcZ+inxAa9fTrYx/uVYwg=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -866,8 +866,8 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
-golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg=
-golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ=
+golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ=
+golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -903,8 +903,8 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
-golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs=
-golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8=
+golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE=
+golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -971,8 +971,8 @@ golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=
-golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
+golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=
+golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
@@ -992,8 +992,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
-golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=
-golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=
+golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng=
+golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU=
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -1034,8 +1034,8 @@ golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4f
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
-golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0=
-golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw=
+golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg=
+golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -1110,8 +1110,8 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
-google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
-google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
+google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A=
+google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
diff --git a/go.mod b/go.mod
index ea43881ea..0c0310df6 100644
--- a/go.mod
+++ b/go.mod
@@ -53,7 +53,7 @@ require (
github.com/libp2p/go-doh-resolver v0.5.0
github.com/libp2p/go-libp2p v0.43.0
github.com/libp2p/go-libp2p-http v0.5.0
- github.com/libp2p/go-libp2p-kad-dht v0.33.1
+ github.com/libp2p/go-libp2p-kad-dht v0.34.0
github.com/libp2p/go-libp2p-kbucket v0.7.0
github.com/libp2p/go-libp2p-pubsub v0.14.2
github.com/libp2p/go-libp2p-pubsub-router v0.6.0
@@ -61,14 +61,14 @@ require (
github.com/libp2p/go-libp2p-routing-helpers v0.7.5
github.com/libp2p/go-libp2p-testing v0.12.0
github.com/libp2p/go-socket-activation v0.1.1
- github.com/multiformats/go-multiaddr v0.16.0
+ github.com/multiformats/go-multiaddr v0.16.1
github.com/multiformats/go-multiaddr-dns v0.4.1
github.com/multiformats/go-multibase v0.2.0
github.com/multiformats/go-multicodec v0.9.2
github.com/multiformats/go-multihash v0.2.3
github.com/opentracing/opentracing-go v1.2.0
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58
- github.com/prometheus/client_golang v1.22.0
+ github.com/prometheus/client_golang v1.23.0
github.com/stretchr/testify v1.10.0
github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d
github.com/tidwall/gjson v1.16.0
@@ -85,12 +85,12 @@ require (
go.uber.org/fx v1.24.0
go.uber.org/multierr v1.11.0
go.uber.org/zap v1.27.0
- golang.org/x/crypto v0.40.0
- golang.org/x/exp v0.0.0-20250718183923-645b1fa84792
- golang.org/x/mod v0.26.0
+ golang.org/x/crypto v0.41.0
+ golang.org/x/exp v0.0.0-20250811191247-51f88131bc50
+ golang.org/x/mod v0.27.0
golang.org/x/sync v0.16.0
- golang.org/x/sys v0.34.0
- google.golang.org/protobuf v1.36.6
+ golang.org/x/sys v0.35.0
+ google.golang.org/protobuf v1.36.7
)
require (
@@ -153,7 +153,7 @@ require (
github.com/ipfs/go-peertaskqueue v0.8.2 // indirect
github.com/jackpal/go-nat-pmp v1.0.2 // indirect
github.com/klauspost/compress v1.18.0 // indirect
- github.com/klauspost/cpuid/v2 v2.2.10 // indirect
+ github.com/klauspost/cpuid/v2 v2.3.0 // indirect
github.com/koron/go-ssdp v0.0.6 // indirect
github.com/kr/pretty v0.3.1 // indirect
github.com/kr/text v0.2.0 // indirect
@@ -175,7 +175,7 @@ require (
github.com/mattn/go-runewidth v0.0.15 // indirect
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect
github.com/mholt/acmez/v3 v3.1.2 // indirect
- github.com/miekg/dns v1.1.67 // indirect
+ github.com/miekg/dns v1.1.68 // indirect
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect
github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect
github.com/minio/sha256-simd v1.0.1 // indirect
@@ -212,8 +212,8 @@ require (
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/polydawn/refmt v0.89.0 // indirect
github.com/prometheus/client_model v0.6.2 // indirect
- github.com/prometheus/common v0.64.0 // indirect
- github.com/prometheus/procfs v0.16.1 // indirect
+ github.com/prometheus/common v0.65.0 // indirect
+ github.com/prometheus/procfs v0.17.0 // indirect
github.com/prometheus/statsd_exporter v0.27.1 // indirect
github.com/quic-go/qpack v0.5.1 // indirect
github.com/quic-go/quic-go v0.54.0 // indirect
@@ -249,12 +249,12 @@ require (
go.uber.org/mock v0.5.2 // indirect
go.uber.org/zap/exp v0.3.0 // indirect
go4.org v0.0.0-20230225012048-214862532bf5 // indirect
- golang.org/x/net v0.42.0 // indirect
+ golang.org/x/net v0.43.0 // indirect
golang.org/x/oauth2 v0.30.0 // indirect
- golang.org/x/term v0.33.0 // indirect
- golang.org/x/text v0.27.0 // indirect
+ golang.org/x/term v0.34.0 // indirect
+ golang.org/x/text v0.28.0 // indirect
golang.org/x/time v0.12.0 // indirect
- golang.org/x/tools v0.35.0 // indirect
+ golang.org/x/tools v0.36.0 // indirect
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
gonum.org/v1/gonum v0.16.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 // indirect
diff --git a/go.sum b/go.sum
index b2e033f9d..a1d9c953f 100644
--- a/go.sum
+++ b/go.sum
@@ -469,8 +469,8 @@ github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6
github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
-github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE=
-github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
+github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y=
+github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/koron/go-ssdp v0.0.6 h1:Jb0h04599eq/CY7rB5YEqPS83HmRfHP2azkxMN2rFtU=
@@ -512,8 +512,8 @@ github.com/libp2p/go-libp2p-gostream v0.6.0 h1:QfAiWeQRce6pqnYfmIVWJFXNdDyfiR/qk
github.com/libp2p/go-libp2p-gostream v0.6.0/go.mod h1:Nywu0gYZwfj7Jc91PQvbGU8dIpqbQQkjWgDuOrFaRdA=
github.com/libp2p/go-libp2p-http v0.5.0 h1:+x0AbLaUuLBArHubbbNRTsgWz0RjNTy6DJLOxQ3/QBc=
github.com/libp2p/go-libp2p-http v0.5.0/go.mod h1:glh87nZ35XCQyFsdzZps6+F4HYI6DctVFY5u1fehwSg=
-github.com/libp2p/go-libp2p-kad-dht v0.33.1 h1:hKFhHMf7WH69LDjaxsJUWOU6qZm71uO47M/a5ijkiP0=
-github.com/libp2p/go-libp2p-kad-dht v0.33.1/go.mod h1:CdmNk4VeGJa9EXM9SLNyNVySEvduKvb+5rSC/H4pLAo=
+github.com/libp2p/go-libp2p-kad-dht v0.34.0 h1:yvJ/Vrt36GVjsqPxiGcuuwOloKuZLV9Aa7awIKyNXy0=
+github.com/libp2p/go-libp2p-kad-dht v0.34.0/go.mod h1:JNbkES4W5tajS6uYivw6MPs0842cPHAwhgaPw8sQG4o=
github.com/libp2p/go-libp2p-kbucket v0.3.1/go.mod h1:oyjT5O7tS9CQurok++ERgc46YLwEpuGoFq9ubvoUOio=
github.com/libp2p/go-libp2p-kbucket v0.7.0 h1:vYDvRjkyJPeWunQXqcW2Z6E93Ywx7fX0jgzb/dGOKCs=
github.com/libp2p/go-libp2p-kbucket v0.7.0/go.mod h1:blOINGIj1yiPYlVEX0Rj9QwEkmVnz3EP8LK1dRKBC6g=
@@ -573,8 +573,8 @@ github.com/mholt/acmez/v3 v3.1.2 h1:auob8J/0FhmdClQicvJvuDavgd5ezwLBfKuYmynhYzc=
github.com/mholt/acmez/v3 v3.1.2/go.mod h1:L1wOU06KKvq7tswuMDwKdcHeKpFFgkppZy/y0DFxagQ=
github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4=
github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4=
-github.com/miekg/dns v1.1.67 h1:kg0EHj0G4bfT5/oOys6HhZw4vmMlnoZ+gDu8tJ/AlI0=
-github.com/miekg/dns v1.1.67/go.mod h1:fujopn7TB3Pu3JM69XaawiU0wqjpL9/8xGop5UrTPps=
+github.com/miekg/dns v1.1.68 h1:jsSRkNozw7G/mnmXULynzMNIsgY2dHC8LO6U6Ij2JEA=
+github.com/miekg/dns v1.1.68/go.mod h1:fujopn7TB3Pu3JM69XaawiU0wqjpL9/8xGop5UrTPps=
github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8=
github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms=
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc=
@@ -609,8 +609,8 @@ github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a
github.com/multiformats/go-multiaddr v0.1.0/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44=
github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo=
github.com/multiformats/go-multiaddr v0.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4=
-github.com/multiformats/go-multiaddr v0.16.0 h1:oGWEVKioVQcdIOBlYM8BH1rZDWOGJSqr9/BKl6zQ4qc=
-github.com/multiformats/go-multiaddr v0.16.0/go.mod h1:JSVUmXDjsVFiW7RjIFMP7+Ev+h1DTbiJgVeTV/tcmP0=
+github.com/multiformats/go-multiaddr v0.16.1 h1:fgJ0Pitow+wWXzN9do+1b8Pyjmo8m5WhGfzpL82MpCw=
+github.com/multiformats/go-multiaddr v0.16.1/go.mod h1:JSVUmXDjsVFiW7RjIFMP7+Ev+h1DTbiJgVeTV/tcmP0=
github.com/multiformats/go-multiaddr-dns v0.4.1 h1:whi/uCLbDS3mSEUMb1MsoT4uzUeZB0N32yzufqS0i5M=
github.com/multiformats/go-multiaddr-dns v0.4.1/go.mod h1:7hfthtB4E4pQwirrz+J0CcDUfbWzTqEzVyYKKIKpgkc=
github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E=
@@ -734,8 +734,8 @@ github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqr
github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
github.com/prometheus/client_golang v1.13.0/go.mod h1:vTeo+zgvILHsnnj/39Ou/1fPN5nJFOEMgftOUOmlvYQ=
-github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q=
-github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0=
+github.com/prometheus/client_golang v1.23.0 h1:ust4zpdl9r4trLY/gSjlm07PuiBq2ynaXXlptpfy8Uc=
+github.com/prometheus/client_golang v1.23.0/go.mod h1:i/o0R9ByOnHX0McrTMTyhYvKE4haaf2mW08I+jGAjEE=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
@@ -749,8 +749,8 @@ github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9
github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
github.com/prometheus/common v0.35.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=
github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=
-github.com/prometheus/common v0.64.0 h1:pdZeA+g617P7oGv1CzdTzyeShxAGrTBsolKNOLQPGO4=
-github.com/prometheus/common v0.64.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8=
+github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2VzE=
+github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8=
github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
@@ -758,8 +758,8 @@ github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O
github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=
-github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg=
-github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is=
+github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7DuK0=
+github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw=
github.com/prometheus/statsd_exporter v0.22.7/go.mod h1:N/TevpjkIh9ccs6nuzY3jQn9dFqnUakOjnEuMPJJJnI=
github.com/prometheus/statsd_exporter v0.27.1 h1:tcRJOmwlA83HPfWzosAgr2+zEN5XDFv+M2mn/uYkn5Y=
github.com/prometheus/statsd_exporter v0.27.1/go.mod h1:vA6ryDfsN7py/3JApEst6nLTJboq66XsNcJGNmC88NQ=
@@ -997,8 +997,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
-golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=
-golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=
+golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4=
+golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -1009,8 +1009,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
-golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 h1:R9PFI6EUdfVKgwKjZef7QIwGcBKu86OEFpJ9nUEP2l4=
-golang.org/x/exp v0.0.0-20250718183923-645b1fa84792/go.mod h1:A+z0yzpGtvnG90cToK5n2tu8UJVP2XUATh+r+sfOOOc=
+golang.org/x/exp v0.0.0-20250811191247-51f88131bc50 h1:3yiSh9fhy5/RhCSntf4Sy0Tnx50DmMpQ4MQdKKk4yg4=
+golang.org/x/exp v0.0.0-20250811191247-51f88131bc50/go.mod h1:rT6SFzZ7oxADUDx58pcaKFTcZ+inxAa9fTrYx/uVYwg=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -1034,8 +1034,8 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
-golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg=
-golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ=
+golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ=
+golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -1087,8 +1087,8 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
-golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs=
-golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8=
+golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE=
+golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -1184,8 +1184,8 @@ golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=
-golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
+golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=
+golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
@@ -1194,8 +1194,8 @@ golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU=
golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY=
-golang.org/x/term v0.33.0 h1:NuFncQrRcaRvVmgRkvM3j/F00gWIAlcmlB8ACEKmGIg=
-golang.org/x/term v0.33.0/go.mod h1:s18+ql9tYWp1IfpV9DmCtQDDSRBUjKaw9M1eAv5UeF0=
+golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4=
+golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -1207,8 +1207,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
-golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=
-golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=
+golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng=
+golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU=
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -1266,8 +1266,8 @@ golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4f
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
-golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0=
-golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw=
+golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg=
+golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -1373,8 +1373,8 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
-google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
-google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
+google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A=
+google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index 16fade132..cfc9c7c24 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -13,7 +13,7 @@ require (
github.com/ipfs/hang-fds v0.1.0
github.com/ipfs/iptb v1.4.1
github.com/ipfs/iptb-plugins v0.5.1
- github.com/multiformats/go-multiaddr v0.16.0
+ github.com/multiformats/go-multiaddr v0.16.1
github.com/multiformats/go-multihash v0.2.3
gotest.tools/gotestsum v1.12.0
)
@@ -152,7 +152,7 @@ require (
github.com/kisielk/errcheck v1.7.0 // indirect
github.com/kkHAIKE/contextcheck v1.1.5 // indirect
github.com/klauspost/compress v1.18.0 // indirect
- github.com/klauspost/cpuid/v2 v2.2.10 // indirect
+ github.com/klauspost/cpuid/v2 v2.3.0 // indirect
github.com/koron/go-ssdp v0.0.6 // indirect
github.com/kr/pretty v0.3.1 // indirect
github.com/kr/text v0.2.0 // indirect
@@ -169,7 +169,7 @@ require (
github.com/libp2p/go-flow-metrics v0.3.0 // indirect
github.com/libp2p/go-libp2p v0.43.0 // indirect
github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect
- github.com/libp2p/go-libp2p-kad-dht v0.33.1 // indirect
+ github.com/libp2p/go-libp2p-kad-dht v0.34.0 // indirect
github.com/libp2p/go-libp2p-kbucket v0.7.0 // indirect
github.com/libp2p/go-libp2p-record v0.3.1 // indirect
github.com/libp2p/go-libp2p-routing-helpers v0.7.5 // indirect
@@ -188,7 +188,7 @@ require (
github.com/mattn/go-shellwords v1.0.12 // indirect
github.com/mgechev/revive v1.3.9 // indirect
github.com/mholt/acmez/v3 v3.1.2 // indirect
- github.com/miekg/dns v1.1.67 // indirect
+ github.com/miekg/dns v1.1.68 // indirect
github.com/minio/sha256-simd v1.0.1 // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
@@ -233,10 +233,10 @@ require (
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/polydawn/refmt v0.89.0 // indirect
github.com/polyfloyd/go-errorlint v1.6.0 // indirect
- github.com/prometheus/client_golang v1.22.0 // indirect
+ github.com/prometheus/client_golang v1.23.0 // indirect
github.com/prometheus/client_model v0.6.2 // indirect
- github.com/prometheus/common v0.64.0 // indirect
- github.com/prometheus/procfs v0.16.1 // indirect
+ github.com/prometheus/common v0.65.0 // indirect
+ github.com/prometheus/procfs v0.17.0 // indirect
github.com/quasilyte/go-ruleguard v0.4.2 // indirect
github.com/quasilyte/go-ruleguard/dsl v0.3.22 // indirect
github.com/quasilyte/gogrep v0.5.0 // indirect
@@ -308,19 +308,19 @@ require (
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.27.0 // indirect
go.uber.org/zap/exp v0.3.0 // indirect
- golang.org/x/crypto v0.40.0 // indirect
- golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 // indirect
+ golang.org/x/crypto v0.41.0 // indirect
+ golang.org/x/exp v0.0.0-20250811191247-51f88131bc50 // indirect
golang.org/x/exp/typeparams v0.0.0-20240314144324-c7f7c6466f7f // indirect
- golang.org/x/mod v0.26.0 // indirect
- golang.org/x/net v0.42.0 // indirect
+ golang.org/x/mod v0.27.0 // indirect
+ golang.org/x/net v0.43.0 // indirect
golang.org/x/sync v0.16.0 // indirect
- golang.org/x/sys v0.34.0 // indirect
- golang.org/x/term v0.33.0 // indirect
- golang.org/x/text v0.27.0 // indirect
+ golang.org/x/sys v0.35.0 // indirect
+ golang.org/x/term v0.34.0 // indirect
+ golang.org/x/text v0.28.0 // indirect
golang.org/x/time v0.12.0 // indirect
- golang.org/x/tools v0.35.0 // indirect
+ golang.org/x/tools v0.36.0 // indirect
gonum.org/v1/gonum v0.16.0 // indirect
- google.golang.org/protobuf v1.36.6 // indirect
+ google.golang.org/protobuf v1.36.7 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index 30c4d1fd5..21ad5cf0a 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -392,8 +392,8 @@ github.com/kkHAIKE/contextcheck v1.1.5 h1:CdnJh63tcDe53vG+RebdpdXJTc9atMgGqdx8LX
github.com/kkHAIKE/contextcheck v1.1.5/go.mod h1:O930cpht4xb1YQpK+1+AgoM3mFsvxr7uyFptcnWTYUA=
github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
-github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE=
-github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
+github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y=
+github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
github.com/koron/go-ssdp v0.0.6 h1:Jb0h04599eq/CY7rB5YEqPS83HmRfHP2azkxMN2rFtU=
github.com/koron/go-ssdp v0.0.6/go.mod h1:0R9LfRJGek1zWTjN3JUNlm5INCDYGpRDfAptnct63fI=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
@@ -431,8 +431,8 @@ github.com/libp2p/go-libp2p v0.43.0 h1:b2bg2cRNmY4HpLK8VHYQXLX2d3iND95OjodLFymvq
github.com/libp2p/go-libp2p v0.43.0/go.mod h1:IiSqAXDyP2sWH+J2gs43pNmB/y4FOi2XQPbsb+8qvzc=
github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94=
github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8=
-github.com/libp2p/go-libp2p-kad-dht v0.33.1 h1:hKFhHMf7WH69LDjaxsJUWOU6qZm71uO47M/a5ijkiP0=
-github.com/libp2p/go-libp2p-kad-dht v0.33.1/go.mod h1:CdmNk4VeGJa9EXM9SLNyNVySEvduKvb+5rSC/H4pLAo=
+github.com/libp2p/go-libp2p-kad-dht v0.34.0 h1:yvJ/Vrt36GVjsqPxiGcuuwOloKuZLV9Aa7awIKyNXy0=
+github.com/libp2p/go-libp2p-kad-dht v0.34.0/go.mod h1:JNbkES4W5tajS6uYivw6MPs0842cPHAwhgaPw8sQG4o=
github.com/libp2p/go-libp2p-kbucket v0.7.0 h1:vYDvRjkyJPeWunQXqcW2Z6E93Ywx7fX0jgzb/dGOKCs=
github.com/libp2p/go-libp2p-kbucket v0.7.0/go.mod h1:blOINGIj1yiPYlVEX0Rj9QwEkmVnz3EP8LK1dRKBC6g=
github.com/libp2p/go-libp2p-record v0.3.1 h1:cly48Xi5GjNw5Wq+7gmjfBiG9HCzQVkiZOUZ8kUl+Fg=
@@ -485,8 +485,8 @@ github.com/mgechev/revive v1.3.9/go.mod h1:+uxEIr5UH0TjXWHTno3xh4u7eg6jDpXKzQccA
github.com/mholt/acmez/v3 v3.1.2 h1:auob8J/0FhmdClQicvJvuDavgd5ezwLBfKuYmynhYzc=
github.com/mholt/acmez/v3 v3.1.2/go.mod h1:L1wOU06KKvq7tswuMDwKdcHeKpFFgkppZy/y0DFxagQ=
github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4=
-github.com/miekg/dns v1.1.67 h1:kg0EHj0G4bfT5/oOys6HhZw4vmMlnoZ+gDu8tJ/AlI0=
-github.com/miekg/dns v1.1.67/go.mod h1:fujopn7TB3Pu3JM69XaawiU0wqjpL9/8xGop5UrTPps=
+github.com/miekg/dns v1.1.68 h1:jsSRkNozw7G/mnmXULynzMNIsgY2dHC8LO6U6Ij2JEA=
+github.com/miekg/dns v1.1.68/go.mod h1:fujopn7TB3Pu3JM69XaawiU0wqjpL9/8xGop5UrTPps=
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc=
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b/go.mod h1:lxPUiZwKoFL8DUUmalo2yJJUCxbPKtm8OKfqr2/FTNU=
github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc h1:PTfri+PuQmWDqERdnNMiD9ZejrlswWrCpBEZgWOiTrc=
@@ -511,8 +511,8 @@ github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYg
github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0=
github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4=
github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo=
-github.com/multiformats/go-multiaddr v0.16.0 h1:oGWEVKioVQcdIOBlYM8BH1rZDWOGJSqr9/BKl6zQ4qc=
-github.com/multiformats/go-multiaddr v0.16.0/go.mod h1:JSVUmXDjsVFiW7RjIFMP7+Ev+h1DTbiJgVeTV/tcmP0=
+github.com/multiformats/go-multiaddr v0.16.1 h1:fgJ0Pitow+wWXzN9do+1b8Pyjmo8m5WhGfzpL82MpCw=
+github.com/multiformats/go-multiaddr v0.16.1/go.mod h1:JSVUmXDjsVFiW7RjIFMP7+Ev+h1DTbiJgVeTV/tcmP0=
github.com/multiformats/go-multiaddr-dns v0.4.1 h1:whi/uCLbDS3mSEUMb1MsoT4uzUeZB0N32yzufqS0i5M=
github.com/multiformats/go-multiaddr-dns v0.4.1/go.mod h1:7hfthtB4E4pQwirrz+J0CcDUfbWzTqEzVyYKKIKpgkc=
github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E=
@@ -617,17 +617,17 @@ github.com/polyfloyd/go-errorlint v1.6.0/go.mod h1:HR7u8wuP1kb1NeN1zqTd1ZMlqUKPP
github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g=
github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U=
github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
-github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q=
-github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0=
+github.com/prometheus/client_golang v1.23.0 h1:ust4zpdl9r4trLY/gSjlm07PuiBq2ynaXXlptpfy8Uc=
+github.com/prometheus/client_golang v1.23.0/go.mod h1:i/o0R9ByOnHX0McrTMTyhYvKE4haaf2mW08I+jGAjEE=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=
github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
-github.com/prometheus/common v0.64.0 h1:pdZeA+g617P7oGv1CzdTzyeShxAGrTBsolKNOLQPGO4=
-github.com/prometheus/common v0.64.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8=
+github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2VzE=
+github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8=
github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
-github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg=
-github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is=
+github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7DuK0=
+github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw=
github.com/quasilyte/go-ruleguard v0.4.2 h1:htXcXDK6/rO12kiTHKfHuqR4kr3Y4M0J0rOL6CH/BYs=
github.com/quasilyte/go-ruleguard v0.4.2/go.mod h1:GJLgqsLeo4qgavUoL8JeGFNS7qcisx3awV/w9eWTmNI=
github.com/quasilyte/go-ruleguard/dsl v0.3.22 h1:wd8zkOhSNr+I+8Qeciml08ivDt1pSXe60+5DqOpCjPE=
@@ -867,11 +867,11 @@ golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
-golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=
-golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=
+golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4=
+golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 h1:R9PFI6EUdfVKgwKjZef7QIwGcBKu86OEFpJ9nUEP2l4=
-golang.org/x/exp v0.0.0-20250718183923-645b1fa84792/go.mod h1:A+z0yzpGtvnG90cToK5n2tu8UJVP2XUATh+r+sfOOOc=
+golang.org/x/exp v0.0.0-20250811191247-51f88131bc50 h1:3yiSh9fhy5/RhCSntf4Sy0Tnx50DmMpQ4MQdKKk4yg4=
+golang.org/x/exp v0.0.0-20250811191247-51f88131bc50/go.mod h1:rT6SFzZ7oxADUDx58pcaKFTcZ+inxAa9fTrYx/uVYwg=
golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
golang.org/x/exp/typeparams v0.0.0-20240314144324-c7f7c6466f7f h1:phY1HzDcf18Aq9A8KkmRtY9WvOFIxN8wgfvy6Zm1DV8=
@@ -896,8 +896,8 @@ golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
-golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg=
-golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ=
+golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ=
+golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -929,8 +929,8 @@ golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
-golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs=
-golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8=
+golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE=
+golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -989,8 +989,8 @@ golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=
-golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
+golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=
+golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
@@ -1007,8 +1007,8 @@ golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY=
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58=
-golang.org/x/term v0.33.0 h1:NuFncQrRcaRvVmgRkvM3j/F00gWIAlcmlB8ACEKmGIg=
-golang.org/x/term v0.33.0/go.mod h1:s18+ql9tYWp1IfpV9DmCtQDDSRBUjKaw9M1eAv5UeF0=
+golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4=
+golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
@@ -1023,8 +1023,8 @@ golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
-golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=
-golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=
+golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng=
+golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU=
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE=
@@ -1062,10 +1062,10 @@ golang.org/x/tools v0.11.0/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8
golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg=
golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc=
-golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0=
-golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw=
-golang.org/x/tools/go/expect v0.1.0-deprecated h1:jY2C5HGYR5lqex3gEniOQL0r7Dq5+VGVgY1nudX5lXY=
-golang.org/x/tools/go/expect v0.1.0-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY=
+golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg=
+golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s=
+golang.org/x/tools/go/expect v0.1.1-deprecated h1:jpBZDwmgPhXsKZC6WhL20P4b/wmnpsEAGHaNy0n/rJM=
+golang.org/x/tools/go/expect v0.1.1-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY=
golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated h1:1h2MnaIAIXISqTFKdENegdpAgUXz6NrPEsbIeWaBRvM=
golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated/go.mod h1:RVAQXBGNv1ib0J382/DPCRS/BPnsGebyM1Gj5VSDpG8=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -1090,8 +1090,8 @@ google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmE
google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio=
google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
-google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
-google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
+google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A=
+google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
From d81f524cce2bc6cc75d6a9165b9f39b05a4114bc Mon Sep 17 00:00:00 2001
From: Sergey Gorbunov
Date: Wed, 13 Aug 2025 05:15:45 +0300
Subject: [PATCH 318/499] feat(ipns): support passing custom sequence number
during publishing (#10851)
* feat(ipns): Add a parameter in name.publish to change the sequence number
* test: monotonic name publish --sequence
* docs: `name publish --sequence`
* chore: boxo main with PR 962
---------
Co-authored-by: Marcin Rataj
---
.github/workflows/interop.yml | 2 +-
core/commands/name/publish.go | 23 +++++++++
core/coreapi/name.go | 4 ++
core/coreiface/options/name.go | 10 ++++
docs/changelogs/v0.37.md | 6 +++
docs/examples/kubo-as-a-library/go.mod | 2 +-
docs/examples/kubo-as-a-library/go.sum | 4 +-
go.mod | 2 +-
go.sum | 4 +-
test/cli/name_test.go | 67 ++++++++++++++++++++++++++
test/dependencies/go.mod | 2 +-
test/dependencies/go.sum | 4 +-
12 files changed, 120 insertions(+), 10 deletions(-)
diff --git a/.github/workflows/interop.yml b/.github/workflows/interop.yml
index e85e1f2fe..af49f27f2 100644
--- a/.github/workflows/interop.yml
+++ b/.github/workflows/interop.yml
@@ -91,7 +91,7 @@ jobs:
steps:
- uses: actions/setup-node@v4
with:
- node-version: 18.14.0
+ node-version: 20.x
- uses: actions/download-artifact@v4
with:
name: kubo
diff --git a/core/commands/name/publish.go b/core/commands/name/publish.go
index 168d7fb44..db97b3b13 100644
--- a/core/commands/name/publish.go
+++ b/core/commands/name/publish.go
@@ -27,6 +27,7 @@ const (
keyOptionName = "key"
quieterOptionName = "quieter"
v1compatOptionName = "v1compat"
+ sequenceOptionName = "sequence"
)
var PublishCmd = &cmds.Command{
@@ -66,6 +67,23 @@ Alternatively, publish an using a valid PeerID (as listed by
> ipfs name publish --key=QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n /ipfs/QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy
Published to QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n: /ipfs/QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy
+Notes:
+
+The --ttl option specifies the time duration for caching IPNS records.
+Lower values like '1m' enable faster updates but increase network load,
+while the default of 1 hour reduces traffic but may delay propagation.
+Gateway operators may override this with Ipns.MaxCacheTTL configuration.
+
+The --sequence option sets a custom sequence number for the IPNS record.
+The sequence number must be monotonically increasing (greater than the
+current record's sequence). This is useful for manually coordinating
+updates across multiple writers. If not specified, the sequence number
+increments automatically.
+
+For faster IPNS updates, consider:
+- Using a lower --ttl value (e.g., '1m' for quick updates)
+- Enabling PubSub via Ipns.UsePubsub in the config
+
`,
},
@@ -80,6 +98,7 @@ Alternatively, publish an using a valid PeerID (as listed by
cmds.BoolOption(quieterOptionName, "Q", "Write only final IPNS Name encoded as CIDv1 (for use in /ipns content paths)."),
cmds.BoolOption(v1compatOptionName, "Produce a backward-compatible IPNS Record by including fields for both V1 and V2 signatures.").WithDefault(true),
cmds.BoolOption(allowOfflineOptionName, "When --offline, save the IPNS record to the local datastore without broadcasting to the network (instead of failing)."),
+ cmds.Uint64Option(sequenceOptionName, "Set a custom sequence number for the IPNS record (must be higher than current)."),
ke.OptionIPNSBase,
},
Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
@@ -114,6 +133,10 @@ Alternatively, publish an using a valid PeerID (as listed by
opts = append(opts, options.Name.TTL(d))
}
+ if sequence, found := req.Options[sequenceOptionName].(uint64); found {
+ opts = append(opts, options.Name.Sequence(sequence))
+ }
+
p, err := cmdutils.PathOrCidPath(req.Arguments[0])
if err != nil {
return err
diff --git a/core/coreapi/name.go b/core/coreapi/name.go
index 305c19e43..b43f9def6 100644
--- a/core/coreapi/name.go
+++ b/core/coreapi/name.go
@@ -66,6 +66,10 @@ func (api *NameAPI) Publish(ctx context.Context, p path.Path, opts ...caopts.Nam
publishOptions = append(publishOptions, namesys.PublishWithTTL(*options.TTL))
}
+ if options.Sequence != nil {
+ publishOptions = append(publishOptions, namesys.PublishWithSequence(*options.Sequence))
+ }
+
err = api.namesys.Publish(ctx, k, p, publishOptions...)
if err != nil {
return ipns.Name{}, err
diff --git a/core/coreiface/options/name.go b/core/coreiface/options/name.go
index 7b4b6a8fd..d62c427ad 100644
--- a/core/coreiface/options/name.go
+++ b/core/coreiface/options/name.go
@@ -16,6 +16,7 @@ type NamePublishSettings struct {
TTL *time.Duration
CompatibleWithV1 bool
AllowOffline bool
+ Sequence *uint64
}
type NameResolveSettings struct {
@@ -105,6 +106,15 @@ func (nameOpts) TTL(ttl time.Duration) NamePublishOption {
}
}
+// Sequence is an option for Name.Publish which specifies the sequence number of
+// a namesys record.
+func (nameOpts) Sequence(seq uint64) NamePublishOption {
+ return func(settings *NamePublishSettings) error {
+ settings.Sequence = &seq
+ return nil
+ }
+}
+
// CompatibleWithV1 is an option for [Name.Publish] which specifies if the
// created record should be backwards compatible with V1 IPNS Records.
func (nameOpts) CompatibleWithV1(compatible bool) NamePublishOption {
diff --git a/docs/changelogs/v0.37.md b/docs/changelogs/v0.37.md
index 63a1501d1..165d30a59 100644
--- a/docs/changelogs/v0.37.md
+++ b/docs/changelogs/v0.37.md
@@ -13,8 +13,10 @@ This release was brought to you by the [Shipyard](https://ipshipyard.com/) team.
- [Clear provide queue when reprovide strategy changes](#clear-provide-queue-when-reprovide-strategy-changes)
- [๐ชต Revamped `ipfs log level` command](#-revamped-ipfs-log-level-command)
- [๐ Named pins in `ipfs add` command](#-named-pins-in-ipfs-add-command)
+ - [Custom sequence numbers in `ipfs name publish`](#custom-sequence-numbers-in-ipfs-name-publish)
- [โ๏ธ `Reprovider.Strategy` is now consistently respected](#-reprovider-strategy-is-now-consistently-respected)
- [Removed unnecessary dependencies](#removed-unnecessary-dependencies)
+ - [Improved `ipfs cid`](#improved-ipfs-cid)
- [Deprecated `ipfs stats reprovide`](#deprecated-ipfs-stats-reprovide)
- [๐ AutoRelay now uses all connected peers for relay discovery](#-autorelay-now-uses-all-connected-peers-for-relay-discovery)
- [๐ฆ๏ธ Important dependency updates](#-important-dependency-updates)
@@ -93,6 +95,10 @@ Kubo has been cleaned up by removing unnecessary dependencies and packages:
These changes reduce the dependency footprint while improving code maintainability and following Go best practices.
+#### Custom sequence numbers in `ipfs name publish`
+
+Added `--sequence` flag to `ipfs name publish` for setting custom sequence numbers in IPNS records. This enables advanced use cases like manually coordinating updates across multiple nodes. See `ipfs name publish --help` for details.
+
#### Improved `ipfs cid`
Certain `ipfs cid` commands can now be run without a daemon or repository, and return correct exit code 1 on error, making it easier to perform CID conversion in scripts and CI/CD pipelines.
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index a4decfb45..00ce3d806 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -7,7 +7,7 @@ go 1.24
replace github.com/ipfs/kubo => ./../../..
require (
- github.com/ipfs/boxo v0.33.2-0.20250804224807-e5da058ebb08
+ github.com/ipfs/boxo v0.33.2-0.20250813013451-825361b44b4e
github.com/ipfs/kubo v0.0.0-00010101000000-000000000000
github.com/libp2p/go-libp2p v0.43.0
github.com/multiformats/go-multiaddr v0.16.1
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index 821d8f8da..dace80e15 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -287,8 +287,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcd
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.33.2-0.20250804224807-e5da058ebb08 h1:PtntQQtYOh7YTCRnrU1idTuOwxEi0ZmYM4u7ZfSAExY=
-github.com/ipfs/boxo v0.33.2-0.20250804224807-e5da058ebb08/go.mod h1:KwlJTzv5fb1GLlA9KyMqHQmvP+4mrFuiE3PnjdrPJHs=
+github.com/ipfs/boxo v0.33.2-0.20250813013451-825361b44b4e h1:A2zSzpyrerCtdN69iDxt9S9z27cD1R4Uw3l1ctLTxX0=
+github.com/ipfs/boxo v0.33.2-0.20250813013451-825361b44b4e/go.mod h1:ehi6uM9NBRkAaB7Q7u2kZgGArXPfbNRe0X/CYTqUwq8=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk=
diff --git a/go.mod b/go.mod
index 0c0310df6..2e75ec217 100644
--- a/go.mod
+++ b/go.mod
@@ -22,7 +22,7 @@ require (
github.com/hashicorp/go-version v1.7.0
github.com/ipfs-shipyard/nopfs v0.0.14
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0
- github.com/ipfs/boxo v0.33.2-0.20250804224807-e5da058ebb08
+ github.com/ipfs/boxo v0.33.2-0.20250813013451-825361b44b4e
github.com/ipfs/go-block-format v0.2.2
github.com/ipfs/go-cid v0.5.0
github.com/ipfs/go-cidutil v0.1.0
diff --git a/go.sum b/go.sum
index a1d9c953f..6bb8d9801 100644
--- a/go.sum
+++ b/go.sum
@@ -354,8 +354,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcd
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.33.2-0.20250804224807-e5da058ebb08 h1:PtntQQtYOh7YTCRnrU1idTuOwxEi0ZmYM4u7ZfSAExY=
-github.com/ipfs/boxo v0.33.2-0.20250804224807-e5da058ebb08/go.mod h1:KwlJTzv5fb1GLlA9KyMqHQmvP+4mrFuiE3PnjdrPJHs=
+github.com/ipfs/boxo v0.33.2-0.20250813013451-825361b44b4e h1:A2zSzpyrerCtdN69iDxt9S9z27cD1R4Uw3l1ctLTxX0=
+github.com/ipfs/boxo v0.33.2-0.20250813013451-825361b44b4e/go.mod h1:ehi6uM9NBRkAaB7Q7u2kZgGArXPfbNRe0X/CYTqUwq8=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk=
diff --git a/test/cli/name_test.go b/test/cli/name_test.go
index 42c649c09..460f5f1a6 100644
--- a/test/cli/name_test.go
+++ b/test/cli/name_test.go
@@ -263,4 +263,71 @@ func TestName(t *testing.T) {
require.NoError(t, err)
require.False(t, val.Validation.Valid)
})
+
+ t.Run("Publishing with custom sequence number", func(t *testing.T) {
+ t.Parallel()
+
+ node := makeDaemon(t, nil)
+ publishPath := "/ipfs/" + fixtureCid
+ name := ipns.NameFromPeer(node.PeerID())
+
+ t.Run("Publish with sequence=0 is not allowed", func(t *testing.T) {
+ // Sequence=0 is never valid, even on a fresh node
+ res := node.RunIPFS("name", "publish", "--allow-offline", "--ttl=0", "--sequence=0", publishPath)
+ require.NotEqual(t, 0, res.ExitCode(), "Expected publish with sequence=0 to fail")
+ require.Contains(t, res.Stderr.String(), "sequence number must be greater than the current record sequence")
+ })
+
+ t.Run("Publish with sequence=1 on fresh node", func(t *testing.T) {
+ // Sequence=1 is the minimum valid sequence number for first publish
+ res := node.IPFS("name", "publish", "--allow-offline", "--ttl=0", "--sequence=1", publishPath)
+ require.Equal(t, fmt.Sprintf("Published to %s: %s\n", name.String(), publishPath), res.Stdout.String())
+ })
+
+ t.Run("Publish with sequence=42", func(t *testing.T) {
+ res := node.IPFS("name", "publish", "--allow-offline", "--ttl=0", "--sequence=42", publishPath)
+ require.Equal(t, fmt.Sprintf("Published to %s: %s\n", name.String(), publishPath), res.Stdout.String())
+ })
+
+ t.Run("Publish with large sequence number", func(t *testing.T) {
+ res := node.IPFS("name", "publish", "--allow-offline", "--ttl=0", "--sequence=18446744073709551615", publishPath) // Max uint64
+ require.Equal(t, fmt.Sprintf("Published to %s: %s\n", name.String(), publishPath), res.Stdout.String())
+ })
+ })
+
+ t.Run("Sequence number monotonic check", func(t *testing.T) {
+ t.Parallel()
+
+ node := makeDaemon(t, nil).StartDaemon()
+ publishPath1 := "/ipfs/" + fixtureCid
+ publishPath2 := "/ipfs/" + dagCid // Different content
+ name := ipns.NameFromPeer(node.PeerID())
+
+ // First, publish with a high sequence number (1000)
+ res := node.IPFS("name", "publish", "--ttl=0", "--sequence=1000", publishPath1)
+ require.Equal(t, fmt.Sprintf("Published to %s: %s\n", name.String(), publishPath1), res.Stdout.String())
+
+ // Verify the record was published successfully
+ res = node.IPFS("name", "resolve", name.String())
+ require.Contains(t, res.Stdout.String(), publishPath1)
+
+ // Now try to publish different content with a LOWER sequence number (500)
+ // This should fail due to monotonic sequence check
+ res = node.RunIPFS("name", "publish", "--ttl=0", "--sequence=500", publishPath2)
+ require.NotEqual(t, 0, res.ExitCode(), "Expected publish with lower sequence to fail")
+ require.Contains(t, res.Stderr.String(), "sequence number", "Expected error about sequence number")
+
+ // Verify the original content is still published (not overwritten)
+ res = node.IPFS("name", "resolve", name.String())
+ require.Contains(t, res.Stdout.String(), publishPath1, "Original content should still be published")
+ require.NotContains(t, res.Stdout.String(), publishPath2, "New content should not have been published")
+
+ // Publishing with a HIGHER sequence number should succeed
+ res = node.IPFS("name", "publish", "--ttl=0", "--sequence=2000", publishPath2)
+ require.Equal(t, fmt.Sprintf("Published to %s: %s\n", name.String(), publishPath2), res.Stdout.String())
+
+ // Verify the new content is now published
+ res = node.IPFS("name", "resolve", name.String())
+ require.Contains(t, res.Stdout.String(), publishPath2, "New content should now be published")
+ })
}
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index cfc9c7c24..19571aff4 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -129,7 +129,7 @@ require (
github.com/huin/goupnp v1.3.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/ipfs/bbloom v0.0.4 // indirect
- github.com/ipfs/boxo v0.33.2-0.20250804224807-e5da058ebb08 // indirect
+ github.com/ipfs/boxo v0.33.2-0.20250813013451-825361b44b4e // indirect
github.com/ipfs/go-bitfield v1.1.0 // indirect
github.com/ipfs/go-block-format v0.2.2 // indirect
github.com/ipfs/go-cid v0.5.0 // indirect
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index 21ad5cf0a..19f6ee6ef 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -321,8 +321,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.33.2-0.20250804224807-e5da058ebb08 h1:PtntQQtYOh7YTCRnrU1idTuOwxEi0ZmYM4u7ZfSAExY=
-github.com/ipfs/boxo v0.33.2-0.20250804224807-e5da058ebb08/go.mod h1:KwlJTzv5fb1GLlA9KyMqHQmvP+4mrFuiE3PnjdrPJHs=
+github.com/ipfs/boxo v0.33.2-0.20250813013451-825361b44b4e h1:A2zSzpyrerCtdN69iDxt9S9z27cD1R4Uw3l1ctLTxX0=
+github.com/ipfs/boxo v0.33.2-0.20250813013451-825361b44b4e/go.mod h1:ehi6uM9NBRkAaB7Q7u2kZgGArXPfbNRe0X/CYTqUwq8=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-block-format v0.2.2 h1:uecCTgRwDIXyZPgYspaLXoMiMmxQpSx2aq34eNc4YvQ=
From a3b01cd05ff159c22a909dca841130657c9dbb0f Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Wed, 13 Aug 2025 02:03:42 -0700
Subject: [PATCH 319/499] Replace `uber-go/multierr` with `errors.Join`
(#10912)
---
client/rpc/api_test.go | 4 ++--
cmd/ipfs/kubo/daemon.go | 10 ++++++----
go.mod | 2 +-
repo/fsrepo/migrations/fetcher.go | 11 +++++------
routing/composer.go | 3 +--
5 files changed, 15 insertions(+), 15 deletions(-)
diff --git a/client/rpc/api_test.go b/client/rpc/api_test.go
index dd1e1db04..745f0fe13 100644
--- a/client/rpc/api_test.go
+++ b/client/rpc/api_test.go
@@ -2,6 +2,7 @@ package rpc
import (
"context"
+ "errors"
"net/http"
"net/http/httptest"
"strconv"
@@ -16,7 +17,6 @@ import (
"github.com/ipfs/kubo/core/coreiface/tests"
"github.com/ipfs/kubo/test/cli/harness"
ma "github.com/multiformats/go-multiaddr"
- "go.uber.org/multierr"
)
type NodeProvider struct{}
@@ -91,7 +91,7 @@ func (np NodeProvider) MakeAPISwarm(t *testing.T, ctx context.Context, fullIdent
wg.Wait()
- return apis, multierr.Combine(errs...)
+ return apis, errors.Join(errs...)
}
func TestHttpApi(t *testing.T) {
diff --git a/cmd/ipfs/kubo/daemon.go b/cmd/ipfs/kubo/daemon.go
index e52e68906..eb8b23a97 100644
--- a/cmd/ipfs/kubo/daemon.go
+++ b/cmd/ipfs/kubo/daemon.go
@@ -44,7 +44,6 @@ import (
manet "github.com/multiformats/go-multiaddr/net"
prometheus "github.com/prometheus/client_golang/prometheus"
promauto "github.com/prometheus/client_golang/prometheus/promauto"
- "go.uber.org/multierr"
)
const (
@@ -725,14 +724,17 @@ take effect.
// collect long-running errors and block for shutdown
// TODO(cryptix): our fuse currently doesn't follow this pattern for graceful shutdown
- var errs error
+ var errs []error
for err := range merge(apiErrc, gwErrc, gcErrc, p2pGwErrc, pluginErrc, unmountErrc) {
if err != nil {
- errs = multierr.Append(errs, err)
+ errs = append(errs, err)
}
}
+ if len(errs) != 0 {
+ return errors.Join(errs...)
+ }
- return errs
+ return nil
}
// serveHTTPApi collects options, creates listener, prints status message and starts serving requests.
diff --git a/go.mod b/go.mod
index 2e75ec217..8dc71c2da 100644
--- a/go.mod
+++ b/go.mod
@@ -83,7 +83,6 @@ require (
go.opentelemetry.io/otel/trace v1.37.0
go.uber.org/dig v1.19.0
go.uber.org/fx v1.24.0
- go.uber.org/multierr v1.11.0
go.uber.org/zap v1.27.0
golang.org/x/crypto v0.41.0
golang.org/x/exp v0.0.0-20250811191247-51f88131bc50
@@ -247,6 +246,7 @@ require (
go.opentelemetry.io/otel/metric v1.37.0 // indirect
go.opentelemetry.io/proto/otlp v1.7.0 // indirect
go.uber.org/mock v0.5.2 // indirect
+ go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap/exp v0.3.0 // indirect
go4.org v0.0.0-20230225012048-214862532bf5 // indirect
golang.org/x/net v0.43.0 // indirect
diff --git a/repo/fsrepo/migrations/fetcher.go b/repo/fsrepo/migrations/fetcher.go
index c81554c3c..cc48a3b77 100644
--- a/repo/fsrepo/migrations/fetcher.go
+++ b/repo/fsrepo/migrations/fetcher.go
@@ -2,11 +2,10 @@ package migrations
import (
"context"
+ "errors"
"fmt"
"io"
"os"
-
- "go.uber.org/multierr"
)
const (
@@ -49,23 +48,23 @@ func NewMultiFetcher(f ...Fetcher) *MultiFetcher {
// Fetch attempts to fetch the file at each of its fetchers until one succeeds.
func (f *MultiFetcher) Fetch(ctx context.Context, ipfsPath string) ([]byte, error) {
- var errs error
+ var errs []error
for _, fetcher := range f.fetchers {
out, err := fetcher.Fetch(ctx, ipfsPath)
if err == nil {
return out, nil
}
fmt.Printf("Error fetching: %s\n", err.Error())
- errs = multierr.Append(errs, err)
+ errs = append(errs, err)
}
- return nil, errs
+ return nil, errors.Join(errs...)
}
func (f *MultiFetcher) Close() error {
var errs error
for _, fetcher := range f.fetchers {
if err := fetcher.Close(); err != nil {
- errs = multierr.Append(errs, err)
+ errs = errors.Join(errs, err)
}
}
return errs
diff --git a/routing/composer.go b/routing/composer.go
index a100bb498..500fa371e 100644
--- a/routing/composer.go
+++ b/routing/composer.go
@@ -9,7 +9,6 @@ import (
"github.com/libp2p/go-libp2p/core/peer"
"github.com/libp2p/go-libp2p/core/routing"
"github.com/multiformats/go-multihash"
- "go.uber.org/multierr"
)
var (
@@ -124,7 +123,7 @@ func (c *Composer) Bootstrap(ctx context.Context) error {
errgv := c.GetValueRouter.Bootstrap(ctx)
errpv := c.PutValueRouter.Bootstrap(ctx)
errp := c.ProvideRouter.Bootstrap(ctx)
- err := multierr.Combine(errfp, errfps, errgv, errpv, errp)
+ err := errors.Join(errfp, errfps, errgv, errpv, errp)
if err != nil {
log.Debug("composer: calling bootstrap error: ", err)
}
From abe6d9da1361ee870d93640eab130bb94735bfb5 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 13 Aug 2025 02:24:18 -0700
Subject: [PATCH 320/499] chore(deps): bump actions/download-artifact from 4 to
5 (#10908)
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 4 to 5.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/v4...v5)
---
updated-dependencies:
- dependency-name: actions/download-artifact
dependency-version: '5'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
---
.github/workflows/interop.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/interop.yml b/.github/workflows/interop.yml
index af49f27f2..d27984063 100644
--- a/.github/workflows/interop.yml
+++ b/.github/workflows/interop.yml
@@ -56,7 +56,7 @@ jobs:
- uses: actions/setup-node@v4
with:
node-version: lts/*
- - uses: actions/download-artifact@v4
+ - uses: actions/download-artifact@v5
with:
name: kubo
path: cmd/ipfs
@@ -92,7 +92,7 @@ jobs:
- uses: actions/setup-node@v4
with:
node-version: 20.x
- - uses: actions/download-artifact@v4
+ - uses: actions/download-artifact@v5
with:
name: kubo
path: cmd/ipfs
From 8e5ef5503d2ae7a17b7c716d56b0f5bbeb47e851 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Thu, 14 Aug 2025 01:49:35 +0200
Subject: [PATCH 321/499] fix(ci): docker build (#10914)
* fix(ci): pass -buildvcs=false to go list in Makefile
Docker builds were failing because go list commands in mk/golang.mk
didn't inherit GOFLAGS from the environment, causing empty package
names when .git directory was incomplete.
This issue always existed but was masked until recent changes in
GitHub Actions runners or Docker golang image exposed it.
* fix(ci): use modern ENV key=value format in Dockerfile
Fixes Docker build deprecation warnings.
---
Dockerfile | 8 ++++----
mk/golang.mk | 4 ++--
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/Dockerfile b/Dockerfile
index d2924f2b7..310f97a93 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -2,7 +2,7 @@ FROM --platform=${BUILDPLATFORM:-linux/amd64} golang:1.24 AS builder
ARG TARGETOS TARGETARCH
-ENV SRC_DIR /kubo
+ENV SRC_DIR=/kubo
# Download packages first so they can be cached.
COPY go.mod go.sum $SRC_DIR/
@@ -47,7 +47,7 @@ RUN set -eux; \
FROM busybox:stable-glibc
# Get the ipfs binary, entrypoint script, and TLS CAs from the build container.
-ENV SRC_DIR /kubo
+ENV SRC_DIR=/kubo
COPY --from=utilities /usr/sbin/gosu /sbin/gosu
COPY --from=utilities /usr/bin/tini /sbin/tini
COPY --from=utilities /bin/fusermount /usr/local/bin/fusermount
@@ -74,7 +74,7 @@ EXPOSE 8080
EXPOSE 8081
# Create the fs-repo directory and switch to a non-privileged user.
-ENV IPFS_PATH /data/ipfs
+ENV IPFS_PATH=/data/ipfs
RUN mkdir -p $IPFS_PATH \
&& adduser -D -h $IPFS_PATH -u 1000 -G users ipfs \
&& chown ipfs:users $IPFS_PATH
@@ -93,7 +93,7 @@ RUN mkdir /container-init.d \
VOLUME $IPFS_PATH
# The default logging level
-ENV GOLOG_LOG_LEVEL ""
+ENV GOLOG_LOG_LEVEL=""
# This just makes sure that:
# 1. There's an fs-repo, and initializes one if there isn't.
diff --git a/mk/golang.mk b/mk/golang.mk
index 3b32a65f9..ce765a294 100644
--- a/mk/golang.mk
+++ b/mk/golang.mk
@@ -26,10 +26,10 @@ TEST_GO :=
TEST_GO_BUILD :=
CHECK_GO :=
-go-pkg-name=$(shell $(GOCC) list $(go-tags) github.com/ipfs/kubo/$(1))
+go-pkg-name=$(shell GOFLAGS=-buildvcs=false $(GOCC) list $(go-tags) github.com/ipfs/kubo/$(1))
go-main-name=$(notdir $(call go-pkg-name,$(1)))$(?exe)
go-curr-pkg-tgt=$(d)/$(call go-main-name,$(d))
-go-pkgs=$(shell $(GOCC) list github.com/ipfs/kubo/...)
+go-pkgs=$(shell GOFLAGS=-buildvcs=false $(GOCC) list github.com/ipfs/kubo/...)
go-tags=$(if $(GOTAGS), -tags="$(call join-with,$(space),$(GOTAGS))")
go-flags-with-tags=$(GOFLAGS)$(go-tags)
From 2b858bb3e6b4d0135a9f652bb4a60091ecd1f8bf Mon Sep 17 00:00:00 2001
From: Piotr Galar
Date: Thu, 14 Aug 2025 01:35:35 +0100
Subject: [PATCH 322/499] feat(ci): reusable spellcheck from unified CI
(#10873)
* ci: use spellcheck from unified CI
* chore: fix spelling
---------
Co-authored-by: Marcin Rataj
---
.codespell-ignore | 21 ----------------
.cspell.yml | 6 +++++
.github/workflows/spellcheck.yml | 29 ++++++++++-------------
config/bootstrap_peers_test.go | 2 +-
core/commands/cid.go | 2 +-
core/commands/stat_reprovide.go | 2 +-
core/coreiface/tests/pin.go | 4 ++--
core/node/core.go | 4 ++--
core/node/libp2p/addrs.go | 12 +++++-----
docs/changelogs/v0.10.md | 2 +-
docs/changelogs/v0.18.md | 2 +-
docs/changelogs/v0.2.md | 2 +-
docs/changelogs/v0.20.md | 2 +-
docs/changelogs/v0.21.md | 2 +-
docs/changelogs/v0.22.md | 2 +-
docs/changelogs/v0.31.md | 2 +-
docs/changelogs/v0.4.md | 2 +-
docs/changelogs/v0.8.md | 2 +-
docs/changelogs/v0.9.md | 2 +-
gc/gc.go | 6 ++---
repo/fsrepo/migrations/migrations_test.go | 2 +-
test/cli/swarm_test.go | 6 ++---
test/sharness/Rules.mk | 6 ++---
test/sharness/t0114-gateway-subdomains.sh | 2 +-
24 files changed, 53 insertions(+), 71 deletions(-)
delete mode 100644 .codespell-ignore
create mode 100644 .cspell.yml
diff --git a/.codespell-ignore b/.codespell-ignore
deleted file mode 100644
index 4b7efa7c0..000000000
--- a/.codespell-ignore
+++ /dev/null
@@ -1,21 +0,0 @@
-Adin
-nd
-Nd
-afile
-thirdparty
-receivedFrom
-origN
-hel
-TotalIn
-childs
-userA
-AssignT
-OT
-AssignT
-fo
-recusive
-raison
-Boddy
-ressource
-achin
-re-using
diff --git a/.cspell.yml b/.cspell.yml
new file mode 100644
index 000000000..da6c80196
--- /dev/null
+++ b/.cspell.yml
@@ -0,0 +1,6 @@
+ignoreWords:
+ - childs # This spelling is used in the files command
+ - NodeCreater # This spelling is used in the fuse dependency
+ - Boddy # One of the contributors to the project - Chris Boddy
+ - Botto # One of the contributors to the project - Santiago Botto
+ - cose # dag-cose
diff --git a/.github/workflows/spellcheck.yml b/.github/workflows/spellcheck.yml
index a34cc0798..4eda8b222 100644
--- a/.github/workflows/spellcheck.yml
+++ b/.github/workflows/spellcheck.yml
@@ -1,21 +1,18 @@
name: Spell Check
-on: [push, pull_request]
+on:
+ pull_request:
+ push:
+ branches: ["master"]
+ workflow_dispatch:
+
+permissions:
+ contents: read
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.event_name == 'push' && github.sha || github.ref }}
+ cancel-in-progress: true
jobs:
spellcheck:
- runs-on: ubuntu-latest
-
- steps:
- - name: Checkout code
- uses: actions/checkout@v4
-
- - name: Install Codespell
- run: pip install codespell==2.4.0
-
- - name: Run Codespell
- uses: codespell-project/actions-codespell@v2
- with:
- only_warn: 1
- ignore_words_file: .codespell-ignore
- skip: "*.mod,*.sum,*.pdf,./docs/AUTHORS,./test/sharness/t0275-cid-security-data,./test/sharness/t0280-plugin-dag-jose-data,./bin"
+ uses: ipdxco/unified-github-workflows/.github/workflows/reusable-spellcheck.yml@v1
diff --git a/config/bootstrap_peers_test.go b/config/bootstrap_peers_test.go
index eeea9b5fd..2d2b66045 100644
--- a/config/bootstrap_peers_test.go
+++ b/config/bootstrap_peers_test.go
@@ -5,7 +5,7 @@ import (
"testing"
)
-func TestBoostrapPeerStrings(t *testing.T) {
+func TestBootstrapPeerStrings(t *testing.T) {
parsed, err := ParseBootstrapPeers(DefaultBootstrapAddresses)
if err != nil {
t.Fatal(err)
diff --git a/core/commands/cid.go b/core/commands/cid.go
index a1660e509..0be9f6cc1 100644
--- a/core/commands/cid.go
+++ b/core/commands/cid.go
@@ -409,7 +409,7 @@ func (s multibaseSorter) Sort() {
if n := cmp.Compare(unicode.ToLower(rune(a.Code)), unicode.ToLower(rune(b.Code))); n != 0 {
return n
}
- // lowecase letters should come before uppercase
+ // lowercase letters should come before uppercase
return cmp.Compare(b.Code, a.Code)
})
}
diff --git a/core/commands/stat_reprovide.go b/core/commands/stat_reprovide.go
index 0e18ceedd..87893d1b5 100644
--- a/core/commands/stat_reprovide.go
+++ b/core/commands/stat_reprovide.go
@@ -10,7 +10,7 @@ var statReprovideCmd = &cmds.Command{
Tagline: "Deprecated command, use 'ipfs provide stat' instead.",
ShortDescription: `
'ipfs stats reprovide' is deprecated because provider stats are now
-available fomr 'ipfs provide stat'.
+available from 'ipfs provide stat'.
`,
},
Arguments: provideStatCmd.Arguments,
diff --git a/core/coreiface/tests/pin.go b/core/coreiface/tests/pin.go
index 4c606323f..18f90c051 100644
--- a/core/coreiface/tests/pin.go
+++ b/core/coreiface/tests/pin.go
@@ -433,7 +433,7 @@ func getThreeChainedNodes(t *testing.T, ctx context.Context, api iface.CoreAPI,
return immutablePathCidContainer{leaf}, parent, grandparent
}
-func assertPinTypes(t *testing.T, ctx context.Context, api iface.CoreAPI, recusive, direct, indirect []cidContainer) {
+func assertPinTypes(t *testing.T, ctx context.Context, api iface.CoreAPI, recursive, direct, indirect []cidContainer) {
assertPinLsAllConsistency(t, ctx, api)
list, err := accPins(ctx, api, opt.Pin.Ls.Recursive())
@@ -441,7 +441,7 @@ func assertPinTypes(t *testing.T, ctx context.Context, api iface.CoreAPI, recusi
t.Fatal(err)
}
- assertPinCids(t, list, recusive...)
+ assertPinCids(t, list, recursive...)
list, err = accPins(ctx, api, opt.Pin.Ls.Direct())
if err != nil {
diff --git a/core/node/core.go b/core/node/core.go
index 38e68f285..0a0ded89a 100644
--- a/core/node/core.go
+++ b/core/node/core.go
@@ -214,8 +214,8 @@ func Files(strategy string) func(mctx helpers.MetricsCtx, lc fx.Lifecycle, repo
return nil, err
}
- offineDag := merkledag.NewDAGService(blockservice.New(bs, offline.Exchange(bs)))
- rnd, err := offineDag.Get(ctx, c)
+ offlineDag := merkledag.NewDAGService(blockservice.New(bs, offline.Exchange(bs)))
+ rnd, err := offlineDag.Get(ctx, c)
if err != nil {
return nil, fmt.Errorf("error loading filesroot from dagservice: %s", err)
}
diff --git a/core/node/libp2p/addrs.go b/core/node/libp2p/addrs.go
index 91fae17c5..135b71d91 100644
--- a/core/node/libp2p/addrs.go
+++ b/core/node/libp2p/addrs.go
@@ -36,7 +36,7 @@ func AddrFilters(filters []string) func() (*ma.Filters, Libp2pOpts, error) {
}
}
-func makeAddrsFactory(announce []string, appendAnnouce []string, noAnnounce []string) (p2pbhost.AddrsFactory, error) {
+func makeAddrsFactory(announce []string, appendAnnounce []string, noAnnounce []string) (p2pbhost.AddrsFactory, error) {
var err error // To assign to the slice in the for loop
existing := make(map[string]bool) // To avoid duplicates
@@ -50,7 +50,7 @@ func makeAddrsFactory(announce []string, appendAnnouce []string, noAnnounce []st
}
var appendAnnAddrs []ma.Multiaddr
- for _, addr := range appendAnnouce {
+ for _, addr := range appendAnnounce {
if existing[addr] {
// skip AppendAnnounce that is on the Announce list already
continue
@@ -99,14 +99,14 @@ func makeAddrsFactory(announce []string, appendAnnouce []string, noAnnounce []st
}, nil
}
-func AddrsFactory(announce []string, appendAnnouce []string, noAnnounce []string) interface{} {
+func AddrsFactory(announce []string, appendAnnounce []string, noAnnounce []string) interface{} {
return func(params struct {
fx.In
ForgeMgr *p2pforge.P2PForgeCertMgr `optional:"true"`
},
) (opts Libp2pOpts, err error) {
var addrsFactory p2pbhost.AddrsFactory
- announceAddrsFactory, err := makeAddrsFactory(announce, appendAnnouce, noAnnounce)
+ announceAddrsFactory, err := makeAddrsFactory(announce, appendAnnounce, noAnnounce)
if err != nil {
return opts, err
}
@@ -115,8 +115,8 @@ func AddrsFactory(announce []string, appendAnnouce []string, noAnnounce []string
} else {
addrsFactory = func(multiaddrs []ma.Multiaddr) []ma.Multiaddr {
forgeProcessing := params.ForgeMgr.AddressFactory()(multiaddrs)
- annouceProcessing := announceAddrsFactory(forgeProcessing)
- return annouceProcessing
+ announceProcessing := announceAddrsFactory(forgeProcessing)
+ return announceProcessing
}
}
opts.Opts = append(opts.Opts, libp2p.AddrsFactory(addrsFactory))
diff --git a/docs/changelogs/v0.10.md b/docs/changelogs/v0.10.md
index 9a1d8b8af..429ff7d37 100644
--- a/docs/changelogs/v0.10.md
+++ b/docs/changelogs/v0.10.md
@@ -80,7 +80,7 @@ Performance profiles can now be collected using `ipfs diag profile`. If you need
#### ๐ Mac OS notarized binaries
-The go-ipfs and related migration binaries (for both Intel and Apple Sillicon) are now signed and notarized to make Mac OS installation easier.
+The go-ipfs and related migration binaries (for both Intel and Apple Silicon) are now signed and notarized to make Mac OS installation easier.
#### ๐จโ๐ฉโ๐ฆ Improved MDNS
diff --git a/docs/changelogs/v0.18.md b/docs/changelogs/v0.18.md
index 972ecb84e..70ce9ef24 100644
--- a/docs/changelogs/v0.18.md
+++ b/docs/changelogs/v0.18.md
@@ -629,7 +629,7 @@ and various improvements have been made to improve the UX including:
- feat: WithLocalPublication option to enable local only publishing on a topic (#481) ([libp2p/go-libp2p-pubsub#481](https://github.com/libp2p/go-libp2p-pubsub/pull/481))
- update pubsub deps (#491) ([libp2p/go-libp2p-pubsub#491](https://github.com/libp2p/go-libp2p-pubsub/pull/491))
- Gossipsub: Unsubscribe backoff (#488) ([libp2p/go-libp2p-pubsub#488](https://github.com/libp2p/go-libp2p-pubsub/pull/488))
- - Adds exponential backoff to re-spawing new streams for supposedly dead peers (#483) ([libp2p/go-libp2p-pubsub#483](https://github.com/libp2p/go-libp2p-pubsub/pull/483))
+ - Adds exponential backoff to re-spawning new streams for supposedly dead peers (#483) ([libp2p/go-libp2p-pubsub#483](https://github.com/libp2p/go-libp2p-pubsub/pull/483))
- Publishing option for signing a message with a custom private key (#486) ([libp2p/go-libp2p-pubsub#486](https://github.com/libp2p/go-libp2p-pubsub/pull/486))
- fix unused GossipSubHistoryGossip, make seenMessages ttl configurable, make score params SeenMsgTTL configurable
- Update README.md
diff --git a/docs/changelogs/v0.2.md b/docs/changelogs/v0.2.md
index 4e60221d5..4d42ea2f5 100644
--- a/docs/changelogs/v0.2.md
+++ b/docs/changelogs/v0.2.md
@@ -10,7 +10,7 @@
config file Bootstrap field changed accordingly. users
can upgrade cleanly with:
- ipfs bootstrap >boostrap_peers
+ ipfs bootstrap >bootstrap_peers
ipfs bootstrap rm --all
diff --git a/docs/changelogs/v0.20.md b/docs/changelogs/v0.20.md
index 3a6ce8f64..e26c0695d 100644
--- a/docs/changelogs/v0.20.md
+++ b/docs/changelogs/v0.20.md
@@ -471,7 +471,7 @@ You can read more about the rationale behind this decision on the [tracking issu
- identify: fix stale comment (#2179) ([libp2p/go-libp2p#2179](https://github.com/libp2p/go-libp2p/pull/2179))
- relay service: add metrics (#2154) ([libp2p/go-libp2p#2154](https://github.com/libp2p/go-libp2p/pull/2154))
- identify: Fix IdentifyWait when Connected events happen out of order (#2173) ([libp2p/go-libp2p#2173](https://github.com/libp2p/go-libp2p/pull/2173))
- - chore: fix ressource manager's README (#2168) ([libp2p/go-libp2p#2168](https://github.com/libp2p/go-libp2p/pull/2168))
+ - chore: fix resource manager's README (#2168) ([libp2p/go-libp2p#2168](https://github.com/libp2p/go-libp2p/pull/2168))
- relay: fix deadlock when closing (#2171) ([libp2p/go-libp2p#2171](https://github.com/libp2p/go-libp2p/pull/2171))
- core: remove LocalPrivateKey method from network.Conn interface (#2144) ([libp2p/go-libp2p#2144](https://github.com/libp2p/go-libp2p/pull/2144))
- routed host: return connection error instead of routing error (#2169) ([libp2p/go-libp2p#2169](https://github.com/libp2p/go-libp2p/pull/2169))
diff --git a/docs/changelogs/v0.21.md b/docs/changelogs/v0.21.md
index 569ea8f79..e8511d981 100644
--- a/docs/changelogs/v0.21.md
+++ b/docs/changelogs/v0.21.md
@@ -263,7 +263,7 @@ should be using AcceleratedDHTClient because they are falling behind.
- chore: release v0.24.0
- fix: don't add unresponsive DHT servers to the Routing Table (#820) ([libp2p/go-libp2p-kad-dht#820](https://github.com/libp2p/go-libp2p-kad-dht/pull/820))
- github.com/libp2p/go-libp2p-kbucket (v0.5.0 -> v0.6.3):
- - fix: fix abba bug in UsefullNewPeer ([libp2p/go-libp2p-kbucket#122](https://github.com/libp2p/go-libp2p-kbucket/pull/122))
+ - fix: fix abba bug in UsefulNewPeer ([libp2p/go-libp2p-kbucket#122](https://github.com/libp2p/go-libp2p-kbucket/pull/122))
- chore: release v0.6.2 ([libp2p/go-libp2p-kbucket#121](https://github.com/libp2p/go-libp2p-kbucket/pull/121))
- Replacing UsefulPeer() with UsefulNewPeer() ([libp2p/go-libp2p-kbucket#120](https://github.com/libp2p/go-libp2p-kbucket/pull/120))
- chore: release 0.6.1 ([libp2p/go-libp2p-kbucket#119](https://github.com/libp2p/go-libp2p-kbucket/pull/119))
diff --git a/docs/changelogs/v0.22.md b/docs/changelogs/v0.22.md
index 3aa55f30e..503c618fc 100644
--- a/docs/changelogs/v0.22.md
+++ b/docs/changelogs/v0.22.md
@@ -236,7 +236,7 @@ This includes a breaking change to `ipfs id` and some of the `ipfs swarm` comman
- chore: cleanup error handling in compparallel
- fix: correctly handle errors in compparallel
- fix: make the ProvideMany docs clearer
- - perf: remove goroutine that just waits before closing with a synchrous waitgroup
+ - perf: remove goroutine that just waits before closing with a synchronous waitgroup
- github.com/libp2p/go-nat (v0.1.0 -> v0.2.0):
- release v0.2.0 (#30) ([libp2p/go-nat#30](https://github.com/libp2p/go-nat/pull/30))
- update deps, use contexts on UPnP functions (#29) ([libp2p/go-nat#29](https://github.com/libp2p/go-nat/pull/29))
diff --git a/docs/changelogs/v0.31.md b/docs/changelogs/v0.31.md
index b20b15862..e055cc9f4 100644
--- a/docs/changelogs/v0.31.md
+++ b/docs/changelogs/v0.31.md
@@ -36,7 +36,7 @@ For a description of the available tuning parameters, see [kubo/docs/datastores.
We've notices users were applying `lowpower` profile, and then reporting content routing issues. This was because `lowpower` disabled reprovider system and locally hosted data was no longer announced on Amino DHT.
-This release changes [`lowpower` profile](https://github.com/ipfs/kubo/blob/master/docs/config.md#lowpower-profile) to not change reprovider settings, ensuring the new users are not sabotaging themselves. It also adds [`annouce-on`](https://github.com/ipfs/kubo/blob/master/docs/config.md#announce-on-profile) and [`announce-off`](https://github.com/ipfs/kubo/blob/master/docs/config.md#announce-off-profile) profiles for controlling announcement settings separately.
+This release changes [`lowpower` profile](https://github.com/ipfs/kubo/blob/master/docs/config.md#lowpower-profile) to not change reprovider settings, ensuring the new users are not sabotaging themselves. It also adds [`announce-on`](https://github.com/ipfs/kubo/blob/master/docs/config.md#announce-on-profile) and [`announce-off`](https://github.com/ipfs/kubo/blob/master/docs/config.md#announce-off-profile) profiles for controlling announcement settings separately.
> [!IMPORTANT]
> If you've ever applied the `lowpower` profile before, there is a high chance your node is not announcing to DHT anymore.
diff --git a/docs/changelogs/v0.4.md b/docs/changelogs/v0.4.md
index 3f2b9c358..de15c51dd 100644
--- a/docs/changelogs/v0.4.md
+++ b/docs/changelogs/v0.4.md
@@ -3255,7 +3255,7 @@ other requested improvements. See below for the full list of changes.
- Make sure all keystore keys get republished ([ipfs/go-ipfs#3951](https://github.com/ipfs/go-ipfs/pull/3951))
- Documentation
- Adding documentation on PubSub encodings ([ipfs/go-ipfs#3909](https://github.com/ipfs/go-ipfs/pull/3909))
- - Change 'neccessary' to 'necessary' ([ipfs/go-ipfs#3941](https://github.com/ipfs/go-ipfs/pull/3941))
+ - Change 'necessary' to 'necessary' ([ipfs/go-ipfs#3941](https://github.com/ipfs/go-ipfs/pull/3941))
- README.md: add Nix to the linux package managers ([ipfs/go-ipfs#3939](https://github.com/ipfs/go-ipfs/pull/3939))
- More verbose errors in filestore ([ipfs/go-ipfs#3964](https://github.com/ipfs/go-ipfs/pull/3964))
- Bug fixes
diff --git a/docs/changelogs/v0.8.md b/docs/changelogs/v0.8.md
index d9d42fa89..8b28ff706 100644
--- a/docs/changelogs/v0.8.md
+++ b/docs/changelogs/v0.8.md
@@ -26,7 +26,7 @@ ipfs pin remote service add myservice https://myservice.tld:1234/api/path myacce
ipfs pin remote add /ipfs/bafymydata --service=myservice --name=myfile
ipfs pin remote ls --service=myservice --name=myfile
ipfs pin remote ls --service=myservice --cid=bafymydata
-ipfs pin remote rm --serivce=myservice --name=myfile
+ipfs pin remote rm --service=myservice --name=myfile
```
A few notes:
diff --git a/docs/changelogs/v0.9.md b/docs/changelogs/v0.9.md
index 64b94e97e..c0dba5abd 100644
--- a/docs/changelogs/v0.9.md
+++ b/docs/changelogs/v0.9.md
@@ -337,7 +337,7 @@ SECIO was deprecated and turned off by default given the prevalence of TLS and N
- schema/gen/go: please vet a bit more
- Introduce 'quip' data building helpers. ([ipld/go-ipld-prime#134](https://github.com/ipld/go-ipld-prime/pull/134))
- gengo: support for unions with stringprefix representation. ([ipld/go-ipld-prime#133](https://github.com/ipld/go-ipld-prime/pull/133))
- - target of opporunity DRY improvement: use more shared templates for structs with stringjoin representations.
+ - target of opportunity DRY improvement: use more shared templates for structs with stringjoin representations.
- fix small consistency typo in gen function names.
- drop old generation mechanisms that were already deprecated.
- error type cleanup, and helpers.
diff --git a/gc/gc.go b/gc/gc.go
index 37daa887c..1d4805a66 100644
--- a/gc/gc.go
+++ b/gc/gc.go
@@ -81,7 +81,7 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, dstor dstore.Datastore, pn
return
}
- keychan, err := bs.AllKeysChan(ctx)
+ keychain, err := bs.AllKeysChan(ctx)
if err != nil {
select {
case output <- Result{Error: err}:
@@ -96,11 +96,11 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, dstor dstore.Datastore, pn
loop:
for ctx.Err() == nil { // select may not notice that we're "done".
select {
- case k, ok := <-keychan:
+ case k, ok := <-keychain:
if !ok {
break loop
}
- // NOTE: assumes that all CIDs returned by the keychan are _raw_ CIDv1 CIDs.
+ // NOTE: assumes that all CIDs returned by the keychain are _raw_ CIDv1 CIDs.
// This means we keep the block as long as we want it somewhere (CIDv1, CIDv0, Raw, other...).
if !gcs.Has(k) {
err := bs.DeleteBlock(ctx, k)
diff --git a/repo/fsrepo/migrations/migrations_test.go b/repo/fsrepo/migrations/migrations_test.go
index 96370f864..ff5e2bfe0 100644
--- a/repo/fsrepo/migrations/migrations_test.go
+++ b/repo/fsrepo/migrations/migrations_test.go
@@ -169,7 +169,7 @@ func TestRunMigrations(t *testing.T) {
err = RunMigration(ctx, fetcher, targetVer, fakeIpfs, false)
if err == nil || !strings.HasPrefix(err.Error(), "downgrade not allowed") {
- t.Fatal("expected 'downgrade not alloed' error")
+ t.Fatal("expected 'downgrade not allowed' error")
}
err = RunMigration(ctx, fetcher, targetVer, fakeIpfs, true)
diff --git a/test/cli/swarm_test.go b/test/cli/swarm_test.go
index ecb668362..88f5f403b 100644
--- a/test/cli/swarm_test.go
+++ b/test/cli/swarm_test.go
@@ -50,7 +50,7 @@ func TestSwarm(t *testing.T) {
actualID := output.Peers[0].Identify.ID
actualPublicKey := output.Peers[0].Identify.PublicKey
actualAgentVersion := output.Peers[0].Identify.AgentVersion
- actualAdresses := output.Peers[0].Identify.Addresses
+ actualAddresses := output.Peers[0].Identify.Addresses
actualProtocols := output.Peers[0].Identify.Protocols
expectedID := otherNode.PeerID().String()
@@ -59,8 +59,8 @@ func TestSwarm(t *testing.T) {
assert.Equal(t, actualID, expectedID)
assert.NotNil(t, actualPublicKey)
assert.NotNil(t, actualAgentVersion)
- assert.Len(t, actualAdresses, 1)
- assert.Equal(t, expectedAddresses[0], actualAdresses[0])
+ assert.Len(t, actualAddresses, 1)
+ assert.Equal(t, expectedAddresses[0], actualAddresses[0])
assert.Greater(t, len(actualProtocols), 0)
})
diff --git a/test/sharness/Rules.mk b/test/sharness/Rules.mk
index 2f2e076ba..0ac3cf950 100644
--- a/test/sharness/Rules.mk
+++ b/test/sharness/Rules.mk
@@ -14,10 +14,10 @@ DEPS_$(d) += $(SHARNESS_$(d))
ifeq ($(OS),Linux)
PLUGINS_DIR_$(d) := $(d)/plugins/
-ORGIN_PLUGINS_$(d) := $(plugin/plugins_plugins_so)
-PLUGINS_$(d) := $(addprefix $(PLUGINS_DIR_$(d)),$(notdir $(ORGIN_PLUGINS_$(d))))
+ORIGIN_PLUGINS_$(d) := $(plugin/plugins_plugins_so)
+PLUGINS_$(d) := $(addprefix $(PLUGINS_DIR_$(d)),$(notdir $(ORIGIN_PLUGINS_$(d))))
-$(PLUGINS_$(d)): $(ORGIN_PLUGINS_$(d))
+$(PLUGINS_$(d)): $(ORIGIN_PLUGINS_$(d))
@mkdir -p $(@D)
cp -f plugin/plugins/$(@F) $@
diff --git a/test/sharness/t0114-gateway-subdomains.sh b/test/sharness/t0114-gateway-subdomains.sh
index 7d18ab265..ae1bc1a93 100755
--- a/test/sharness/t0114-gateway-subdomains.sh
+++ b/test/sharness/t0114-gateway-subdomains.sh
@@ -802,7 +802,7 @@ test_expect_success "request for http://fake.domain.com/ipfs/{CID} with X-Forwar
# Kubo specific end-to-end test
# (independent of gateway-conformance)
-# test configuration beign wired up correctly end-to-end
+# test configuration being wired up correctly end-to-end
## ============================================================================
## Test support for wildcards in gateway config
From 501b1f8bc35f226122b51c1888d04fa27de97a9c Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Wed, 13 Aug 2025 18:01:50 -0700
Subject: [PATCH 323/499] feat: require go1.25 for building kubo (#10913)
* Require go1.25 for building kubo
* update Dockerfile to fix warnings
---
.github/workflows/codeql-analysis.yml | 2 +-
.github/workflows/docker-build.yml | 2 +-
.github/workflows/gateway-conformance.yml | 4 +-
.github/workflows/gobuild.yml | 2 +-
.github/workflows/golang-analysis.yml | 2 +-
.github/workflows/golint.yml | 2 +-
.github/workflows/gotest.yml | 2 +-
.github/workflows/interop.yml | 2 +-
.github/workflows/sharness.yml | 2 +-
Dockerfile | 2 +-
docs/changelogs/v0.37.md | 1 +
docs/examples/kubo-as-a-library/go.mod | 2 +-
go.mod | 2 +-
mk/golang.mk | 2 +-
test/dependencies/go.mod | 171 ++++-----
test/dependencies/go.sum | 406 ++++++++++------------
16 files changed, 290 insertions(+), 316 deletions(-)
diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
index 4bc3665b6..28aaccf43 100644
--- a/.github/workflows/codeql-analysis.yml
+++ b/.github/workflows/codeql-analysis.yml
@@ -34,7 +34,7 @@ jobs:
- name: Setup Go
uses: actions/setup-go@v5
with:
- go-version: 1.24.x
+ go-version: 1.25.x
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml
index 180f37963..89d7efe3f 100644
--- a/.github/workflows/docker-build.yml
+++ b/.github/workflows/docker-build.yml
@@ -28,7 +28,7 @@ jobs:
steps:
- uses: actions/setup-go@v5
with:
- go-version: 1.24.x
+ go-version: 1.25.x
- uses: actions/checkout@v4
- run: docker build -t $IMAGE_NAME:$WIP_IMAGE_TAG .
- run: docker run --rm $IMAGE_NAME:$WIP_IMAGE_TAG --version
diff --git a/.github/workflows/gateway-conformance.yml b/.github/workflows/gateway-conformance.yml
index b305a8fc7..697b32192 100644
--- a/.github/workflows/gateway-conformance.yml
+++ b/.github/workflows/gateway-conformance.yml
@@ -49,7 +49,7 @@ jobs:
- name: Setup Go
uses: actions/setup-go@v5
with:
- go-version: 1.24.x
+ go-version: 1.25.x
- uses: protocol/cache-go-action@v1
with:
name: ${{ github.job }}
@@ -136,7 +136,7 @@ jobs:
- name: Setup Go
uses: actions/setup-go@v5
with:
- go-version: 1.24.x
+ go-version: 1.25.x
- uses: protocol/cache-go-action@v1
with:
name: ${{ github.job }}
diff --git a/.github/workflows/gobuild.yml b/.github/workflows/gobuild.yml
index 32cefb4c1..e75275011 100644
--- a/.github/workflows/gobuild.yml
+++ b/.github/workflows/gobuild.yml
@@ -30,7 +30,7 @@ jobs:
steps:
- uses: actions/setup-go@v5
with:
- go-version: 1.24.x
+ go-version: 1.25.x
- uses: actions/checkout@v4
- run: make cmd/ipfs-try-build
env:
diff --git a/.github/workflows/golang-analysis.yml b/.github/workflows/golang-analysis.yml
index aef635845..71067b9f6 100644
--- a/.github/workflows/golang-analysis.yml
+++ b/.github/workflows/golang-analysis.yml
@@ -27,7 +27,7 @@ jobs:
submodules: recursive
- uses: actions/setup-go@v5
with:
- go-version: "1.24.x"
+ go-version: "1.25.x"
- name: Check that go.mod is tidy
uses: protocol/multiple-go-modules@v1.4
with:
diff --git a/.github/workflows/golint.yml b/.github/workflows/golint.yml
index 5f6e0bb20..de4aac792 100644
--- a/.github/workflows/golint.yml
+++ b/.github/workflows/golint.yml
@@ -31,6 +31,6 @@ jobs:
steps:
- uses: actions/setup-go@v5
with:
- go-version: 1.24.x
+ go-version: 1.25.x
- uses: actions/checkout@v4
- run: make -O test_go_lint
diff --git a/.github/workflows/gotest.yml b/.github/workflows/gotest.yml
index a5eb4ac8d..afa3357b8 100644
--- a/.github/workflows/gotest.yml
+++ b/.github/workflows/gotest.yml
@@ -32,7 +32,7 @@ jobs:
- name: Set up Go
uses: actions/setup-go@v5
with:
- go-version: 1.24.x
+ go-version: 1.25.x
- name: Check out Kubo
uses: actions/checkout@v4
- name: Install missing tools
diff --git a/.github/workflows/interop.yml b/.github/workflows/interop.yml
index d27984063..5fb3a5817 100644
--- a/.github/workflows/interop.yml
+++ b/.github/workflows/interop.yml
@@ -10,7 +10,7 @@ on:
- 'master'
env:
- GO_VERSION: 1.24.x
+ GO_VERSION: 1.25.x
concurrency:
group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.event_name == 'push' && github.sha || github.ref }}
diff --git a/.github/workflows/sharness.yml b/.github/workflows/sharness.yml
index 62725e9b4..6ee3c4c45 100644
--- a/.github/workflows/sharness.yml
+++ b/.github/workflows/sharness.yml
@@ -25,7 +25,7 @@ jobs:
- name: Setup Go
uses: actions/setup-go@v5
with:
- go-version: 1.24.x
+ go-version: 1.25.x
- name: Checkout Kubo
uses: actions/checkout@v4
with:
diff --git a/Dockerfile b/Dockerfile
index 310f97a93..de66c7867 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
-FROM --platform=${BUILDPLATFORM:-linux/amd64} golang:1.24 AS builder
+FROM --platform=${BUILDPLATFORM:-linux/amd64} golang:1.25 AS builder
ARG TARGETOS TARGETARCH
diff --git a/docs/changelogs/v0.37.md b/docs/changelogs/v0.37.md
index 165d30a59..84f6637bd 100644
--- a/docs/changelogs/v0.37.md
+++ b/docs/changelogs/v0.37.md
@@ -122,6 +122,7 @@ AutoRelay's relay discovery now includes all connected peers as potential relay
- update `p2p-forge/client` to [v0.6.1](https://github.com/ipshipyard/p2p-forge/releases/tag/v0.6.1)
- update `boxo` to [v0.33.1](https://github.com/ipfs/boxo/releases/tag/v0.33.1)
- update `ipfs-webui` to [v4.8.0](https://github.com/ipfs/ipfs-webui/releases/tag/v4.8.0)
+- update to [Go 1.25](https://go.dev/doc/go1.25)
### ๐ Changelog
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index 00ce3d806..18da5bf01 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -1,6 +1,6 @@
module github.com/ipfs/kubo/examples/kubo-as-a-library
-go 1.24
+go 1.25
// Used to keep this in sync with the current version of kubo. You should remove
// this if you copy this example.
diff --git a/go.mod b/go.mod
index 8dc71c2da..9231b344c 100644
--- a/go.mod
+++ b/go.mod
@@ -1,6 +1,6 @@
module github.com/ipfs/kubo
-go 1.24
+go 1.25
require (
bazil.org/fuse v0.0.0-20200117225306-7b5117fecadc
diff --git a/mk/golang.mk b/mk/golang.mk
index ce765a294..5f691bc85 100644
--- a/mk/golang.mk
+++ b/mk/golang.mk
@@ -1,5 +1,5 @@
# golang utilities
-GO_MIN_VERSION = 1.18
+GO_MIN_VERSION = 1.25
export GO111MODULE=on
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index 19571aff4..590ec5bac 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -1,12 +1,12 @@
module github.com/ipfs/kubo/test/dependencies
-go 1.24
+go 1.25
replace github.com/ipfs/kubo => ../../
require (
github.com/Kubuxu/gocovmerge v0.0.0-20161216165753-7ecaa51963cd
- github.com/golangci/golangci-lint v1.60.2
+ github.com/golangci/golangci-lint v1.64.8
github.com/ipfs/go-cidutil v0.1.0
github.com/ipfs/go-log/v2 v2.8.0
github.com/ipfs/go-test v0.2.2
@@ -15,50 +15,51 @@ require (
github.com/ipfs/iptb-plugins v0.5.1
github.com/multiformats/go-multiaddr v0.16.1
github.com/multiformats/go-multihash v0.2.3
- gotest.tools/gotestsum v1.12.0
+ gotest.tools/gotestsum v1.12.3
)
require (
- 4d63.com/gocheckcompilerdirectives v1.2.1 // indirect
- 4d63.com/gochecknoglobals v0.2.1 // indirect
- github.com/4meepo/tagalign v1.3.4 // indirect
- github.com/Abirdcfly/dupword v0.0.14 // indirect
- github.com/Antonboom/errname v0.1.13 // indirect
- github.com/Antonboom/nilnil v0.1.9 // indirect
- github.com/Antonboom/testifylint v1.4.3 // indirect
+ 4d63.com/gocheckcompilerdirectives v1.3.0 // indirect
+ 4d63.com/gochecknoglobals v0.2.2 // indirect
+ github.com/4meepo/tagalign v1.4.2 // indirect
+ github.com/Abirdcfly/dupword v0.1.3 // indirect
+ github.com/Antonboom/errname v1.0.0 // indirect
+ github.com/Antonboom/nilnil v1.0.1 // indirect
+ github.com/Antonboom/testifylint v1.5.2 // indirect
github.com/BurntSushi/toml v1.4.1-0.20240526193622-a339e1f7089c // indirect
- github.com/Crocmagnon/fatcontext v0.4.0 // indirect
+ github.com/Crocmagnon/fatcontext v0.7.1 // indirect
github.com/DataDog/zstd v1.5.6-0.20230824185856-869dae002e5e // indirect
github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 // indirect
- github.com/GaijinEntertainment/go-exhaustruct/v3 v3.3.0 // indirect
+ github.com/GaijinEntertainment/go-exhaustruct/v3 v3.3.1 // indirect
github.com/Jorropo/jsync v1.0.1 // indirect
- github.com/Masterminds/semver/v3 v3.2.1 // indirect
- github.com/OpenPeeDeeP/depguard/v2 v2.2.0 // indirect
- github.com/alecthomas/go-check-sumtype v0.1.4 // indirect
+ github.com/Masterminds/semver/v3 v3.3.0 // indirect
+ github.com/OpenPeeDeeP/depguard/v2 v2.2.1 // indirect
+ github.com/alecthomas/go-check-sumtype v0.3.1 // indirect
github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b // indirect
- github.com/alexkohler/nakedret/v2 v2.0.4 // indirect
+ github.com/alexkohler/nakedret/v2 v2.0.5 // indirect
github.com/alexkohler/prealloc v1.0.0 // indirect
github.com/alingse/asasalint v0.0.11 // indirect
+ github.com/alingse/nilnesserr v0.1.2 // indirect
github.com/ashanbrown/forbidigo v1.6.0 // indirect
- github.com/ashanbrown/makezero v1.1.1 // indirect
+ github.com/ashanbrown/makezero v1.2.0 // indirect
github.com/benbjohnson/clock v1.3.5 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/bitfield/gotestdox v0.2.2 // indirect
- github.com/bkielbasa/cyclop v1.2.1 // indirect
+ github.com/bkielbasa/cyclop v1.2.3 // indirect
github.com/blizzy78/varnamelen v0.8.0 // indirect
- github.com/bombsimon/wsl/v4 v4.4.1 // indirect
- github.com/breml/bidichk v0.2.7 // indirect
- github.com/breml/errchkjson v0.3.6 // indirect
- github.com/butuzov/ireturn v0.3.0 // indirect
- github.com/butuzov/mirror v1.2.0 // indirect
+ github.com/bombsimon/wsl/v4 v4.5.0 // indirect
+ github.com/breml/bidichk v0.3.2 // indirect
+ github.com/breml/errchkjson v0.4.0 // indirect
+ github.com/butuzov/ireturn v0.3.1 // indirect
+ github.com/butuzov/mirror v1.3.0 // indirect
github.com/caddyserver/certmagic v0.23.0 // indirect
github.com/caddyserver/zerossl v0.1.3 // indirect
- github.com/catenacyber/perfsprint v0.7.1 // indirect
+ github.com/catenacyber/perfsprint v0.8.2 // indirect
github.com/ccojocar/zxcvbn-go v1.0.2 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/charithe/durationcheck v0.0.10 // indirect
github.com/chavacava/garif v0.1.0 // indirect
- github.com/ckaznocha/intrange v0.1.2 // indirect
+ github.com/ckaznocha/intrange v0.3.0 // indirect
github.com/cockroachdb/crlib v0.0.0-20241015224233-894974b3ad94 // indirect
github.com/cockroachdb/errors v1.11.3 // indirect
github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect
@@ -67,10 +68,10 @@ require (
github.com/cockroachdb/redact v1.1.5 // indirect
github.com/cockroachdb/swiss v0.0.0-20250624142022-d6e517c1d961 // indirect
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect
- github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect
+ github.com/cpuguy83/go-md2man/v2 v2.0.6 // indirect
github.com/crackcomm/go-gitignore v0.0.0-20241020182519-7843d2ba8fdf // indirect
- github.com/curioswitch/go-reassign v0.2.0 // indirect
- github.com/daixiang0/gci v0.13.4 // indirect
+ github.com/curioswitch/go-reassign v0.3.0 // indirect
+ github.com/daixiang0/gci v0.13.5 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 // indirect
@@ -78,18 +79,18 @@ require (
github.com/dnephin/pflag v1.0.7 // indirect
github.com/ettle/strcase v0.2.0 // indirect
github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5 // indirect
- github.com/fatih/color v1.17.0 // indirect
+ github.com/fatih/color v1.18.0 // indirect
github.com/fatih/structtag v1.2.0 // indirect
github.com/filecoin-project/go-clock v0.1.0 // indirect
github.com/firefart/nonamedreturns v1.0.5 // indirect
github.com/flynn/noise v1.1.0 // indirect
github.com/francoispqt/gojay v1.2.13 // indirect
- github.com/fsnotify/fsnotify v1.7.0 // indirect
+ github.com/fsnotify/fsnotify v1.8.0 // indirect
github.com/fzipp/gocyclo v0.6.0 // indirect
github.com/gammazero/deque v1.0.0 // indirect
github.com/getsentry/sentry-go v0.27.0 // indirect
- github.com/ghostiam/protogetter v0.3.6 // indirect
- github.com/go-critic/go-critic v0.11.4 // indirect
+ github.com/ghostiam/protogetter v0.3.9 // indirect
+ github.com/go-critic/go-critic v0.12.0 // indirect
github.com/go-logr/logr v1.4.3 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-toolsmith/astcast v1.1.0 // indirect
@@ -99,18 +100,18 @@ require (
github.com/go-toolsmith/astp v1.1.0 // indirect
github.com/go-toolsmith/strparse v1.1.0 // indirect
github.com/go-toolsmith/typep v1.1.0 // indirect
- github.com/go-viper/mapstructure/v2 v2.0.0 // indirect
- github.com/go-xmlfmt/xmlfmt v1.1.2 // indirect
+ github.com/go-viper/mapstructure/v2 v2.2.1 // indirect
+ github.com/go-xmlfmt/xmlfmt v1.1.3 // indirect
github.com/gobwas/glob v0.2.3 // indirect
github.com/gofrs/flock v0.12.1 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/snappy v0.0.5-0.20231225225746-43d5d4cd4e0e // indirect
- github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a // indirect
- github.com/golangci/gofmt v0.0.0-20240816233607-d8596aa466a9 // indirect
+ github.com/golangci/dupl v0.0.0-20250308024227-f665c8d69b32 // indirect
+ github.com/golangci/go-printf-func-name v0.1.0 // indirect
+ github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d // indirect
github.com/golangci/misspell v0.6.0 // indirect
- github.com/golangci/modinfo v0.3.4 // indirect
github.com/golangci/plugin-module-register v0.1.1 // indirect
- github.com/golangci/revgrep v0.5.3 // indirect
+ github.com/golangci/revgrep v0.8.0 // indirect
github.com/golangci/unconvert v0.0.0-20240309020433-c5143eacb3ed // indirect
github.com/google/go-cmp v0.7.0 // indirect
github.com/google/gopacket v1.1.19 // indirect
@@ -118,9 +119,10 @@ require (
github.com/google/uuid v1.6.0 // indirect
github.com/gordonklaus/ineffassign v0.1.0 // indirect
github.com/gostaticanalysis/analysisutil v0.7.1 // indirect
- github.com/gostaticanalysis/comment v1.4.2 // indirect
- github.com/gostaticanalysis/forcetypeassert v0.1.0 // indirect
+ github.com/gostaticanalysis/comment v1.5.0 // indirect
+ github.com/gostaticanalysis/forcetypeassert v0.2.0 // indirect
github.com/gostaticanalysis/nilerr v0.1.1 // indirect
+ github.com/hashicorp/go-immutable-radix/v2 v2.1.0 // indirect
github.com/hashicorp/go-version v1.7.0 // indirect
github.com/hashicorp/golang-lru v1.0.2 // indirect
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
@@ -145,12 +147,11 @@ require (
github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect
github.com/jgautheron/goconst v1.7.1 // indirect
github.com/jingyugao/rowserrcheck v1.1.1 // indirect
- github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af // indirect
- github.com/jjti/go-spancheck v0.6.2 // indirect
- github.com/julz/importas v0.1.0 // indirect
- github.com/karamaru-alpha/copyloopvar v1.1.0 // indirect
- github.com/kisielk/errcheck v1.7.0 // indirect
- github.com/kkHAIKE/contextcheck v1.1.5 // indirect
+ github.com/jjti/go-spancheck v0.6.4 // indirect
+ github.com/julz/importas v0.2.0 // indirect
+ github.com/karamaru-alpha/copyloopvar v1.2.1 // indirect
+ github.com/kisielk/errcheck v1.9.0 // indirect
+ github.com/kkHAIKE/contextcheck v1.1.6 // indirect
github.com/klauspost/compress v1.18.0 // indirect
github.com/klauspost/cpuid/v2 v2.3.0 // indirect
github.com/koron/go-ssdp v0.0.6 // indirect
@@ -158,10 +159,12 @@ require (
github.com/kr/text v0.2.0 // indirect
github.com/kulti/thelper v0.6.3 // indirect
github.com/kunwardeep/paralleltest v1.0.10 // indirect
- github.com/kyoh86/exportloopref v0.1.11 // indirect
- github.com/lasiar/canonicalheader v1.1.1 // indirect
- github.com/ldez/gomoddirectives v0.2.4 // indirect
- github.com/ldez/tagliatelle v0.5.0 // indirect
+ github.com/lasiar/canonicalheader v1.1.2 // indirect
+ github.com/ldez/exptostd v0.4.2 // indirect
+ github.com/ldez/gomoddirectives v0.6.1 // indirect
+ github.com/ldez/grignotin v0.9.0 // indirect
+ github.com/ldez/tagliatelle v0.7.1 // indirect
+ github.com/ldez/usetesting v0.4.2 // indirect
github.com/leonklingele/grouper v1.1.2 // indirect
github.com/libdns/libdns v1.0.0-beta.1 // indirect
github.com/libp2p/go-buffer-pool v0.1.0 // indirect
@@ -176,17 +179,16 @@ require (
github.com/libp2p/go-msgio v0.3.0 // indirect
github.com/libp2p/go-netroute v0.2.2 // indirect
github.com/libp2p/go-reuseport v0.4.0 // indirect
- github.com/lufeee/execinquery v1.2.1 // indirect
github.com/macabu/inamedparam v0.1.3 // indirect
github.com/magiconair/properties v1.8.7 // indirect
github.com/maratori/testableexamples v1.0.0 // indirect
github.com/maratori/testpackage v1.1.1 // indirect
- github.com/matoous/godox v0.0.0-20240105082147-c5b5e0e7c0c0 // indirect
- github.com/mattn/go-colorable v0.1.13 // indirect
+ github.com/matoous/godox v1.1.0 // indirect
+ github.com/mattn/go-colorable v0.1.14 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
- github.com/mattn/go-runewidth v0.0.15 // indirect
+ github.com/mattn/go-runewidth v0.0.16 // indirect
github.com/mattn/go-shellwords v1.0.12 // indirect
- github.com/mgechev/revive v1.3.9 // indirect
+ github.com/mgechev/revive v1.7.0 // indirect
github.com/mholt/acmez/v3 v3.1.2 // indirect
github.com/miekg/dns v1.1.68 // indirect
github.com/minio/sha256-simd v1.0.1 // indirect
@@ -206,10 +208,10 @@ require (
github.com/nakabonne/nestif v0.3.1 // indirect
github.com/nishanths/exhaustive v0.12.0 // indirect
github.com/nishanths/predeclared v0.2.2 // indirect
- github.com/nunnatsa/ginkgolinter v0.16.2 // indirect
+ github.com/nunnatsa/ginkgolinter v0.19.1 // indirect
github.com/olekukonko/tablewriter v0.0.5 // indirect
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect
- github.com/pelletier/go-toml/v2 v2.2.2 // indirect
+ github.com/pelletier/go-toml/v2 v2.2.3 // indirect
github.com/pion/datachannel v1.5.10 // indirect
github.com/pion/dtls/v2 v2.2.12 // indirect
github.com/pion/dtls/v3 v3.0.6 // indirect
@@ -232,12 +234,12 @@ require (
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/polydawn/refmt v0.89.0 // indirect
- github.com/polyfloyd/go-errorlint v1.6.0 // indirect
+ github.com/polyfloyd/go-errorlint v1.7.1 // indirect
github.com/prometheus/client_golang v1.23.0 // indirect
github.com/prometheus/client_model v0.6.2 // indirect
github.com/prometheus/common v0.65.0 // indirect
github.com/prometheus/procfs v0.17.0 // indirect
- github.com/quasilyte/go-ruleguard v0.4.2 // indirect
+ github.com/quasilyte/go-ruleguard v0.4.3-0.20240823090925-0fe6f58b47b1 // indirect
github.com/quasilyte/go-ruleguard/dsl v0.3.22 // indirect
github.com/quasilyte/gogrep v0.5.0 // indirect
github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 // indirect
@@ -245,46 +247,47 @@ require (
github.com/quic-go/qpack v0.5.1 // indirect
github.com/quic-go/quic-go v0.54.0 // indirect
github.com/quic-go/webtransport-go v0.9.0 // indirect
+ github.com/raeperd/recvcheck v0.2.0 // indirect
github.com/rivo/uniseg v0.4.7 // indirect
- github.com/rogpeppe/go-internal v1.13.1 // indirect
+ github.com/rogpeppe/go-internal v1.14.1 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
- github.com/ryancurrah/gomodguard v1.3.3 // indirect
+ github.com/ryancurrah/gomodguard v1.3.5 // indirect
github.com/ryanrolds/sqlclosecheck v0.5.1 // indirect
github.com/sagikazarmark/locafero v0.6.0 // indirect
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
- github.com/sanposhiho/wastedassign/v2 v2.0.7 // indirect
- github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 // indirect
+ github.com/sanposhiho/wastedassign/v2 v2.1.0 // indirect
+ github.com/santhosh-tekuri/jsonschema/v6 v6.0.1 // indirect
github.com/sashamelentyev/interfacebloat v1.1.0 // indirect
- github.com/sashamelentyev/usestdlibvars v1.27.0 // indirect
- github.com/securego/gosec/v2 v2.20.1-0.20240820084340-81cda2f91fbe // indirect
- github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c // indirect
+ github.com/sashamelentyev/usestdlibvars v1.28.0 // indirect
+ github.com/securego/gosec/v2 v2.22.2 // indirect
github.com/sirupsen/logrus v1.9.3 // indirect
github.com/sivchari/containedctx v1.0.3 // indirect
- github.com/sivchari/tenv v1.10.0 // indirect
- github.com/sonatard/noctx v0.0.2 // indirect
+ github.com/sivchari/tenv v1.12.1 // indirect
+ github.com/sonatard/noctx v0.1.0 // indirect
github.com/sourcegraph/conc v0.3.0 // indirect
github.com/sourcegraph/go-diff v0.7.0 // indirect
github.com/spaolacci/murmur3 v1.1.0 // indirect
- github.com/spf13/afero v1.11.0 // indirect
+ github.com/spf13/afero v1.12.0 // indirect
github.com/spf13/cast v1.6.0 // indirect
- github.com/spf13/cobra v1.8.1 // indirect
- github.com/spf13/pflag v1.0.5 // indirect
+ github.com/spf13/cobra v1.9.1 // indirect
+ github.com/spf13/pflag v1.0.6 // indirect
github.com/spf13/viper v1.19.0 // indirect
github.com/ssgreg/nlreturn/v2 v2.2.1 // indirect
- github.com/stbenjam/no-sprintf-host-port v0.1.1 // indirect
+ github.com/stbenjam/no-sprintf-host-port v0.2.0 // indirect
github.com/stretchr/objx v0.5.2 // indirect
github.com/stretchr/testify v1.10.0 // indirect
github.com/subosito/gotenv v1.6.0 // indirect
- github.com/tdakkota/asciicheck v0.2.0 // indirect
- github.com/tetafro/godot v1.4.16 // indirect
- github.com/timakin/bodyclose v0.0.0-20240125160201-f835fa56326a // indirect
- github.com/timonwong/loggercheck v0.9.4 // indirect
- github.com/tomarrell/wrapcheck/v2 v2.9.0 // indirect
+ github.com/tdakkota/asciicheck v0.4.1 // indirect
+ github.com/tetafro/godot v1.5.0 // indirect
+ github.com/timakin/bodyclose v0.0.0-20241017074812-ed6a65f985e3 // indirect
+ github.com/timonwong/loggercheck v0.10.1 // indirect
+ github.com/tomarrell/wrapcheck/v2 v2.10.0 // indirect
github.com/tommy-muehle/go-mnd/v2 v2.5.1 // indirect
- github.com/ultraware/funlen v0.1.0 // indirect
- github.com/ultraware/whitespace v0.1.1 // indirect
+ github.com/ultraware/funlen v0.2.0 // indirect
+ github.com/ultraware/whitespace v0.2.0 // indirect
github.com/urfave/cli v1.22.16 // indirect
- github.com/uudashr/gocognit v1.1.3 // indirect
+ github.com/uudashr/gocognit v1.2.0 // indirect
+ github.com/uudashr/iface v1.3.1 // indirect
github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc // indirect
github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f // indirect
github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 // indirect
@@ -295,8 +298,8 @@ require (
github.com/ykadowak/zerologlint v0.1.5 // indirect
github.com/zeebo/blake3 v0.2.4 // indirect
gitlab.com/bosi/decorder v0.4.2 // indirect
- go-simpler.org/musttag v0.12.2 // indirect
- go-simpler.org/sloglint v0.7.2 // indirect
+ go-simpler.org/musttag v0.13.0 // indirect
+ go-simpler.org/sloglint v0.9.0 // indirect
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
go.opentelemetry.io/otel v1.37.0 // indirect
go.opentelemetry.io/otel/metric v1.37.0 // indirect
@@ -310,7 +313,7 @@ require (
go.uber.org/zap/exp v0.3.0 // indirect
golang.org/x/crypto v0.41.0 // indirect
golang.org/x/exp v0.0.0-20250811191247-51f88131bc50 // indirect
- golang.org/x/exp/typeparams v0.0.0-20240314144324-c7f7c6466f7f // indirect
+ golang.org/x/exp/typeparams v0.0.0-20250210185358-939b2ce775ac // indirect
golang.org/x/mod v0.27.0 // indirect
golang.org/x/net v0.43.0 // indirect
golang.org/x/sync v0.16.0 // indirect
@@ -324,7 +327,7 @@ require (
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
- honnef.co/go/tools v0.5.1 // indirect
+ honnef.co/go/tools v0.6.1 // indirect
lukechampine.com/blake3 v1.4.1 // indirect
mvdan.cc/gofumpt v0.7.0 // indirect
mvdan.cc/unparam v0.0.0-20240528143540-8a5130ca722f // indirect
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index 19f6ee6ef..57828a1b0 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -1,7 +1,7 @@
-4d63.com/gocheckcompilerdirectives v1.2.1 h1:AHcMYuw56NPjq/2y615IGg2kYkBdTvOaojYCBcRE7MA=
-4d63.com/gocheckcompilerdirectives v1.2.1/go.mod h1:yjDJSxmDTtIHHCqX0ufRYZDL6vQtMG7tJdKVeWwsqvs=
-4d63.com/gochecknoglobals v0.2.1 h1:1eiorGsgHOFOuoOiJDy2psSrQbRdIHrlge0IJIkUgDc=
-4d63.com/gochecknoglobals v0.2.1/go.mod h1:KRE8wtJB3CXCsb1xy421JfTHIIbmT3U5ruxw2Qu8fSU=
+4d63.com/gocheckcompilerdirectives v1.3.0 h1:Ew5y5CtcAAQeTVKUVFrE7EwHMrTO6BggtEj8BZSjZ3A=
+4d63.com/gocheckcompilerdirectives v1.3.0/go.mod h1:ofsJ4zx2QAuIP/NO/NAh1ig6R1Fb18/GI7RVMwz7kAY=
+4d63.com/gochecknoglobals v0.2.2 h1:H1vdnwnMaZdQW/N+NrkT1SZMTBmcwHe9Vq8lJcYYTtU=
+4d63.com/gochecknoglobals v0.2.2/go.mod h1:lLxwTQjL5eIesRbvnzIP3jZtG140FnTdz+AlMa+ogt0=
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
@@ -11,57 +11,59 @@ dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBr
dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4=
dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU=
git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg=
-github.com/4meepo/tagalign v1.3.4 h1:P51VcvBnf04YkHzjfclN6BbsopfJR5rxs1n+5zHt+w8=
-github.com/4meepo/tagalign v1.3.4/go.mod h1:M+pnkHH2vG8+qhE5bVc/zeP7HS/j910Fwa9TUSyZVI0=
-github.com/Abirdcfly/dupword v0.0.14 h1:3U4ulkc8EUo+CaT105/GJ1BQwtgyj6+VaBVbAX11Ba8=
-github.com/Abirdcfly/dupword v0.0.14/go.mod h1:VKDAbxdY8YbKUByLGg8EETzYSuC4crm9WwI6Y3S0cLI=
-github.com/Antonboom/errname v0.1.13 h1:JHICqsewj/fNckzrfVSe+T33svwQxmjC+1ntDsHOVvM=
-github.com/Antonboom/errname v0.1.13/go.mod h1:uWyefRYRN54lBg6HseYCFhs6Qjcy41Y3Jl/dVhA87Ns=
-github.com/Antonboom/nilnil v0.1.9 h1:eKFMejSxPSA9eLSensFmjW2XTgTwJMjZ8hUHtV4s/SQ=
-github.com/Antonboom/nilnil v0.1.9/go.mod h1:iGe2rYwCq5/Me1khrysB4nwI7swQvjclR8/YRPl5ihQ=
-github.com/Antonboom/testifylint v1.4.3 h1:ohMt6AHuHgttaQ1xb6SSnxCeK4/rnK7KKzbvs7DmEck=
-github.com/Antonboom/testifylint v1.4.3/go.mod h1:+8Q9+AOLsz5ZiQiiYujJKs9mNz398+M6UgslP4qgJLA=
+github.com/4meepo/tagalign v1.4.2 h1:0hcLHPGMjDyM1gHG58cS73aQF8J4TdVR96TZViorO9E=
+github.com/4meepo/tagalign v1.4.2/go.mod h1:+p4aMyFM+ra7nb41CnFG6aSDXqRxU/w1VQqScKqDARI=
+github.com/Abirdcfly/dupword v0.1.3 h1:9Pa1NuAsZvpFPi9Pqkd93I7LIYRURj+A//dFd5tgBeE=
+github.com/Abirdcfly/dupword v0.1.3/go.mod h1:8VbB2t7e10KRNdwTVoxdBaxla6avbhGzb8sCTygUMhw=
+github.com/Antonboom/errname v1.0.0 h1:oJOOWR07vS1kRusl6YRSlat7HFnb3mSfMl6sDMRoTBA=
+github.com/Antonboom/errname v1.0.0/go.mod h1:gMOBFzK/vrTiXN9Oh+HFs+e6Ndl0eTFbtsRTSRdXyGI=
+github.com/Antonboom/nilnil v1.0.1 h1:C3Tkm0KUxgfO4Duk3PM+ztPncTFlOf0b2qadmS0s4xs=
+github.com/Antonboom/nilnil v1.0.1/go.mod h1:CH7pW2JsRNFgEh8B2UaPZTEPhCMuFowP/e8Udp9Nnb0=
+github.com/Antonboom/testifylint v1.5.2 h1:4s3Xhuv5AvdIgbd8wOOEeo0uZG7PbDKQyKY5lGoQazk=
+github.com/Antonboom/testifylint v1.5.2/go.mod h1:vxy8VJ0bc6NavlYqjZfmp6EfqXMtBgQ4+mhCojwC1P8=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
github.com/BurntSushi/toml v1.4.1-0.20240526193622-a339e1f7089c h1:pxW6RcqyfI9/kWtOwnv/G+AzdKuy2ZrqINhenH4HyNs=
github.com/BurntSushi/toml v1.4.1-0.20240526193622-a339e1f7089c/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
-github.com/Crocmagnon/fatcontext v0.4.0 h1:4ykozu23YHA0JB6+thiuEv7iT6xq995qS1vcuWZq0tg=
-github.com/Crocmagnon/fatcontext v0.4.0/go.mod h1:ZtWrXkgyfsYPzS6K3O88va6t2GEglG93vnII/F94WC0=
+github.com/Crocmagnon/fatcontext v0.7.1 h1:SC/VIbRRZQeQWj/TcQBS6JmrXcfA+BU4OGSVUt54PjM=
+github.com/Crocmagnon/fatcontext v0.7.1/go.mod h1:1wMvv3NXEBJucFGfwOJBxSVWcoIO6emV215SMkW9MFU=
github.com/DataDog/zstd v1.5.6-0.20230824185856-869dae002e5e h1:ZIWapoIRN1VqT8GR8jAwb1Ie9GyehWjVcGh32Y2MznE=
github.com/DataDog/zstd v1.5.6-0.20230824185856-869dae002e5e/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw=
github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 h1:sHglBQTwgx+rWPdisA5ynNEsoARbiCBOyGcJM4/OzsM=
github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs=
-github.com/GaijinEntertainment/go-exhaustruct/v3 v3.3.0 h1:/fTUt5vmbkAcMBt4YQiuC23cV0kEsN1MVMNqeOW43cU=
-github.com/GaijinEntertainment/go-exhaustruct/v3 v3.3.0/go.mod h1:ONJg5sxcbsdQQ4pOW8TGdTidT2TMAUy/2Xhr8mrYaao=
+github.com/GaijinEntertainment/go-exhaustruct/v3 v3.3.1 h1:Sz1JIXEcSfhz7fUi7xHnhpIE0thVASYjvosApmHuD2k=
+github.com/GaijinEntertainment/go-exhaustruct/v3 v3.3.1/go.mod h1:n/LSCXNuIYqVfBlVXyHfMQkZDdp1/mmxfSjADd3z1Zg=
github.com/Jorropo/jsync v1.0.1 h1:6HgRolFZnsdfzRUj+ImB9og1JYOxQoReSywkHOGSaUU=
github.com/Jorropo/jsync v1.0.1/go.mod h1:jCOZj3vrBCri3bSU3ErUYvevKlnbssrXeCivybS5ABQ=
github.com/Kubuxu/gocovmerge v0.0.0-20161216165753-7ecaa51963cd h1:HNhzThEtZW714v8Eda8sWWRcu9WSzJC+oCyjRjvZgRA=
github.com/Kubuxu/gocovmerge v0.0.0-20161216165753-7ecaa51963cd/go.mod h1:bqoB8kInrTeEtYAwaIXoSRqdwnjQmFhsfusnzyui6yY=
-github.com/Masterminds/semver/v3 v3.2.1 h1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0=
-github.com/Masterminds/semver/v3 v3.2.1/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ=
-github.com/OpenPeeDeeP/depguard/v2 v2.2.0 h1:vDfG60vDtIuf0MEOhmLlLLSzqaRM8EMcgJPdp74zmpA=
-github.com/OpenPeeDeeP/depguard/v2 v2.2.0/go.mod h1:CIzddKRvLBC4Au5aYP/i3nyaWQ+ClszLIuVocRiCYFQ=
+github.com/Masterminds/semver/v3 v3.3.0 h1:B8LGeaivUe71a5qox1ICM/JLl0NqZSW5CHyL+hmvYS0=
+github.com/Masterminds/semver/v3 v3.3.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
+github.com/OpenPeeDeeP/depguard/v2 v2.2.1 h1:vckeWVESWp6Qog7UZSARNqfu/cZqvki8zsuj3piCMx4=
+github.com/OpenPeeDeeP/depguard/v2 v2.2.1/go.mod h1:q4DKzC4UcVaAvcfd41CZh0PWpGgzrVxUYBlgKNGquUo=
github.com/aclements/go-perfevent v0.0.0-20240301234650-f7843625020f h1:JjxwchlOepwsUWcQwD2mLUAGE9aCp0/ehy6yCHFBOvo=
github.com/aclements/go-perfevent v0.0.0-20240301234650-f7843625020f/go.mod h1:tMDTce/yLLN/SK8gMOxQfnyeMeCg8KGzp0D1cbECEeo=
-github.com/alecthomas/assert/v2 v2.2.2 h1:Z/iVC0xZfWTaFNE6bA3z07T86hd45Xe2eLt6WVy2bbk=
-github.com/alecthomas/assert/v2 v2.2.2/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ=
-github.com/alecthomas/go-check-sumtype v0.1.4 h1:WCvlB3l5Vq5dZQTFmodqL2g68uHiSwwlWcT5a2FGK0c=
-github.com/alecthomas/go-check-sumtype v0.1.4/go.mod h1:WyYPfhfkdhyrdaligV6svFopZV8Lqdzn5pyVBaV6jhQ=
-github.com/alecthomas/repr v0.2.0 h1:HAzS41CIzNW5syS8Mf9UwXhNH1J9aix/BvDRf1Ml2Yk=
-github.com/alecthomas/repr v0.2.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4=
+github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0=
+github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
+github.com/alecthomas/go-check-sumtype v0.3.1 h1:u9aUvbGINJxLVXiFvHUlPEaD7VDULsrxJb4Aq31NLkU=
+github.com/alecthomas/go-check-sumtype v0.3.1/go.mod h1:A8TSiN3UPRw3laIgWEUOHHLPa6/r9MtoigdlP5h3K/E=
+github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc=
+github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4=
github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b h1:mimo19zliBX/vSQ6PWWSL9lK8qwHozUj03+zLoEB8O0=
github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs=
-github.com/alexkohler/nakedret/v2 v2.0.4 h1:yZuKmjqGi0pSmjGpOC016LtPJysIL0WEUiaXW5SUnNg=
-github.com/alexkohler/nakedret/v2 v2.0.4/go.mod h1:bF5i0zF2Wo2o4X4USt9ntUWve6JbFv02Ff4vlkmS/VU=
+github.com/alexkohler/nakedret/v2 v2.0.5 h1:fP5qLgtwbx9EJE8dGEERT02YwS8En4r9nnZ71RK+EVU=
+github.com/alexkohler/nakedret/v2 v2.0.5/go.mod h1:bF5i0zF2Wo2o4X4USt9ntUWve6JbFv02Ff4vlkmS/VU=
github.com/alexkohler/prealloc v1.0.0 h1:Hbq0/3fJPQhNkN0dR95AVrr6R7tou91y0uHG5pOcUuw=
github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE=
github.com/alingse/asasalint v0.0.11 h1:SFwnQXJ49Kx/1GghOFz1XGqHYKp21Kq1nHad/0WQRnw=
github.com/alingse/asasalint v0.0.11/go.mod h1:nCaoMhw7a9kSJObvQyVzNTPBDbNpdocqrSP7t/cW5+I=
+github.com/alingse/nilnesserr v0.1.2 h1:Yf8Iwm3z2hUUrP4muWfW83DF4nE3r1xZ26fGWUKCZlo=
+github.com/alingse/nilnesserr v0.1.2/go.mod h1:1xJPrXonEtX7wyTq8Dytns5P2hNzoWymVUIaKm4HNFg=
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
github.com/ashanbrown/forbidigo v1.6.0 h1:D3aewfM37Yb3pxHujIPSpTf6oQk9sc9WZi8gerOIVIY=
github.com/ashanbrown/forbidigo v1.6.0/go.mod h1:Y8j9jy9ZYAEHXdu723cUlraTqbzjKF1MUyfOKL+AjcU=
-github.com/ashanbrown/makezero v1.1.1 h1:iCQ87C0V0vSyO+M9E/FZYbu65auqH0lnsOkf5FcB28s=
-github.com/ashanbrown/makezero v1.1.1/go.mod h1:i1bJLCRSCHOcOa9Y6MyF2FTfMZMFdHvxKHxgO5Z1axI=
+github.com/ashanbrown/makezero v1.2.0 h1:/2Lp1bypdmK9wDIq7uWBlDF1iMUpIIS4A+pF6C9IEUU=
+github.com/ashanbrown/makezero v1.2.0/go.mod h1:dxlPhHbDMC6N6xICzFBSK+4njQDdK8euNO0qjQMtGY4=
github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o=
github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
@@ -69,28 +71,28 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/bitfield/gotestdox v0.2.2 h1:x6RcPAbBbErKLnapz1QeAlf3ospg8efBsedU93CDsnE=
github.com/bitfield/gotestdox v0.2.2/go.mod h1:D+gwtS0urjBrzguAkTM2wodsTQYFHdpx8eqRJ3N+9pY=
-github.com/bkielbasa/cyclop v1.2.1 h1:AeF71HZDob1P2/pRm1so9cd1alZnrpyc4q2uP2l0gJY=
-github.com/bkielbasa/cyclop v1.2.1/go.mod h1:K/dT/M0FPAiYjBgQGau7tz+3TMh4FWAEqlMhzFWCrgM=
+github.com/bkielbasa/cyclop v1.2.3 h1:faIVMIGDIANuGPWH031CZJTi2ymOQBULs9H21HSMa5w=
+github.com/bkielbasa/cyclop v1.2.3/go.mod h1:kHTwA9Q0uZqOADdupvcFJQtp/ksSnytRMe8ztxG8Fuo=
github.com/blizzy78/varnamelen v0.8.0 h1:oqSblyuQvFsW1hbBHh1zfwrKe3kcSj0rnXkKzsQ089M=
github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k=
-github.com/bombsimon/wsl/v4 v4.4.1 h1:jfUaCkN+aUpobrMO24zwyAMwMAV5eSziCkOKEauOLdw=
-github.com/bombsimon/wsl/v4 v4.4.1/go.mod h1:Xu/kDxGZTofQcDGCtQe9KCzhHphIe0fDuyWTxER9Feo=
+github.com/bombsimon/wsl/v4 v4.5.0 h1:iZRsEvDdyhd2La0FVi5k6tYehpOR/R7qIUjmKk7N74A=
+github.com/bombsimon/wsl/v4 v4.5.0/go.mod h1:NOQ3aLF4nD7N5YPXMruR6ZXDOAqLoM0GEpLwTdvmOSc=
github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g=
-github.com/breml/bidichk v0.2.7 h1:dAkKQPLl/Qrk7hnP6P+E0xOodrq8Us7+U0o4UBOAlQY=
-github.com/breml/bidichk v0.2.7/go.mod h1:YodjipAGI9fGcYM7II6wFvGhdMYsC5pHDlGzqvEW3tQ=
-github.com/breml/errchkjson v0.3.6 h1:VLhVkqSBH96AvXEyclMR37rZslRrY2kcyq+31HCsVrA=
-github.com/breml/errchkjson v0.3.6/go.mod h1:jhSDoFheAF2RSDOlCfhHO9KqhZgAYLyvHe7bRCX8f/U=
+github.com/breml/bidichk v0.3.2 h1:xV4flJ9V5xWTqxL+/PMFF6dtJPvZLPsyixAoPe8BGJs=
+github.com/breml/bidichk v0.3.2/go.mod h1:VzFLBxuYtT23z5+iVkamXO386OB+/sVwZOpIj6zXGos=
+github.com/breml/errchkjson v0.4.0 h1:gftf6uWZMtIa/Is3XJgibewBm2ksAQSY/kABDNFTAdk=
+github.com/breml/errchkjson v0.4.0/go.mod h1:AuBOSTHyLSaaAFlWsRSuRBIroCh3eh7ZHh5YeelDIk8=
github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s=
-github.com/butuzov/ireturn v0.3.0 h1:hTjMqWw3y5JC3kpnC5vXmFJAWI/m31jaCYQqzkS6PL0=
-github.com/butuzov/ireturn v0.3.0/go.mod h1:A09nIiwiqzN/IoVo9ogpa0Hzi9fex1kd9PSD6edP5ZA=
-github.com/butuzov/mirror v1.2.0 h1:9YVK1qIjNspaqWutSv8gsge2e/Xpq1eqEkslEUHy5cs=
-github.com/butuzov/mirror v1.2.0/go.mod h1:DqZZDtzm42wIAIyHXeN8W/qb1EPlb9Qn/if9icBOpdQ=
+github.com/butuzov/ireturn v0.3.1 h1:mFgbEI6m+9W8oP/oDdfA34dLisRFCj2G6o/yiI1yZrY=
+github.com/butuzov/ireturn v0.3.1/go.mod h1:ZfRp+E7eJLC0NQmk1Nrm1LOrn/gQlOykv+cVPdiXH5M=
+github.com/butuzov/mirror v1.3.0 h1:HdWCXzmwlQHdVhwvsfBb2Au0r3HyINry3bDWLYXiKoc=
+github.com/butuzov/mirror v1.3.0/go.mod h1:AEij0Z8YMALaq4yQj9CPPVYOyJQyiexpQEQgihajRfI=
github.com/caddyserver/certmagic v0.23.0 h1:CfpZ/50jMfG4+1J/u2LV6piJq4HOfO6ppOnOf7DkFEU=
github.com/caddyserver/certmagic v0.23.0/go.mod h1:9mEZIWqqWoI+Gf+4Trh04MOVPD0tGSxtqsxg87hAIH4=
github.com/caddyserver/zerossl v0.1.3 h1:onS+pxp3M8HnHpN5MMbOMyNjmTheJyWRaZYwn+YTAyA=
github.com/caddyserver/zerossl v0.1.3/go.mod h1:CxA0acn7oEGO6//4rtrRjYgEoa4MFw/XofZnrYwGqG4=
-github.com/catenacyber/perfsprint v0.7.1 h1:PGW5G/Kxn+YrN04cRAZKC+ZuvlVwolYMrIyyTJ/rMmc=
-github.com/catenacyber/perfsprint v0.7.1/go.mod h1:/wclWYompEyjUD2FuIIDVKNkqz7IgBIWXIH3V0Zol50=
+github.com/catenacyber/perfsprint v0.8.2 h1:+o9zVmCSVa7M4MvabsWvESEhpsMkhfE7k0sHNGL95yw=
+github.com/catenacyber/perfsprint v0.8.2/go.mod h1:q//VWC2fWbcdSLEY1R3l8n0zQCDPdE4IjZwyY1HMunM=
github.com/ccojocar/zxcvbn-go v1.0.2 h1:na/czXU8RrhXO4EZme6eQJLR4PzcGsahsBOAwU6I3Vg=
github.com/ccojocar/zxcvbn-go v1.0.2/go.mod h1:g1qkXtUSvHP8lhHp5GrSmTz6uWALGRMQdw6Qnz/hi60=
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
@@ -99,8 +101,8 @@ github.com/charithe/durationcheck v0.0.10 h1:wgw73BiocdBDQPik+zcEoBG/ob8uyBHf2iy
github.com/charithe/durationcheck v0.0.10/go.mod h1:bCWXb7gYRysD1CU3C+u4ceO49LoGOY1C1L6uouGNreQ=
github.com/chavacava/garif v0.1.0 h1:2JHa3hbYf5D9dsgseMKAmc/MZ109otzgNFk5s87H9Pc=
github.com/chavacava/garif v0.1.0/go.mod h1:XMyYCkEL58DF0oyW4qDjjnPWONs2HBqYKI+UIPD+Gww=
-github.com/ckaznocha/intrange v0.1.2 h1:3Y4JAxcMntgb/wABQ6e8Q8leMd26JbX2790lIss9MTI=
-github.com/ckaznocha/intrange v0.1.2/go.mod h1:RWffCw/vKBwHeOEwWdCikAtY0q4gGt8VhJZEEA5n+RE=
+github.com/ckaznocha/intrange v0.3.0 h1:VqnxtK32pxgkhJgYQEeOArVidIPg+ahLP7WBOXZd5ZY=
+github.com/ckaznocha/intrange v0.3.0/go.mod h1:+I/o2d2A1FBHgGELbGxzIcyd3/9l9DuwjM8FsbSS3Lo=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cockroachdb/crlib v0.0.0-20241015224233-894974b3ad94 h1:bvJv505UUfjzbaIPdNS4AEkHreDqQk6yuNpsdRHpwFA=
github.com/cockroachdb/crlib v0.0.0-20241015224233-894974b3ad94/go.mod h1:Gq51ZeKaFCXk6QwuGM0w1dnaOqc/F5zKT2zA9D6Xeac=
@@ -124,18 +126,18 @@ github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAK
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ=
github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
-github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
-github.com/cpuguy83/go-md2man/v2 v2.0.5 h1:ZtcqGrnekaHpVLArFSe4HK5DoKx1T0rq2DwVB0alcyc=
github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
+github.com/cpuguy83/go-md2man/v2 v2.0.6 h1:XJtiaUW6dEEqVuZiMTn1ldk455QWwEIsMIJlo5vtkx0=
+github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
github.com/crackcomm/go-gitignore v0.0.0-20241020182519-7843d2ba8fdf h1:dwGgBWn84wUS1pVikGiruW+x5XM4amhjaZO20vCjay4=
github.com/crackcomm/go-gitignore v0.0.0-20241020182519-7843d2ba8fdf/go.mod h1:p1d6YEZWvFzEh4KLyvBcVSnrfNDDvK2zfK/4x2v/4pE=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0=
github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis=
-github.com/curioswitch/go-reassign v0.2.0 h1:G9UZyOcpk/d7Gd6mqYgd8XYWFMw/znxwGDUstnC9DIo=
-github.com/curioswitch/go-reassign v0.2.0/go.mod h1:x6OpXuWvgfQaMGks2BZybTngWjT84hqJfKoO8Tt/Roc=
-github.com/daixiang0/gci v0.13.4 h1:61UGkmpoAcxHM2hhNkZEf5SzwQtWJXTSws7jaPyqwlw=
-github.com/daixiang0/gci v0.13.4/go.mod h1:12etP2OniiIdP4q+kjUGrC/rUagga7ODbqsom5Eo5Yk=
+github.com/curioswitch/go-reassign v0.3.0 h1:dh3kpQHuADL3cobV/sSGETA8DOv457dwl+fbBAhrQPs=
+github.com/curioswitch/go-reassign v0.3.0/go.mod h1:nApPCCTtqLJN/s8HfItCcKV0jIPwluBOvZP+dsJGA88=
+github.com/daixiang0/gci v0.13.5 h1:kThgmH1yBmZSBCh1EJVxQ7JsHpm5Oms0AMed/0LaH4c=
+github.com/daixiang0/gci v0.13.5/go.mod h1:12etP2OniiIdP4q+kjUGrC/rUagga7ODbqsom5Eo5Yk=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
@@ -148,6 +150,8 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 h1:NMZiJj8QnKe1LgsbDayM4UoHwbvw
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0/go.mod h1:ZXNYxsqcloTdSy/rNShjYzMhyjf0LaoftYK0p+A3h40=
github.com/denis-tingaikin/go-header v0.5.0 h1:SRdnP5ZKvcO9KKRP1KJrhFR3RrlGuD+42t4429eC9k8=
github.com/denis-tingaikin/go-header v0.5.0/go.mod h1:mMenU5bWrok6Wl2UsZjy+1okegmwQ3UgWl4V1D8gjlY=
+github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI=
+github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
github.com/dnephin/pflag v1.0.7 h1:oxONGlWxhmUct0YzKTgrpQv9AUA1wtPBn7zuSjJqptk=
github.com/dnephin/pflag v1.0.7/go.mod h1:uxE91IoWURlOiTUIA8Mq5ZZkAv3dPUfZNaT80Zm7OQE=
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
@@ -155,10 +159,8 @@ github.com/ettle/strcase v0.2.0 h1:fGNiVF21fHXpX1niBgk0aROov1LagYsOwV/xqKDKR/Q=
github.com/ettle/strcase v0.2.0/go.mod h1:DajmHElDSaX76ITe3/VHVyMin4LWSJN5Z909Wp+ED1A=
github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5 h1:BBso6MBKW8ncyZLv37o+KNyy0HrrHgfnOaGQC2qvN+A=
github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5/go.mod h1:JpoxHjuQauoxiFMl1ie8Xc/7TfLuMZ5eOCONd1sUBHg=
-github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw=
-github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=
-github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4=
-github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI=
+github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
+github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=
github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=
github.com/filecoin-project/go-clock v0.1.0 h1:SFbYIM75M8NnFm1yMHhN9Ahy3W5bEZV9gd6MPfXbKVU=
@@ -173,8 +175,8 @@ github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiD
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
-github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
-github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
+github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M=
+github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo=
github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA=
github.com/gammazero/chanqueue v1.1.1 h1:n9Y+zbBxw2f7uUE9wpgs0rOSkP/I/yhDLiNuhyVjojQ=
@@ -186,11 +188,11 @@ github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w
github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9 h1:r5GgOLGbza2wVHRzK7aAj6lWZjfbAwiu/RDCVOKjRyM=
github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
-github.com/ghostiam/protogetter v0.3.6 h1:R7qEWaSgFCsy20yYHNIJsU9ZOb8TziSRRxuAOTVKeOk=
-github.com/ghostiam/protogetter v0.3.6/go.mod h1:7lpeDnEJ1ZjL/YtyoN99ljO4z0pd3H0d18/t2dPBxHw=
+github.com/ghostiam/protogetter v0.3.9 h1:j+zlLLWzqLay22Cz/aYwTHKQ88GE2DQ6GkWSYFOI4lQ=
+github.com/ghostiam/protogetter v0.3.9/go.mod h1:WZ0nw9pfzsgxuRsPOFQomgDVSWtDLJRfQJEhsGbmQMA=
github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
-github.com/go-critic/go-critic v0.11.4 h1:O7kGOCx0NDIni4czrkRIXTnit0mkyKOCePh3My6OyEU=
-github.com/go-critic/go-critic v0.11.4/go.mod h1:2QAdo4iuLik5S9YG0rT4wcZ8QxwHYkrr6/2MWAiv/vc=
+github.com/go-critic/go-critic v0.12.0 h1:iLosHZuye812wnkEz1Xu3aBwn5ocCPfc9yqmFG9pa6w=
+github.com/go-critic/go-critic v0.12.0/go.mod h1:DpE0P6OVc6JzVYzmM5gq5jMU31zLr4am5mB/VfFK64w=
github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q=
github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA=
github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og=
@@ -222,10 +224,10 @@ github.com/go-toolsmith/strparse v1.1.0 h1:GAioeZUK9TGxnLS+qfdqNbA4z0SSm5zVNtCQi
github.com/go-toolsmith/strparse v1.1.0/go.mod h1:7ksGy58fsaQkGQlY8WVoBFNyEPMGuJin1rfoPS4lBSQ=
github.com/go-toolsmith/typep v1.1.0 h1:fIRYDyF+JywLfqzyhdiHzRop/GQDxxNhLGQ6gFUNHus=
github.com/go-toolsmith/typep v1.1.0/go.mod h1:fVIw+7zjdsMxDA3ITWnH1yOiw1rnTQKCsF/sk2H/qig=
-github.com/go-viper/mapstructure/v2 v2.0.0 h1:dhn8MZ1gZ0mzeodTG3jt5Vj/o87xZKuNAprG2mQfMfc=
-github.com/go-viper/mapstructure/v2 v2.0.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
-github.com/go-xmlfmt/xmlfmt v1.1.2 h1:Nea7b4icn8s57fTx1M5AI4qQT5HEM3rVUO8MuE6g80U=
-github.com/go-xmlfmt/xmlfmt v1.1.2/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM=
+github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss=
+github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
+github.com/go-xmlfmt/xmlfmt v1.1.3 h1:t8Ey3Uy7jDSEisW2K3somuMKIpzktkWptA0iFCnRUWY=
+github.com/go-xmlfmt/xmlfmt v1.1.3/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM=
github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0=
github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
@@ -242,20 +244,20 @@ github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/snappy v0.0.5-0.20231225225746-43d5d4cd4e0e h1:4bw4WeyTYPp0smaXiJZCNnLrvVBqirQVreixayXezGc=
github.com/golang/snappy v0.0.5-0.20231225225746-43d5d4cd4e0e/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
-github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a h1:w8hkcTqaFpzKqonE9uMCefW1WDie15eSP/4MssdenaM=
-github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk=
-github.com/golangci/gofmt v0.0.0-20240816233607-d8596aa466a9 h1:/1322Qns6BtQxUZDTAT4SdcoxknUki7IAoK4SAXr8ME=
-github.com/golangci/gofmt v0.0.0-20240816233607-d8596aa466a9/go.mod h1:Oesb/0uFAyWoaw1U1qS5zyjCg5NP9C9iwjnI4tIsXEE=
-github.com/golangci/golangci-lint v1.60.2 h1:Y8aWnZCMOLY5T7Ga5hcoemyKsZZJCUmIIK3xTD3jIhc=
-github.com/golangci/golangci-lint v1.60.2/go.mod h1:4UvjLpOJoQSvmyWkmO1urDR3txhL9R9sn4oM/evJ95g=
+github.com/golangci/dupl v0.0.0-20250308024227-f665c8d69b32 h1:WUvBfQL6EW/40l6OmeSBYQJNSif4O11+bmWEz+C7FYw=
+github.com/golangci/dupl v0.0.0-20250308024227-f665c8d69b32/go.mod h1:NUw9Zr2Sy7+HxzdjIULge71wI6yEg1lWQr7Evcu8K0E=
+github.com/golangci/go-printf-func-name v0.1.0 h1:dVokQP+NMTO7jwO4bwsRwLWeudOVUPPyAKJuzv8pEJU=
+github.com/golangci/go-printf-func-name v0.1.0/go.mod h1:wqhWFH5mUdJQhweRnldEywnR5021wTdZSNgwYceV14s=
+github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d h1:viFft9sS/dxoYY0aiOTsLKO2aZQAPT4nlQCsimGcSGE=
+github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d/go.mod h1:ivJ9QDg0XucIkmwhzCDsqcnxxlDStoTl89jDMIoNxKY=
+github.com/golangci/golangci-lint v1.64.8 h1:y5TdeVidMtBGG32zgSC7ZXTFNHrsJkDnpO4ItB3Am+I=
+github.com/golangci/golangci-lint v1.64.8/go.mod h1:5cEsUQBSr6zi8XI8OjmcY2Xmliqc4iYL7YoPrL+zLJ4=
github.com/golangci/misspell v0.6.0 h1:JCle2HUTNWirNlDIAUO44hUsKhOFqGPoC4LZxlaSXDs=
github.com/golangci/misspell v0.6.0/go.mod h1:keMNyY6R9isGaSAu+4Q8NMBwMPkh15Gtc8UCVoDtAWo=
-github.com/golangci/modinfo v0.3.4 h1:oU5huX3fbxqQXdfspamej74DFX0kyGLkw1ppvXoJ8GA=
-github.com/golangci/modinfo v0.3.4/go.mod h1:wytF1M5xl9u0ij8YSvhkEVPP3M5Mc7XLl1pxH3B2aUM=
github.com/golangci/plugin-module-register v0.1.1 h1:TCmesur25LnyJkpsVrupv1Cdzo+2f7zX0H6Jkw1Ol6c=
github.com/golangci/plugin-module-register v0.1.1/go.mod h1:TTpqoB6KkwOJMV8u7+NyXMrkwwESJLOkfl9TxR1DGFc=
-github.com/golangci/revgrep v0.5.3 h1:3tL7c1XBMtWHHqVpS5ChmiAAoe4PF/d5+ULzV9sLAzs=
-github.com/golangci/revgrep v0.5.3/go.mod h1:U4R/s9dlXZsg8uJmaR1GrloUr14D7qDl8gi2iPXJH8k=
+github.com/golangci/revgrep v0.8.0 h1:EZBctwbVd0aMeRnNUsFogoyayvKHyxlV3CdUA46FX2s=
+github.com/golangci/revgrep v0.8.0/go.mod h1:U4R/s9dlXZsg8uJmaR1GrloUr14D7qDl8gi2iPXJH8k=
github.com/golangci/unconvert v0.0.0-20240309020433-c5143eacb3ed h1:IURFTjxeTfNFP0hTEi1YKjB/ub8zkpaOqFFMApi2EAs=
github.com/golangci/unconvert v0.0.0-20240309020433-c5143eacb3ed/go.mod h1:XLXN8bNw4CGRPaqgl3bv/lhz7bsGPh4/xSaMTbo2vkQ=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
@@ -265,8 +267,6 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
-github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
-github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ=
@@ -293,17 +293,22 @@ github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/ad
github.com/gostaticanalysis/analysisutil v0.7.1 h1:ZMCjoue3DtDWQ5WyU16YbjbQEQ3VuzwxALrpYd+HeKk=
github.com/gostaticanalysis/analysisutil v0.7.1/go.mod h1:v21E3hY37WKMGSnbsw2S/ojApNWb6C1//mXO48CXbVc=
github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXfXAlTaRzuaNDlSado=
-github.com/gostaticanalysis/comment v1.4.2 h1:hlnx5+S2fY9Zo9ePo4AhgYsYHbM2+eAv8m/s1JiCd6Q=
github.com/gostaticanalysis/comment v1.4.2/go.mod h1:KLUTGDv6HOCotCH8h2erHKmpci2ZoR8VPu34YA2uzdM=
-github.com/gostaticanalysis/forcetypeassert v0.1.0 h1:6eUflI3DiGusXGK6X7cCcIgVCpZ2CiZ1Q7jl6ZxNV70=
-github.com/gostaticanalysis/forcetypeassert v0.1.0/go.mod h1:qZEedyP/sY1lTGV1uJ3VhWZ2mqag3IkWsDHVbplHXak=
+github.com/gostaticanalysis/comment v1.5.0 h1:X82FLl+TswsUMpMh17srGRuKaaXprTaytmEpgnKIDu8=
+github.com/gostaticanalysis/comment v1.5.0/go.mod h1:V6eb3gpCv9GNVqb6amXzEUX3jXLVK/AdA+IrAMSqvEc=
+github.com/gostaticanalysis/forcetypeassert v0.2.0 h1:uSnWrrUEYDr86OCxWa4/Tp2jeYDlogZiZHzGkWFefTk=
+github.com/gostaticanalysis/forcetypeassert v0.2.0/go.mod h1:M5iPavzE9pPqWyeiVXSFghQjljW1+l/Uke3PXHS6ILY=
github.com/gostaticanalysis/nilerr v0.1.1 h1:ThE+hJP0fEp4zWLkWHWcRyI2Od0p7DlgYG3Uqrmrcpk=
github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A=
github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M=
-github.com/gostaticanalysis/testutil v0.4.0 h1:nhdCmubdmDF6VEatUNjgUZBJKWRqugoISdUv3PPQgHY=
-github.com/gostaticanalysis/testutil v0.4.0/go.mod h1:bLIoPefWXrRi/ssLFWX1dx7Repi5x3CuviD3dgAZaBU=
+github.com/gostaticanalysis/testutil v0.5.0 h1:Dq4wT1DdTwTGCQQv3rl3IvD5Ld0E6HiY+3Zh0sUGqw8=
+github.com/gostaticanalysis/testutil v0.5.0/go.mod h1:OLQSbuM6zw2EvCcXTz1lVq5unyoNft372msDY0nY5Hs=
github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw=
+github.com/hashicorp/go-immutable-radix/v2 v2.1.0 h1:CUW5RYIcysz+D3B+l1mDeXrQ7fUvGGCwJfdASSzbrfo=
+github.com/hashicorp/go-immutable-radix/v2 v2.1.0/go.mod h1:hgdqLXA4f6NIjRVisM1TJ9aOJVNRqKZj+xDGF6m7PBw=
+github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=
+github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY=
github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
@@ -372,24 +377,22 @@ github.com/jgautheron/goconst v1.7.1 h1:VpdAG7Ca7yvvJk5n8dMwQhfEZJh95kl/Hl9S1OI5
github.com/jgautheron/goconst v1.7.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4=
github.com/jingyugao/rowserrcheck v1.1.1 h1:zibz55j/MJtLsjP1OF4bSdgXxwL1b+Vn7Tjzq7gFzUs=
github.com/jingyugao/rowserrcheck v1.1.1/go.mod h1:4yvlZSDb3IyDTUZJUmpZfm2Hwok+Dtp+nu2qOq+er9c=
-github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af h1:KA9BjwUk7KlCh6S9EAGWBt1oExIUv9WyNCiRz5amv48=
-github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0=
-github.com/jjti/go-spancheck v0.6.2 h1:iYtoxqPMzHUPp7St+5yA8+cONdyXD3ug6KK15n7Pklk=
-github.com/jjti/go-spancheck v0.6.2/go.mod h1:+X7lvIrR5ZdUTkxFYqzJ0abr8Sb5LOo80uOhWNqIrYA=
+github.com/jjti/go-spancheck v0.6.4 h1:Tl7gQpYf4/TMU7AT84MN83/6PutY21Nb9fuQjFTpRRc=
+github.com/jjti/go-spancheck v0.6.4/go.mod h1:yAEYdKJ2lRkDA8g7X+oKUHXOWVAXSBJRv04OhF+QUjk=
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
-github.com/julz/importas v0.1.0 h1:F78HnrsjY3cR7j0etXy5+TU1Zuy7Xt08X/1aJnH5xXY=
-github.com/julz/importas v0.1.0/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0=
-github.com/karamaru-alpha/copyloopvar v1.1.0 h1:x7gNyKcC2vRBO1H2Mks5u1VxQtYvFiym7fCjIP8RPos=
-github.com/karamaru-alpha/copyloopvar v1.1.0/go.mod h1:u7CIfztblY0jZLOQZgH3oYsJzpC2A7S6u/lfgSXHy0k=
+github.com/julz/importas v0.2.0 h1:y+MJN/UdL63QbFJHws9BVC5RpA2iq0kpjrFajTGivjQ=
+github.com/julz/importas v0.2.0/go.mod h1:pThlt589EnCYtMnmhmRYY/qn9lCf/frPOK+WMx3xiJY=
+github.com/karamaru-alpha/copyloopvar v1.2.1 h1:wmZaZYIjnJ0b5UoKDjUHrikcV0zuPyyxI4SVplLd2CI=
+github.com/karamaru-alpha/copyloopvar v1.2.1/go.mod h1:nFmMlFNlClC2BPvNaHMdkirmTJxVCY0lhxBtlfOypMM=
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
-github.com/kisielk/errcheck v1.7.0 h1:+SbscKmWJ5mOK/bO1zS60F5I9WwZDWOfRsC4RwfwRV0=
-github.com/kisielk/errcheck v1.7.0/go.mod h1:1kLL+jV4e+CFfueBmI1dSK2ADDyQnlrnrY/FqKluHJQ=
+github.com/kisielk/errcheck v1.9.0 h1:9xt1zI9EBfcYBvdU1nVrzMzzUPUtPKs9bVSIM3TAb3M=
+github.com/kisielk/errcheck v1.9.0/go.mod h1:kQxWMMVZgIkDq7U8xtG/n2juOjbLgZtedi0D+/VL/i8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
-github.com/kkHAIKE/contextcheck v1.1.5 h1:CdnJh63tcDe53vG+RebdpdXJTc9atMgGqdx8LXxiilg=
-github.com/kkHAIKE/contextcheck v1.1.5/go.mod h1:O930cpht4xb1YQpK+1+AgoM3mFsvxr7uyFptcnWTYUA=
+github.com/kkHAIKE/contextcheck v1.1.6 h1:7HIyRcnyzxL9Lz06NGhiKvenXq7Zw6Q0UQu/ttjfJCE=
+github.com/kkHAIKE/contextcheck v1.1.6/go.mod h1:3dDbMRNBFaq8HFXWC1JyvDSPm43CmE6IuHam8Wr0rkg=
github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y=
@@ -409,14 +412,18 @@ github.com/kulti/thelper v0.6.3 h1:ElhKf+AlItIu+xGnI990no4cE2+XaSu1ULymV2Yulxs=
github.com/kulti/thelper v0.6.3/go.mod h1:DsqKShOvP40epevkFrvIwkCMNYxMeTNjdWL4dqWHZ6I=
github.com/kunwardeep/paralleltest v1.0.10 h1:wrodoaKYzS2mdNVnc4/w31YaXFtsc21PCTdvWJ/lDDs=
github.com/kunwardeep/paralleltest v1.0.10/go.mod h1:2C7s65hONVqY7Q5Efj5aLzRCNLjw2h4eMc9EcypGjcY=
-github.com/kyoh86/exportloopref v0.1.11 h1:1Z0bcmTypkL3Q4k+IDHMWTcnCliEZcaPiIe0/ymEyhQ=
-github.com/kyoh86/exportloopref v0.1.11/go.mod h1:qkV4UF1zGl6EkF1ox8L5t9SwyeBAZ3qLMd6up458uqA=
-github.com/lasiar/canonicalheader v1.1.1 h1:wC+dY9ZfiqiPwAexUApFush/csSPXeIi4QqyxXmng8I=
-github.com/lasiar/canonicalheader v1.1.1/go.mod h1:cXkb3Dlk6XXy+8MVQnF23CYKWlyA7kfQhSw2CcZtZb0=
-github.com/ldez/gomoddirectives v0.2.4 h1:j3YjBIjEBbqZ0NKtBNzr8rtMHTOrLPeiwTkfUJZ3alg=
-github.com/ldez/gomoddirectives v0.2.4/go.mod h1:oWu9i62VcQDYp9EQ0ONTfqLNh+mDLWWDO+SO0qSQw5g=
-github.com/ldez/tagliatelle v0.5.0 h1:epgfuYt9v0CG3fms0pEgIMNPuFf/LpPIfjk4kyqSioo=
-github.com/ldez/tagliatelle v0.5.0/go.mod h1:rj1HmWiL1MiKQuOONhd09iySTEkUuE/8+5jtPYz9xa4=
+github.com/lasiar/canonicalheader v1.1.2 h1:vZ5uqwvDbyJCnMhmFYimgMZnJMjwljN5VGY0VKbMXb4=
+github.com/lasiar/canonicalheader v1.1.2/go.mod h1:qJCeLFS0G/QlLQ506T+Fk/fWMa2VmBUiEI2cuMK4djI=
+github.com/ldez/exptostd v0.4.2 h1:l5pOzHBz8mFOlbcifTxzfyYbgEmoUqjxLFHZkjlbHXs=
+github.com/ldez/exptostd v0.4.2/go.mod h1:iZBRYaUmcW5jwCR3KROEZ1KivQQp6PHXbDPk9hqJKCQ=
+github.com/ldez/gomoddirectives v0.6.1 h1:Z+PxGAY+217f/bSGjNZr/b2KTXcyYLgiWI6geMBN2Qc=
+github.com/ldez/gomoddirectives v0.6.1/go.mod h1:cVBiu3AHR9V31em9u2kwfMKD43ayN5/XDgr+cdaFaKs=
+github.com/ldez/grignotin v0.9.0 h1:MgOEmjZIVNn6p5wPaGp/0OKWyvq42KnzAt/DAb8O4Ow=
+github.com/ldez/grignotin v0.9.0/go.mod h1:uaVTr0SoZ1KBii33c47O1M8Jp3OP3YDwhZCmzT9GHEk=
+github.com/ldez/tagliatelle v0.7.1 h1:bTgKjjc2sQcsgPiT902+aadvMjCeMHrY7ly2XKFORIk=
+github.com/ldez/tagliatelle v0.7.1/go.mod h1:3zjxUpsNB2aEZScWiZTHrAXOl1x25t3cRmzfK1mlo2I=
+github.com/ldez/usetesting v0.4.2 h1:J2WwbrFGk3wx4cZwSMiCQQ00kjGR0+tuuyW0Lqm4lwA=
+github.com/ldez/usetesting v0.4.2/go.mod h1:eEs46T3PpQ+9RgN9VjpY6qWdiw2/QmfiDeWmdZdrjIQ=
github.com/leonklingele/grouper v1.1.2 h1:o1ARBDLOmmasUaNDesWqWCIFH3u7hoFlM84YrjT3mIY=
github.com/leonklingele/grouper v1.1.2/go.mod h1:6D0M/HVkhs2yRKRFZUoGjeDy7EZTfFBE9gl4kjmIGkA=
github.com/libdns/libdns v1.0.0-beta.1 h1:KIf4wLfsrEpXpZ3vmc/poM8zCATXT2klbdPe6hyOBjQ=
@@ -449,8 +456,6 @@ github.com/libp2p/go-reuseport v0.4.0 h1:nR5KU7hD0WxXCJbmw7r2rhRYruNRl2koHw8fQsc
github.com/libp2p/go-reuseport v0.4.0/go.mod h1:ZtI03j/wO5hZVDFo2jKywN6bYKWLOy8Se6DrI2E1cLU=
github.com/libp2p/go-yamux/v5 v5.0.1 h1:f0WoX/bEF2E8SbE4c/k1Mo+/9z0O4oC/hWEA+nfYRSg=
github.com/libp2p/go-yamux/v5 v5.0.1/go.mod h1:en+3cdX51U0ZslwRdRLrvQsdayFt3TSUKvBGErzpWbU=
-github.com/lufeee/execinquery v1.2.1 h1:hf0Ems4SHcUGBxpGN7Jz78z1ppVkP/837ZlETPCEtOM=
-github.com/lufeee/execinquery v1.2.1/go.mod h1:EC7DrEKView09ocscGHC+apXMIaorh4xqSxS/dy8SbM=
github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI=
github.com/macabu/inamedparam v0.1.3 h1:2tk/phHkMlEL/1GNe/Yf6kkR/hkcUdAEY3L0hjYV1Mk=
github.com/macabu/inamedparam v0.1.3/go.mod h1:93FLICAIk/quk7eaPPQvbzihUdn/QkGDwIZEoLtpH6I=
@@ -463,25 +468,22 @@ github.com/maratori/testpackage v1.1.1 h1:S58XVV5AD7HADMmD0fNnziNHqKvSdDuEKdPD1r
github.com/maratori/testpackage v1.1.1/go.mod h1:s4gRK/ym6AMrqpOa/kEbQTV4Q4jb7WeLZzVhVVVOQMc=
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk=
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU=
-github.com/matoous/godox v0.0.0-20240105082147-c5b5e0e7c0c0 h1:Ny7cm4KSWceJLYyI1sm+aFIVDWSGXLcOJ0O0UaS5wdU=
-github.com/matoous/godox v0.0.0-20240105082147-c5b5e0e7c0c0/go.mod h1:jgE/3fUXiTurkdHOLT5WEkThTSuE7yxHv5iWPa80afs=
+github.com/matoous/godox v1.1.0 h1:W5mqwbyWrwZv6OQ5Z1a/DHGMOvXYCBP3+Ht7KMoJhq4=
+github.com/matoous/godox v1.1.0/go.mod h1:jgE/3fUXiTurkdHOLT5WEkThTSuE7yxHv5iWPa80afs=
github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE=
github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU=
-github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
-github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
-github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
-github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
-github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
+github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
+github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
-github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U=
-github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
+github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
+github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk=
github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
-github.com/mgechev/revive v1.3.9 h1:18Y3R4a2USSBF+QZKFQwVkBROUda7uoBlkEuBD+YD1A=
-github.com/mgechev/revive v1.3.9/go.mod h1:+uxEIr5UH0TjXWHTno3xh4u7eg6jDpXKzQccA9UGhHU=
+github.com/mgechev/revive v1.7.0 h1:JyeQ4yO5K8aZhIKf5rec56u0376h8AlKNQEmjfkjKlY=
+github.com/mgechev/revive v1.7.0/go.mod h1:qZnwcNhoguE58dfi96IJeSTPeZQejNeoMQLUZGi4SW4=
github.com/mholt/acmez/v3 v3.1.2 h1:auob8J/0FhmdClQicvJvuDavgd5ezwLBfKuYmynhYzc=
github.com/mholt/acmez/v3 v3.1.2/go.mod h1:L1wOU06KKvq7tswuMDwKdcHeKpFFgkppZy/y0DFxagQ=
github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4=
@@ -538,8 +540,8 @@ github.com/nishanths/exhaustive v0.12.0 h1:vIY9sALmw6T/yxiASewa4TQcFsVYZQQRUQJhK
github.com/nishanths/exhaustive v0.12.0/go.mod h1:mEZ95wPIZW+x8kC4TgC+9YCUgiST7ecevsVDTgc2obs=
github.com/nishanths/predeclared v0.2.2 h1:V2EPdZPliZymNAn79T8RkNApBjMmVKh5XRpLm/w98Vk=
github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c=
-github.com/nunnatsa/ginkgolinter v0.16.2 h1:8iLqHIZvN4fTLDC0Ke9tbSZVcyVHoBs0HIbnVSxfHJk=
-github.com/nunnatsa/ginkgolinter v0.16.2/go.mod h1:4tWRinDN1FeJgU+iJANW/kz7xKN5nYRAOfJDQUS9dOQ=
+github.com/nunnatsa/ginkgolinter v0.19.1 h1:mjwbOlDQxZi9Cal+KfbEJTCz327OLNfwNvoZ70NJ+c4=
+github.com/nunnatsa/ginkgolinter v0.19.1/go.mod h1:jkQ3naZDmxaZMXPWaS9rblH+i+GWXQCaS/JFIWcOH2s=
github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
@@ -557,8 +559,8 @@ github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT9
github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc=
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0=
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y=
-github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM=
-github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
+github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M=
+github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc=
github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4=
github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
github.com/pion/datachannel v1.5.10 h1:ly0Q26K1i6ZkGf42W7D4hQYR90pZwzFOjTq5AuCKk4o=
@@ -612,8 +614,8 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/polydawn/refmt v0.89.0 h1:ADJTApkvkeBZsN0tBTx8QjpD9JkmxbKp0cxfr9qszm4=
github.com/polydawn/refmt v0.89.0/go.mod h1:/zvteZs/GwLtCgZ4BL6CBsk9IKIlexP43ObX9AxTqTw=
-github.com/polyfloyd/go-errorlint v1.6.0 h1:tftWV9DE7txiFzPpztTAwyoRLKNj9gpVm2cg8/OwcYY=
-github.com/polyfloyd/go-errorlint v1.6.0/go.mod h1:HR7u8wuP1kb1NeN1zqTd1ZMlqUKPPHF+Id4vIPvDqVw=
+github.com/polyfloyd/go-errorlint v1.7.1 h1:RyLVXIbosq1gBdk/pChWA8zWYLsq9UEw7a1L5TVMCnA=
+github.com/polyfloyd/go-errorlint v1.7.1/go.mod h1:aXjNb1x2TNhoLsk26iv1yl7a+zTnXPhwEMtEXukiLR8=
github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g=
github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U=
github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
@@ -628,8 +630,8 @@ github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGI
github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7DuK0=
github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw=
-github.com/quasilyte/go-ruleguard v0.4.2 h1:htXcXDK6/rO12kiTHKfHuqR4kr3Y4M0J0rOL6CH/BYs=
-github.com/quasilyte/go-ruleguard v0.4.2/go.mod h1:GJLgqsLeo4qgavUoL8JeGFNS7qcisx3awV/w9eWTmNI=
+github.com/quasilyte/go-ruleguard v0.4.3-0.20240823090925-0fe6f58b47b1 h1:+Wl/0aFp0hpuHM3H//KMft64WQ1yX9LdJY64Qm/gFCo=
+github.com/quasilyte/go-ruleguard v0.4.3-0.20240823090925-0fe6f58b47b1/go.mod h1:GJLgqsLeo4qgavUoL8JeGFNS7qcisx3awV/w9eWTmNI=
github.com/quasilyte/go-ruleguard/dsl v0.3.22 h1:wd8zkOhSNr+I+8Qeciml08ivDt1pSXe60+5DqOpCjPE=
github.com/quasilyte/go-ruleguard/dsl v0.3.22/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU=
github.com/quasilyte/gogrep v0.5.0 h1:eTKODPXbI8ffJMN+W2aE0+oL0z/nh8/5eNdiO34SOAo=
@@ -644,38 +646,37 @@ github.com/quic-go/quic-go v0.54.0 h1:6s1YB9QotYI6Ospeiguknbp2Znb/jZYjZLRXn9kMQB
github.com/quic-go/quic-go v0.54.0/go.mod h1:e68ZEaCdyviluZmy44P6Iey98v/Wfz6HCjQEm+l8zTY=
github.com/quic-go/webtransport-go v0.9.0 h1:jgys+7/wm6JarGDrW+lD/r9BGqBAmqY/ssklE09bA70=
github.com/quic-go/webtransport-go v0.9.0/go.mod h1:4FUYIiUc75XSsF6HShcLeXXYZJ9AGwo/xh3L8M/P1ao=
+github.com/raeperd/recvcheck v0.2.0 h1:GnU+NsbiCqdC2XX5+vMZzP+jAJC5fht7rcVTAhX74UI=
+github.com/raeperd/recvcheck v0.2.0/go.mod h1:n04eYkwIR0JbgD73wT8wL4JjPC3wm0nFtzBnWNocnYU=
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
-github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
-github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
-github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
+github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
+github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
-github.com/ryancurrah/gomodguard v1.3.3 h1:eiSQdJVNr9KTNxY2Niij8UReSwR8Xrte3exBrAZfqpg=
-github.com/ryancurrah/gomodguard v1.3.3/go.mod h1:rsKQjj4l3LXe8N344Ow7agAy5p9yjsWOtRzUMYmA0QY=
+github.com/ryancurrah/gomodguard v1.3.5 h1:cShyguSwUEeC0jS7ylOiG/idnd1TpJ1LfHGpV3oJmPU=
+github.com/ryancurrah/gomodguard v1.3.5/go.mod h1:MXlEPQRxgfPQa62O8wzK3Ozbkv9Rkqr+wKjSxTdsNJE=
github.com/ryanrolds/sqlclosecheck v0.5.1 h1:dibWW826u0P8jNLsLN+En7+RqWWTYrjCB9fJfSfdyCU=
github.com/ryanrolds/sqlclosecheck v0.5.1/go.mod h1:2g3dUjoS6AL4huFdv6wn55WpLIDjY7ZgUR4J8HOO/XQ=
github.com/sagikazarmark/locafero v0.6.0 h1:ON7AQg37yzcRPU69mt7gwhFEBwxI6P9T4Qu3N51bwOk=
github.com/sagikazarmark/locafero v0.6.0/go.mod h1:77OmuIc6VTraTXKXIs/uvUxKGUXjE1GbemJYHqdNjX0=
github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=
github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ=
-github.com/sanposhiho/wastedassign/v2 v2.0.7 h1:J+6nrY4VW+gC9xFzUc+XjPD3g3wF3je/NsJFwFK7Uxc=
-github.com/sanposhiho/wastedassign/v2 v2.0.7/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI=
-github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 h1:lZUw3E0/J3roVtGQ+SCrUrg3ON6NgVqpn3+iol9aGu4=
-github.com/santhosh-tekuri/jsonschema/v5 v5.3.1/go.mod h1:uToXkOrWAZ6/Oc07xWQrPOhJotwFIyu2bBVN41fcDUY=
+github.com/sanposhiho/wastedassign/v2 v2.1.0 h1:crurBF7fJKIORrV85u9UUpePDYGWnwvv3+A96WvwXT0=
+github.com/sanposhiho/wastedassign/v2 v2.1.0/go.mod h1:+oSmSC+9bQ+VUAxA66nBb0Z7N8CK7mscKTDYC6aIek4=
+github.com/santhosh-tekuri/jsonschema/v6 v6.0.1 h1:PKK9DyHxif4LZo+uQSgXNqs0jj5+xZwwfKHgph2lxBw=
+github.com/santhosh-tekuri/jsonschema/v6 v6.0.1/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU=
github.com/sashamelentyev/interfacebloat v1.1.0 h1:xdRdJp0irL086OyW1H/RTZTr1h/tMEOsumirXcOJqAw=
github.com/sashamelentyev/interfacebloat v1.1.0/go.mod h1:+Y9yU5YdTkrNvoX0xHc84dxiN1iBi9+G8zZIhPVoNjQ=
-github.com/sashamelentyev/usestdlibvars v1.27.0 h1:t/3jZpSXtRPRf2xr0m63i32ZrusyurIGT9E5wAvXQnI=
-github.com/sashamelentyev/usestdlibvars v1.27.0/go.mod h1:9nl0jgOfHKWNFS43Ojw0i7aRoS4j6EBye3YBhmAIRF8=
-github.com/securego/gosec/v2 v2.20.1-0.20240820084340-81cda2f91fbe h1:exdneYmXwZ4+VaIWv9mQ47uIHkTQSN50DYdCjXJ1cdQ=
-github.com/securego/gosec/v2 v2.20.1-0.20240820084340-81cda2f91fbe/go.mod h1:iyeMMRw8QEmueUSZ2VqmkQMiDyDcobfPnG00CV/NWdE=
+github.com/sashamelentyev/usestdlibvars v1.28.0 h1:jZnudE2zKCtYlGzLVreNp5pmCdOxXUzwsMDBkR21cyQ=
+github.com/sashamelentyev/usestdlibvars v1.28.0/go.mod h1:9nl0jgOfHKWNFS43Ojw0i7aRoS4j6EBye3YBhmAIRF8=
+github.com/securego/gosec/v2 v2.22.2 h1:IXbuI7cJninj0nRpZSLCUlotsj8jGusohfONMrHoF6g=
+github.com/securego/gosec/v2 v2.22.2/go.mod h1:UEBGA+dSKb+VqM6TdehR7lnQtIIMorYJ4/9CW1KVQBE=
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
-github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c h1:W65qqJCIOVP4jpqPQ0YvHYKwcMEMVWIzWC5iNQQfBTU=
-github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs=
github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY=
github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM=
github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0=
@@ -703,14 +704,14 @@ github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/sivchari/containedctx v1.0.3 h1:x+etemjbsh2fB5ewm5FeLNi5bUjK0V8n0RB+Wwfd0XE=
github.com/sivchari/containedctx v1.0.3/go.mod h1:c1RDvCbnJLtH4lLcYD/GqwiBSSf4F5Qk0xld2rBqzJ4=
-github.com/sivchari/tenv v1.10.0 h1:g/hzMA+dBCKqGXgW8AV/1xIWhAvDrx0zFKNR48NFMg0=
-github.com/sivchari/tenv v1.10.0/go.mod h1:tdY24masnVoZFxYrHv/nD6Tc8FbkEtAQEEziXpyMgqY=
+github.com/sivchari/tenv v1.12.1 h1:+E0QzjktdnExv/wwsnnyk4oqZBUfuh89YMQT1cyuvSY=
+github.com/sivchari/tenv v1.12.1/go.mod h1:1LjSOUCc25snIr5n3DtGGrENhX3LuWefcplwVGC24mw=
github.com/smartystreets/assertions v1.2.0 h1:42S6lae5dvLc7BrLu/0ugRtcFVjoJNMC/N3yZFZkDFs=
github.com/smartystreets/assertions v1.2.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo=
github.com/smartystreets/goconvey v1.7.2 h1:9RBaZCeXEQ3UselpuwUQHltGVXvdwm6cv1hgR6gDIPg=
github.com/smartystreets/goconvey v1.7.2/go.mod h1:Vw0tHAZW6lzCRk3xgdin6fKYcG+G3Pg9vgXWeJpQFMM=
-github.com/sonatard/noctx v0.0.2 h1:L7Dz4De2zDQhW8S0t+KUjY0MAQJd6SgVwhzNIc4ok00=
-github.com/sonatard/noctx v0.0.2/go.mod h1:kzFz+CzWSjQ2OzIm46uJZoXuBpa2+0y3T36U18dWqIo=
+github.com/sonatard/noctx v0.1.0 h1:JjqOc2WN16ISWAjAk8M5ej0RfExEXtkEyExl2hLW+OM=
+github.com/sonatard/noctx v0.1.0/go.mod h1:0RvBxqY8D4j9cTTTWE8ylt2vqj2EPI8fHmrxHdsaZ2c=
github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE=
github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=
github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=
@@ -719,20 +720,21 @@ github.com/sourcegraph/go-diff v0.7.0/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag07
github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA=
github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=
github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
-github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8=
-github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY=
+github.com/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs=
+github.com/spf13/afero v1.12.0/go.mod h1:ZTlWwG4/ahT8W7T0WQ5uYmjI9duaLQGy3Q2OAl4sk/4=
github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0=
github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
-github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM=
-github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y=
-github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
+github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=
+github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
+github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI=
github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg=
github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YEwQ0=
github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I=
-github.com/stbenjam/no-sprintf-host-port v0.1.1 h1:tYugd/yrm1O0dV+ThCbaKZh195Dfm07ysF0U6JQXczc=
-github.com/stbenjam/no-sprintf-host-port v0.1.1/go.mod h1:TLhvtIvONRzdmkFiio4O8LHsN9N74I+PhRquPsxpL0I=
+github.com/stbenjam/no-sprintf-host-port v0.2.0 h1:i8pxvGrt1+4G0czLr/WnmyH7zbZ8Bg8etvARQ1rpyl4=
+github.com/stbenjam/no-sprintf-host-port v0.2.0/go.mod h1:eL0bQ9PasS0hsyTyfTjjG+E80QIyPnBVQbYZyv20Jfk=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
@@ -753,31 +755,33 @@ github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf
github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA=
-github.com/tdakkota/asciicheck v0.2.0 h1:o8jvnUANo0qXtnslk2d3nMKTFNlOnJjRrNcj0j9qkHM=
-github.com/tdakkota/asciicheck v0.2.0/go.mod h1:Qb7Y9EgjCLJGup51gDHFzbI08/gbGhL/UVhYIPWG2rg=
+github.com/tdakkota/asciicheck v0.4.1 h1:bm0tbcmi0jezRA2b5kg4ozmMuGAFotKI3RZfrhfovg8=
+github.com/tdakkota/asciicheck v0.4.1/go.mod h1:0k7M3rCfRXb0Z6bwgvkEIMleKH3kXNz9UqJ9Xuqopr8=
github.com/tenntenn/modver v1.0.1 h1:2klLppGhDgzJrScMpkj9Ujy3rXPUspSjAcev9tSEBgA=
github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0=
github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3 h1:f+jULpRQGxTSkNYKJ51yaw6ChIqO+Je8UqsTKN/cDag=
github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY=
-github.com/tetafro/godot v1.4.16 h1:4ChfhveiNLk4NveAZ9Pu2AN8QZ2nkUGFuadM9lrr5D0=
-github.com/tetafro/godot v1.4.16/go.mod h1:2oVxTBSftRTh4+MVfUaUXR6bn2GDXCaMcOG4Dk3rfio=
-github.com/timakin/bodyclose v0.0.0-20240125160201-f835fa56326a h1:A6uKudFIfAEpoPdaal3aSqGxBzLyU8TqyXImLwo6dIo=
-github.com/timakin/bodyclose v0.0.0-20240125160201-f835fa56326a/go.mod h1:mkjARE7Yr8qU23YcGMSALbIxTQ9r9QBVahQOBRfU460=
-github.com/timonwong/loggercheck v0.9.4 h1:HKKhqrjcVj8sxL7K77beXh0adEm6DLjV/QOGeMXEVi4=
-github.com/timonwong/loggercheck v0.9.4/go.mod h1:caz4zlPcgvpEkXgVnAJGowHAMW2NwHaNlpS8xDbVhTg=
-github.com/tomarrell/wrapcheck/v2 v2.9.0 h1:801U2YCAjLhdN8zhZ/7tdjB3EnAoRlJHt/s+9hijLQ4=
-github.com/tomarrell/wrapcheck/v2 v2.9.0/go.mod h1:g9vNIyhb5/9TQgumxQyOEqDHsmGYcGsVMOx/xGkqdMo=
+github.com/tetafro/godot v1.5.0 h1:aNwfVI4I3+gdxjMgYPus9eHmoBeJIbnajOyqZYStzuw=
+github.com/tetafro/godot v1.5.0/go.mod h1:2oVxTBSftRTh4+MVfUaUXR6bn2GDXCaMcOG4Dk3rfio=
+github.com/timakin/bodyclose v0.0.0-20241017074812-ed6a65f985e3 h1:y4mJRFlM6fUyPhoXuFg/Yu02fg/nIPFMOY8tOqppoFg=
+github.com/timakin/bodyclose v0.0.0-20241017074812-ed6a65f985e3/go.mod h1:mkjARE7Yr8qU23YcGMSALbIxTQ9r9QBVahQOBRfU460=
+github.com/timonwong/loggercheck v0.10.1 h1:uVZYClxQFpw55eh+PIoqM7uAOHMrhVcDoWDery9R8Lg=
+github.com/timonwong/loggercheck v0.10.1/go.mod h1:HEAWU8djynujaAVX7QI65Myb8qgfcZ1uKbdpg3ZzKl8=
+github.com/tomarrell/wrapcheck/v2 v2.10.0 h1:SzRCryzy4IrAH7bVGG4cK40tNUhmVmMDuJujy4XwYDg=
+github.com/tomarrell/wrapcheck/v2 v2.10.0/go.mod h1:g9vNIyhb5/9TQgumxQyOEqDHsmGYcGsVMOx/xGkqdMo=
github.com/tommy-muehle/go-mnd/v2 v2.5.1 h1:NowYhSdyE/1zwK9QCLeRb6USWdoif80Ie+v+yU8u1Zw=
github.com/tommy-muehle/go-mnd/v2 v2.5.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw=
-github.com/ultraware/funlen v0.1.0 h1:BuqclbkY6pO+cvxoq7OsktIXZpgBSkYTQtmwhAK81vI=
-github.com/ultraware/funlen v0.1.0/go.mod h1:XJqmOQja6DpxarLj6Jj1U7JuoS8PvL4nEqDaQhy22p4=
-github.com/ultraware/whitespace v0.1.1 h1:bTPOGejYFulW3PkcrqkeQwOd6NKOOXvmGD9bo/Gk8VQ=
-github.com/ultraware/whitespace v0.1.1/go.mod h1:XcP1RLD81eV4BW8UhQlpaR+SDc2givTvyI8a586WjW8=
+github.com/ultraware/funlen v0.2.0 h1:gCHmCn+d2/1SemTdYMiKLAHFYxTYz7z9VIDRaTGyLkI=
+github.com/ultraware/funlen v0.2.0/go.mod h1:ZE0q4TsJ8T1SQcjmkhN/w+MceuatI6pBFSxxyteHIJA=
+github.com/ultraware/whitespace v0.2.0 h1:TYowo2m9Nfj1baEQBjuHzvMRbp19i+RCcRYrSWoFa+g=
+github.com/ultraware/whitespace v0.2.0/go.mod h1:XcP1RLD81eV4BW8UhQlpaR+SDc2givTvyI8a586WjW8=
github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
github.com/urfave/cli v1.22.16 h1:MH0k6uJxdwdeWQTwhSO42Pwr4YLrNLwBtg1MRgTqPdQ=
github.com/urfave/cli v1.22.16/go.mod h1:EeJR6BKodywf4zciqrdw6hpCPk68JO9z5LazXZMn5Po=
-github.com/uudashr/gocognit v1.1.3 h1:l+a111VcDbKfynh+airAy/DJQKaXh2m9vkoysMPSZyM=
-github.com/uudashr/gocognit v1.1.3/go.mod h1:aKH8/e8xbTRBwjbCkwZ8qt4l2EpKXl31KMHgSS+lZ2U=
+github.com/uudashr/gocognit v1.2.0 h1:3BU9aMr1xbhPlvJLSydKwdLN3tEUUrzPSSM8S4hDYRA=
+github.com/uudashr/gocognit v1.2.0/go.mod h1:k/DdKPI6XBZO1q7HgoV2juESI2/Ofj9AcHPZhBBdrTU=
+github.com/uudashr/iface v1.3.1 h1:bA51vmVx1UIhiIsQFSNq6GZ6VPTk3WNMZgRiCe9R29U=
+github.com/uudashr/iface v1.3.1/go.mod h1:4QvspiRd3JLPAEXBQ9AiZpLbJlrWWgRChOKDJEuQTdg=
github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU=
github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM=
github.com/warpfork/go-testmark v0.12.1 h1:rMgCpJfwy1sJ50x0M0NgyphxYYPMOODIJHhsXyEHU0s=
@@ -818,10 +822,10 @@ gitlab.com/bosi/decorder v0.4.2 h1:qbQaV3zgwnBZ4zPMhGLW4KZe7A7NwxEhJx39R3shffo=
gitlab.com/bosi/decorder v0.4.2/go.mod h1:muuhHoaJkA9QLcYHq4Mj8FJUwDZ+EirSHRiaTcTf6T8=
go-simpler.org/assert v0.9.0 h1:PfpmcSvL7yAnWyChSjOz6Sp6m9j5lyK8Ok9pEL31YkQ=
go-simpler.org/assert v0.9.0/go.mod h1:74Eqh5eI6vCK6Y5l3PI8ZYFXG4Sa+tkr70OIPJAUr28=
-go-simpler.org/musttag v0.12.2 h1:J7lRc2ysXOq7eM8rwaTYnNrHd5JwjppzB6mScysB2Cs=
-go-simpler.org/musttag v0.12.2/go.mod h1:uN1DVIasMTQKk6XSik7yrJoEysGtR2GRqvWnI9S7TYM=
-go-simpler.org/sloglint v0.7.2 h1:Wc9Em/Zeuu7JYpl+oKoYOsQSy2X560aVueCW/m6IijY=
-go-simpler.org/sloglint v0.7.2/go.mod h1:US+9C80ppl7VsThQclkM7BkCHQAzuz8kHLsW3ppuluo=
+go-simpler.org/musttag v0.13.0 h1:Q/YAW0AHvaoaIbsPj3bvEI5/QFP7w696IMUpnKXQfCE=
+go-simpler.org/musttag v0.13.0/go.mod h1:FTzIGeK6OkKlUDVpj0iQUXZLUO1Js9+mvykDQy9C5yM=
+go-simpler.org/sloglint v0.9.0 h1:/40NQtjRx9txvsB/RN022KsUJU+zaaSb/9q9BSefSrE=
+go-simpler.org/sloglint v0.9.0/go.mod h1:G/OrAF6uxj48sHahCzrbarVMptL2kjWTaUeC8+fOGww=
go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA=
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
@@ -858,15 +862,11 @@ golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPh
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw=
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
-golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio=
golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
-golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
-golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4=
golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
@@ -874,8 +874,8 @@ golang.org/x/exp v0.0.0-20250811191247-51f88131bc50 h1:3yiSh9fhy5/RhCSntf4Sy0Tnx
golang.org/x/exp v0.0.0-20250811191247-51f88131bc50/go.mod h1:rT6SFzZ7oxADUDx58pcaKFTcZ+inxAa9fTrYx/uVYwg=
golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
-golang.org/x/exp/typeparams v0.0.0-20240314144324-c7f7c6466f7f h1:phY1HzDcf18Aq9A8KkmRtY9WvOFIxN8wgfvy6Zm1DV8=
-golang.org/x/exp/typeparams v0.0.0-20240314144324-c7f7c6466f7f/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
+golang.org/x/exp/typeparams v0.0.0-20250210185358-939b2ce775ac h1:TSSpLIG4v+p0rPv1pNOQtl1I8knsO4S9trOxNMOLVP4=
+golang.org/x/exp/typeparams v0.0.0-20250210185358-939b2ce775ac/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
@@ -885,17 +885,13 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
-golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI=
golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
-golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
-golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ=
golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -916,19 +912,15 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
-golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
-golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
+golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
-golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA=
golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
-golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
-golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE=
golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -949,7 +941,6 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
-golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -962,7 +953,6 @@ golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -973,40 +963,28 @@ golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=
golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
-golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
-golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
-golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
+golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
-golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o=
golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU=
golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY=
-golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
-golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58=
golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4=
golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -1016,10 +994,9 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
-golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
-golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
@@ -1034,9 +1011,7 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm
golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
-golang.org/x/tools v0.0.0-20190321232350-e250d351ecad/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
@@ -1046,22 +1021,17 @@ golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc
golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU=
golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU=
golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
-golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=
golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
-golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA=
golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k=
-golang.org/x/tools v0.5.0/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
-golang.org/x/tools v0.11.0/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8=
+golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s=
golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg=
-golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc=
golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg=
golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s=
golang.org/x/tools/go/expect v0.1.1-deprecated h1:jpBZDwmgPhXsKZC6WhL20P4b/wmnpsEAGHaNy0n/rJM=
@@ -1105,16 +1075,16 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-gotest.tools/gotestsum v1.12.0 h1:CmwtaGDkHxrZm4Ib0Vob89MTfpc3GrEFMJKovliPwGk=
-gotest.tools/gotestsum v1.12.0/go.mod h1:fAvqkSptospfSbQw26CTYzNwnsE/ztqLeyhP0h67ARY=
-gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU=
-gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU=
+gotest.tools/gotestsum v1.12.3 h1:jFwenGJ0RnPkuKh2VzAYl1mDOJgbhobBDeL2W1iEycs=
+gotest.tools/gotestsum v1.12.3/go.mod h1:Y1+e0Iig4xIRtdmYbEV7K7H6spnjc1fX4BOuUhWw2Wk=
+gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q=
+gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA=
grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o=
honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.5.1 h1:4bH5o3b5ZULQ4UrBmP+63W9r7qIkqJClEA9ko5YKx+I=
-honnef.co/go/tools v0.5.1/go.mod h1:e9irvo83WDG9/irijV44wr3tbhcFeRnfpVlRqVwpzMs=
+honnef.co/go/tools v0.6.1 h1:R094WgE8K4JirYjBaOpz/AvTyUu/3wbmAoskKN/pxTI=
+honnef.co/go/tools v0.6.1/go.mod h1:3puzxxljPCe8RGJX7BIy1plGbxEOZni5mR2aXe3/uk4=
lukechampine.com/blake3 v1.4.1 h1:I3Smz7gso8w4/TunLKec6K2fn+kyKtDxr/xcQEN84Wg=
lukechampine.com/blake3 v1.4.1/go.mod h1:QFosUxmjB8mnrWFSNwKmvxHpfY72bmD2tQ0kBMM3kwo=
mvdan.cc/gofumpt v0.7.0 h1:bg91ttqXmi9y2xawvkuMXyvAA/1ZGJqYAEGjXuP0JXU=
From b8a1aa471c806c2b0df0e6f91fdfff15429cfc9e Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Thu, 14 Aug 2025 10:37:55 -0700
Subject: [PATCH 324/499] chore: replace random test utils with equivalents in
go-test/random (#10915)
Replace test functionality that is dublicated in go-test/random
---
test/cli/bitswap_config_test.go | 4 +-
test/cli/content_routing_http_test.go | 4 +-
.../delegated_routing_v1_http_proxy_test.go | 10 +-
test/cli/dht_autoclient_test.go | 6 +-
test/cli/dht_opt_prov_test.go | 4 +-
test/cli/http_retrieval_client_test.go | 4 +-
test/cli/pinning_remote_test.go | 12 +-
test/cli/pins_test.go | 21 +--
test/cli/provider_test.go | 16 +--
test/cli/testutils/random.go | 16 ---
test/cli/testutils/random_files.go | 123 ------------------
test/cli/testutils/strings.go | 5 +
test/cli/transports_test.go | 14 +-
13 files changed, 54 insertions(+), 185 deletions(-)
delete mode 100644 test/cli/testutils/random.go
delete mode 100644 test/cli/testutils/random_files.go
diff --git a/test/cli/bitswap_config_test.go b/test/cli/bitswap_config_test.go
index 9674d3cb6..52e9ea541 100644
--- a/test/cli/bitswap_config_test.go
+++ b/test/cli/bitswap_config_test.go
@@ -6,9 +6,9 @@ import (
"time"
"github.com/ipfs/boxo/bitswap/network/bsnet"
+ "github.com/ipfs/go-test/random"
"github.com/ipfs/kubo/config"
"github.com/ipfs/kubo/test/cli/harness"
- "github.com/ipfs/kubo/test/cli/testutils"
"github.com/stretchr/testify/assert"
)
@@ -16,7 +16,7 @@ func TestBitswapConfig(t *testing.T) {
t.Parallel()
// Create test data that will be shared between nodes
- testData := testutils.RandomBytes(100)
+ testData := random.Bytes(100)
t.Run("server enabled (default)", func(t *testing.T) {
t.Parallel()
diff --git a/test/cli/content_routing_http_test.go b/test/cli/content_routing_http_test.go
index 4b210cfba..b6e045383 100644
--- a/test/cli/content_routing_http_test.go
+++ b/test/cli/content_routing_http_test.go
@@ -8,9 +8,9 @@ import (
"time"
"github.com/ipfs/boxo/routing/http/server"
+ "github.com/ipfs/go-test/random"
"github.com/ipfs/kubo/config"
"github.com/ipfs/kubo/test/cli/harness"
- "github.com/ipfs/kubo/test/cli/testutils"
"github.com/ipfs/kubo/test/cli/testutils/httprouting"
"github.com/stretchr/testify/assert"
)
@@ -43,7 +43,7 @@ func TestContentRoutingHTTP(t *testing.T) {
node.StartDaemon()
// compute a random CID
- randStr := string(testutils.RandomBytes(100))
+ randStr := string(random.Bytes(100))
res := node.PipeStrToIPFS(randStr, "add", "-qn")
wantCIDStr := res.Stdout.Trimmed()
diff --git a/test/cli/delegated_routing_v1_http_proxy_test.go b/test/cli/delegated_routing_v1_http_proxy_test.go
index 7f8ff8bca..548459653 100644
--- a/test/cli/delegated_routing_v1_http_proxy_test.go
+++ b/test/cli/delegated_routing_v1_http_proxy_test.go
@@ -4,9 +4,9 @@ import (
"testing"
"github.com/ipfs/boxo/ipns"
+ "github.com/ipfs/go-test/random"
"github.com/ipfs/kubo/config"
"github.com/ipfs/kubo/test/cli/harness"
- "github.com/ipfs/kubo/test/cli/testutils"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
@@ -70,7 +70,7 @@ func TestRoutingV1Proxy(t *testing.T) {
t.Parallel()
nodes := setupNodes(t)
- cidStr := nodes[0].IPFSAddStr(testutils.RandomStr(1000))
+ cidStr := nodes[0].IPFSAddStr(string(random.Bytes(1000)))
// Reprovide as initialProviderDelay still ongoing
res := nodes[0].IPFS("routing", "reprovide")
require.NoError(t, res.Err)
@@ -109,7 +109,7 @@ func TestRoutingV1Proxy(t *testing.T) {
require.Error(t, res.ExitErr)
// Publish record on Node 0.
- path := "/ipfs/" + nodes[0].IPFSAddStr(testutils.RandomStr(1000))
+ path := "/ipfs/" + nodes[0].IPFSAddStr(string(random.Bytes(1000)))
nodes[0].IPFS("name", "publish", "--allow-offline", path)
// Get record on Node 1 (no DHT).
@@ -132,7 +132,7 @@ func TestRoutingV1Proxy(t *testing.T) {
require.Error(t, res.ExitErr)
// Publish name.
- path := "/ipfs/" + nodes[0].IPFSAddStr(testutils.RandomStr(1000))
+ path := "/ipfs/" + nodes[0].IPFSAddStr(string(random.Bytes(1000)))
nodes[0].IPFS("name", "publish", "--allow-offline", path)
// Resolve IPNS name
@@ -146,7 +146,7 @@ func TestRoutingV1Proxy(t *testing.T) {
// Publish something on Node 1 (no DHT).
nodeName := "/ipns/" + ipns.NameFromPeer(nodes[1].PeerID()).String()
- path := "/ipfs/" + nodes[1].IPFSAddStr(testutils.RandomStr(1000))
+ path := "/ipfs/" + nodes[1].IPFSAddStr(string(random.Bytes(1000)))
nodes[1].IPFS("name", "publish", "--allow-offline", path)
// Retrieve through Node 0.
diff --git a/test/cli/dht_autoclient_test.go b/test/cli/dht_autoclient_test.go
index 39aa5b258..adb200509 100644
--- a/test/cli/dht_autoclient_test.go
+++ b/test/cli/dht_autoclient_test.go
@@ -4,8 +4,8 @@ import (
"bytes"
"testing"
+ "github.com/ipfs/go-test/random"
"github.com/ipfs/kubo/test/cli/harness"
- "github.com/ipfs/kubo/test/cli/testutils"
"github.com/stretchr/testify/assert"
)
@@ -19,7 +19,7 @@ func TestDHTAutoclient(t *testing.T) {
t.Run("file added on node in client mode is retrievable from node in client mode", func(t *testing.T) {
t.Parallel()
- randomBytes := testutils.RandomBytes(1000)
+ randomBytes := random.Bytes(1000)
randomBytes = append(randomBytes, '\r')
hash := nodes[8].IPFSAdd(bytes.NewReader(randomBytes))
@@ -29,7 +29,7 @@ func TestDHTAutoclient(t *testing.T) {
t.Run("file added on node in server mode is retrievable from all nodes", func(t *testing.T) {
t.Parallel()
- randomBytes := testutils.RandomBytes(1000)
+ randomBytes := random.Bytes(1000)
hash := nodes[0].IPFSAdd(bytes.NewReader(randomBytes))
for i := 0; i < 10; i++ {
diff --git a/test/cli/dht_opt_prov_test.go b/test/cli/dht_opt_prov_test.go
index f7b492066..3cdb9d51c 100644
--- a/test/cli/dht_opt_prov_test.go
+++ b/test/cli/dht_opt_prov_test.go
@@ -3,9 +3,9 @@ package cli
import (
"testing"
+ "github.com/ipfs/go-test/random"
"github.com/ipfs/kubo/config"
"github.com/ipfs/kubo/test/cli/harness"
- "github.com/ipfs/kubo/test/cli/testutils"
"github.com/stretchr/testify/assert"
)
@@ -21,7 +21,7 @@ func TestDHTOptimisticProvide(t *testing.T) {
nodes.StartDaemons().Connect()
- hash := nodes[0].IPFSAddStr(testutils.RandomStr(100))
+ hash := nodes[0].IPFSAddStr(string(random.Bytes(100)))
nodes[0].IPFS("routing", "provide", hash)
res := nodes[1].IPFS("routing", "findprovs", "--num-providers=1", hash)
diff --git a/test/cli/http_retrieval_client_test.go b/test/cli/http_retrieval_client_test.go
index f845c818e..e2934fc99 100644
--- a/test/cli/http_retrieval_client_test.go
+++ b/test/cli/http_retrieval_client_test.go
@@ -13,9 +13,9 @@ import (
"github.com/ipfs/boxo/routing/http/server"
"github.com/ipfs/boxo/routing/http/types"
"github.com/ipfs/go-cid"
+ "github.com/ipfs/go-test/random"
"github.com/ipfs/kubo/config"
"github.com/ipfs/kubo/test/cli/harness"
- "github.com/ipfs/kubo/test/cli/testutils"
"github.com/ipfs/kubo/test/cli/testutils/httprouting"
"github.com/libp2p/go-libp2p/core/peer"
"github.com/multiformats/go-multiaddr"
@@ -51,7 +51,7 @@ func TestHTTPRetrievalClient(t *testing.T) {
})
// compute a random CID
- randStr := string(testutils.RandomBytes(100))
+ randStr := string(random.Bytes(100))
res := node.PipeStrToIPFS(randStr, "add", "-qn", "--cid-version", "1") // -n means dont add to local repo, just produce CID
wantCIDStr := res.Stdout.Trimmed()
testCid := cid.MustParse(wantCIDStr)
diff --git a/test/cli/pinning_remote_test.go b/test/cli/pinning_remote_test.go
index fede942ba..fd9ae8e94 100644
--- a/test/cli/pinning_remote_test.go
+++ b/test/cli/pinning_remote_test.go
@@ -9,8 +9,8 @@ import (
"time"
"github.com/google/uuid"
+ "github.com/ipfs/go-test/random"
"github.com/ipfs/kubo/test/cli/harness"
- "github.com/ipfs/kubo/test/cli/testutils"
"github.com/ipfs/kubo/test/cli/testutils/pinningservice"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
@@ -350,7 +350,7 @@ func TestRemotePinning(t *testing.T) {
pin.Status = "pinned"
transitionedCh <- struct{}{}
}
- hash := node.IPFSAddStr(string(testutils.RandomBytes(1000)))
+ hash := node.IPFSAddStr(string(random.Bytes(1000)))
node.IPFS("pin", "remote", "add", "--background=false", "--service=svc", hash)
<-transitionedCh
res := node.IPFS("pin", "remote", "ls", "--service=svc", "--cid="+hash, "--enc=json").Stdout.String()
@@ -368,7 +368,7 @@ func TestRemotePinning(t *testing.T) {
defer pin.M.Unlock()
pin.Status = "pinned"
}
- hash := node.IPFSAddStr(string(testutils.RandomBytes(1000)))
+ hash := node.IPFSAddStr(string(random.Bytes(1000)))
node.IPFS("pin", "remote", "add", "--service=svc", "--name=force-test-name", hash)
node.IPFS("pin", "remote", "add", "--service=svc", "--name=force-test-name", hash)
@@ -396,7 +396,7 @@ func TestRemotePinning(t *testing.T) {
defer pin.M.Unlock()
pin.Status = "pinned"
}
- hash := node.IPFSAddStr(string(testutils.RandomBytes(1000)))
+ hash := node.IPFSAddStr(string(random.Bytes(1000)))
node.IPFS("pin", "remote", "add", "--service=svc", "--name=force-test-name", hash)
node.IPFS("pin", "remote", "add", "--service=svc", "--name=force-test-name", hash)
@@ -417,7 +417,7 @@ func TestRemotePinning(t *testing.T) {
pin.Status = "pinned"
}
for i := 0; i < 4; i++ {
- hash := node.IPFSAddStr(string(testutils.RandomBytes(1000)))
+ hash := node.IPFSAddStr(string(random.Bytes(1000)))
name := fmt.Sprintf("--name=%d", i)
node.IPFS("pin", "remote", "add", "--service=svc", "--name="+name, hash)
}
@@ -438,7 +438,7 @@ func TestRemotePinning(t *testing.T) {
_, svcURL := runPinningService(t, authToken)
node.IPFS("pin", "remote", "service", "add", "svc", svcURL, authToken)
- hash := node.IPFSAddStr(string(testutils.RandomBytes(1000)))
+ hash := node.IPFSAddStr(string(random.Bytes(1000)))
res := node.IPFS("pin", "remote", "add", "--service=svc", "--background", hash)
warningMsg := "WARNING: the local node is offline and remote pinning may fail if there is no other provider for this CID"
assert.Contains(t, res.Stdout.String(), warningMsg)
diff --git a/test/cli/pins_test.go b/test/cli/pins_test.go
index 3e3325a01..68611c8f8 100644
--- a/test/cli/pins_test.go
+++ b/test/cli/pins_test.go
@@ -6,6 +6,7 @@ import (
"testing"
"github.com/ipfs/go-cid"
+ "github.com/ipfs/go-test/random"
"github.com/ipfs/kubo/test/cli/harness"
. "github.com/ipfs/kubo/test/cli/testutils"
"github.com/stretchr/testify/assert"
@@ -142,7 +143,7 @@ func testPinDAG(t *testing.T, args testPinsArgs) {
if args.runDaemon {
node.StartDaemon("--offline")
}
- bytes := RandomBytes(1 << 20) // 1 MiB
+ bytes := random.Bytes(1 << 20) // 1 MiB
tmpFile := h.WriteToTemp(string(bytes))
cid := node.IPFS(StrCat("add", args.pinArg, "--pin=false", "-q", tmpFile)...).Stdout.Trimmed()
@@ -169,7 +170,7 @@ func testPinProgress(t *testing.T, args testPinsArgs) {
node.StartDaemon("--offline")
}
- bytes := RandomBytes(1 << 20) // 1 MiB
+ bytes := random.Bytes(1 << 20) // 1 MiB
tmpFile := h.WriteToTemp(string(bytes))
cid := node.IPFS(StrCat("add", args.pinArg, "--pin=false", "-q", tmpFile)...).Stdout.Trimmed()
@@ -218,8 +219,8 @@ func TestPins(t *testing.T) {
t.Parallel()
node := harness.NewT(t).NewNode().Init()
- cidAStr := node.IPFSAddStr(RandomStr(1000), "--pin=false")
- cidBStr := node.IPFSAddStr(RandomStr(1000), "--pin=false")
+ cidAStr := node.IPFSAddStr(string(random.Bytes(1000)), "--pin=false")
+ cidBStr := node.IPFSAddStr(string(random.Bytes(1000)), "--pin=false")
_ = node.IPFS("pin", "add", "--name", "testPin", cidAStr)
@@ -246,9 +247,9 @@ func TestPins(t *testing.T) {
t.Parallel()
node := harness.NewT(t).NewNode().Init()
- cidAStr := node.IPFSAddStr(RandomStr(1000), "--pin=false")
- cidBStr := node.IPFSAddStr(RandomStr(1000), "--pin=false")
- cidCStr := node.IPFSAddStr(RandomStr(1000), "--pin=false")
+ cidAStr := node.IPFSAddStr(string(random.Bytes(1000)), "--pin=false")
+ cidBStr := node.IPFSAddStr(string(random.Bytes(1000)), "--pin=false")
+ cidCStr := node.IPFSAddStr(string(random.Bytes(1000)), "--pin=false")
outA := cidAStr + " recursive testPin"
outB := cidBStr + " recursive testPin"
@@ -284,7 +285,7 @@ func TestPins(t *testing.T) {
t.Parallel()
node := harness.NewT(t).NewNode().Init()
- cidStr := node.IPFSAddStr(RandomStr(1000), "--pin=false")
+ cidStr := node.IPFSAddStr(string(random.Bytes(1000)), "--pin=false")
outBefore := cidStr + " recursive A"
outAfter := cidStr + " recursive B"
@@ -305,8 +306,8 @@ func TestPins(t *testing.T) {
t.Parallel()
node := harness.NewT(t).NewNode().Init()
- cidAStr := node.IPFSAddStr(RandomStr(1000), "--pin=false")
- cidBStr := node.IPFSAddStr(RandomStr(1000), "--pin=false")
+ cidAStr := node.IPFSAddStr(string(random.Bytes(1000)), "--pin=false")
+ cidBStr := node.IPFSAddStr(string(random.Bytes(1000)), "--pin=false")
_ = node.IPFS("pin", "add", "--name", "testPinJson", cidAStr)
diff --git a/test/cli/provider_test.go b/test/cli/provider_test.go
index a3cb4c086..7820fb356 100644
--- a/test/cli/provider_test.go
+++ b/test/cli/provider_test.go
@@ -6,8 +6,8 @@ import (
"testing"
"time"
+ "github.com/ipfs/go-test/random"
"github.com/ipfs/kubo/test/cli/harness"
- "github.com/ipfs/kubo/test/cli/testutils"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
@@ -75,7 +75,7 @@ func TestProvider(t *testing.T) {
})
defer nodes.StopDaemons()
- data := testutils.RandomBytes(256)
+ data := random.Bytes(256)
cid := nodes[0].IPFSBlockPut(bytes.NewReader(data), "--pin=false")
expectProviders(t, cid, nodes[0].PeerID().String(), nodes[1:]...)
})
@@ -262,7 +262,7 @@ func TestProvider(t *testing.T) {
defer nodes.StopDaemons()
// Add a file to MFS (should be provided)
- data := testutils.RandomBytes(1000)
+ data := random.Bytes(1000)
cid := nodes[0].IPFSAdd(bytes.NewReader(data), "-Q")
// not yet in MFS
@@ -329,8 +329,8 @@ func TestProvider(t *testing.T) {
t.Run("Reprovides with 'pinned' strategy", func(t *testing.T) {
t.Parallel()
- foo := testutils.RandomBytes(1000)
- bar := testutils.RandomBytes(1000)
+ foo := random.Bytes(1000)
+ bar := random.Bytes(1000)
nodes := initNodesWithoutStart(t, 2, func(n *harness.Node) {
n.SetIPFSConfig("Reprovider.Strategy", "pinned")
@@ -364,8 +364,8 @@ func TestProvider(t *testing.T) {
t.Run("Reprovides with 'roots' strategy", func(t *testing.T) {
t.Parallel()
- foo := testutils.RandomBytes(1000)
- bar := testutils.RandomBytes(1000)
+ foo := random.Bytes(1000)
+ bar := random.Bytes(1000)
nodes := initNodesWithoutStart(t, 2, func(n *harness.Node) {
n.SetIPFSConfig("Reprovider.Strategy", "roots")
@@ -396,7 +396,7 @@ func TestProvider(t *testing.T) {
t.Run("Reprovides with 'mfs' strategy", func(t *testing.T) {
t.Parallel()
- bar := testutils.RandomBytes(1000)
+ bar := random.Bytes(1000)
nodes := initNodesWithoutStart(t, 2, func(n *harness.Node) {
n.SetIPFSConfig("Reprovider.Strategy", "mfs")
diff --git a/test/cli/testutils/random.go b/test/cli/testutils/random.go
deleted file mode 100644
index 6fa6528c3..000000000
--- a/test/cli/testutils/random.go
+++ /dev/null
@@ -1,16 +0,0 @@
-package testutils
-
-import "crypto/rand"
-
-func RandomBytes(n int) []byte {
- bytes := make([]byte, n)
- _, err := rand.Read(bytes)
- if err != nil {
- panic(err)
- }
- return bytes
-}
-
-func RandomStr(n int) string {
- return string(RandomBytes(n))
-}
diff --git a/test/cli/testutils/random_files.go b/test/cli/testutils/random_files.go
deleted file mode 100644
index 7991cad83..000000000
--- a/test/cli/testutils/random_files.go
+++ /dev/null
@@ -1,123 +0,0 @@
-package testutils
-
-import (
- "fmt"
- "io"
- "math/rand"
- "os"
- "path"
- "time"
-)
-
-var (
- AlphabetEasy = []rune("abcdefghijklmnopqrstuvwxyz01234567890-_")
- AlphabetHard = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890!@#$%^&*()-_+= ;.,<>'\"[]{}() ")
-)
-
-type RandFiles struct {
- Rand *rand.Rand
- FileSize int // the size per file.
- FilenameSize int
- Alphabet []rune // for filenames
-
- FanoutDepth int // how deep the hierarchy goes
- FanoutFiles int // how many files per dir
- FanoutDirs int // how many dirs per dir
-
- RandomSize bool // randomize file sizes
- RandomNameSize bool // randomize filename lengths
- RandomFanout bool // randomize fanout numbers
-}
-
-func NewRandFiles() *RandFiles {
- return &RandFiles{
- Rand: rand.New(rand.NewSource(time.Now().UnixNano())),
- FileSize: 4096,
- FilenameSize: 16,
- Alphabet: AlphabetEasy,
- FanoutDepth: 2,
- FanoutDirs: 5,
- FanoutFiles: 10,
- RandomSize: true,
- RandomNameSize: true,
- }
-}
-
-func (r *RandFiles) WriteRandomFiles(root string, depth int) error {
- numfiles := r.FanoutFiles
- if r.RandomFanout {
- numfiles = rand.Intn(r.FanoutFiles) + 1
- }
-
- for i := 0; i < numfiles; i++ {
- if err := r.WriteRandomFile(root); err != nil {
- return err
- }
- }
-
- if depth+1 <= r.FanoutDepth {
- numdirs := r.FanoutDirs
- if r.RandomFanout {
- numdirs = r.Rand.Intn(numdirs) + 1
- }
-
- for i := 0; i < numdirs; i++ {
- if err := r.WriteRandomDir(root, depth+1); err != nil {
- return err
- }
- }
- }
-
- return nil
-}
-
-func (r *RandFiles) RandomFilename(length int) string {
- b := make([]rune, length)
- for i := range b {
- b[i] = r.Alphabet[r.Rand.Intn(len(r.Alphabet))]
- }
- return string(b)
-}
-
-func (r *RandFiles) WriteRandomFile(root string) error {
- filesize := int64(r.FileSize)
- if r.RandomSize {
- filesize = r.Rand.Int63n(filesize) + 1
- }
-
- n := r.FilenameSize
- if r.RandomNameSize {
- n = rand.Intn(r.FilenameSize-4) + 4
- }
- name := r.RandomFilename(n)
- filepath := path.Join(root, name)
- f, err := os.Create(filepath)
- if err != nil {
- return fmt.Errorf("creating random file: %w", err)
- }
-
- if _, err := io.CopyN(f, r.Rand, filesize); err != nil {
- return fmt.Errorf("copying random file: %w", err)
- }
-
- return f.Close()
-}
-
-func (r *RandFiles) WriteRandomDir(root string, depth int) error {
- if depth > r.FanoutDepth {
- return nil
- }
-
- n := rand.Intn(r.FilenameSize-4) + 4
- name := r.RandomFilename(n)
- root = path.Join(root, name)
- if err := os.MkdirAll(root, 0o755); err != nil {
- return fmt.Errorf("creating random dir: %w", err)
- }
-
- err := r.WriteRandomFiles(root, depth)
- if err != nil {
- return fmt.Errorf("writing random files in random dir: %w", err)
- }
- return nil
-}
diff --git a/test/cli/testutils/strings.go b/test/cli/testutils/strings.go
index 110051e67..9bd73b379 100644
--- a/test/cli/testutils/strings.go
+++ b/test/cli/testutils/strings.go
@@ -13,6 +13,11 @@ import (
manet "github.com/multiformats/go-multiaddr/net"
)
+var (
+ AlphabetEasy = []rune("abcdefghijklmnopqrstuvwxyz01234567890-_")
+ AlphabetHard = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890!@#$%^&*()-_+= ;.,<>'\"[]{}() ")
+)
+
// StrCat takes a bunch of strings or string slices
// and concats them all together into one string slice.
// If an arg is not one of those types, this panics.
diff --git a/test/cli/transports_test.go b/test/cli/transports_test.go
index ec27e00ba..3e674adf6 100644
--- a/test/cli/transports_test.go
+++ b/test/cli/transports_test.go
@@ -6,9 +6,10 @@ import (
"path/filepath"
"testing"
+ "github.com/ipfs/go-test/random"
+ "github.com/ipfs/go-test/random/files"
"github.com/ipfs/kubo/config"
"github.com/ipfs/kubo/test/cli/harness"
- "github.com/ipfs/kubo/test/cli/testutils"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
@@ -23,7 +24,7 @@ func TestTransports(t *testing.T) {
})
}
checkSingleFile := func(nodes harness.Nodes) {
- s := testutils.RandomStr(100)
+ s := string(random.Bytes(100))
hash := nodes[0].IPFSAddStr(s)
nodes.ForEachPar(func(n *harness.Node) {
val := n.IPFS("cat", hash).Stdout.String()
@@ -33,10 +34,11 @@ func TestTransports(t *testing.T) {
checkRandomDir := func(nodes harness.Nodes) {
randDir := filepath.Join(nodes[0].Dir, "foobar")
require.NoError(t, os.Mkdir(randDir, 0o777))
- rf := testutils.NewRandFiles()
- rf.FanoutDirs = 3
- rf.FanoutFiles = 6
- require.NoError(t, rf.WriteRandomFiles(randDir, 4))
+ rfCfg := files.DefaultConfig()
+ rfCfg.Dirs = 3
+ rfCfg.Files = 6
+ rfCfg.Depth = 4
+ require.NoError(t, files.Create(rfCfg, randDir))
hash := nodes[1].IPFS("add", "-r", "-Q", randDir).Stdout.Trimmed()
nodes.ForEachPar(func(n *harness.Node) {
From 5cb0943936082f879f960c9097137bbbf6a3695c Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Fri, 15 Aug 2025 00:32:05 +0200
Subject: [PATCH 325/499] chore(deps): bump actions/checkout from 4 to 5
(#10907)
Dependabot couldn't find the original pull request head commit, 0292612bd5e16ed34f2974225fe170b15d4eb821.
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
.github/workflows/codeql-analysis.yml | 2 +-
.github/workflows/docker-build.yml | 2 +-
.github/workflows/docker-image.yml | 2 +-
.github/workflows/gateway-conformance.yml | 4 ++--
.github/workflows/gobuild.yml | 2 +-
.github/workflows/golang-analysis.yml | 2 +-
.github/workflows/golint.yml | 2 +-
.github/workflows/gotest.yml | 2 +-
.github/workflows/interop.yml | 4 ++--
.github/workflows/sharness.yml | 2 +-
10 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
index 28aaccf43..904b7815a 100644
--- a/.github/workflows/codeql-analysis.yml
+++ b/.github/workflows/codeql-analysis.yml
@@ -29,7 +29,7 @@ jobs:
steps:
- name: Checkout repository
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
- name: Setup Go
uses: actions/setup-go@v5
diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml
index 89d7efe3f..c5043d5a2 100644
--- a/.github/workflows/docker-build.yml
+++ b/.github/workflows/docker-build.yml
@@ -29,6 +29,6 @@ jobs:
- uses: actions/setup-go@v5
with:
go-version: 1.25.x
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- run: docker build -t $IMAGE_NAME:$WIP_IMAGE_TAG .
- run: docker run --rm $IMAGE_NAME:$WIP_IMAGE_TAG --version
diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml
index f83809240..8aa0dd77b 100644
--- a/.github/workflows/docker-image.yml
+++ b/.github/workflows/docker-image.yml
@@ -38,7 +38,7 @@ jobs:
LEGACY_IMAGE_NAME: ipfs/go-ipfs
steps:
- name: Check out the repo
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
diff --git a/.github/workflows/gateway-conformance.yml b/.github/workflows/gateway-conformance.yml
index 697b32192..18d1959e6 100644
--- a/.github/workflows/gateway-conformance.yml
+++ b/.github/workflows/gateway-conformance.yml
@@ -54,7 +54,7 @@ jobs:
with:
name: ${{ github.job }}
- name: Checkout kubo-gateway
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
with:
path: kubo-gateway
- name: Build kubo-gateway
@@ -141,7 +141,7 @@ jobs:
with:
name: ${{ github.job }}
- name: Checkout kubo-gateway
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
with:
path: kubo-gateway
- name: Build kubo-gateway
diff --git a/.github/workflows/gobuild.yml b/.github/workflows/gobuild.yml
index e75275011..48665074f 100644
--- a/.github/workflows/gobuild.yml
+++ b/.github/workflows/gobuild.yml
@@ -31,7 +31,7 @@ jobs:
- uses: actions/setup-go@v5
with:
go-version: 1.25.x
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- run: make cmd/ipfs-try-build
env:
TEST_FUSE: 1
diff --git a/.github/workflows/golang-analysis.yml b/.github/workflows/golang-analysis.yml
index 71067b9f6..bb1a49570 100644
--- a/.github/workflows/golang-analysis.yml
+++ b/.github/workflows/golang-analysis.yml
@@ -22,7 +22,7 @@ jobs:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
with:
submodules: recursive
- uses: actions/setup-go@v5
diff --git a/.github/workflows/golint.yml b/.github/workflows/golint.yml
index de4aac792..898e3e936 100644
--- a/.github/workflows/golint.yml
+++ b/.github/workflows/golint.yml
@@ -32,5 +32,5 @@ jobs:
- uses: actions/setup-go@v5
with:
go-version: 1.25.x
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- run: make -O test_go_lint
diff --git a/.github/workflows/gotest.yml b/.github/workflows/gotest.yml
index afa3357b8..34d86352b 100644
--- a/.github/workflows/gotest.yml
+++ b/.github/workflows/gotest.yml
@@ -34,7 +34,7 @@ jobs:
with:
go-version: 1.25.x
- name: Check out Kubo
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
- name: Install missing tools
run: sudo apt update && sudo apt install -y zsh
- name: ๐๏ธ If this step failed, go to ยซSummaryยป (top left) โ inspect the ยซFailures/Errorsยป table
diff --git a/.github/workflows/interop.yml b/.github/workflows/interop.yml
index 5fb3a5817..2f7c7a78c 100644
--- a/.github/workflows/interop.yml
+++ b/.github/workflows/interop.yml
@@ -39,7 +39,7 @@ jobs:
- uses: actions/setup-go@v5
with:
go-version: ${{ env.GO_VERSION }}
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- run: make build
- uses: actions/upload-artifact@v4
with:
@@ -97,7 +97,7 @@ jobs:
name: kubo
path: cmd/ipfs
- run: chmod +x cmd/ipfs/ipfs
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
with:
repository: ipfs/ipfs-webui
path: ipfs-webui
diff --git a/.github/workflows/sharness.yml b/.github/workflows/sharness.yml
index 6ee3c4c45..9295bc1c1 100644
--- a/.github/workflows/sharness.yml
+++ b/.github/workflows/sharness.yml
@@ -27,7 +27,7 @@ jobs:
with:
go-version: 1.25.x
- name: Checkout Kubo
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
with:
path: kubo
- name: Install missing tools
From 64c47c374a263ee9f8ab5e50a548332862cef749 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Fri, 15 Aug 2025 02:36:33 +0200
Subject: [PATCH 326/499] feat(config):
`Gateway.RetrievalTimeout|MaxConcurrentRequests` (#10905)
* feat(gateway): concurrency and timeout limits
Depends on https://github.com/ipfs/boxo/pull/994
* chore: boxo master with final boxo#994
this includes race-condition fixes from ipfs/boxo#994
and increased `DefaultMaxConcurrentRequests = 4096`
* docs: concise config.md and changelog
---
.github/workflows/docker-build.yml | 2 +-
config/gateway.go | 25 ++++
core/corehttp/gateway.go | 16 ++-
core/corehttp/metrics.go | 1 +
docs/changelogs/v0.37.md | 20 +++
docs/config.md | 51 +++++++
docs/examples/kubo-as-a-library/go.mod | 10 +-
docs/examples/kubo-as-a-library/go.sum | 20 +--
go.mod | 10 +-
go.sum | 20 +--
test/cli/gateway_limits_test.go | 132 ++++++++++++++++++
test/dependencies/go.mod | 24 +++-
test/dependencies/go.sum | 64 +++++++--
.../t0119-prometheus-data/prometheus_metrics | 1 +
14 files changed, 348 insertions(+), 48 deletions(-)
create mode 100644 test/cli/gateway_limits_test.go
diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml
index c5043d5a2..bd1a5cf41 100644
--- a/.github/workflows/docker-build.yml
+++ b/.github/workflows/docker-build.yml
@@ -26,9 +26,9 @@ jobs:
run:
shell: bash
steps:
+ - uses: actions/checkout@v5
- uses: actions/setup-go@v5
with:
go-version: 1.25.x
- - uses: actions/checkout@v5
- run: docker build -t $IMAGE_NAME:$WIP_IMAGE_TAG .
- run: docker run --rm $IMAGE_NAME:$WIP_IMAGE_TAG --version
diff --git a/config/gateway.go b/config/gateway.go
index 35af598b4..56eb0c395 100644
--- a/config/gateway.go
+++ b/config/gateway.go
@@ -1,10 +1,18 @@
package config
+import (
+ "github.com/ipfs/boxo/gateway"
+)
+
const (
DefaultInlineDNSLink = false
DefaultDeserializedResponses = true
DefaultDisableHTMLErrors = false
DefaultExposeRoutingAPI = false
+
+ // Gateway limit defaults from boxo
+ DefaultRetrievalTimeout = gateway.DefaultRetrievalTimeout
+ DefaultMaxConcurrentRequests = gateway.DefaultMaxConcurrentRequests
)
type GatewaySpec struct {
@@ -73,4 +81,21 @@ type Gateway struct {
// ExposeRoutingAPI configures the gateway port to expose
// routing system as HTTP API at /routing/v1 (https://specs.ipfs.tech/routing/http-routing-v1/).
ExposeRoutingAPI Flag
+
+ // RetrievalTimeout enforces a maximum duration for content retrieval:
+ // - Time to first byte: If the gateway cannot start writing the response within
+ // this duration (e.g., stuck searching for providers), a 504 Gateway Timeout
+ // is returned.
+ // - Time between writes: After the first byte, the timeout resets each time new
+ // bytes are written to the client. If the gateway cannot write additional data
+ // within this duration after the last successful write, the response is terminated.
+ // This helps free resources when the gateway gets stuck looking for providers
+ // or cannot retrieve the requested content.
+ // A value of 0 disables this timeout.
+ RetrievalTimeout *OptionalDuration `json:",omitempty"`
+
+ // MaxConcurrentRequests limits concurrent HTTP requests handled by the gateway.
+ // Requests beyond this limit receive 429 Too Many Requests with Retry-After header.
+ // A value of 0 disables the limit.
+ MaxConcurrentRequests *OptionalInteger `json:",omitempty"`
}
diff --git a/core/corehttp/gateway.go b/core/corehttp/gateway.go
index 6ac381885..340882a7e 100644
--- a/core/corehttp/gateway.go
+++ b/core/corehttp/gateway.go
@@ -97,11 +97,21 @@ func Libp2pGatewayOption() ServeOption {
return nil, err
}
+ // Get gateway configuration from the node's config
+ cfg, err := n.Repo.Config()
+ if err != nil {
+ return nil, err
+ }
+
gwConfig := gateway.Config{
- DeserializedResponses: false,
- NoDNSLink: true,
+ // Keep these constraints for security
+ DeserializedResponses: false, // Trustless-only
+ NoDNSLink: true, // No DNS resolution
PublicGateways: nil,
Menu: nil,
+ // Apply timeout and concurrency limits from user config
+ RetrievalTimeout: cfg.Gateway.RetrievalTimeout.WithDefault(config.DefaultRetrievalTimeout),
+ MaxConcurrentRequests: int(cfg.Gateway.MaxConcurrentRequests.WithDefault(int64(config.DefaultMaxConcurrentRequests))),
}
handler := gateway.NewHandler(gwConfig, &offlineGatewayErrWrapper{gwimpl: backend})
@@ -258,6 +268,8 @@ func getGatewayConfig(n *core.IpfsNode) (gateway.Config, map[string][]string, er
DisableHTMLErrors: cfg.Gateway.DisableHTMLErrors.WithDefault(config.DefaultDisableHTMLErrors),
NoDNSLink: cfg.Gateway.NoDNSLink,
PublicGateways: map[string]*gateway.PublicGateway{},
+ RetrievalTimeout: cfg.Gateway.RetrievalTimeout.WithDefault(config.DefaultRetrievalTimeout),
+ MaxConcurrentRequests: int(cfg.Gateway.MaxConcurrentRequests.WithDefault(int64(config.DefaultMaxConcurrentRequests))),
}
// Add default implicit known gateways, such as subdomain gateway on localhost.
diff --git a/core/corehttp/metrics.go b/core/corehttp/metrics.go
index f43362ff7..be1031513 100644
--- a/core/corehttp/metrics.go
+++ b/core/corehttp/metrics.go
@@ -87,6 +87,7 @@ func MetricsCollectionOption(handlerName string) ServeOption {
Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001},
}
+ // Legacy metric - new metrics are provided by boxo/gateway as gw_http_responses_total
reqCnt := prometheus.NewCounterVec(
prometheus.CounterOpts{
Namespace: opts.Namespace,
diff --git a/docs/changelogs/v0.37.md b/docs/changelogs/v0.37.md
index 84f6637bd..9d2f3673b 100644
--- a/docs/changelogs/v0.37.md
+++ b/docs/changelogs/v0.37.md
@@ -10,6 +10,7 @@ This release was brought to you by the [Shipyard](https://ipshipyard.com/) team.
- [Overview](#overview)
- [๐ฆ Highlights](#-highlights)
+ - [๐ฆ Gateway concurrent request limits and retrieval timeouts](#-gateway-concurrent-request-limits-and-retrieval-timeouts)
- [Clear provide queue when reprovide strategy changes](#clear-provide-queue-when-reprovide-strategy-changes)
- [๐ชต Revamped `ipfs log level` command](#-revamped-ipfs-log-level-command)
- [๐ Named pins in `ipfs add` command](#-named-pins-in-ipfs-add-command)
@@ -27,6 +28,25 @@ This release was brought to you by the [Shipyard](https://ipshipyard.com/) team.
### ๐ฆ Highlights
+#### ๐ฆ Gateway concurrent request limits and retrieval timeouts
+
+New configurable limits protect gateway resources during high load:
+
+- **[`Gateway.RetrievalTimeout`](https://github.com/ipfs/kubo/blob/master/docs/config.md#gatewayretrievaltimeout)** (default: 30s): Maximum duration for content retrieval. Returns 504 Gateway Timeout when exceeded - applies to both initial retrieval (time to first byte) and between subsequent writes.
+- **[`Gateway.MaxConcurrentRequests`](https://github.com/ipfs/kubo/blob/master/docs/config.md#gatewaymaxconcurrentrequests)** (default: 4096): Limits concurrent HTTP requests. Returns 429 Too Many Requests when exceeded. Protects nodes from traffic spikes and resource exhaustion, especially useful behind reverse proxies without rate-limiting.
+
+New Prometheus metrics for monitoring:
+
+- `ipfs_http_gw_concurrent_requests`: Current requests being processed
+- `ipfs_http_gw_responses_total`: HTTP responses by status code
+- `ipfs_http_gw_retrieval_timeouts_total`: Timeouts by status code and truncation status
+
+Tuning tips:
+
+- Monitor metrics to understand gateway behavior and adjust based on observations
+- Watch `ipfs_http_gw_concurrent_requests` for saturation
+- Track `ipfs_http_gw_retrieval_timeouts_total` vs success rates to identify timeout patterns indicating routing or storage provider issues
+
#### Clear provide queue when reprovide strategy changes
Your content sharing strategy changes now take effect cleanly, without interference from previously queued items.
diff --git a/docs/config.md b/docs/config.md
index 6b9ad4c13..79d51bec4 100644
--- a/docs/config.md
+++ b/docs/config.md
@@ -60,6 +60,8 @@ config file at runtime.
- [`Gateway.DeserializedResponses`](#gatewaydeserializedresponses)
- [`Gateway.DisableHTMLErrors`](#gatewaydisablehtmlerrors)
- [`Gateway.ExposeRoutingAPI`](#gatewayexposeroutingapi)
+ - [`Gateway.RetrievalTimeout`](#gatewayretrievaltimeout)
+ - [`Gateway.MaxConcurrentRequests`](#gatewaymaxconcurrentrequests)
- [`Gateway.HTTPHeaders`](#gatewayhttpheaders)
- [`Gateway.RootRedirect`](#gatewayrootredirect)
- [`Gateway.FastDirIndexThreshold`](#gatewayfastdirindexthreshold)
@@ -947,6 +949,55 @@ Default: `false`
Type: `flag`
+### `Gateway.RetrievalTimeout`
+
+Maximum duration Kubo will wait for content retrieval (new bytes to arrive).
+
+**Timeout behavior:**
+- **Time to first byte**: Returns 504 Gateway Timeout if the gateway cannot start writing within this duration (e.g., stuck searching for providers)
+- **Time between writes**: After first byte, timeout resets with each write. Response terminates if no new data can be written within this duration
+
+**Truncation handling:** When timeout occurs after HTTP 200 headers are sent (e.g., during CAR streams), the gateway:
+- Appends error message to indicate truncation
+- Forces TCP reset (RST) to prevent caching incomplete responses
+- Records in metrics with original status code and `truncated=true` flag
+
+**Monitoring:** Track `ipfs_http_gw_retrieval_timeouts_total` by status code and truncation status.
+
+**Tuning guidance:**
+- Compare timeout rates (`ipfs_http_gw_retrieval_timeouts_total`) with success rates (`ipfs_http_gw_responses_total{status="200"}`)
+- High timeout rate: consider increasing timeout or scaling horizontally if hardware is constrained
+- Many 504s may indicate routing problems - check requested CIDs and provider availability using https://check.ipfs.network/
+- `truncated=true` timeouts indicate retrieval stalled mid-file with no new bytes for the timeout duration
+
+A value of 0 disables this timeout.
+
+Default: `30s`
+
+Type: `optionalDuration`
+
+### `Gateway.MaxConcurrentRequests`
+
+Limits concurrent HTTP requests. Requests beyond limit receive 429 Too Many Requests.
+
+Protects nodes from traffic spikes and resource exhaustion, especially behind reverse proxies without rate-limiting. Default (4096) aligns with common reverse proxy configurations (e.g., nginx: 8 workers ร 1024 connections).
+
+**Monitoring:** `ipfs_http_gw_concurrent_requests` tracks current requests in flight.
+
+**Tuning guidance:**
+- Monitor `ipfs_http_gw_concurrent_requests` gauge for usage patterns
+- Track 429s (`ipfs_http_gw_responses_total{status="429"}`) and success rate (`{status="200"}`)
+- Near limit with low resource usage โ increase value
+- Memory pressure or OOMs โ decrease value and consider scaling
+- Set slightly below reverse proxy limit for graceful degradation
+- Start with default, adjust based on observed performance for your hardware
+
+A value of 0 disables the limit.
+
+Default: `4096`
+
+Type: `optionalInteger`
+
### `Gateway.HTTPHeaders`
Headers to set on gateway responses.
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index 18da5bf01..94fe5ee27 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -7,7 +7,7 @@ go 1.25
replace github.com/ipfs/kubo => ./../../..
require (
- github.com/ipfs/boxo v0.33.2-0.20250813013451-825361b44b4e
+ github.com/ipfs/boxo v0.33.2-0.20250814210825-54b62d4eccbf
github.com/ipfs/kubo v0.0.0-00010101000000-000000000000
github.com/libp2p/go-libp2p v0.43.0
github.com/multiformats/go-multiaddr v0.16.1
@@ -52,7 +52,7 @@ require (
github.com/fsnotify/fsnotify v1.7.0 // indirect
github.com/gabriel-vasile/mimetype v1.4.9 // indirect
github.com/gammazero/chanqueue v1.1.1 // indirect
- github.com/gammazero/deque v1.0.0 // indirect
+ github.com/gammazero/deque v1.1.0 // indirect
github.com/getsentry/sentry-go v0.27.0 // indirect
github.com/go-jose/go-jose/v4 v4.0.5 // indirect
github.com/go-logr/logr v1.4.3 // indirect
@@ -75,7 +75,7 @@ require (
github.com/ipfs/go-block-format v0.2.2 // indirect
github.com/ipfs/go-cid v0.5.0 // indirect
github.com/ipfs/go-cidutil v0.1.0 // indirect
- github.com/ipfs/go-datastore v0.8.2 // indirect
+ github.com/ipfs/go-datastore v0.8.3 // indirect
github.com/ipfs/go-ds-badger v0.3.4 // indirect
github.com/ipfs/go-ds-flatfs v0.5.5 // indirect
github.com/ipfs/go-ds-leveldb v0.5.2 // indirect
@@ -90,7 +90,7 @@ require (
github.com/ipfs/go-ipld-format v0.6.2 // indirect
github.com/ipfs/go-ipld-git v0.1.1 // indirect
github.com/ipfs/go-ipld-legacy v0.2.2 // indirect
- github.com/ipfs/go-log/v2 v2.8.0 // indirect
+ github.com/ipfs/go-log/v2 v2.8.1 // indirect
github.com/ipfs/go-metrics-interface v0.3.0 // indirect
github.com/ipfs/go-peertaskqueue v0.8.2 // indirect
github.com/ipfs/go-unixfsnode v1.10.1 // indirect
@@ -206,7 +206,7 @@ require (
go.uber.org/zap/exp v0.3.0 // indirect
go4.org v0.0.0-20230225012048-214862532bf5 // indirect
golang.org/x/crypto v0.41.0 // indirect
- golang.org/x/exp v0.0.0-20250811191247-51f88131bc50 // indirect
+ golang.org/x/exp v0.0.0-20250813145105-42675adae3e6 // indirect
golang.org/x/mod v0.27.0 // indirect
golang.org/x/net v0.43.0 // indirect
golang.org/x/sync v0.16.0 // indirect
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index dace80e15..a514520a4 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -163,8 +163,8 @@ github.com/gabriel-vasile/mimetype v1.4.9 h1:5k+WDwEsD9eTLL8Tz3L0VnmVh9QxGjRmjBv
github.com/gabriel-vasile/mimetype v1.4.9/go.mod h1:WnSQhFKJuBlRyLiKohA/2DtIlPFAbguNaG7QCHcyGok=
github.com/gammazero/chanqueue v1.1.1 h1:n9Y+zbBxw2f7uUE9wpgs0rOSkP/I/yhDLiNuhyVjojQ=
github.com/gammazero/chanqueue v1.1.1/go.mod h1:fMwpwEiuUgpab0sH4VHiVcEoji1pSi+EIzeG4TPeKPc=
-github.com/gammazero/deque v1.0.0 h1:LTmimT8H7bXkkCy6gZX7zNLtkbz4NdS2z8LZuor3j34=
-github.com/gammazero/deque v1.0.0/go.mod h1:iflpYvtGfM3U8S8j+sZEKIak3SAKYpA5/SQewgfXDKo=
+github.com/gammazero/deque v1.1.0 h1:OyiyReBbnEG2PP0Bnv1AASLIYvyKqIFN5xfl1t8oGLo=
+github.com/gammazero/deque v1.1.0/go.mod h1:JVrR+Bj1NMQbPnYclvDlvSX0nVGReLrQZ0aUMuWLctg=
github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps=
github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY=
github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9 h1:r5GgOLGbza2wVHRzK7aAj6lWZjfbAwiu/RDCVOKjRyM=
@@ -287,8 +287,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcd
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.33.2-0.20250813013451-825361b44b4e h1:A2zSzpyrerCtdN69iDxt9S9z27cD1R4Uw3l1ctLTxX0=
-github.com/ipfs/boxo v0.33.2-0.20250813013451-825361b44b4e/go.mod h1:ehi6uM9NBRkAaB7Q7u2kZgGArXPfbNRe0X/CYTqUwq8=
+github.com/ipfs/boxo v0.33.2-0.20250814210825-54b62d4eccbf h1:W3iHiK3PaaayhoQQUgh3zvz7nbVfi/srJSgWi7HyM9s=
+github.com/ipfs/boxo v0.33.2-0.20250814210825-54b62d4eccbf/go.mod h1:kzdH/ewDybtO3+M8MCVkpwnIIc/d2VISX95DFrY4vQA=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk=
@@ -303,8 +303,8 @@ github.com/ipfs/go-cidutil v0.1.0 h1:RW5hO7Vcf16dplUU60Hs0AKDkQAVPVplr7lk97CFL+Q
github.com/ipfs/go-cidutil v0.1.0/go.mod h1:e7OEVBMIv9JaOxt9zaGEmAoSlXW9jdFZ5lP/0PwcfpA=
github.com/ipfs/go-datastore v0.1.0/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE=
github.com/ipfs/go-datastore v0.1.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw=
-github.com/ipfs/go-datastore v0.8.2 h1:Jy3wjqQR6sg/LhyY0NIePZC3Vux19nLtg7dx0TVqr6U=
-github.com/ipfs/go-datastore v0.8.2/go.mod h1:W+pI1NsUsz3tcsAACMtfC+IZdnQTnC/7VfPoJBQuts0=
+github.com/ipfs/go-datastore v0.8.3 h1:z391GsQyGKUIUof2tPoaZVeDknbt7fNHs6Gqjcw5Jo4=
+github.com/ipfs/go-datastore v0.8.3/go.mod h1:raxQ/CreIy9L6MxT71ItfMX12/ASN6EhXJoUFjICQ2M=
github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk=
github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps=
github.com/ipfs/go-ds-badger v0.0.7/go.mod h1:qt0/fWzZDoPW6jpQeqUjR5kBfhDNB65jd9YlmAvpQBk=
@@ -345,8 +345,8 @@ github.com/ipfs/go-ipld-legacy v0.2.2/go.mod h1:hhkj+b3kG9b2BcUNw8IFYAsfeNo8E3U7
github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM=
github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8=
github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo=
-github.com/ipfs/go-log/v2 v2.8.0 h1:SptNTPJQV3s5EF4FdrTu/yVdOKfGbDgn1EBZx4til2o=
-github.com/ipfs/go-log/v2 v2.8.0/go.mod h1:2LEEhdv8BGubPeSFTyzbqhCqrwqxCbuTNTLWqgNAipo=
+github.com/ipfs/go-log/v2 v2.8.1 h1:Y/X36z7ASoLJaYIJAL4xITXgwf7RVeqb1+/25aq/Xk0=
+github.com/ipfs/go-log/v2 v2.8.1/go.mod h1:NyhTBcZmh2Y55eWVjOeKf8M7e4pnJYM3yDZNxQBWEEY=
github.com/ipfs/go-metrics-interface v0.3.0 h1:YwG7/Cy4R94mYDUuwsBfeziJCVm9pBMJ6q/JR9V40TU=
github.com/ipfs/go-metrics-interface v0.3.0/go.mod h1:OxxQjZDGocXVdyTPocns6cOLwHieqej/jos7H4POwoY=
github.com/ipfs/go-peertaskqueue v0.8.2 h1:PaHFRaVFdxQk1Qo3OKiHPYjmmusQy7gKQUaL8JDszAU=
@@ -842,8 +842,8 @@ golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE
golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
-golang.org/x/exp v0.0.0-20250811191247-51f88131bc50 h1:3yiSh9fhy5/RhCSntf4Sy0Tnx50DmMpQ4MQdKKk4yg4=
-golang.org/x/exp v0.0.0-20250811191247-51f88131bc50/go.mod h1:rT6SFzZ7oxADUDx58pcaKFTcZ+inxAa9fTrYx/uVYwg=
+golang.org/x/exp v0.0.0-20250813145105-42675adae3e6 h1:SbTAbRFnd5kjQXbczszQ0hdk3ctwYf3qBNH9jIsGclE=
+golang.org/x/exp v0.0.0-20250813145105-42675adae3e6/go.mod h1:4QTo5u+SEIbbKW1RacMZq1YEfOBqeXa19JeshGi+zc4=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
diff --git a/go.mod b/go.mod
index 9231b344c..21b034301 100644
--- a/go.mod
+++ b/go.mod
@@ -22,11 +22,11 @@ require (
github.com/hashicorp/go-version v1.7.0
github.com/ipfs-shipyard/nopfs v0.0.14
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0
- github.com/ipfs/boxo v0.33.2-0.20250813013451-825361b44b4e
+ github.com/ipfs/boxo v0.33.2-0.20250814210825-54b62d4eccbf
github.com/ipfs/go-block-format v0.2.2
github.com/ipfs/go-cid v0.5.0
github.com/ipfs/go-cidutil v0.1.0
- github.com/ipfs/go-datastore v0.8.2
+ github.com/ipfs/go-datastore v0.8.3
github.com/ipfs/go-detect-race v0.0.1
github.com/ipfs/go-ds-badger v0.3.4
github.com/ipfs/go-ds-flatfs v0.5.5
@@ -39,7 +39,7 @@ require (
github.com/ipfs/go-ipld-format v0.6.2
github.com/ipfs/go-ipld-git v0.1.1
github.com/ipfs/go-ipld-legacy v0.2.2
- github.com/ipfs/go-log/v2 v2.8.0
+ github.com/ipfs/go-log/v2 v2.8.1
github.com/ipfs/go-metrics-interface v0.3.0
github.com/ipfs/go-metrics-prometheus v0.1.0
github.com/ipfs/go-test v0.2.2
@@ -85,7 +85,7 @@ require (
go.uber.org/fx v1.24.0
go.uber.org/zap v1.27.0
golang.org/x/crypto v0.41.0
- golang.org/x/exp v0.0.0-20250811191247-51f88131bc50
+ golang.org/x/exp v0.0.0-20250813145105-42675adae3e6
golang.org/x/mod v0.27.0
golang.org/x/sync v0.16.0
golang.org/x/sys v0.35.0
@@ -125,7 +125,7 @@ require (
github.com/francoispqt/gojay v1.2.13 // indirect
github.com/gabriel-vasile/mimetype v1.4.9 // indirect
github.com/gammazero/chanqueue v1.1.1 // indirect
- github.com/gammazero/deque v1.0.0 // indirect
+ github.com/gammazero/deque v1.1.0 // indirect
github.com/getsentry/sentry-go v0.27.0 // indirect
github.com/go-jose/go-jose/v4 v4.0.5 // indirect
github.com/go-kit/log v0.2.1 // indirect
diff --git a/go.sum b/go.sum
index 6bb8d9801..f39c315b3 100644
--- a/go.sum
+++ b/go.sum
@@ -201,8 +201,8 @@ github.com/gabriel-vasile/mimetype v1.4.9 h1:5k+WDwEsD9eTLL8Tz3L0VnmVh9QxGjRmjBv
github.com/gabriel-vasile/mimetype v1.4.9/go.mod h1:WnSQhFKJuBlRyLiKohA/2DtIlPFAbguNaG7QCHcyGok=
github.com/gammazero/chanqueue v1.1.1 h1:n9Y+zbBxw2f7uUE9wpgs0rOSkP/I/yhDLiNuhyVjojQ=
github.com/gammazero/chanqueue v1.1.1/go.mod h1:fMwpwEiuUgpab0sH4VHiVcEoji1pSi+EIzeG4TPeKPc=
-github.com/gammazero/deque v1.0.0 h1:LTmimT8H7bXkkCy6gZX7zNLtkbz4NdS2z8LZuor3j34=
-github.com/gammazero/deque v1.0.0/go.mod h1:iflpYvtGfM3U8S8j+sZEKIak3SAKYpA5/SQewgfXDKo=
+github.com/gammazero/deque v1.1.0 h1:OyiyReBbnEG2PP0Bnv1AASLIYvyKqIFN5xfl1t8oGLo=
+github.com/gammazero/deque v1.1.0/go.mod h1:JVrR+Bj1NMQbPnYclvDlvSX0nVGReLrQZ0aUMuWLctg=
github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps=
github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY=
github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9 h1:r5GgOLGbza2wVHRzK7aAj6lWZjfbAwiu/RDCVOKjRyM=
@@ -354,8 +354,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcd
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.33.2-0.20250813013451-825361b44b4e h1:A2zSzpyrerCtdN69iDxt9S9z27cD1R4Uw3l1ctLTxX0=
-github.com/ipfs/boxo v0.33.2-0.20250813013451-825361b44b4e/go.mod h1:ehi6uM9NBRkAaB7Q7u2kZgGArXPfbNRe0X/CYTqUwq8=
+github.com/ipfs/boxo v0.33.2-0.20250814210825-54b62d4eccbf h1:W3iHiK3PaaayhoQQUgh3zvz7nbVfi/srJSgWi7HyM9s=
+github.com/ipfs/boxo v0.33.2-0.20250814210825-54b62d4eccbf/go.mod h1:kzdH/ewDybtO3+M8MCVkpwnIIc/d2VISX95DFrY4vQA=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk=
@@ -370,8 +370,8 @@ github.com/ipfs/go-cidutil v0.1.0 h1:RW5hO7Vcf16dplUU60Hs0AKDkQAVPVplr7lk97CFL+Q
github.com/ipfs/go-cidutil v0.1.0/go.mod h1:e7OEVBMIv9JaOxt9zaGEmAoSlXW9jdFZ5lP/0PwcfpA=
github.com/ipfs/go-datastore v0.1.0/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE=
github.com/ipfs/go-datastore v0.1.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw=
-github.com/ipfs/go-datastore v0.8.2 h1:Jy3wjqQR6sg/LhyY0NIePZC3Vux19nLtg7dx0TVqr6U=
-github.com/ipfs/go-datastore v0.8.2/go.mod h1:W+pI1NsUsz3tcsAACMtfC+IZdnQTnC/7VfPoJBQuts0=
+github.com/ipfs/go-datastore v0.8.3 h1:z391GsQyGKUIUof2tPoaZVeDknbt7fNHs6Gqjcw5Jo4=
+github.com/ipfs/go-datastore v0.8.3/go.mod h1:raxQ/CreIy9L6MxT71ItfMX12/ASN6EhXJoUFjICQ2M=
github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk=
github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps=
github.com/ipfs/go-ds-badger v0.0.7/go.mod h1:qt0/fWzZDoPW6jpQeqUjR5kBfhDNB65jd9YlmAvpQBk=
@@ -414,8 +414,8 @@ github.com/ipfs/go-ipld-legacy v0.2.2/go.mod h1:hhkj+b3kG9b2BcUNw8IFYAsfeNo8E3U7
github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM=
github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8=
github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo=
-github.com/ipfs/go-log/v2 v2.8.0 h1:SptNTPJQV3s5EF4FdrTu/yVdOKfGbDgn1EBZx4til2o=
-github.com/ipfs/go-log/v2 v2.8.0/go.mod h1:2LEEhdv8BGubPeSFTyzbqhCqrwqxCbuTNTLWqgNAipo=
+github.com/ipfs/go-log/v2 v2.8.1 h1:Y/X36z7ASoLJaYIJAL4xITXgwf7RVeqb1+/25aq/Xk0=
+github.com/ipfs/go-log/v2 v2.8.1/go.mod h1:NyhTBcZmh2Y55eWVjOeKf8M7e4pnJYM3yDZNxQBWEEY=
github.com/ipfs/go-metrics-interface v0.3.0 h1:YwG7/Cy4R94mYDUuwsBfeziJCVm9pBMJ6q/JR9V40TU=
github.com/ipfs/go-metrics-interface v0.3.0/go.mod h1:OxxQjZDGocXVdyTPocns6cOLwHieqej/jos7H4POwoY=
github.com/ipfs/go-metrics-prometheus v0.1.0 h1:bApWOHkrH3VTBHzTHrZSfq4n4weOZDzZFxUXv+HyKcA=
@@ -1009,8 +1009,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
-golang.org/x/exp v0.0.0-20250811191247-51f88131bc50 h1:3yiSh9fhy5/RhCSntf4Sy0Tnx50DmMpQ4MQdKKk4yg4=
-golang.org/x/exp v0.0.0-20250811191247-51f88131bc50/go.mod h1:rT6SFzZ7oxADUDx58pcaKFTcZ+inxAa9fTrYx/uVYwg=
+golang.org/x/exp v0.0.0-20250813145105-42675adae3e6 h1:SbTAbRFnd5kjQXbczszQ0hdk3ctwYf3qBNH9jIsGclE=
+golang.org/x/exp v0.0.0-20250813145105-42675adae3e6/go.mod h1:4QTo5u+SEIbbKW1RacMZq1YEfOBqeXa19JeshGi+zc4=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
diff --git a/test/cli/gateway_limits_test.go b/test/cli/gateway_limits_test.go
new file mode 100644
index 000000000..2c5554cf3
--- /dev/null
+++ b/test/cli/gateway_limits_test.go
@@ -0,0 +1,132 @@
+package cli
+
+import (
+ "net/http"
+ "testing"
+ "time"
+
+ "github.com/ipfs/kubo/config"
+ "github.com/ipfs/kubo/test/cli/harness"
+ "github.com/stretchr/testify/assert"
+)
+
+// TestGatewayLimits tests the gateway request limiting and timeout features.
+// These are basic integration tests that verify the configuration works.
+// For comprehensive tests, see:
+// - github.com/ipfs/boxo/gateway/middleware_retrieval_timeout_test.go
+// - github.com/ipfs/boxo/gateway/middleware_ratelimit_test.go
+func TestGatewayLimits(t *testing.T) {
+ t.Parallel()
+
+ t.Run("RetrievalTimeout", func(t *testing.T) {
+ t.Parallel()
+
+ // Create a node with a short retrieval timeout
+ node := harness.NewT(t).NewNode().Init()
+ node.UpdateConfig(func(cfg *config.Config) {
+ // Set a 1 second timeout for retrieval
+ cfg.Gateway.RetrievalTimeout = config.NewOptionalDuration(1 * time.Second)
+ })
+ node.StartDaemon()
+
+ // Add content that can be retrieved quickly
+ cid := node.IPFSAddStr("test content")
+
+ client := node.GatewayClient()
+
+ // Normal request should succeed (content is local)
+ resp := client.Get("/ipfs/" + cid)
+ assert.Equal(t, http.StatusOK, resp.StatusCode)
+ assert.Equal(t, "test content", resp.Body)
+
+ // Request for non-existent content should timeout
+ // Using a CID that has no providers (generated with ipfs add -n)
+ nonExistentCID := "bafkreif6lrhgz3fpiwypdk65qrqiey7svgpggruhbylrgv32l3izkqpsc4"
+
+ // Create a client with longer timeout than the gateway's retrieval timeout
+ // to ensure we get the gateway's 504 response
+ clientWithTimeout := &harness.HTTPClient{
+ Client: &http.Client{
+ Timeout: 5 * time.Second,
+ },
+ BaseURL: client.BaseURL,
+ }
+
+ resp = clientWithTimeout.Get("/ipfs/" + nonExistentCID)
+ assert.Equal(t, http.StatusGatewayTimeout, resp.StatusCode, "Expected 504 Gateway Timeout for stuck retrieval")
+ assert.Contains(t, resp.Body, "Unable to retrieve content within timeout period")
+ })
+
+ t.Run("MaxConcurrentRequests", func(t *testing.T) {
+ t.Parallel()
+
+ // Create a node with a low concurrent request limit
+ node := harness.NewT(t).NewNode().Init()
+ node.UpdateConfig(func(cfg *config.Config) {
+ // Allow only 1 concurrent request to make test deterministic
+ cfg.Gateway.MaxConcurrentRequests = config.NewOptionalInteger(1)
+ // Set retrieval timeout so blocking requests don't hang forever
+ cfg.Gateway.RetrievalTimeout = config.NewOptionalDuration(2 * time.Second)
+ })
+ node.StartDaemon()
+
+ // Add some content - use a non-existent CID that will block during retrieval
+ // to ensure we can control timing
+ blockingCID := "bafkreif6lrhgz3fpiwypdk65qrqiey7svgpggruhbylrgv32l3izkqpsc4"
+ normalCID := node.IPFSAddStr("test content for concurrent request limiting")
+
+ client := node.GatewayClient()
+
+ // First, verify single request succeeds
+ resp := client.Get("/ipfs/" + normalCID)
+ assert.Equal(t, http.StatusOK, resp.StatusCode)
+
+ // Now test deterministic 429 response:
+ // Start a blocking request that will occupy the single slot,
+ // then make another request that MUST get 429
+
+ blockingStarted := make(chan bool)
+ blockingDone := make(chan bool)
+
+ // Start a request that will block (searching for non-existent content)
+ go func() {
+ blockingStarted <- true
+ // This will block until timeout looking for providers
+ client.Get("/ipfs/" + blockingCID)
+ blockingDone <- true
+ }()
+
+ // Wait for blocking request to start and occupy the slot
+ <-blockingStarted
+ time.Sleep(1 * time.Second) // Ensure it has acquired the semaphore
+
+ // This request MUST get 429 because the slot is occupied
+ resp = client.Get("/ipfs/" + normalCID + "?must-get-429=true")
+ assert.Equal(t, http.StatusTooManyRequests, resp.StatusCode, "Second request must get 429 when slot is occupied")
+
+ // Verify 429 response headers
+ retryAfter := resp.Headers.Get("Retry-After")
+ assert.NotEmpty(t, retryAfter, "Retry-After header must be set on 429 response")
+ assert.Equal(t, "60", retryAfter, "Retry-After must be 60 seconds")
+
+ cacheControl := resp.Headers.Get("Cache-Control")
+ assert.Equal(t, "no-store", cacheControl, "Cache-Control must be no-store on 429 response")
+
+ assert.Contains(t, resp.Body, "Too many requests", "429 response must contain error message")
+
+ // Clean up: wait for blocking request to timeout (it will timeout due to gateway retrieval timeout)
+ select {
+ case <-blockingDone:
+ // Good, it completed
+ case <-time.After(10 * time.Second):
+ // Give it more time if needed
+ }
+
+ // Wait a bit more to ensure slot is fully released
+ time.Sleep(1 * time.Second)
+
+ // After blocking request completes, new request should succeed
+ resp = client.Get("/ipfs/" + normalCID + "?after-limit-cleared=true")
+ assert.Equal(t, http.StatusOK, resp.StatusCode, "Request must succeed after slot is freed")
+ })
+}
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index 590ec5bac..ccd92f5c4 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -8,7 +8,7 @@ require (
github.com/Kubuxu/gocovmerge v0.0.0-20161216165753-7ecaa51963cd
github.com/golangci/golangci-lint v1.64.8
github.com/ipfs/go-cidutil v0.1.0
- github.com/ipfs/go-log/v2 v2.8.0
+ github.com/ipfs/go-log/v2 v2.8.1
github.com/ipfs/go-test v0.2.2
github.com/ipfs/hang-fds v0.1.0
github.com/ipfs/iptb v1.4.1
@@ -77,17 +77,20 @@ require (
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 // indirect
github.com/denis-tingaikin/go-header v0.5.0 // indirect
github.com/dnephin/pflag v1.0.7 // indirect
+ github.com/dustin/go-humanize v1.0.1 // indirect
github.com/ettle/strcase v0.2.0 // indirect
github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5 // indirect
github.com/fatih/color v1.18.0 // indirect
github.com/fatih/structtag v1.2.0 // indirect
+ github.com/felixge/httpsnoop v1.0.4 // indirect
github.com/filecoin-project/go-clock v0.1.0 // indirect
github.com/firefart/nonamedreturns v1.0.5 // indirect
github.com/flynn/noise v1.1.0 // indirect
github.com/francoispqt/gojay v1.2.13 // indirect
github.com/fsnotify/fsnotify v1.8.0 // indirect
github.com/fzipp/gocyclo v0.6.0 // indirect
- github.com/gammazero/deque v1.0.0 // indirect
+ github.com/gabriel-vasile/mimetype v1.4.9 // indirect
+ github.com/gammazero/deque v1.1.0 // indirect
github.com/getsentry/sentry-go v0.27.0 // indirect
github.com/ghostiam/protogetter v0.3.9 // indirect
github.com/go-critic/go-critic v0.12.0 // indirect
@@ -131,15 +134,19 @@ require (
github.com/huin/goupnp v1.3.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/ipfs/bbloom v0.0.4 // indirect
- github.com/ipfs/boxo v0.33.2-0.20250813013451-825361b44b4e // indirect
+ github.com/ipfs/boxo v0.33.2-0.20250814210825-54b62d4eccbf // indirect
github.com/ipfs/go-bitfield v1.1.0 // indirect
github.com/ipfs/go-block-format v0.2.2 // indirect
github.com/ipfs/go-cid v0.5.0 // indirect
- github.com/ipfs/go-datastore v0.8.2 // indirect
+ github.com/ipfs/go-datastore v0.8.3 // indirect
+ github.com/ipfs/go-ipfs-redirects-file v0.1.2 // indirect
+ github.com/ipfs/go-ipld-cbor v0.2.1 // indirect
github.com/ipfs/go-ipld-format v0.6.2 // indirect
github.com/ipfs/go-ipld-legacy v0.2.2 // indirect
github.com/ipfs/go-metrics-interface v0.3.0 // indirect
+ github.com/ipfs/go-unixfsnode v1.10.1 // indirect
github.com/ipfs/kubo v0.31.0 // indirect
+ github.com/ipld/go-car/v2 v2.14.3 // indirect
github.com/ipld/go-codec-dagpb v1.7.0 // indirect
github.com/ipld/go-ipld-prime v0.21.0 // indirect
github.com/ipshipyard/p2p-forge v0.6.1 // indirect
@@ -169,6 +176,7 @@ require (
github.com/libdns/libdns v1.0.0-beta.1 // indirect
github.com/libp2p/go-buffer-pool v0.1.0 // indirect
github.com/libp2p/go-cidranger v1.1.0 // indirect
+ github.com/libp2p/go-doh-resolver v0.5.0 // indirect
github.com/libp2p/go-flow-metrics v0.3.0 // indirect
github.com/libp2p/go-libp2p v0.43.0 // indirect
github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect
@@ -212,6 +220,7 @@ require (
github.com/olekukonko/tablewriter v0.0.5 // indirect
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect
github.com/pelletier/go-toml/v2 v2.2.3 // indirect
+ github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 // indirect
github.com/pion/datachannel v1.5.10 // indirect
github.com/pion/dtls/v2 v2.2.12 // indirect
github.com/pion/dtls/v3 v3.0.6 // indirect
@@ -283,12 +292,15 @@ require (
github.com/timonwong/loggercheck v0.10.1 // indirect
github.com/tomarrell/wrapcheck/v2 v2.10.0 // indirect
github.com/tommy-muehle/go-mnd/v2 v2.5.1 // indirect
+ github.com/ucarion/urlpath v0.0.0-20200424170820-7ccc79b76bbb // indirect
github.com/ultraware/funlen v0.2.0 // indirect
github.com/ultraware/whitespace v0.2.0 // indirect
github.com/urfave/cli v1.22.16 // indirect
github.com/uudashr/gocognit v1.2.0 // indirect
github.com/uudashr/iface v1.3.1 // indirect
github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc // indirect
+ github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 // indirect
+ github.com/whyrusleeping/cbor-gen v0.3.1 // indirect
github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f // indirect
github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 // indirect
github.com/wlynxg/anet v0.0.5 // indirect
@@ -301,6 +313,7 @@ require (
go-simpler.org/musttag v0.13.0 // indirect
go-simpler.org/sloglint v0.9.0 // indirect
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
+ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 // indirect
go.opentelemetry.io/otel v1.37.0 // indirect
go.opentelemetry.io/otel/metric v1.37.0 // indirect
go.opentelemetry.io/otel/trace v1.37.0 // indirect
@@ -312,7 +325,7 @@ require (
go.uber.org/zap v1.27.0 // indirect
go.uber.org/zap/exp v0.3.0 // indirect
golang.org/x/crypto v0.41.0 // indirect
- golang.org/x/exp v0.0.0-20250811191247-51f88131bc50 // indirect
+ golang.org/x/exp v0.0.0-20250813145105-42675adae3e6 // indirect
golang.org/x/exp/typeparams v0.0.0-20250210185358-939b2ce775ac // indirect
golang.org/x/mod v0.27.0 // indirect
golang.org/x/net v0.43.0 // indirect
@@ -322,6 +335,7 @@ require (
golang.org/x/text v0.28.0 // indirect
golang.org/x/time v0.12.0 // indirect
golang.org/x/tools v0.36.0 // indirect
+ golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
gonum.org/v1/gonum v0.16.0 // indirect
google.golang.org/protobuf v1.36.7 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index 57828a1b0..a2a835d15 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -155,6 +155,8 @@ github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cn
github.com/dnephin/pflag v1.0.7 h1:oxONGlWxhmUct0YzKTgrpQv9AUA1wtPBn7zuSjJqptk=
github.com/dnephin/pflag v1.0.7/go.mod h1:uxE91IoWURlOiTUIA8Mq5ZZkAv3dPUfZNaT80Zm7OQE=
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
+github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
+github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
github.com/ettle/strcase v0.2.0 h1:fGNiVF21fHXpX1niBgk0aROov1LagYsOwV/xqKDKR/Q=
github.com/ettle/strcase v0.2.0/go.mod h1:DajmHElDSaX76ITe3/VHVyMin4LWSJN5Z909Wp+ED1A=
github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5 h1:BBso6MBKW8ncyZLv37o+KNyy0HrrHgfnOaGQC2qvN+A=
@@ -163,6 +165,8 @@ github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=
github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=
+github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
+github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
github.com/filecoin-project/go-clock v0.1.0 h1:SFbYIM75M8NnFm1yMHhN9Ahy3W5bEZV9gd6MPfXbKVU=
github.com/filecoin-project/go-clock v0.1.0/go.mod h1:4uB/O4PvOjlx1VCMdZ9MyDZXRm//gkj1ELEbxfI1AZs=
github.com/firefart/nonamedreturns v1.0.5 h1:tM+Me2ZaXs8tfdDw3X6DOX++wMCOqzYUho6tUTYIdRA=
@@ -179,10 +183,12 @@ github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/
github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo=
github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA=
+github.com/gabriel-vasile/mimetype v1.4.9 h1:5k+WDwEsD9eTLL8Tz3L0VnmVh9QxGjRmjBvAG7U/oYY=
+github.com/gabriel-vasile/mimetype v1.4.9/go.mod h1:WnSQhFKJuBlRyLiKohA/2DtIlPFAbguNaG7QCHcyGok=
github.com/gammazero/chanqueue v1.1.1 h1:n9Y+zbBxw2f7uUE9wpgs0rOSkP/I/yhDLiNuhyVjojQ=
github.com/gammazero/chanqueue v1.1.1/go.mod h1:fMwpwEiuUgpab0sH4VHiVcEoji1pSi+EIzeG4TPeKPc=
-github.com/gammazero/deque v1.0.0 h1:LTmimT8H7bXkkCy6gZX7zNLtkbz4NdS2z8LZuor3j34=
-github.com/gammazero/deque v1.0.0/go.mod h1:iflpYvtGfM3U8S8j+sZEKIak3SAKYpA5/SQewgfXDKo=
+github.com/gammazero/deque v1.1.0 h1:OyiyReBbnEG2PP0Bnv1AASLIYvyKqIFN5xfl1t8oGLo=
+github.com/gammazero/deque v1.1.0/go.mod h1:JVrR+Bj1NMQbPnYclvDlvSX0nVGReLrQZ0aUMuWLctg=
github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps=
github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY=
github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9 h1:r5GgOLGbza2wVHRzK7aAj6lWZjfbAwiu/RDCVOKjRyM=
@@ -326,8 +332,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.33.2-0.20250813013451-825361b44b4e h1:A2zSzpyrerCtdN69iDxt9S9z27cD1R4Uw3l1ctLTxX0=
-github.com/ipfs/boxo v0.33.2-0.20250813013451-825361b44b4e/go.mod h1:ehi6uM9NBRkAaB7Q7u2kZgGArXPfbNRe0X/CYTqUwq8=
+github.com/ipfs/boxo v0.33.2-0.20250814210825-54b62d4eccbf h1:W3iHiK3PaaayhoQQUgh3zvz7nbVfi/srJSgWi7HyM9s=
+github.com/ipfs/boxo v0.33.2-0.20250814210825-54b62d4eccbf/go.mod h1:kzdH/ewDybtO3+M8MCVkpwnIIc/d2VISX95DFrY4vQA=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-block-format v0.2.2 h1:uecCTgRwDIXyZPgYspaLXoMiMmxQpSx2aq34eNc4YvQ=
@@ -336,36 +342,52 @@ github.com/ipfs/go-cid v0.5.0 h1:goEKKhaGm0ul11IHA7I6p1GmKz8kEYniqFopaB5Otwg=
github.com/ipfs/go-cid v0.5.0/go.mod h1:0L7vmeNXpQpUS9vt+yEARkJ8rOg43DF3iPgn4GIN0mk=
github.com/ipfs/go-cidutil v0.1.0 h1:RW5hO7Vcf16dplUU60Hs0AKDkQAVPVplr7lk97CFL+Q=
github.com/ipfs/go-cidutil v0.1.0/go.mod h1:e7OEVBMIv9JaOxt9zaGEmAoSlXW9jdFZ5lP/0PwcfpA=
-github.com/ipfs/go-datastore v0.8.2 h1:Jy3wjqQR6sg/LhyY0NIePZC3Vux19nLtg7dx0TVqr6U=
-github.com/ipfs/go-datastore v0.8.2/go.mod h1:W+pI1NsUsz3tcsAACMtfC+IZdnQTnC/7VfPoJBQuts0=
+github.com/ipfs/go-datastore v0.8.3 h1:z391GsQyGKUIUof2tPoaZVeDknbt7fNHs6Gqjcw5Jo4=
+github.com/ipfs/go-datastore v0.8.3/go.mod h1:raxQ/CreIy9L6MxT71ItfMX12/ASN6EhXJoUFjICQ2M=
github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk=
github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps=
+github.com/ipfs/go-ipfs-blockstore v1.3.1 h1:cEI9ci7V0sRNivqaOr0elDsamxXFxJMMMy7PTTDQNsQ=
+github.com/ipfs/go-ipfs-blockstore v1.3.1/go.mod h1:KgtZyc9fq+P2xJUiCAzbRdhhqJHvsw8u2Dlqy2MyRTE=
github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1IeRQ=
github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw=
+github.com/ipfs/go-ipfs-ds-help v1.1.1 h1:B5UJOH52IbcfS56+Ul+sv8jnIV10lbjLF5eOO0C66Nw=
+github.com/ipfs/go-ipfs-ds-help v1.1.1/go.mod h1:75vrVCkSdSFidJscs8n4W+77AtTpCIAdDGAwjitJMIo=
github.com/ipfs/go-ipfs-pq v0.0.3 h1:YpoHVJB+jzK15mr/xsWC574tyDLkezVrDNeaalQBsTE=
github.com/ipfs/go-ipfs-pq v0.0.3/go.mod h1:btNw5hsHBpRcSSgZtiNm/SLj5gYIZ18AKtv3kERkRb4=
+github.com/ipfs/go-ipfs-redirects-file v0.1.2 h1:QCK7VtL91FH17KROVVy5KrzDx2hu68QvB2FTWk08ZQk=
+github.com/ipfs/go-ipfs-redirects-file v0.1.2/go.mod h1:yIiTlLcDEM/8lS6T3FlCEXZktPPqSOyuY6dEzVqw7Fw=
+github.com/ipfs/go-ipld-cbor v0.2.1 h1:H05yEJbK/hxg0uf2AJhyerBDbjOuHX4yi+1U/ogRa7E=
+github.com/ipfs/go-ipld-cbor v0.2.1/go.mod h1:x9Zbeq8CoE5R2WicYgBMcr/9mnkQ0lHddYWJP2sMV3A=
github.com/ipfs/go-ipld-format v0.6.2 h1:bPZQ+A05ol0b3lsJSl0bLvwbuQ+HQbSsdGTy4xtYUkU=
github.com/ipfs/go-ipld-format v0.6.2/go.mod h1:nni2xFdHKx5lxvXJ6brt/pndtGxKAE+FPR1rg4jTkyk=
github.com/ipfs/go-ipld-legacy v0.2.2 h1:DThbqCPVLpWBcGtU23KDLiY2YRZZnTkXQyfz8aOfBkQ=
github.com/ipfs/go-ipld-legacy v0.2.2/go.mod h1:hhkj+b3kG9b2BcUNw8IFYAsfeNo8E3U7eYlWeAOPyDU=
-github.com/ipfs/go-log/v2 v2.8.0 h1:SptNTPJQV3s5EF4FdrTu/yVdOKfGbDgn1EBZx4til2o=
-github.com/ipfs/go-log/v2 v2.8.0/go.mod h1:2LEEhdv8BGubPeSFTyzbqhCqrwqxCbuTNTLWqgNAipo=
+github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8=
+github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo=
+github.com/ipfs/go-log/v2 v2.8.1 h1:Y/X36z7ASoLJaYIJAL4xITXgwf7RVeqb1+/25aq/Xk0=
+github.com/ipfs/go-log/v2 v2.8.1/go.mod h1:NyhTBcZmh2Y55eWVjOeKf8M7e4pnJYM3yDZNxQBWEEY=
github.com/ipfs/go-metrics-interface v0.3.0 h1:YwG7/Cy4R94mYDUuwsBfeziJCVm9pBMJ6q/JR9V40TU=
github.com/ipfs/go-metrics-interface v0.3.0/go.mod h1:OxxQjZDGocXVdyTPocns6cOLwHieqej/jos7H4POwoY=
github.com/ipfs/go-peertaskqueue v0.8.2 h1:PaHFRaVFdxQk1Qo3OKiHPYjmmusQy7gKQUaL8JDszAU=
github.com/ipfs/go-peertaskqueue v0.8.2/go.mod h1:L6QPvou0346c2qPJNiJa6BvOibxDfaiPlqHInmzg0FA=
github.com/ipfs/go-test v0.2.2 h1:1yjYyfbdt1w93lVzde6JZ2einh3DIV40at4rVoyEcE8=
github.com/ipfs/go-test v0.2.2/go.mod h1:cmLisgVwkdRCnKu/CFZOk2DdhOcwghr5GsHeqwexoRA=
+github.com/ipfs/go-unixfsnode v1.10.1 h1:hGKhzuH6NSzZ4y621wGuDspkjXRNG3B+HqhlyTjSwSM=
+github.com/ipfs/go-unixfsnode v1.10.1/go.mod h1:eguv/otvacjmfSbYvmamc9ssNAzLvRk0+YN30EYeOOY=
github.com/ipfs/hang-fds v0.1.0 h1:deBiFlWHsVGzJ0ZMaqscEqRM1r2O1rFZ59UiQXb1Xko=
github.com/ipfs/hang-fds v0.1.0/go.mod h1:29VLWOn3ftAgNNgXg/al7b11UzuQ+w7AwtCGcTaWkbM=
github.com/ipfs/iptb v1.4.1 h1:faXd3TKGPswbHyZecqqg6UfbES7RDjTKQb+6VFPKDUo=
github.com/ipfs/iptb v1.4.1/go.mod h1:nTsBMtVYFEu0FjC5DgrErnABm3OG9ruXkFXGJoTV5OA=
github.com/ipfs/iptb-plugins v0.5.1 h1:11PNTNEt2+SFxjUcO5qpyCTXqDj6T8Tx9pU/G4ytCIQ=
github.com/ipfs/iptb-plugins v0.5.1/go.mod h1:mscJAjRnu4g16QK6oUBn9RGpcp8ueJmLfmPxIG/At78=
+github.com/ipld/go-car/v2 v2.14.3 h1:1Mhl82/ny8MVP+w1M4LXbj4j99oK3gnuZG2GmG1IhC8=
+github.com/ipld/go-car/v2 v2.14.3/go.mod h1:/vpSvPngOX8UnvmdFJ3o/mDgXa9LuyXsn7wxOzHDYQE=
github.com/ipld/go-codec-dagpb v1.7.0 h1:hpuvQjCSVSLnTnHXn+QAMR0mLmb1gA6wl10LExo2Ts0=
github.com/ipld/go-codec-dagpb v1.7.0/go.mod h1:rD3Zg+zub9ZnxcLwfol/OTQRVjaLzXypgy4UqHQvilM=
github.com/ipld/go-ipld-prime v0.21.0 h1:n4JmcpOlPDIxBcY037SVfpd1G+Sj1nKZah0m6QH9C2E=
github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOanyMctpPjsvxQ=
+github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd h1:gMlw/MhNr2Wtp5RwGdsW23cs+yCuj9k2ON7i9MiJlRo=
+github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd/go.mod h1:wZ8hH8UxeryOs4kJEJaiui/s00hDSbE37OKsL47g+Sw=
github.com/ipshipyard/p2p-forge v0.6.1 h1:987/hUC1YxI56CcMX6iTB+9BLjFV0d2SJnig9Z1pf8A=
github.com/ipshipyard/p2p-forge v0.6.1/go.mod h1:pj8Zcs+ex5OMq5a1bFLHqW0oL3qYO0v5eGLZmit0l7U=
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
@@ -432,6 +454,8 @@ github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6
github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg=
github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38yPW7c=
github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic=
+github.com/libp2p/go-doh-resolver v0.5.0 h1:4h7plVVW+XTS+oUBw2+8KfoM1jF6w8XmO7+skhePFdE=
+github.com/libp2p/go-doh-resolver v0.5.0/go.mod h1:aPDxfiD2hNURgd13+hfo29z9IC22fv30ee5iM31RzxU=
github.com/libp2p/go-flow-metrics v0.3.0 h1:q31zcHUvHnwDO0SHaukewPYgwOBSxtt830uJtUx6784=
github.com/libp2p/go-flow-metrics v0.3.0/go.mod h1:nuhlreIwEguM1IvHAew3ij7A8BMlyHQJ279ao24eZZo=
github.com/libp2p/go-libp2p v0.43.0 h1:b2bg2cRNmY4HpLK8VHYQXLX2d3iND95OjodLFymvqXU=
@@ -549,6 +573,8 @@ github.com/onsi/ginkgo/v2 v2.23.4 h1:ktYTpKJAVZnDT4VjxSbiBenUjmlL/5QkBEocaWXiQus
github.com/onsi/ginkgo/v2 v2.23.4/go.mod h1:Bt66ApGPBFzHyR+JO10Zbt0Gsp4uWxu5mIOTusL46e8=
github.com/onsi/gomega v1.36.3 h1:hID7cr8t3Wp26+cYnfcjR6HpJ00fdogN6dqZ1t6IylU=
github.com/onsi/gomega v1.36.3/go.mod h1:8D9+Txp43QWKhM24yyOBEdpkzN8FvJyAwecBgsU4KU0=
+github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs=
+github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8=
github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw=
github.com/otiai10/copy v1.14.0 h1:dCI/t1iTdYGtkvCuBG2BgR6KZa83PTclw4U5n2wAllU=
@@ -561,6 +587,8 @@ github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2D
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y=
github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M=
github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc=
+github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 h1:1/WtZae0yGtPq+TI6+Tv1WTxkukpXeMlviSxvL7SRgk=
+github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9/go.mod h1:x3N5drFsm2uilKKuuYo6LdyD8vZAW55sH/9w+pbo1sw=
github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4=
github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
github.com/pion/datachannel v1.5.10 h1:ly0Q26K1i6ZkGf42W7D4hQYR90pZwzFOjTq5AuCKk4o=
@@ -771,6 +799,8 @@ github.com/tomarrell/wrapcheck/v2 v2.10.0 h1:SzRCryzy4IrAH7bVGG4cK40tNUhmVmMDuJu
github.com/tomarrell/wrapcheck/v2 v2.10.0/go.mod h1:g9vNIyhb5/9TQgumxQyOEqDHsmGYcGsVMOx/xGkqdMo=
github.com/tommy-muehle/go-mnd/v2 v2.5.1 h1:NowYhSdyE/1zwK9QCLeRb6USWdoif80Ie+v+yU8u1Zw=
github.com/tommy-muehle/go-mnd/v2 v2.5.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw=
+github.com/ucarion/urlpath v0.0.0-20200424170820-7ccc79b76bbb h1:Ywfo8sUltxogBpFuMOFRrrSifO788kAFxmvVw31PtQQ=
+github.com/ucarion/urlpath v0.0.0-20200424170820-7ccc79b76bbb/go.mod h1:ikPs9bRWicNw3S7XpJ8sK/smGwU9WcSVU3dy9qahYBM=
github.com/ultraware/funlen v0.2.0 h1:gCHmCn+d2/1SemTdYMiKLAHFYxTYz7z9VIDRaTGyLkI=
github.com/ultraware/funlen v0.2.0/go.mod h1:ZE0q4TsJ8T1SQcjmkhN/w+MceuatI6pBFSxxyteHIJA=
github.com/ultraware/whitespace v0.2.0 h1:TYowo2m9Nfj1baEQBjuHzvMRbp19i+RCcRYrSWoFa+g=
@@ -790,6 +820,10 @@ github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0 h1:GDDkbFiaK8jsSD
github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw=
github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc h1:BCPnHtcboadS0DvysUuJXZ4lWVv5Bh5i7+tbIyi+ck4=
github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc/go.mod h1:r45hJU7yEoA81k6MWNhpMj/kms0n14dkzkxYHoB96UM=
+github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 h1:5HZfQkwe0mIfyDmc1Em5GqlNRzcdtlv4HTNmdpt7XH0=
+github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11/go.mod h1:Wlo/SzPmxVp6vXpGt/zaXhHH0fn4IxgqZc82aKg6bpQ=
+github.com/whyrusleeping/cbor-gen v0.3.1 h1:82ioxmhEYut7LBVGhGq8xoRkXPLElVuh5mV67AFfdv0=
+github.com/whyrusleeping/cbor-gen v0.3.1/go.mod h1:pM99HXyEbSQHcosHc0iW7YFmwnscr+t9Te4ibko05so=
github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E=
github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8=
github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 h1:EKhdznlJHPMoKr0XTrX+IlJs1LH3lyx2nfr1dOlZ79k=
@@ -829,12 +863,20 @@ go-simpler.org/sloglint v0.9.0/go.mod h1:G/OrAF6uxj48sHahCzrbarVMptL2kjWTaUeC8+f
go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA=
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 h1:Hf9xI/XLML9ElpiHVDNwvqI0hIFlzV8dgIr35kV1kRU=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0/go.mod h1:NfchwuyNoMcZ5MLHwPrODwUF1HWCXWrL31s8gSAdIKY=
go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ=
go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I=
go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE=
go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E=
+go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI=
+go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg=
+go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc=
+go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps=
go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4=
go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0=
+go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
+go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8=
go.uber.org/dig v1.19.0 h1:BACLhebsYdpQ7IROQ1AGPjrXcP5dF80U3gKoFzbaq/4=
@@ -870,8 +912,8 @@ golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1m
golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4=
golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20250811191247-51f88131bc50 h1:3yiSh9fhy5/RhCSntf4Sy0Tnx50DmMpQ4MQdKKk4yg4=
-golang.org/x/exp v0.0.0-20250811191247-51f88131bc50/go.mod h1:rT6SFzZ7oxADUDx58pcaKFTcZ+inxAa9fTrYx/uVYwg=
+golang.org/x/exp v0.0.0-20250813145105-42675adae3e6 h1:SbTAbRFnd5kjQXbczszQ0hdk3ctwYf3qBNH9jIsGclE=
+golang.org/x/exp v0.0.0-20250813145105-42675adae3e6/go.mod h1:4QTo5u+SEIbbKW1RacMZq1YEfOBqeXa19JeshGi+zc4=
golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
golang.org/x/exp/typeparams v0.0.0-20250210185358-939b2ce775ac h1:TSSpLIG4v+p0rPv1pNOQtl1I8knsO4S9trOxNMOLVP4=
@@ -1042,6 +1084,8 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY=
+golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90=
gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=
google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
diff --git a/test/sharness/t0119-prometheus-data/prometheus_metrics b/test/sharness/t0119-prometheus-data/prometheus_metrics
index fa257d9fc..12be12cb2 100644
--- a/test/sharness/t0119-prometheus-data/prometheus_metrics
+++ b/test/sharness/t0119-prometheus-data/prometheus_metrics
@@ -157,6 +157,7 @@ ipfs_fsrepo_datastore_sync_latency_seconds_bucket
ipfs_fsrepo_datastore_sync_latency_seconds_count
ipfs_fsrepo_datastore_sync_latency_seconds_sum
ipfs_fsrepo_datastore_sync_total
+ipfs_http_gw_concurrent_requests
ipfs_http_request_duration_seconds
ipfs_http_request_duration_seconds_count
ipfs_http_request_duration_seconds_sum
From 1ca5c9dd84dfcbb8385995c04251c878efa56b32 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Fri, 15 Aug 2025 05:21:56 +0200
Subject: [PATCH 327/499] test: fix flaky repo verify (#10743)
The test was flaky because `ipfs repo verify` doesn't detect corruption
of the empty directory block (served from memory even when corrupted on
disk). Exclude both empty file and empty directory blocks from random
corruption to make the test reliable.
---------
Co-authored-by: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
---
test/sharness/t0086-repo-verify.sh | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/test/sharness/t0086-repo-verify.sh b/test/sharness/t0086-repo-verify.sh
index 0f12fef8f..612d281ef 100755
--- a/test/sharness/t0086-repo-verify.sh
+++ b/test/sharness/t0086-repo-verify.sh
@@ -24,7 +24,10 @@ sort_rand() {
}
check_random_corruption() {
- to_break=$(find "$IPFS_PATH/blocks" -type f -name '*.data' | sort_rand | head -n 1)
+ # Exclude well-known blocks from corruption as they cause test flakiness:
+ # - CIQL7TG2PB52XIZLLHDYIUFMHUQLMMZWBNBZSLDXFCPZ5VDNQQ2WDZQ.data: empty file block
+ # - CIQFTFEEHEDF6KLBT32BFAGLXEZL4UWFNWM4LFTLMXQBCERZ6CMLX3Y.data: empty directory block (has special handling, served from memory even when corrupted on disk)
+ to_break=$(find "$IPFS_PATH/blocks" -type f -name '*.data' | grep -v -E "CIQL7TG2PB52XIZLLHDYIUFMHUQLMMZWBNBZSLDXFCPZ5VDNQQ2WDZQ.data|CIQFTFEEHEDF6KLBT32BFAGLXEZL4UWFNWM4LFTLMXQBCERZ6CMLX3Y.data" | sort_rand | head -n 1)
test_expect_success "back up file and overwrite it" '
cp "$to_break" backup_file &&
From 710953446434db286921c29b7c2f1651915114d4 Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Fri, 15 Aug 2025 14:43:26 -0700
Subject: [PATCH 328/499] Upgrade to Boxo v0.34.0 (#10917)
* Use ValidatingBlockstore when HashOnRead is configured
* fix ValidatingBlockstore creation
* upgrade to boxo v0.34.0
* Use tagged boxo release
---
core/commands/repo.go | 3 +--
core/node/storage.go | 4 ++--
docs/examples/kubo-as-a-library/go.mod | 2 +-
docs/examples/kubo-as-a-library/go.sum | 4 ++--
go.mod | 2 +-
go.sum | 4 ++--
test/dependencies/go.mod | 2 +-
test/dependencies/go.sum | 4 ++--
8 files changed, 12 insertions(+), 13 deletions(-)
diff --git a/core/commands/repo.go b/core/commands/repo.go
index 77ce68590..ba27c71dd 100644
--- a/core/commands/repo.go
+++ b/core/commands/repo.go
@@ -283,8 +283,7 @@ var repoVerifyCmd = &cmds.Command{
return err
}
- bs := bstore.NewBlockstore(nd.Repo.Datastore())
- bs.HashOnRead(true)
+ bs := &bstore.ValidatingBlockstore{Blockstore: bstore.NewBlockstore(nd.Repo.Datastore())}
keys, err := bs.AllKeysChan(req.Context)
if err != nil {
diff --git a/core/node/storage.go b/core/node/storage.go
index 5115d9403..d31ab15dc 100644
--- a/core/node/storage.go
+++ b/core/node/storage.go
@@ -62,8 +62,8 @@ func BaseBlockstoreCtor(
bs = blockstore.NewIdStore(bs)
- if hashOnRead { // TODO: review: this is how it was done originally, is there a reason we can't just pass this directly?
- bs.HashOnRead(true)
+ if hashOnRead {
+ bs = &blockstore.ValidatingBlockstore{Blockstore: bs}
}
return
diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod
index 94fe5ee27..5e728552d 100644
--- a/docs/examples/kubo-as-a-library/go.mod
+++ b/docs/examples/kubo-as-a-library/go.mod
@@ -7,7 +7,7 @@ go 1.25
replace github.com/ipfs/kubo => ./../../..
require (
- github.com/ipfs/boxo v0.33.2-0.20250814210825-54b62d4eccbf
+ github.com/ipfs/boxo v0.34.0
github.com/ipfs/kubo v0.0.0-00010101000000-000000000000
github.com/libp2p/go-libp2p v0.43.0
github.com/multiformats/go-multiaddr v0.16.1
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index a514520a4..f49bf6708 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -287,8 +287,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcd
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.33.2-0.20250814210825-54b62d4eccbf h1:W3iHiK3PaaayhoQQUgh3zvz7nbVfi/srJSgWi7HyM9s=
-github.com/ipfs/boxo v0.33.2-0.20250814210825-54b62d4eccbf/go.mod h1:kzdH/ewDybtO3+M8MCVkpwnIIc/d2VISX95DFrY4vQA=
+github.com/ipfs/boxo v0.34.0 h1:pMP9bAsTs4xVh8R0ZmxIWviV7kjDa60U24QrlGgHb1g=
+github.com/ipfs/boxo v0.34.0/go.mod h1:kzdH/ewDybtO3+M8MCVkpwnIIc/d2VISX95DFrY4vQA=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk=
diff --git a/go.mod b/go.mod
index 21b034301..3c5e26d1a 100644
--- a/go.mod
+++ b/go.mod
@@ -22,7 +22,7 @@ require (
github.com/hashicorp/go-version v1.7.0
github.com/ipfs-shipyard/nopfs v0.0.14
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0
- github.com/ipfs/boxo v0.33.2-0.20250814210825-54b62d4eccbf
+ github.com/ipfs/boxo v0.34.0
github.com/ipfs/go-block-format v0.2.2
github.com/ipfs/go-cid v0.5.0
github.com/ipfs/go-cidutil v0.1.0
diff --git a/go.sum b/go.sum
index f39c315b3..4701138dc 100644
--- a/go.sum
+++ b/go.sum
@@ -354,8 +354,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcd
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.33.2-0.20250814210825-54b62d4eccbf h1:W3iHiK3PaaayhoQQUgh3zvz7nbVfi/srJSgWi7HyM9s=
-github.com/ipfs/boxo v0.33.2-0.20250814210825-54b62d4eccbf/go.mod h1:kzdH/ewDybtO3+M8MCVkpwnIIc/d2VISX95DFrY4vQA=
+github.com/ipfs/boxo v0.34.0 h1:pMP9bAsTs4xVh8R0ZmxIWviV7kjDa60U24QrlGgHb1g=
+github.com/ipfs/boxo v0.34.0/go.mod h1:kzdH/ewDybtO3+M8MCVkpwnIIc/d2VISX95DFrY4vQA=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk=
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index ccd92f5c4..0997c8c26 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -134,7 +134,7 @@ require (
github.com/huin/goupnp v1.3.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/ipfs/bbloom v0.0.4 // indirect
- github.com/ipfs/boxo v0.33.2-0.20250814210825-54b62d4eccbf // indirect
+ github.com/ipfs/boxo v0.34.0 // indirect
github.com/ipfs/go-bitfield v1.1.0 // indirect
github.com/ipfs/go-block-format v0.2.2 // indirect
github.com/ipfs/go-cid v0.5.0 // indirect
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index a2a835d15..1f3d9b2f2 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -332,8 +332,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/boxo v0.33.2-0.20250814210825-54b62d4eccbf h1:W3iHiK3PaaayhoQQUgh3zvz7nbVfi/srJSgWi7HyM9s=
-github.com/ipfs/boxo v0.33.2-0.20250814210825-54b62d4eccbf/go.mod h1:kzdH/ewDybtO3+M8MCVkpwnIIc/d2VISX95DFrY4vQA=
+github.com/ipfs/boxo v0.34.0 h1:pMP9bAsTs4xVh8R0ZmxIWviV7kjDa60U24QrlGgHb1g=
+github.com/ipfs/boxo v0.34.0/go.mod h1:kzdH/ewDybtO3+M8MCVkpwnIIc/d2VISX95DFrY4vQA=
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
github.com/ipfs/go-block-format v0.2.2 h1:uecCTgRwDIXyZPgYspaLXoMiMmxQpSx2aq34eNc4YvQ=
From 187fce7a6db813333783a1185d0f0854fc7b1f5f Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Mon, 18 Aug 2025 08:43:25 -0700
Subject: [PATCH 329/499] fix typos in docs and comments (#10920)
---
docs/changelogs/v0.36.md | 2 +-
test/cli/content_blocking_test.go | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/docs/changelogs/v0.36.md b/docs/changelogs/v0.36.md
index 0bf39522c..2a5234477 100644
--- a/docs/changelogs/v0.36.md
+++ b/docs/changelogs/v0.36.md
@@ -40,7 +40,7 @@ See [`HTTPRetrieval`](https://github.com/ipfs/kubo/blob/master/docs/config.md#ht
The Bitswap client now supports broadcast reduction logic, which is enabled by default. This feature significantly reduces the number of broadcast messages sent to peers, resulting in lower bandwidth usage during load spikes.
-The overall logic works by sending to non-local peers only if those peers have previously replied that they want data blocks. To minimize impact on existing workloads, by default, broadcasts are still always sent to peers on the local network, or the ones defined in `Peering.Peers`.
+The overall logic works by sending to non-local peers only if those peers have previously replied that they have data blocks. To minimize impact on existing workloads, by default, broadcasts are still always sent to peers on the local network, or the ones defined in `Peering.Peers`.
At Shipyard, we conducted A/B testing on our internal Kubo staging gateway with organic CID requests to `ipfs.io`. While these results may not exactly match your specific workload, the benefits proved significant enough to make this feature default. Here are the key findings:
diff --git a/test/cli/content_blocking_test.go b/test/cli/content_blocking_test.go
index 6598354d1..8c50aee2b 100644
--- a/test/cli/content_blocking_test.go
+++ b/test/cli/content_blocking_test.go
@@ -308,7 +308,7 @@ func TestContentBlocking(t *testing.T) {
// trustless gateway exposed over libp2p
// when Experimental.GatewayOverLibp2p=true
// (https://github.com/ipfs/kubo/blob/master/docs/experimental-features.md#http-gateway-over-libp2p)
- // NOTE: this type fo gateway is hardcoded to be NoFetch: it does not fetch
+ // NOTE: this type of gateway is hardcoded to be NoFetch: it does not fetch
// data that is not in local store, so we only need to run it once: a
// simple smoke-test for allowed CID and blockedCID.
t.Run("GatewayOverLibp2p", func(t *testing.T) {
From 4255cc38894b393387319ef23d2a89a39c9063f8 Mon Sep 17 00:00:00 2001
From: Hector Sanjuan
Date: Mon, 18 Aug 2025 20:46:05 +0200
Subject: [PATCH 330/499] feat: telemetry plugin (#10866)
* Initial pass at Telemetry plugin
Currently, IP Shipyard, with the help of Probelab, monitor and extract
Amino/IPFS public network metrics with the use of DHT crawlers and
bootstrappers (via peerlog plugin). For example, we log all peer IDs seen and
their AgentVersion/Addresses obtained from the `identify` protocol, which
provides insights into protocol usage, total number of peers etc.
We would like to increase the ability to obtain more insights from the network
by collecting some more information in the future, but also to give users more
control over this collection (i.e. opt-out). The information collected will
not allow unique identification of anyone and is only used for aggregation.
Now, this PR explores a way of moving in this direction:
* A new "telemetry" fx plugin is in charge of dealing with telemetry
* The FX plugin allows to plug and make decisions / take actions during the setup phase:
* We can inspect whether we are using Private Networks before the libp2p.Host has been initialized.
* We can send telemetry after the libp2p Host is initialized.
* Everything is self-contained. Custom builds can remove the plugin altogether without needing to surgically edit the code.
As for behaviour:
* The user can opt-in/out via EnvVar, file in the repo path or plugin configuration.
* Users on private networks or with custom bootstrappers are detected, offered a wall of text explaining why we need telemetry and invited to opt-in. Opt-out happens otherwise on a timeout (with no input). Their preferences are stored.
* Users on standard settings are opted-in by default. This is the status quo in Kubo already, except they don't get a chance to opt out.
The telemetry libp2p protocol is yet to be defined, but expect something similar to identify, with a protobuf being pushed to bootstrappers or to a specific telemetry node that we define. In the case of pnets, this will be done with a temporary peer.
* checkpoint
* telemetry plugin: second pass
* On first run it generates a UUID and shows a message to the user.
* UUID is persistend to "telemetry_uuid"
* Sends telemetry 1 minute after boot and every 24h
* LogEvent is the thing containing all the telemetry that is sent
* Opt-out possible via env-var or plugin configuration
* Telemetry: add changelog and environment variable documentation
* docs: improved daemon message
making it more obvious nothing was sent yet
and that user had 15m to out-out
plus some debug logs that confirm opt-out
* refactor: rename IPFS_TELEMETRY_MODE to IPFS_TELEMETRY
* fix: add User-Agent header to telemetry requests
---------
Co-authored-by: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Co-authored-by: Marcin Rataj
---
.cspell.yml | 2 +-
docs/changelogs/v0.37.md | 50 +-
docs/environment-variables.md | 17 +
docs/plugins.md | 1 +
docs/telemetry.md | 122 +++++
plugin/loader/preload.go | 2 +
plugin/loader/preload_list | 1 +
plugin/plugins/telemetry/telemetry.go | 560 +++++++++++++++++++++
plugin/plugins/telemetry/telemetry_test.go | 170 +++++++
plugin/plugins/telemetry/telemetry_uuid | 1 +
test/cli/telemetry_test.go | 184 +++++++
11 files changed, 1108 insertions(+), 2 deletions(-)
create mode 100644 docs/telemetry.md
create mode 100644 plugin/plugins/telemetry/telemetry.go
create mode 100644 plugin/plugins/telemetry/telemetry_test.go
create mode 100644 plugin/plugins/telemetry/telemetry_uuid
create mode 100644 test/cli/telemetry_test.go
diff --git a/.cspell.yml b/.cspell.yml
index da6c80196..f56756a87 100644
--- a/.cspell.yml
+++ b/.cspell.yml
@@ -3,4 +3,4 @@ ignoreWords:
- NodeCreater # This spelling is used in the fuse dependency
- Boddy # One of the contributors to the project - Chris Boddy
- Botto # One of the contributors to the project - Santiago Botto
- - cose # dag-cose
+ - cose # dag-cose
\ No newline at end of file
diff --git a/docs/changelogs/v0.37.md b/docs/changelogs/v0.37.md
index 9d2f3673b..bc48c8ff3 100644
--- a/docs/changelogs/v0.37.md
+++ b/docs/changelogs/v0.37.md
@@ -20,6 +20,7 @@ This release was brought to you by the [Shipyard](https://ipshipyard.com/) team.
- [Improved `ipfs cid`](#improved-ipfs-cid)
- [Deprecated `ipfs stats reprovide`](#deprecated-ipfs-stats-reprovide)
- [๐ AutoRelay now uses all connected peers for relay discovery](#-autorelay-now-uses-all-connected-peers-for-relay-discovery)
+ - [๐ Anonymous telemetry for better feature prioritization](#-anonymous-telemetry-for-better-feature-prioritization)
- [๐ฆ๏ธ Important dependency updates](#-important-dependency-updates)
- [๐ Changelog](#-changelog)
- [๐จโ๐ฉโ๐งโ๐ฆ Contributors](#-contributors)
@@ -136,7 +137,54 @@ The `ipfs stats reprovide` command has moved to `ipfs provide stat`. This was do
AutoRelay's relay discovery now includes all connected peers as potential relay candidates, not just peers discovered through the DHT. This allows peers connected via HTTP routing and manual `ipfs swarm connect` commands to serve as relays, improving connectivity for nodes using non-DHT routing configurations.
-#### ๐ฆ๏ธ Important dependency updates
+#### ๐ Anonymous telemetry for better feature prioritization
+
+Per a suggestion from the IPFS Foundation, Kubo now sends optional anonymized telemetry information to Shipyard [maintainers](https://github.com/ipshipyard/roadmaps/issues/20).
+
+**Privacy first**: The telemetry system collects only anonymous data - no personally identifiable information, file paths, or content data. A random UUID is generated on first run for anonymous identification. Users are notified before any data is sent and have time to opt-out.
+
+**Why**: We want to better understand Kubo usage across the ecosystem so we can better direct funding and work efforts. For example, we have little insights into how many nodes are NAT'ed and rely on AutoNAT for reachability. Some of the information can be inferred by crawling the network or logging `/identify` details in the bootstrappers, but users have no way of opting out from that, so we believe it is more transparent to concentrate this functionality in one place.
+
+**What**: Currently, we send the following anonymous metrics:
+
+```
+ "uuid": "",
+ "agent_version": "kubo/0.37.0-dev",
+ "private_network": false,
+ "bootstrappers_custom": false,
+ "repo_size_bucket": 1073741824,
+ "uptime_bucket": 86400000000000,
+ "reprovider_strategy": "pinned",
+ "routing_type": "auto",
+ "routing_accelerated_dht_client": false,
+ "routing_delegated_count": 0,
+ "autonat_service_mode": "enabled",
+ "autonat_reachability": "",
+ "swarm_enable_hole_punching": true,
+ "swarm_circuit_addresses": false,
+ "swarm_ipv4_public_addresses": true,
+ "swarm_ipv6_public_addresses": true,
+ "auto_tls_auto_wss": true,
+ "auto_tls_domain_suffix_custom": false,
+ "discovery_mdns_enabled": true,
+ "platform_os": "linux",
+ "platform_arch": "amd64",
+ "platform_containerized": false,
+ "platform_vm": false
+```
+
+The exact data sent for your node can be inspected by setting `GOLOG_LOG_LEVEL="telemetry=debug"`. Users will see an informative message the first time they launch a telemetry-enabled daemon, with time to opt-out before any data is collected. Telemetry data is sent every 24h, with the first collection starting 15 minutes after daemon launch.
+
+**User control**: You can opt-out at any time:
+
+- Set environment variable `IPFS_TELEMETRY=off` before starting the daemon
+- Or run `ipfs config Plugins.Plugins.telemetry.Config.Mode off` and restart the daemon
+
+The telemetry plugin code lives in `plugin/plugins/telemetry`.
+
+Learn more: [`/kubo/docs/telemetry.md`](https://github.com/ipfs/kubo/blob/master/docs/telemetry.md)
+
+### ๐ฆ๏ธ Important dependency updates
- update `go-libp2p` to [v0.43.0](https://github.com/libp2p/go-libp2p/releases/tag/v0.43.0) (incl. [v0.42.1](https://github.com/libp2p/go-libp2p/releases/tag/v0.42.1))
- update `p2p-forge/client` to [v0.6.1](https://github.com/ipshipyard/p2p-forge/releases/tag/v0.6.1)
diff --git a/docs/environment-variables.md b/docs/environment-variables.md
index ed18f8f3b..2942bf788 100644
--- a/docs/environment-variables.md
+++ b/docs/environment-variables.md
@@ -18,6 +18,7 @@
- [`IPFS_HTTP_ROUTERS_FILTER_PROTOCOLS`](#ipfs_http_routers_filter_protocols)
- [`IPFS_CONTENT_BLOCKING_DISABLE`](#ipfs_content_blocking_disable)
- [`IPFS_WAIT_REPO_LOCK`](#ipfs_wait_repo_lock)
+ - [`IPFS_TELEMETRY`](#ipfs_telemetry)
- [`LIBP2P_TCP_REUSEPORT`](#libp2p_tcp_reuseport)
- [`LIBP2P_TCP_MUX`](#libp2p_tcp_mux)
- [`LIBP2P_MUX_PREFS`](#libp2p_mux_prefs)
@@ -194,6 +195,22 @@ IPFS_WAIT_REPO_LOCK="15s"
If the lock cannot be acquired because someone else has the lock, and `IPFS_WAIT_REPO_LOCK` is set to a valid value, then acquiring the lock is retried every second until the lock is acquired or the specified wait time has elapsed.
+## `IPFS_TELEMETRY`
+
+Controls the behavior of the [telemetry plugin](telemetry.md). Valid values are:
+
+- `on`: Enables telemetry.
+- `off`: Disables telemetry.
+- `auto`: Like `on`, but logs an informative message about telemetry and gives user 15 minutes to opt-out before first collection. Used automatically on first run and when `IPFS_TELEMETRY` is not set.
+
+The mode can also be set in the config file under `Plugins.Plugins.telemetry.Config.Mode`.
+
+Example:
+
+```bash
+export IPFS_TELEMETRY="off"
+```
+
## `LIBP2P_TCP_REUSEPORT`
Kubo tries to reuse the same source port for all connections to improve NAT
diff --git a/docs/plugins.md b/docs/plugins.md
index 86cfe1c51..8a388a533 100644
--- a/docs/plugins.md
+++ b/docs/plugins.md
@@ -117,6 +117,7 @@ Example:
| [flatfs](https://github.com/ipfs/kubo/tree/master/plugin/plugins/flatfs) | Datastore | x | A stable filesystem-based datastore. |
| [levelds](https://github.com/ipfs/kubo/tree/master/plugin/plugins/levelds) | Datastore | x | A stable, flexible datastore backend. |
| [jaeger](https://github.com/ipfs/go-jaeger-plugin) | Tracing | | An opentracing backend. |
+| [telemetry](https://github.com/ipfs/kubo/tree/master/plugin/plugins/telemetry) | Telemetry | x | Collects anonymized usage data for Kubo development. |
* **Preloaded** plugins are built into the Kubo binary and do not need to be
installed separately. At the moment, all in-tree plugins are preloaded.
diff --git a/docs/telemetry.md b/docs/telemetry.md
new file mode 100644
index 000000000..d4bab0e1c
--- /dev/null
+++ b/docs/telemetry.md
@@ -0,0 +1,122 @@
+# Telemetry Plugin Documentation
+
+The **Telemetry plugin** is a feature in Kubo that collects **anonymized usage data** to help the development team better understand how the software is used, identify areas for improvement, and guide future feature development.
+
+This data is not personally identifiable and is used solely for the purpose of improving the Kubo project.
+
+---
+
+## ๐ก๏ธ How to Control Telemetry
+
+The behavior of the Telemetry plugin is controlled via the environment variable [`IPFS_TELEMETRY`](environment-variables.md#ipfs_telemetry) and optionally via the `Plugins.Plugins.telemetry.Config.Mode` in the IPFS config file.
+
+### Available Modes
+
+| Mode | Description |
+|----------|-----------------------------------------------------------------------------|
+| `on` | **Default**. Telemetry is enabled. Data is sent periodically. |
+| `off` | Telemetry is disabled. No data is sent. Any existing telemetry UUID file is removed. |
+| `auto` | Like `on`, but logs an informative message about the telemetry and gives user 15 minutes to opt-out before first collection. This mode is automatically used on the first run when `IPFS_TELEMETRY` is not set and telemetry UUID is not found (not generated yet). The informative message is only shown once. |
+
+You can set the mode in your environment:
+
+```bash
+export IPFS_TELEMETRY="off"
+```
+
+Or in your IPFS config file:
+
+```json
+{
+ "Plugins": {
+ "Plugins": {
+ "telemetry": {
+ "Config": {
+ "Mode": "off"
+ }
+ }
+ }
+ }
+}
+```
+
+---
+
+## ๐ฆ What Data is Collected?
+
+The telemetry plugin collects the following anonymized data:
+
+### General Information
+- **Agent version**: The version of Kubo being used.
+- **Platform details**: Operating system, architecture, and container status.
+- **Uptime**: How long the node has been running, categorized into buckets.
+- **Repo size**: Categorized into buckets (e.g., 1GB, 5GB, 10GB, etc.).
+
+### Network Configuration
+- **Private network**: Whether the node is running in a private network.
+- **Bootstrap peers**: Whether custom bootstrap peers are used.
+- **Routing type**: Whether the node uses DHT, IPFS, or a custom routing setup.
+- **AutoNAT settings**: Whether AutoNAT is enabled and its reachability status.
+- **Swarm settings**: Whether hole punching is enabled, and whether public IP addresses are used.
+
+### TLS and Discovery
+- **AutoTLS settings**: Whether WSS is enabled and whether a custom domain suffix is used.
+- **Discovery settings**: Whether mDNS is enabled.
+
+### Reprovider Strategy
+- The strategy used for reprovider (e.g., "all", "pinned"...).
+
+---
+
+## ๐งโ๐คโ๐ง Privacy and Anonymization
+
+All data collected is:
+- **Anonymized**: No personally identifiable information (PII) is sent.
+- **Optional**: Users can choose to opt out at any time.
+- **Secure**: Data is sent over HTTPS to a trusted endpoint.
+
+The telemetry UUID is stored in the IPFS repo folder and is used to identify the node across runs, but it does not contain any personal information. When you opt-out, this UUID file is automatically removed to ensure complete privacy.
+
+---
+
+## ๐ฆ Contributing to the Project
+
+By enabling telemetry, you are helping the Kubo team improve the software for the entire community. The data is used to:
+
+- Prioritize feature development
+- Identify performance bottlenecks
+- Improve user experience
+
+You can always disable telemetry at any time if you change your mind.
+
+---
+
+## ๐งช Testing Telemetry
+
+If you're testing telemetry locally, you can change the endpoint by setting the `Endpoint` field in the config:
+
+```json
+{
+ "Plugins": {
+ "Plugins": {
+ "telemetry": {
+ "Config": {
+ "Mode": "on",
+ "Endpoint": "http://localhost:8080"
+ }
+ }
+ }
+ }
+}
+```
+
+This allows you to capture and inspect telemetry data locally.
+
+---
+
+## ๐ฆ Further Reading
+
+For more information, see:
+- [IPFS Environment Variables](docs/environment-variables.md)
+- [IPFS Plugins](docs/plugins.md)
+- [IPFS Configuration](docs/config.md)
diff --git a/plugin/loader/preload.go b/plugin/loader/preload.go
index 75e21270c..eb1bd5a6e 100644
--- a/plugin/loader/preload.go
+++ b/plugin/loader/preload.go
@@ -10,6 +10,7 @@ import (
pluginnopfs "github.com/ipfs/kubo/plugin/plugins/nopfs"
pluginpebbleds "github.com/ipfs/kubo/plugin/plugins/pebbleds"
pluginpeerlog "github.com/ipfs/kubo/plugin/plugins/peerlog"
+ plugintelemetry "github.com/ipfs/kubo/plugin/plugins/telemetry"
)
// DO NOT EDIT THIS FILE
@@ -26,4 +27,5 @@ func init() {
Preload(pluginpeerlog.Plugins...)
Preload(pluginfxtest.Plugins...)
Preload(pluginnopfs.Plugins...)
+ Preload(plugintelemetry.Plugins...)
}
diff --git a/plugin/loader/preload_list b/plugin/loader/preload_list
index 190cc65d7..80e5b9cc9 100644
--- a/plugin/loader/preload_list
+++ b/plugin/loader/preload_list
@@ -13,3 +13,4 @@ pebbleds github.com/ipfs/kubo/plugin/plugins/pebbleds *
peerlog github.com/ipfs/kubo/plugin/plugins/peerlog *
fxtest github.com/ipfs/kubo/plugin/plugins/fxtest *
nopfs github.com/ipfs/kubo/plugin/plugins/nopfs *
+telemetry github.com/ipfs/kubo/plugin/plugins/telemetry *
diff --git a/plugin/plugins/telemetry/telemetry.go b/plugin/plugins/telemetry/telemetry.go
new file mode 100644
index 000000000..0414e5098
--- /dev/null
+++ b/plugin/plugins/telemetry/telemetry.go
@@ -0,0 +1,560 @@
+package telemetry
+
+import (
+ "bytes"
+ "context"
+ "encoding/json"
+ "fmt"
+ "net/http"
+ "os"
+ "path"
+ "runtime"
+ "strings"
+ "time"
+
+ "github.com/google/uuid"
+ logging "github.com/ipfs/go-log/v2"
+ ipfs "github.com/ipfs/kubo"
+ "github.com/ipfs/kubo/config"
+ "github.com/ipfs/kubo/core"
+ "github.com/ipfs/kubo/core/corerepo"
+ "github.com/ipfs/kubo/plugin"
+ "github.com/libp2p/go-libp2p/core/network"
+ "github.com/libp2p/go-libp2p/core/pnet"
+ multiaddr "github.com/multiformats/go-multiaddr"
+ manet "github.com/multiformats/go-multiaddr/net"
+)
+
+var log = logging.Logger("telemetry")
+
+const (
+ modeEnvVar = "IPFS_TELEMETRY"
+ uuidFilename = "telemetry_uuid"
+ endpoint = "https://telemetry.ipshipyard.dev"
+ sendDelay = 15 * time.Minute // delay before first telemetry collection after daemon start
+ sendInterval = 24 * time.Hour // interval between telemetry collections after the first one
+ httpTimeout = 30 * time.Second // timeout for telemetry HTTP requests
+)
+
+type pluginMode int
+
+const (
+ modeAuto pluginMode = iota
+ modeOn
+ modeOff
+)
+
+// repoSizeBuckets defines size thresholds for categorizing repository sizes.
+// Each value represents the upper limit of a bucket in bytes (except the last)
+var repoSizeBuckets = []uint64{
+ 1 << 30, // 1 GB
+ 5 << 30, // 5 GB
+ 10 << 30, // 10 GB
+ 100 << 30, // 100 GB
+ 500 << 30, // 500 GB
+ 1 << 40, // 1 TB
+ 10 << 40, // 10 TB
+ 11 << 40, // + anything more than 10TB falls here.
+}
+
+var uptimeBuckets = []time.Duration{
+ 1 * 24 * time.Hour,
+ 2 * 24 * time.Hour,
+ 3 * 24 * time.Hour,
+ 7 * 24 * time.Hour,
+ 14 * 24 * time.Hour,
+ 30 * 24 * time.Hour,
+ 31 * 24 * time.Hour, // + anything more than 30 days falls here.
+}
+
+// A LogEvent is the object sent to the telemetry endpoint.
+type LogEvent struct {
+ UUID string `json:"uuid"`
+
+ AgentVersion string `json:"agent_version"`
+
+ PrivateNetwork bool `json:"private_network"`
+
+ BootstrappersCustom bool `json:"bootstrappers_custom"`
+
+ RepoSizeBucket uint64 `json:"repo_size_bucket"`
+
+ UptimeBucket time.Duration `json:"uptime_bucket"`
+
+ ReproviderStrategy string `json:"reprovider_strategy"`
+
+ RoutingType string `json:"routing_type"`
+ RoutingAcceleratedDHTClient bool `json:"routing_accelerated_dht_client"`
+ RoutingDelegatedCount int `json:"routing_delegated_count"`
+
+ AutoNATServiceMode string `json:"autonat_service_mode"`
+ AutoNATReachability string `json:"autonat_reachability"`
+
+ SwarmEnableHolePunching bool `json:"swarm_enable_hole_punching"`
+ SwarmCircuitAddresses bool `json:"swarm_circuit_addresses"`
+ SwarmIPv4PublicAddresses bool `json:"swarm_ipv4_public_addresses"`
+ SwarmIPv6PublicAddresses bool `json:"swarm_ipv6_public_addresses"`
+
+ AutoTLSAutoWSS bool `json:"auto_tls_auto_wss"`
+ AutoTLSDomainSuffixCustom bool `json:"auto_tls_domain_suffix_custom"`
+
+ DiscoveryMDNSEnabled bool `json:"discovery_mdns_enabled"`
+
+ PlatformOS string `json:"platform_os"`
+ PlatformArch string `json:"platform_arch"`
+ PlatformContainerized bool `json:"platform_containerized"`
+ PlatformVM bool `json:"platform_vm"`
+}
+
+var Plugins = []plugin.Plugin{
+ &telemetryPlugin{},
+}
+
+type telemetryPlugin struct {
+ uuidFilename string
+ mode pluginMode
+ endpoint string
+ runOnce bool // test-only flag: when true, sends telemetry immediately without delay
+ sendDelay time.Duration
+
+ node *core.IpfsNode
+ config *config.Config
+ event *LogEvent
+ startTime time.Time
+}
+
+func (p *telemetryPlugin) Name() string {
+ return "telemetry"
+}
+
+func (p *telemetryPlugin) Version() string {
+ return "0.0.1"
+}
+
+func readFromConfig(cfg interface{}, key string) string {
+ if cfg == nil {
+ return ""
+ }
+
+ pcfg, ok := cfg.(map[string]interface{})
+ if !ok {
+ return ""
+ }
+
+ val, ok := pcfg[key].(string)
+ if !ok {
+ return ""
+ }
+ return val
+}
+
+func (p *telemetryPlugin) Init(env *plugin.Environment) error {
+ // logging.SetLogLevel("telemetry", "DEBUG")
+ log.Debug("telemetry plugin Init()")
+ p.event = &LogEvent{}
+ p.startTime = time.Now()
+
+ repoPath := env.Repo
+ p.uuidFilename = path.Join(repoPath, uuidFilename)
+
+ v := os.Getenv(modeEnvVar)
+ if v != "" {
+ log.Debug("mode set from env-var")
+ } else if pmode := readFromConfig(env.Config, "Mode"); pmode != "" {
+ v = pmode
+ log.Debug("mode set from config")
+ }
+
+ // read "Delay" from the config. Parse as duration. Set p.sendDelay to it
+ // or set default.
+ if delayStr := readFromConfig(env.Config, "Delay"); delayStr != "" {
+ delay, err := time.ParseDuration(delayStr)
+ if err != nil {
+ log.Debug("sendDelay set from default")
+ p.sendDelay = sendDelay
+ } else {
+ log.Debug("sendDelay set from config")
+ p.sendDelay = delay
+ }
+ } else {
+ log.Debug("sendDelay set from default")
+ p.sendDelay = sendDelay
+ }
+
+ p.endpoint = endpoint
+ if ep := readFromConfig(env.Config, "Endpoint"); ep != "" {
+ log.Debug("endpoint set from config", ep)
+ p.endpoint = ep
+ }
+
+ switch v {
+ case "off":
+ p.mode = modeOff
+ log.Debug("telemetry disabled via opt-out")
+ // Remove UUID file if it exists when user opts out
+ if _, err := os.Stat(p.uuidFilename); err == nil {
+ if err := os.Remove(p.uuidFilename); err != nil {
+ log.Debugf("failed to remove telemetry UUID file: %s", err)
+ } else {
+ log.Debug("removed existing telemetry UUID file due to opt-out")
+ }
+ }
+ return nil
+ case "auto":
+ p.mode = modeAuto
+ default:
+ p.mode = modeOn
+ }
+ log.Debug("telemetry mode: ", p.mode)
+ return nil
+}
+
+func (p *telemetryPlugin) loadUUID() error {
+ // Generate or read our UUID from disk
+ b, err := os.ReadFile(p.uuidFilename)
+ if err != nil {
+ if !os.IsNotExist(err) {
+ log.Errorf("error reading telemetry uuid from disk: %s", err)
+ return err
+ }
+ uid, err := uuid.NewRandom()
+ if err != nil {
+ log.Errorf("cannot generate telemetry uuid: %s", err)
+ return err
+ }
+ p.event.UUID = uid.String()
+ p.mode = modeAuto
+ log.Debugf("new telemetry UUID %s. Mode set to Auto", uid)
+
+ // Write the UUID to disk
+ if err := os.WriteFile(p.uuidFilename, []byte(p.event.UUID), 0600); err != nil {
+ log.Errorf("cannot write telemetry uuid: %s", err)
+ return err
+ }
+ return nil
+ }
+
+ v := string(b)
+ v = strings.TrimSpace(v)
+ uid, err := uuid.Parse(v)
+ if err != nil {
+ log.Errorf("cannot parse telemetry uuid: %s", err)
+ return err
+ }
+ log.Debugf("uuid read from disk %s", uid)
+ p.event.UUID = uid.String()
+ return nil
+}
+
+func (p *telemetryPlugin) hasDefaultBootstrapPeers() bool {
+ defaultPeers := config.DefaultBootstrapAddresses
+ currentPeers := p.config.Bootstrap
+ if len(defaultPeers) != len(currentPeers) {
+ return false
+ }
+ peerMap := make(map[string]struct{}, len(defaultPeers))
+ for _, peer := range defaultPeers {
+ peerMap[peer] = struct{}{}
+ }
+ for _, peer := range currentPeers {
+ if _, ok := peerMap[peer]; !ok {
+ return false
+ }
+ }
+ return true
+}
+
+func (p *telemetryPlugin) showInfo() {
+ fmt.Printf(`
+
+โน๏ธ Anonymous telemetry will be enabled in %s
+
+Kubo will collect anonymous usage data to help improve the software:
+โข What: Feature usage and configuration (no personal data)
+ Use GOLOG_LOG_LEVEL="telemetry=debug" to inspect collected data
+โข When: First collection in %s, then every 24h
+โข How: HTTP POST to %s
+ Anonymous ID: %s
+
+No data sent yet. To opt-out before collection starts:
+โข Set environment: %s=off
+โข Or run: ipfs config Plugins.Plugins.telemetry.Config.Mode off
+โข Then restart daemon
+
+This message is shown only once.
+Learn more: https://github.com/ipfs/kubo/blob/master/docs/telemetry.md
+
+
+`, p.sendDelay, p.sendDelay, endpoint, p.event.UUID, modeEnvVar)
+}
+
+// Start finishes telemetry initialization once the IpfsNode is ready,
+// collects telemetry data and sends it to the endpoint.
+func (p *telemetryPlugin) Start(n *core.IpfsNode) error {
+ // We should not be crashing the daemon due to problems with telemetry
+ // so this is always going to return nil and panics are going to be
+ // handled.
+ defer func() {
+ if r := recover(); r != nil {
+ log.Errorf("telemetry plugin panicked: %v", r)
+ }
+ }()
+
+ p.node = n
+ cfg, err := n.Repo.Config()
+ if err != nil {
+ log.Error("error getting the repo.Config: %s", err)
+ return nil
+ }
+ p.config = cfg
+ if p.mode == modeOff {
+ log.Debug("telemetry collection skipped: opted out")
+ return nil
+ }
+
+ if !n.IsDaemon || !n.IsOnline {
+ log.Debugf("skipping telemetry. Daemon: %t. Online: %t", n.IsDaemon, n.IsOnline)
+ return nil
+ }
+
+ // loadUUID might switch to modeAuto when generating a new uuid
+ if err := p.loadUUID(); err != nil {
+ p.mode = modeOff
+ return nil
+ }
+
+ if p.mode == modeAuto {
+ p.showInfo()
+ }
+
+ // runOnce is only used in tests to send telemetry immediately.
+ // In production, this is always false, ensuring users get the 15-minute delay.
+ if p.runOnce {
+ p.prepareEvent()
+ return p.sendTelemetry()
+ }
+
+ go func() {
+ timer := time.NewTimer(p.sendDelay)
+ for range timer.C {
+ p.prepareEvent()
+ if err := p.sendTelemetry(); err != nil {
+ log.Warnf("telemetry submission failed: %s (will retry in %s)", err, sendInterval)
+ }
+ timer.Reset(sendInterval)
+ }
+ }()
+
+ return nil
+}
+
+func (p *telemetryPlugin) prepareEvent() {
+ p.collectBasicInfo()
+ p.collectRoutingInfo()
+ p.collectAutoNATInfo()
+ p.collectSwarmInfo()
+ p.collectAutoTLSInfo()
+ p.collectDiscoveryInfo()
+ p.collectPlatformInfo()
+}
+
+// Collects:
+// * AgentVersion
+// * PrivateNetwork
+// * RepoSizeBucket
+// * BootstrappersCustom
+// * UptimeBucket
+// * ReproviderStrategy
+func (p *telemetryPlugin) collectBasicInfo() {
+ p.event.AgentVersion = ipfs.GetUserAgentVersion()
+
+ privNet := false
+ if pnet.ForcePrivateNetwork {
+ privNet = true
+ } else if key, _ := p.node.Repo.SwarmKey(); key != nil {
+ privNet = true
+ }
+ p.event.PrivateNetwork = privNet
+
+ p.event.BootstrappersCustom = !p.hasDefaultBootstrapPeers()
+
+ repoSizeBucket := repoSizeBuckets[len(repoSizeBuckets)-1]
+ sizeStat, err := corerepo.RepoSize(context.Background(), p.node)
+ if err == nil {
+ for _, b := range repoSizeBuckets {
+ if sizeStat.RepoSize > b {
+ continue
+ }
+ repoSizeBucket = b
+ break
+ }
+ p.event.RepoSizeBucket = repoSizeBucket
+ } else {
+ log.Debugf("error setting sizeStat: %s", err)
+ }
+
+ uptime := time.Since(p.startTime)
+ uptimeBucket := uptimeBuckets[len(uptimeBuckets)-1]
+ for _, bucket := range uptimeBuckets {
+ if uptime > bucket {
+ continue
+
+ }
+ uptimeBucket = bucket
+ break
+ }
+ p.event.UptimeBucket = uptimeBucket
+
+ p.event.ReproviderStrategy = p.config.Reprovider.Strategy.WithDefault(config.DefaultReproviderStrategy)
+}
+
+func (p *telemetryPlugin) collectRoutingInfo() {
+ p.event.RoutingType = p.config.Routing.Type.WithDefault("auto")
+ p.event.RoutingAcceleratedDHTClient = p.config.Routing.AcceleratedDHTClient.WithDefault(false)
+ p.event.RoutingDelegatedCount = len(p.config.Routing.DelegatedRouters)
+}
+
+type reachabilityHost interface {
+ Reachability() network.Reachability
+}
+
+func (p *telemetryPlugin) collectAutoNATInfo() {
+ autonat := p.config.AutoNAT.ServiceMode
+ if autonat == config.AutoNATServiceUnset {
+ autonat = config.AutoNATServiceEnabled
+ }
+ autoNATSvcModeB, err := autonat.MarshalText()
+ if err == nil {
+ autoNATSvcMode := string(autoNATSvcModeB)
+ if autoNATSvcMode == "" {
+ autoNATSvcMode = "unset"
+ }
+ p.event.AutoNATServiceMode = autoNATSvcMode
+ }
+
+ h := p.node.PeerHost
+ reachHost, ok := h.(reachabilityHost)
+ if ok {
+ p.event.AutoNATReachability = reachHost.Reachability().String()
+ }
+}
+
+func (p *telemetryPlugin) collectSwarmInfo() {
+ p.event.SwarmEnableHolePunching = p.config.Swarm.EnableHolePunching.WithDefault(true)
+
+ var circuitAddrs, publicIP4Addrs, publicIP6Addrs bool
+ for _, addr := range p.node.PeerHost.Addrs() {
+ if manet.IsPublicAddr(addr) {
+ if _, err := addr.ValueForProtocol(multiaddr.P_IP4); err == nil {
+ publicIP4Addrs = true
+ } else if _, err := addr.ValueForProtocol(multiaddr.P_IP6); err == nil {
+ publicIP6Addrs = true
+ }
+ }
+ if _, err := addr.ValueForProtocol(multiaddr.P_CIRCUIT); err == nil {
+ circuitAddrs = true
+ }
+ }
+
+ p.event.SwarmCircuitAddresses = circuitAddrs
+ p.event.SwarmIPv4PublicAddresses = publicIP4Addrs
+ p.event.SwarmIPv6PublicAddresses = publicIP6Addrs
+}
+
+func (p *telemetryPlugin) collectAutoTLSInfo() {
+ p.event.AutoTLSAutoWSS = p.config.AutoTLS.AutoWSS.WithDefault(config.DefaultAutoWSS)
+ domainSuffix := p.config.AutoTLS.DomainSuffix.WithDefault(config.DefaultDomainSuffix)
+ p.event.AutoTLSDomainSuffixCustom = domainSuffix != config.DefaultDomainSuffix
+}
+
+func (p *telemetryPlugin) collectDiscoveryInfo() {
+ p.event.DiscoveryMDNSEnabled = p.config.Discovery.MDNS.Enabled
+}
+
+func (p *telemetryPlugin) collectPlatformInfo() {
+ p.event.PlatformOS = runtime.GOOS
+ p.event.PlatformArch = runtime.GOARCH
+ p.event.PlatformContainerized = isRunningInContainer()
+ p.event.PlatformVM = isRunningInVM()
+}
+
+func isRunningInContainer() bool {
+ // Check for Docker container
+ if _, err := os.Stat("/.dockerenv"); err == nil {
+ return true
+ }
+
+ // Check cgroup for container
+ content, err := os.ReadFile("/proc/self/cgroup")
+ if err == nil {
+ if strings.Contains(string(content), "docker") || strings.Contains(string(content), "lxc") || strings.Contains(string(content), "/kubepods") {
+ return true
+ }
+ }
+
+ content, err = os.ReadFile("/proc/self/mountinfo")
+ if err == nil {
+ for line := range strings.Lines(string(content)) {
+ if strings.Contains(line, "overlay") && strings.Contains(line, "/var/lib/containers/storage/overlay") {
+ return true
+ }
+ }
+ }
+
+ // Also check for systemd-nspawn
+ if _, err := os.Stat("/run/systemd/container"); err == nil {
+ return true
+ }
+
+ return false
+}
+
+func isRunningInVM() bool {
+ // Check for VM
+ if _, err := os.Stat("/sys/hypervisor/uuid"); err == nil {
+ return true
+ }
+
+ // Check for other VM indicators
+ if _, err := os.Stat("/dev/virt-0"); err == nil {
+ return true
+ }
+
+ return false
+}
+
+func (p *telemetryPlugin) sendTelemetry() error {
+ data, err := json.MarshalIndent(p.event, "", " ")
+ if err != nil {
+ return err
+ }
+
+ log.Debugf("sending telemetry:\n %s", data)
+
+ req, err := http.NewRequest("POST", p.endpoint, bytes.NewBuffer(data))
+ if err != nil {
+ return err
+ }
+ req.Header.Set("Content-Type", "application/json")
+ req.Header.Set("User-Agent", ipfs.GetUserAgentVersion())
+ req.Close = true
+
+ // Use client with timeout to prevent hanging
+ client := &http.Client{
+ Timeout: httpTimeout,
+ }
+ resp, err := client.Do(req)
+ if err != nil {
+ log.Debugf("failed to send telemetry: %s", err)
+ return err
+ }
+ defer resp.Body.Close()
+
+ if resp.StatusCode >= 400 {
+ err := fmt.Errorf("telemetry endpoint returned HTTP %d", resp.StatusCode)
+ log.Debug(err)
+ return err
+ }
+ log.Debugf("telemetry sent successfully (%d)", resp.StatusCode)
+ return nil
+}
diff --git a/plugin/plugins/telemetry/telemetry_test.go b/plugin/plugins/telemetry/telemetry_test.go
new file mode 100644
index 000000000..6b88ced92
--- /dev/null
+++ b/plugin/plugins/telemetry/telemetry_test.go
@@ -0,0 +1,170 @@
+package telemetry
+
+import (
+ "context"
+ "encoding/json"
+ "io"
+ "net/http"
+ "net/http/httptest"
+ "os"
+ "testing"
+
+ "github.com/cockroachdb/pebble/v2"
+ logging "github.com/ipfs/go-log/v2"
+ "github.com/ipfs/kubo/config"
+ "github.com/ipfs/kubo/core"
+ "github.com/ipfs/kubo/core/node/libp2p"
+ "github.com/ipfs/kubo/plugin"
+ "github.com/ipfs/kubo/plugin/plugins/pebbleds"
+ "github.com/ipfs/kubo/repo/fsrepo"
+)
+
+func mockServer(t *testing.T) (*httptest.Server, func() LogEvent) {
+ t.Helper()
+
+ var e LogEvent
+
+ // Create a mock HTTP test server
+ return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ // Check if the request is POST to the correct endpoint
+ if r.Method != "POST" || r.URL.Path != "/" {
+ t.Log("invalid request")
+ http.Error(w, "invalid request", http.StatusBadRequest)
+ return
+ }
+
+ // Check content type
+ if r.Header.Get("Content-Type") != "application/json" {
+ t.Log("invalid content type")
+ http.Error(w, "invalid content type", http.StatusBadRequest)
+ return
+ }
+
+ // Check if the body is not empty
+ if r.Body == nil {
+ t.Log("empty body")
+ http.Error(w, "empty body", http.StatusBadRequest)
+ return
+ }
+
+ // Read the body
+ body, _ := io.ReadAll(r.Body)
+ if len(body) == 0 {
+ t.Log("zero-length body")
+ http.Error(w, "empty body", http.StatusBadRequest)
+ return
+ }
+
+ t.Logf("Received telemetry:\n %s", string(body))
+
+ err := json.Unmarshal(body, &e)
+ if err != nil {
+ t.Log("error unmarshaling event", err)
+ http.Error(w, err.Error(), http.StatusBadRequest)
+ return
+ }
+
+ // Return success
+ w.WriteHeader(http.StatusOK)
+ })), func() LogEvent { return e }
+}
+
+func makeNode(t *testing.T) (node *core.IpfsNode, repopath string) {
+ t.Helper()
+
+ // Create a Temporary Repo
+ repoPath, err := os.MkdirTemp("", "ipfs-shell")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ pebbledspli := pebbleds.Plugins[0]
+ pebbledspl, ok := pebbledspli.(plugin.PluginDatastore)
+ if !ok {
+ t.Fatal("bad datastore plugin")
+ }
+
+ err = fsrepo.AddDatastoreConfigHandler(pebbledspl.DatastoreTypeName(), pebbledspl.DatastoreConfigParser())
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // Create a config with default options and a 2048 bit key
+ cfg, err := config.Init(io.Discard, 2048)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ cfg.Datastore.Spec = map[string]interface{}{
+ "type": "pebbleds",
+ "prefix": "pebble.datastore",
+ "path": "pebbleds",
+ "formatMajorVersion": int(pebble.FormatNewest),
+ }
+
+ // Create the repo with the config
+ err = fsrepo.Init(repoPath, cfg)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // Open the repo
+ repo, err := fsrepo.Open(repoPath)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // Construct the node
+
+ nodeOptions := &core.BuildCfg{
+ Online: true,
+ Routing: libp2p.NilRouterOption,
+ Repo: repo,
+ }
+
+ node, err = core.NewNode(context.Background(), nodeOptions)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ node.IsDaemon = true
+ return
+}
+
+func TestSendTelemetry(t *testing.T) {
+ if err := logging.SetLogLevel("telemetry", "DEBUG"); err != nil {
+ t.Fatal(err)
+ }
+ ts, eventGetter := mockServer(t)
+ defer ts.Close()
+
+ node, repoPath := makeNode(t)
+
+ // Create a plugin instance
+ p := &telemetryPlugin{
+ runOnce: true,
+ }
+
+ // Initialize the plugin
+ pe := &plugin.Environment{
+ Repo: repoPath,
+ Config: nil,
+ }
+ err := p.Init(pe)
+ if err != nil {
+ t.Fatalf("Init() failed: %v", err)
+ }
+
+ p.endpoint = ts.URL
+
+ // Start the plugin
+ err = p.Start(node)
+ if err != nil {
+ t.Fatalf("Start() failed: %v", err)
+ }
+
+ e := eventGetter()
+ if e.UUID != p.event.UUID {
+ t.Fatal("uuid mismatch")
+ }
+}
diff --git a/plugin/plugins/telemetry/telemetry_uuid b/plugin/plugins/telemetry/telemetry_uuid
new file mode 100644
index 000000000..f80cb9c3f
--- /dev/null
+++ b/plugin/plugins/telemetry/telemetry_uuid
@@ -0,0 +1 @@
+289ffed8-c770-49ae-922f-b020c8f776f2
\ No newline at end of file
diff --git a/test/cli/telemetry_test.go b/test/cli/telemetry_test.go
new file mode 100644
index 000000000..51c23414b
--- /dev/null
+++ b/test/cli/telemetry_test.go
@@ -0,0 +1,184 @@
+package cli
+
+import (
+ "os"
+ "path/filepath"
+ "testing"
+ "time"
+
+ "github.com/ipfs/kubo/test/cli/harness"
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+)
+
+func TestTelemetry(t *testing.T) {
+ t.Parallel()
+
+ t.Run("opt-out via environment variable", func(t *testing.T) {
+ t.Parallel()
+
+ // Create a new node
+ node := harness.NewT(t).NewNode().Init()
+
+ // Set the opt-out environment variable
+ node.Runner.Env["IPFS_TELEMETRY"] = "off"
+ node.Runner.Env["GOLOG_LOG_LEVEL"] = "telemetry=debug"
+
+ // Capture daemon output
+ stdout := &harness.Buffer{}
+ stderr := &harness.Buffer{}
+
+ // Start daemon with output capture
+ node.StartDaemonWithReq(harness.RunRequest{
+ CmdOpts: []harness.CmdOpt{
+ harness.RunWithStdout(stdout),
+ harness.RunWithStderr(stderr),
+ },
+ }, "")
+
+ time.Sleep(500 * time.Millisecond)
+
+ // Get daemon output
+ output := stdout.String() + stderr.String()
+
+ // Check that telemetry is disabled
+ assert.Contains(t, output, "telemetry disabled via opt-out", "Expected telemetry disabled message")
+
+ // Stop daemon
+ node.StopDaemon()
+
+ // Verify UUID file was not created or was removed
+ uuidPath := filepath.Join(node.Dir, "telemetry_uuid")
+ _, err := os.Stat(uuidPath)
+ assert.True(t, os.IsNotExist(err), "UUID file should not exist when opted out")
+ })
+
+ t.Run("opt-out via config", func(t *testing.T) {
+ t.Parallel()
+
+ // Create a new node
+ node := harness.NewT(t).NewNode().Init()
+
+ // Set opt-out via config
+ node.IPFS("config", "Plugins.Plugins.telemetry.Config.Mode", "off")
+
+ // Enable debug logging
+ node.Runner.Env["GOLOG_LOG_LEVEL"] = "telemetry=debug"
+
+ // Capture daemon output
+ stdout := &harness.Buffer{}
+ stderr := &harness.Buffer{}
+
+ // Start daemon with output capture
+ node.StartDaemonWithReq(harness.RunRequest{
+ CmdOpts: []harness.CmdOpt{
+ harness.RunWithStdout(stdout),
+ harness.RunWithStderr(stderr),
+ },
+ }, "")
+
+ time.Sleep(500 * time.Millisecond)
+
+ // Get daemon output
+ output := stdout.String() + stderr.String()
+
+ // Check that telemetry is disabled
+ assert.Contains(t, output, "telemetry disabled via opt-out", "Expected telemetry disabled message")
+ assert.Contains(t, output, "telemetry collection skipped: opted out", "Expected telemetry skipped message")
+
+ // Stop daemon
+ node.StopDaemon()
+
+ // Verify UUID file was not created or was removed
+ uuidPath := filepath.Join(node.Dir, "telemetry_uuid")
+ _, err := os.Stat(uuidPath)
+ assert.True(t, os.IsNotExist(err), "UUID file should not exist when opted out")
+ })
+
+ t.Run("opt-out removes existing UUID file", func(t *testing.T) {
+ t.Parallel()
+
+ // Create a new node
+ node := harness.NewT(t).NewNode().Init()
+
+ // Create a UUID file manually to simulate previous telemetry run
+ uuidPath := filepath.Join(node.Dir, "telemetry_uuid")
+ testUUID := "test-uuid-12345"
+ err := os.WriteFile(uuidPath, []byte(testUUID), 0600)
+ require.NoError(t, err, "Failed to create test UUID file")
+
+ // Verify file exists
+ _, err = os.Stat(uuidPath)
+ require.NoError(t, err, "UUID file should exist before opt-out")
+
+ // Set the opt-out environment variable
+ node.Runner.Env["IPFS_TELEMETRY"] = "off"
+ node.Runner.Env["GOLOG_LOG_LEVEL"] = "telemetry=debug"
+
+ // Capture daemon output
+ stdout := &harness.Buffer{}
+ stderr := &harness.Buffer{}
+
+ // Start daemon with output capture
+ node.StartDaemonWithReq(harness.RunRequest{
+ CmdOpts: []harness.CmdOpt{
+ harness.RunWithStdout(stdout),
+ harness.RunWithStderr(stderr),
+ },
+ }, "")
+
+ time.Sleep(500 * time.Millisecond)
+
+ // Get daemon output
+ output := stdout.String() + stderr.String()
+
+ // Check that UUID file was removed
+ assert.Contains(t, output, "removed existing telemetry UUID file due to opt-out", "Expected UUID removal message")
+
+ // Stop daemon
+ node.StopDaemon()
+
+ // Verify UUID file was removed
+ _, err = os.Stat(uuidPath)
+ assert.True(t, os.IsNotExist(err), "UUID file should be removed after opt-out")
+ })
+
+ t.Run("telemetry enabled shows info message", func(t *testing.T) {
+ t.Parallel()
+
+ // Create a new node
+ node := harness.NewT(t).NewNode().Init()
+
+ // Capture daemon output
+ stdout := &harness.Buffer{}
+ stderr := &harness.Buffer{}
+
+ // Don't set opt-out, so telemetry will be enabled
+ // This should trigger the info message on first run
+ node.StartDaemonWithReq(harness.RunRequest{
+ CmdOpts: []harness.CmdOpt{
+ harness.RunWithStdout(stdout),
+ harness.RunWithStderr(stderr),
+ },
+ }, "")
+
+ time.Sleep(500 * time.Millisecond)
+
+ // Get daemon output
+ output := stdout.String() + stderr.String()
+
+ // First run - should show info message
+ assert.Contains(t, output, "Anonymous telemetry")
+ assert.Contains(t, output, "No data sent yet", "Expected no data sent message")
+ assert.Contains(t, output, "To opt-out before collection starts", "Expected opt-out instructions")
+ assert.Contains(t, output, "Learn more:", "Expected learn more link")
+
+ // Stop daemon
+ node.StopDaemon()
+
+ // Verify UUID file was created
+ uuidPath := filepath.Join(node.Dir, "telemetry_uuid")
+ _, err := os.Stat(uuidPath)
+ assert.NoError(t, err, "UUID file should exist when daemon started without telemetry opt-out")
+ })
+}
From c5b13b14e82614eb856da45f252ed6c3d9f3f71b Mon Sep 17 00:00:00 2001
From: Hector Sanjuan
Date: Mon, 18 Aug 2025 20:48:53 +0200
Subject: [PATCH 331/499] docs: fix broadcast control release docs (#10919)
s/want/have blocks
From a81cc2928247829e12c2a76d8b7041232a9fe29c Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Mon, 18 Aug 2025 20:49:26 +0200
Subject: [PATCH 332/499] fix: resolve TestAddMultipleGCLive race condition
(#10916)
test was expecting immediate GC lock acquisition after pipe close,
but timing wasn't guaranteed. replaced blocking wait with 5-second
timeout to handle timing variations while still detecting deadlocks.
---
core/coreunix/add_test.go | 21 ++++++++++++++++++---
1 file changed, 18 insertions(+), 3 deletions(-)
diff --git a/core/coreunix/add_test.go b/core/coreunix/add_test.go
index 1eb050ee9..a11dd13e4 100644
--- a/core/coreunix/add_test.go
+++ b/core/coreunix/add_test.go
@@ -93,8 +93,15 @@ func TestAddMultipleGCLive(t *testing.T) {
// finish write and unblock gc
pipew1.Close()
- // Should have gotten the lock at this point
- <-gc1started
+ // Wait for GC to acquire the lock
+ // The adder needs to finish processing file 'a' and call maybePauseForGC
+ // when starting file 'b' before GC can proceed
+ select {
+ case <-gc1started:
+ // GC got the lock as expected
+ case <-time.After(5 * time.Second):
+ t.Fatal("timeout waiting for GC to start - possible deadlock")
+ }
removedHashes := make(map[string]struct{})
for r := range gc1out {
@@ -123,7 +130,15 @@ func TestAddMultipleGCLive(t *testing.T) {
pipew2.Close()
- <-gc2started
+ // Wait for second GC to acquire the lock
+ // The adder needs to finish processing file 'b' and call maybePauseForGC
+ // when starting file 'c' before GC can proceed
+ select {
+ case <-gc2started:
+ // GC got the lock as expected
+ case <-time.After(5 * time.Second):
+ t.Fatal("timeout waiting for second GC to start - possible deadlock")
+ }
for r := range gc2out {
if r.Error != nil {
From 4bafb22b7638de4f3dcd61f992f6724e75f648c4 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Mon, 18 Aug 2025 22:12:22 +0200
Subject: [PATCH 333/499] fix(ci): make NewRandPort thread-safe (#10921)
* chore: disable AutoTLS in TCP-only transport tests
Tests were failing intermittently. Disabling AutoTLS when WebSocket
transport is disabled appears to resolve the issue.
* fix: make NewRandPort thread-safe
Track allocated ports globally to prevent conflicts
when tests run in parallel.
---
test/cli/harness/peering.go | 38 ++++++++++++++++++++++++++++++-------
test/cli/transports_test.go | 2 ++
2 files changed, 33 insertions(+), 7 deletions(-)
diff --git a/test/cli/harness/peering.go b/test/cli/harness/peering.go
index 8488c822d..445c2cf26 100644
--- a/test/cli/harness/peering.go
+++ b/test/cli/harness/peering.go
@@ -4,6 +4,7 @@ import (
"fmt"
"math/rand"
"net"
+ "sync"
"testing"
"github.com/ipfs/kubo/config"
@@ -14,16 +15,39 @@ type Peering struct {
To int
}
+var (
+ allocatedPorts = make(map[int]struct{})
+ portMutex sync.Mutex
+)
+
func NewRandPort() int {
- if a, err := net.ResolveTCPAddr("tcp", "localhost:0"); err == nil {
- var l *net.TCPListener
- if l, err = net.ListenTCP("tcp", a); err == nil {
- defer l.Close()
- return l.Addr().(*net.TCPAddr).Port
+ portMutex.Lock()
+ defer portMutex.Unlock()
+
+ for i := 0; i < 100; i++ {
+ l, err := net.Listen("tcp", "localhost:0")
+ if err != nil {
+ continue
+ }
+ port := l.Addr().(*net.TCPAddr).Port
+ l.Close()
+
+ if _, used := allocatedPorts[port]; !used {
+ allocatedPorts[port] = struct{}{}
+ return port
}
}
- n := rand.Int()
- return 3000 + (n % 1000)
+
+ // Fallback to random port if we can't get a unique one from the OS
+ for i := 0; i < 1000; i++ {
+ port := 30000 + rand.Intn(10000)
+ if _, used := allocatedPorts[port]; !used {
+ allocatedPorts[port] = struct{}{}
+ return port
+ }
+ }
+
+ panic("failed to allocate unique port after 1100 attempts")
}
func CreatePeerNodes(t *testing.T, n int, peerings []Peering) (*Harness, Nodes) {
diff --git a/test/cli/transports_test.go b/test/cli/transports_test.go
index 3e674adf6..43daa8ed4 100644
--- a/test/cli/transports_test.go
+++ b/test/cli/transports_test.go
@@ -62,6 +62,8 @@ func TestTransports(t *testing.T) {
cfg.Swarm.Transports.Network.WebTransport = config.False
cfg.Swarm.Transports.Network.WebRTCDirect = config.False
cfg.Swarm.Transports.Network.Websocket = config.False
+ // Disable AutoTLS since we're disabling WebSocket transport
+ cfg.AutoTLS.Enabled = config.False
})
})
disableRouting(nodes)
From c468f44fc17ef82352181d2124ad00f9a8b6a16a Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Tue, 19 Aug 2025 11:13:03 -0700
Subject: [PATCH 334/499] upgrade to go-test v0.2.3 (#10923)
---
docs/examples/kubo-as-a-library/go.sum | 4 ++--
go.mod | 2 +-
go.sum | 4 ++--
test/dependencies/go.mod | 2 +-
test/dependencies/go.sum | 4 ++--
5 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum
index f49bf6708..50a10c6b6 100644
--- a/docs/examples/kubo-as-a-library/go.sum
+++ b/docs/examples/kubo-as-a-library/go.sum
@@ -351,8 +351,8 @@ github.com/ipfs/go-metrics-interface v0.3.0 h1:YwG7/Cy4R94mYDUuwsBfeziJCVm9pBMJ6
github.com/ipfs/go-metrics-interface v0.3.0/go.mod h1:OxxQjZDGocXVdyTPocns6cOLwHieqej/jos7H4POwoY=
github.com/ipfs/go-peertaskqueue v0.8.2 h1:PaHFRaVFdxQk1Qo3OKiHPYjmmusQy7gKQUaL8JDszAU=
github.com/ipfs/go-peertaskqueue v0.8.2/go.mod h1:L6QPvou0346c2qPJNiJa6BvOibxDfaiPlqHInmzg0FA=
-github.com/ipfs/go-test v0.2.2 h1:1yjYyfbdt1w93lVzde6JZ2einh3DIV40at4rVoyEcE8=
-github.com/ipfs/go-test v0.2.2/go.mod h1:cmLisgVwkdRCnKu/CFZOk2DdhOcwghr5GsHeqwexoRA=
+github.com/ipfs/go-test v0.2.3 h1:Z/jXNAReQFtCYyn7bsv/ZqUwS6E7iIcSpJ2CuzCvnrc=
+github.com/ipfs/go-test v0.2.3/go.mod h1:QW8vSKkwYvWFwIZQLGQXdkt9Ud76eQXRQ9Ao2H+cA1o=
github.com/ipfs/go-unixfsnode v1.10.1 h1:hGKhzuH6NSzZ4y621wGuDspkjXRNG3B+HqhlyTjSwSM=
github.com/ipfs/go-unixfsnode v1.10.1/go.mod h1:eguv/otvacjmfSbYvmamc9ssNAzLvRk0+YN30EYeOOY=
github.com/ipld/go-car/v2 v2.14.3 h1:1Mhl82/ny8MVP+w1M4LXbj4j99oK3gnuZG2GmG1IhC8=
diff --git a/go.mod b/go.mod
index 3c5e26d1a..c18c127cb 100644
--- a/go.mod
+++ b/go.mod
@@ -42,7 +42,7 @@ require (
github.com/ipfs/go-log/v2 v2.8.1
github.com/ipfs/go-metrics-interface v0.3.0
github.com/ipfs/go-metrics-prometheus v0.1.0
- github.com/ipfs/go-test v0.2.2
+ github.com/ipfs/go-test v0.2.3
github.com/ipfs/go-unixfsnode v1.10.1
github.com/ipld/go-car/v2 v2.14.3
github.com/ipld/go-codec-dagpb v1.7.0
diff --git a/go.sum b/go.sum
index 4701138dc..a5c243b03 100644
--- a/go.sum
+++ b/go.sum
@@ -422,8 +422,8 @@ github.com/ipfs/go-metrics-prometheus v0.1.0 h1:bApWOHkrH3VTBHzTHrZSfq4n4weOZDzZ
github.com/ipfs/go-metrics-prometheus v0.1.0/go.mod h1:2GtL525C/4yxtvSXpRJ4dnE45mCX9AS0XRa03vHx7G0=
github.com/ipfs/go-peertaskqueue v0.8.2 h1:PaHFRaVFdxQk1Qo3OKiHPYjmmusQy7gKQUaL8JDszAU=
github.com/ipfs/go-peertaskqueue v0.8.2/go.mod h1:L6QPvou0346c2qPJNiJa6BvOibxDfaiPlqHInmzg0FA=
-github.com/ipfs/go-test v0.2.2 h1:1yjYyfbdt1w93lVzde6JZ2einh3DIV40at4rVoyEcE8=
-github.com/ipfs/go-test v0.2.2/go.mod h1:cmLisgVwkdRCnKu/CFZOk2DdhOcwghr5GsHeqwexoRA=
+github.com/ipfs/go-test v0.2.3 h1:Z/jXNAReQFtCYyn7bsv/ZqUwS6E7iIcSpJ2CuzCvnrc=
+github.com/ipfs/go-test v0.2.3/go.mod h1:QW8vSKkwYvWFwIZQLGQXdkt9Ud76eQXRQ9Ao2H+cA1o=
github.com/ipfs/go-unixfsnode v1.10.1 h1:hGKhzuH6NSzZ4y621wGuDspkjXRNG3B+HqhlyTjSwSM=
github.com/ipfs/go-unixfsnode v1.10.1/go.mod h1:eguv/otvacjmfSbYvmamc9ssNAzLvRk0+YN30EYeOOY=
github.com/ipld/go-car/v2 v2.14.3 h1:1Mhl82/ny8MVP+w1M4LXbj4j99oK3gnuZG2GmG1IhC8=
diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod
index 0997c8c26..962e3093a 100644
--- a/test/dependencies/go.mod
+++ b/test/dependencies/go.mod
@@ -9,7 +9,7 @@ require (
github.com/golangci/golangci-lint v1.64.8
github.com/ipfs/go-cidutil v0.1.0
github.com/ipfs/go-log/v2 v2.8.1
- github.com/ipfs/go-test v0.2.2
+ github.com/ipfs/go-test v0.2.3
github.com/ipfs/hang-fds v0.1.0
github.com/ipfs/iptb v1.4.1
github.com/ipfs/iptb-plugins v0.5.1
diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum
index 1f3d9b2f2..a8018cc80 100644
--- a/test/dependencies/go.sum
+++ b/test/dependencies/go.sum
@@ -370,8 +370,8 @@ github.com/ipfs/go-metrics-interface v0.3.0 h1:YwG7/Cy4R94mYDUuwsBfeziJCVm9pBMJ6
github.com/ipfs/go-metrics-interface v0.3.0/go.mod h1:OxxQjZDGocXVdyTPocns6cOLwHieqej/jos7H4POwoY=
github.com/ipfs/go-peertaskqueue v0.8.2 h1:PaHFRaVFdxQk1Qo3OKiHPYjmmusQy7gKQUaL8JDszAU=
github.com/ipfs/go-peertaskqueue v0.8.2/go.mod h1:L6QPvou0346c2qPJNiJa6BvOibxDfaiPlqHInmzg0FA=
-github.com/ipfs/go-test v0.2.2 h1:1yjYyfbdt1w93lVzde6JZ2einh3DIV40at4rVoyEcE8=
-github.com/ipfs/go-test v0.2.2/go.mod h1:cmLisgVwkdRCnKu/CFZOk2DdhOcwghr5GsHeqwexoRA=
+github.com/ipfs/go-test v0.2.3 h1:Z/jXNAReQFtCYyn7bsv/ZqUwS6E7iIcSpJ2CuzCvnrc=
+github.com/ipfs/go-test v0.2.3/go.mod h1:QW8vSKkwYvWFwIZQLGQXdkt9Ud76eQXRQ9Ao2H+cA1o=
github.com/ipfs/go-unixfsnode v1.10.1 h1:hGKhzuH6NSzZ4y621wGuDspkjXRNG3B+HqhlyTjSwSM=
github.com/ipfs/go-unixfsnode v1.10.1/go.mod h1:eguv/otvacjmfSbYvmamc9ssNAzLvRk0+YN30EYeOOY=
github.com/ipfs/hang-fds v0.1.0 h1:deBiFlWHsVGzJ0ZMaqscEqRM1r2O1rFZ59UiQXb1Xko=
From ccb49de8524e77bbb72733c73c9bec606cf1d005 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Wed, 20 Aug 2025 05:59:11 +0200
Subject: [PATCH 335/499] feat(config): AutoConf with "auto" placeholders
(#10883)
https://github.com/ipfs/kubo/pull/10883
https://github.com/ipshipyard/config.ipfs-mainnet.org/issues/3
---------
Co-authored-by: gammazero
---
.gitattributes | 20 +
cmd/ipfs/kubo/daemon.go | 136 +--
commands/context.go | 17 +
config/autoconf.go | 319 +++++++
config/autoconf_client.go | 136 +++
config/autoconf_test.go | 92 +++
config/bootstrap_peers.go | 29 -
config/bootstrap_peers_test.go | 32 +-
config/config.go | 2 +
config/dns.go | 2 +-
config/init.go | 19 +-
config/ipns.go | 3 +
config/migration.go | 22 +-
config/profile.go | 48 +-
config/routing.go | 11 +-
core/commands/bootstrap.go | 128 ++-
core/commands/commands_test.go | 1 -
core/commands/config.go | 59 +-
core/commands/name/publish.go | 51 +-
core/commands/repo.go | 86 +-
core/core.go | 3 +-
core/coreapi/name.go | 22 +-
core/coreiface/options/name.go | 14 +-
core/coreiface/tests/name.go | 21 +-
core/node/builder.go | 3 +-
core/node/dns.go | 5 +-
core/node/libp2p/host.go | 3 +-
core/node/libp2p/routing.go | 3 +-
core/node/libp2p/routingopt.go | 174 +++-
core/node/libp2p/routingopt_test.go | 190 +++++
docs/changelogs/v0.37.md | 68 +-
docs/config.md | 246 +++++-
docs/environment-variables.md | 16 +-
docs/experimental-features.md | 1 +
docs/telemetry.md | 1 +
go.mod | 2 +-
plugin/plugins/telemetry/telemetry.go | 25 +-
repo/fsrepo/fsrepo.go | 3 +-
repo/fsrepo/migrations/README.md | 134 +++
.../migrations/atomicfile/atomicfile.go | 59 ++
repo/fsrepo/migrations/embedded.go | 146 ++++
repo/fsrepo/migrations/embedded_test.go | 36 +
.../migrations/fs-repo-16-to-17/main.go | 63 ++
.../fs-repo-16-to-17/migration/migration.go | 492 +++++++++++
.../migration/migration_test.go | 479 +++++++++++
repo/fsrepo/migrations/migrations.go | 243 +++++-
repo/fsrepo/migrations/migrations_test.go | 28 +-
test/cli/autoconf/autoconf_test.go | 779 ++++++++++++++++++
test/cli/autoconf/dns_test.go | 288 +++++++
.../cli/autoconf/expand_comprehensive_test.go | 698 ++++++++++++++++
test/cli/autoconf/expand_fallback_test.go | 286 +++++++
test/cli/autoconf/expand_test.go | 732 ++++++++++++++++
test/cli/autoconf/extensibility_test.go | 255 ++++++
test/cli/autoconf/fuzz_test.go | 654 +++++++++++++++
test/cli/autoconf/ipns_test.go | 352 ++++++++
test/cli/autoconf/routing_test.go | 236 ++++++
test/cli/autoconf/swarm_connect_test.go | 90 ++
.../testdata/autoconf_amino_and_ipni.json | 60 ++
.../testdata/autoconf_new_routing_system.json | 38 +
.../autoconf_new_routing_with_filtering.json | 59 ++
.../autoconf_with_unsupported_paths.json | 64 ++
.../autoconf/testdata/updated_autoconf.json | 87 ++
.../cli/autoconf/testdata/valid_autoconf.json | 68 ++
test/cli/autoconf/validation_test.go | 144 ++++
test/cli/basic_commands_test.go | 4 +
test/cli/bootstrap_auto_test.go | 202 +++++
test/cli/harness/node.go | 140 +++-
.../cli/migrations/migration_16_to_17_test.go | 684 +++++++++++++++
.../migration_legacy_15_to_17_test.go | 451 ++++++++++
.../testdata/v15-repo/blocks/SHARDING | Bin 0 -> 37 bytes
...2BFAGLXEZL4UWFNWM4LFTLMXQBCERZ6CMLX3Y.data | Bin 0 -> 4 bytes
.../testdata/v15-repo/blocks/_README | Bin 0 -> 1123 bytes
.../testdata/v15-repo/blocks/diskUsage.cache | Bin 0 -> 47 bytes
test/cli/migrations/testdata/v15-repo/config | Bin 0 -> 3592 bytes
.../testdata/v15-repo/datastore/000001.log | Bin 0 -> 1303 bytes
.../testdata/v15-repo/datastore/CURRENT | Bin 0 -> 16 bytes
.../testdata/v15-repo/datastore/LOCK | Bin
.../testdata/v15-repo/datastore/LOG | Bin 0 -> 437 bytes
.../v15-repo/datastore/MANIFEST-000000 | Bin 0 -> 54 bytes
.../testdata/v15-repo/datastore_spec | Bin 0 -> 190 bytes
test/cli/migrations/testdata/v15-repo/version | Bin 0 -> 3 bytes
.../testdata/v16-repo/blocks/SHARDING | Bin 0 -> 37 bytes
...2BFAGLXEZL4UWFNWM4LFTLMXQBCERZ6CMLX3Y.data | Bin 0 -> 4 bytes
.../testdata/v16-repo/blocks/_README | Bin 0 -> 1123 bytes
.../testdata/v16-repo/blocks/diskUsage.cache | Bin 0 -> 47 bytes
test/cli/migrations/testdata/v16-repo/config | Bin 0 -> 3581 bytes
.../testdata/v16-repo/datastore/000001.log | Bin 0 -> 1299 bytes
.../testdata/v16-repo/datastore/CURRENT | Bin 0 -> 16 bytes
.../testdata/v16-repo/datastore/LOCK | Bin
.../testdata/v16-repo/datastore/LOG | Bin 0 -> 438 bytes
.../v16-repo/datastore/MANIFEST-000000 | Bin 0 -> 54 bytes
.../testdata/v16-repo/datastore_spec | Bin 0 -> 190 bytes
test/cli/migrations/testdata/v16-repo/version | Bin 0 -> 3 bytes
test/cli/name_test.go | 2 +-
test/cli/telemetry_test.go | 125 +++
test/sharness/t0066-migration.sh | 47 +-
test/sharness/t0120-bootstrap.sh | 30 +-
test/sharness/t0181-private-network.sh | 26 +-
version.go | 7 +-
99 files changed, 9886 insertions(+), 415 deletions(-)
create mode 100644 config/autoconf.go
create mode 100644 config/autoconf_client.go
create mode 100644 config/autoconf_test.go
create mode 100644 repo/fsrepo/migrations/README.md
create mode 100644 repo/fsrepo/migrations/atomicfile/atomicfile.go
create mode 100644 repo/fsrepo/migrations/embedded.go
create mode 100644 repo/fsrepo/migrations/embedded_test.go
create mode 100644 repo/fsrepo/migrations/fs-repo-16-to-17/main.go
create mode 100644 repo/fsrepo/migrations/fs-repo-16-to-17/migration/migration.go
create mode 100644 repo/fsrepo/migrations/fs-repo-16-to-17/migration/migration_test.go
create mode 100644 test/cli/autoconf/autoconf_test.go
create mode 100644 test/cli/autoconf/dns_test.go
create mode 100644 test/cli/autoconf/expand_comprehensive_test.go
create mode 100644 test/cli/autoconf/expand_fallback_test.go
create mode 100644 test/cli/autoconf/expand_test.go
create mode 100644 test/cli/autoconf/extensibility_test.go
create mode 100644 test/cli/autoconf/fuzz_test.go
create mode 100644 test/cli/autoconf/ipns_test.go
create mode 100644 test/cli/autoconf/routing_test.go
create mode 100644 test/cli/autoconf/swarm_connect_test.go
create mode 100644 test/cli/autoconf/testdata/autoconf_amino_and_ipni.json
create mode 100644 test/cli/autoconf/testdata/autoconf_new_routing_system.json
create mode 100644 test/cli/autoconf/testdata/autoconf_new_routing_with_filtering.json
create mode 100644 test/cli/autoconf/testdata/autoconf_with_unsupported_paths.json
create mode 100644 test/cli/autoconf/testdata/updated_autoconf.json
create mode 100644 test/cli/autoconf/testdata/valid_autoconf.json
create mode 100644 test/cli/autoconf/validation_test.go
create mode 100644 test/cli/bootstrap_auto_test.go
create mode 100644 test/cli/migrations/migration_16_to_17_test.go
create mode 100644 test/cli/migrations/migration_legacy_15_to_17_test.go
create mode 100644 test/cli/migrations/testdata/v15-repo/blocks/SHARDING
create mode 100644 test/cli/migrations/testdata/v15-repo/blocks/X3/CIQFTFEEHEDF6KLBT32BFAGLXEZL4UWFNWM4LFTLMXQBCERZ6CMLX3Y.data
create mode 100644 test/cli/migrations/testdata/v15-repo/blocks/_README
create mode 100644 test/cli/migrations/testdata/v15-repo/blocks/diskUsage.cache
create mode 100644 test/cli/migrations/testdata/v15-repo/config
create mode 100644 test/cli/migrations/testdata/v15-repo/datastore/000001.log
create mode 100644 test/cli/migrations/testdata/v15-repo/datastore/CURRENT
create mode 100644 test/cli/migrations/testdata/v15-repo/datastore/LOCK
create mode 100644 test/cli/migrations/testdata/v15-repo/datastore/LOG
create mode 100644 test/cli/migrations/testdata/v15-repo/datastore/MANIFEST-000000
create mode 100644 test/cli/migrations/testdata/v15-repo/datastore_spec
create mode 100644 test/cli/migrations/testdata/v15-repo/version
create mode 100644 test/cli/migrations/testdata/v16-repo/blocks/SHARDING
create mode 100644 test/cli/migrations/testdata/v16-repo/blocks/X3/CIQFTFEEHEDF6KLBT32BFAGLXEZL4UWFNWM4LFTLMXQBCERZ6CMLX3Y.data
create mode 100644 test/cli/migrations/testdata/v16-repo/blocks/_README
create mode 100644 test/cli/migrations/testdata/v16-repo/blocks/diskUsage.cache
create mode 100644 test/cli/migrations/testdata/v16-repo/config
create mode 100644 test/cli/migrations/testdata/v16-repo/datastore/000001.log
create mode 100644 test/cli/migrations/testdata/v16-repo/datastore/CURRENT
create mode 100644 test/cli/migrations/testdata/v16-repo/datastore/LOCK
create mode 100644 test/cli/migrations/testdata/v16-repo/datastore/LOG
create mode 100644 test/cli/migrations/testdata/v16-repo/datastore/MANIFEST-000000
create mode 100644 test/cli/migrations/testdata/v16-repo/datastore_spec
create mode 100644 test/cli/migrations/testdata/v16-repo/version
diff --git a/.gitattributes b/.gitattributes
index 831606f19..280c95af2 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -15,3 +15,23 @@ LICENSE text eol=auto
# Binary assets
assets/init-doc/* binary
core/coreunix/test_data/** binary
+test/cli/migrations/testdata/** binary
+
+# Generated test data
+test/cli/migrations/testdata/** linguist-generated=true
+test/cli/autoconf/testdata/** linguist-generated=true
+test/cli/fixtures/** linguist-generated=true
+test/sharness/t0054-dag-car-import-export-data/** linguist-generated=true
+test/sharness/t0109-gateway-web-_redirects-data/** linguist-generated=true
+test/sharness/t0114-gateway-subdomains/** linguist-generated=true
+test/sharness/t0115-gateway-dir-listing/** linguist-generated=true
+test/sharness/t0116-gateway-cache/** linguist-generated=true
+test/sharness/t0119-prometheus-data/** linguist-generated=true
+test/sharness/t0165-keystore-data/** linguist-generated=true
+test/sharness/t0275-cid-security-data/** linguist-generated=true
+test/sharness/t0280-plugin-dag-jose-data/** linguist-generated=true
+test/sharness/t0280-plugin-data/** linguist-generated=true
+test/sharness/t0280-plugin-git-data/** linguist-generated=true
+test/sharness/t0400-api-no-gateway/** linguist-generated=true
+test/sharness/t0701-delegated-routing-reframe/** linguist-generated=true
+test/sharness/t0702-delegated-routing-http/** linguist-generated=true
diff --git a/cmd/ipfs/kubo/daemon.go b/cmd/ipfs/kubo/daemon.go
index eb8b23a97..916735840 100644
--- a/cmd/ipfs/kubo/daemon.go
+++ b/cmd/ipfs/kubo/daemon.go
@@ -34,7 +34,6 @@ import (
nodeMount "github.com/ipfs/kubo/fuse/node"
fsrepo "github.com/ipfs/kubo/repo/fsrepo"
"github.com/ipfs/kubo/repo/fsrepo/migrations"
- "github.com/ipfs/kubo/repo/fsrepo/migrations/ipfsfetcher"
p2pcrypto "github.com/libp2p/go-libp2p/core/crypto"
pnet "github.com/libp2p/go-libp2p/core/pnet"
"github.com/libp2p/go-libp2p/core/protocol"
@@ -65,6 +64,7 @@ const (
routingOptionDHTServerKwd = "dhtserver"
routingOptionNoneKwd = "none"
routingOptionCustomKwd = "custom"
+ routingOptionDelegatedKwd = "delegated"
routingOptionDefaultKwd = "default"
routingOptionAutoKwd = "auto"
routingOptionAutoClientKwd = "autoclient"
@@ -275,7 +275,7 @@ func daemonFunc(req *cmds.Request, re cmds.ResponseEmitter, env cmds.Environment
}
var cacheMigrations, pinMigrations bool
- var fetcher migrations.Fetcher
+ var externalMigrationFetcher migrations.Fetcher
// acquire the repo lock _before_ constructing a node. we need to make
// sure we are permitted to access the resources (datastore, etc.)
@@ -285,74 +285,39 @@ func daemonFunc(req *cmds.Request, re cmds.ResponseEmitter, env cmds.Environment
return err
case fsrepo.ErrNeedMigration:
domigrate, found := req.Options[migrateKwd].(bool)
- fmt.Println("Found outdated fs-repo, migrations need to be run.")
+
+ // Get current repo version for more informative message
+ currentVersion, verErr := migrations.RepoVersion(cctx.ConfigRoot)
+ if verErr != nil {
+ // Fallback to generic message if we can't read version
+ fmt.Printf("Kubo repository at %s requires migration.\n", cctx.ConfigRoot)
+ } else {
+ fmt.Printf("Kubo repository at %s has version %d and needs to be migrated to version %d.\n",
+ cctx.ConfigRoot, currentVersion, version.RepoVersion)
+ }
if !found {
domigrate = YesNoPrompt("Run migrations now? [y/N]")
}
if !domigrate {
- fmt.Println("Not running migrations of fs-repo now.")
- fmt.Println("Please get fs-repo-migrations from https://dist.ipfs.tech")
+ fmt.Printf("Not running migrations on repository at %s. Re-run daemon with --migrate or see 'ipfs repo migrate --help'\n", cctx.ConfigRoot)
return errors.New("fs-repo requires migration")
}
- // Read Migration section of IPFS config
- configFileOpt, _ := req.Options[commands.ConfigFileOption].(string)
- migrationCfg, err := migrations.ReadMigrationConfig(cctx.ConfigRoot, configFileOpt)
+ // Use hybrid migration strategy that intelligently combines external and embedded migrations
+ err = migrations.RunHybridMigrations(cctx.Context(), version.RepoVersion, cctx.ConfigRoot, false)
if err != nil {
- return err
- }
-
- // Define function to create IPFS fetcher. Do not supply an
- // already-constructed IPFS fetcher, because this may be expensive and
- // not needed according to migration config. Instead, supply a function
- // to construct the particular IPFS fetcher implementation used here,
- // which is called only if an IPFS fetcher is needed.
- newIpfsFetcher := func(distPath string) migrations.Fetcher {
- return ipfsfetcher.NewIpfsFetcher(distPath, 0, &cctx.ConfigRoot, configFileOpt)
- }
-
- // Fetch migrations from current distribution, or location from environ
- fetchDistPath := migrations.GetDistPathEnv(migrations.CurrentIpfsDist)
-
- // Create fetchers according to migrationCfg.DownloadSources
- fetcher, err = migrations.GetMigrationFetcher(migrationCfg.DownloadSources, fetchDistPath, newIpfsFetcher)
- if err != nil {
- return err
- }
- defer fetcher.Close()
-
- if migrationCfg.Keep == "cache" {
- cacheMigrations = true
- } else if migrationCfg.Keep == "pin" {
- pinMigrations = true
- }
-
- if cacheMigrations || pinMigrations {
- // Create temp directory to store downloaded migration archives
- migrations.DownloadDirectory, err = os.MkdirTemp("", "migrations")
- if err != nil {
- return err
- }
- // Defer cleanup of download directory so that it gets cleaned up
- // if daemon returns early due to error
- defer func() {
- if migrations.DownloadDirectory != "" {
- os.RemoveAll(migrations.DownloadDirectory)
- }
- }()
- }
-
- err = migrations.RunMigration(cctx.Context(), fetcher, fsrepo.RepoVersion, "", false)
- if err != nil {
- fmt.Println("The migrations of fs-repo failed:")
+ fmt.Println("Repository migration failed:")
fmt.Printf(" %s\n", err)
fmt.Println("If you think this is a bug, please file an issue and include this whole log output.")
- fmt.Println(" https://github.com/ipfs/fs-repo-migrations")
+ fmt.Println(" https://github.com/ipfs/kubo")
return err
}
+ // Note: Migration caching/pinning functionality has been deprecated
+ // The hybrid migration system handles legacy migrations more efficiently
+
repo, err = fsrepo.Open(cctx.ConfigRoot)
if err != nil {
return err
@@ -379,6 +344,27 @@ func daemonFunc(req *cmds.Request, re cmds.ResponseEmitter, env cmds.Environment
return err
}
+ // Validate autoconf setup - check for private network conflict
+ swarmKey, _ := repo.SwarmKey()
+ isPrivateNetwork := swarmKey != nil || pnet.ForcePrivateNetwork
+ if err := config.ValidateAutoConfWithRepo(cfg, isPrivateNetwork); err != nil {
+ return err
+ }
+
+ // Start background AutoConf updater if enabled
+ if cfg.AutoConf.Enabled.WithDefault(config.DefaultAutoConfEnabled) {
+ // Start autoconf client for background updates
+ client, err := config.GetAutoConfClient(cfg)
+ if err != nil {
+ log.Errorf("failed to create autoconf client: %v", err)
+ } else {
+ // Start primes cache and starts background updater
+ if _, err := client.Start(cctx.Context()); err != nil {
+ log.Errorf("failed to start autoconf updater: %v", err)
+ }
+ }
+ }
+
fmt.Printf("PeerID: %s\n", cfg.Identity.PeerID)
if !psSet {
@@ -402,8 +388,8 @@ func daemonFunc(req *cmds.Request, re cmds.ResponseEmitter, env cmds.Environment
}
routingOption, _ := req.Options[routingOptionKwd].(string)
- if routingOption == routingOptionDefaultKwd {
- routingOption = cfg.Routing.Type.WithDefault(routingOptionAutoKwd)
+ if routingOption == routingOptionDefaultKwd || routingOption == "" {
+ routingOption = cfg.Routing.Type.WithDefault(config.DefaultRoutingType)
if routingOption == "" {
routingOption = routingOptionAutoKwd
}
@@ -433,6 +419,8 @@ func daemonFunc(req *cmds.Request, re cmds.ResponseEmitter, env cmds.Environment
}
}
+ // Use config for routing construction
+
switch routingOption {
case routingOptionSupernodeKwd:
return errors.New("supernode routing was never fully implemented and has been removed")
@@ -448,6 +436,8 @@ func daemonFunc(req *cmds.Request, re cmds.ResponseEmitter, env cmds.Environment
ncfg.Routing = libp2p.DHTServerOption
case routingOptionNoneKwd:
ncfg.Routing = libp2p.NilRouterOption
+ case routingOptionDelegatedKwd:
+ ncfg.Routing = libp2p.ConstructDelegatedOnlyRouting(cfg)
case routingOptionCustomKwd:
if cfg.Routing.AcceleratedDHTClient.WithDefault(config.DefaultAcceleratedDHTClient) {
return errors.New("Routing.AcceleratedDHTClient option is set even tho Routing.Type is custom, using custom .AcceleratedDHTClient needs to be set on DHT routers individually")
@@ -494,6 +484,15 @@ func daemonFunc(req *cmds.Request, re cmds.ResponseEmitter, env cmds.Environment
cfg.Experimental.StrategicProviding = false
cfg.Provider.Enabled = config.False
}
+ if routingOption == routingOptionDelegatedKwd {
+ // Delegated routing is read-only mode - content providing must be disabled
+ if cfg.Provider.Enabled.WithDefault(config.DefaultProviderEnabled) {
+ log.Fatal("Routing.Type=delegated does not support content providing. Set Provider.Enabled=false in your config.")
+ }
+ if cfg.Reprovider.Interval.WithDefault(config.DefaultReproviderInterval) != 0 {
+ log.Fatal("Routing.Type=delegated does not support content providing. Set Reprovider.Interval='0' in your config.")
+ }
+ }
printLibp2pPorts(node)
@@ -525,6 +524,9 @@ take effect.
}
}()
+ // Clear any cached offline node and set the online daemon node
+ // This ensures HTTP RPC server uses the online node, not any cached offline node
+ cctx.ClearCachedNode()
cctx.ConstructNode = func() (*core.IpfsNode, error) {
return node, nil
}
@@ -578,9 +580,9 @@ take effect.
return err
}
- // Add any files downloaded by migration.
- if cacheMigrations || pinMigrations {
- err = addMigrations(cctx.Context(), node, fetcher, pinMigrations)
+ // Add any files downloaded by external migrations (embedded migrations don't download files)
+ if externalMigrationFetcher != nil && (cacheMigrations || pinMigrations) {
+ err = addMigrations(cctx.Context(), node, externalMigrationFetcher, pinMigrations)
if err != nil {
fmt.Fprintln(os.Stderr, "Could not add migration to IPFS:", err)
}
@@ -589,10 +591,10 @@ take effect.
os.RemoveAll(migrations.DownloadDirectory)
migrations.DownloadDirectory = ""
}
- if fetcher != nil {
+ if externalMigrationFetcher != nil {
// If there is an error closing the IpfsFetcher, then print error, but
// do not fail because of it.
- err = fetcher.Close()
+ err = externalMigrationFetcher.Close()
if err != nil {
log.Errorf("error closing IPFS fetcher: %s", err)
}
@@ -884,6 +886,12 @@ func printLibp2pPorts(node *core.IpfsNode) {
return
}
+ if node.PeerHost == nil {
+ log.Error("PeerHost is nil - this should not happen and likely indicates an FX dependency injection issue or race condition")
+ fmt.Println("Swarm not properly initialized - node PeerHost is nil.")
+ return
+ }
+
ifaceAddrs, err := node.PeerHost.Network().InterfaceListenAddresses()
if err != nil {
log.Errorf("failed to read listening addresses: %s", err)
@@ -1065,6 +1073,10 @@ func serveTrustlessGatewayOverLibp2p(cctx *oldcmds.Context) (<-chan error, error
return nil, err
}
+ if node.PeerHost == nil {
+ return nil, fmt.Errorf("cannot create libp2p gateway: node PeerHost is nil (this should not happen and likely indicates an FX dependency injection issue or race condition)")
+ }
+
h := p2phttp.Host{
StreamHost: node.PeerHost,
}
diff --git a/commands/context.go b/commands/context.go
index ca425acbf..c8893ae17 100644
--- a/commands/context.go
+++ b/commands/context.go
@@ -53,6 +53,23 @@ func (c *Context) GetNode() (*core.IpfsNode, error) {
return c.node, err
}
+// ClearCachedNode clears any cached node, forcing GetNode to construct a new one.
+//
+// This method is critical for mitigating racy FX dependency injection behavior
+// that can occur during daemon startup. The daemon may create multiple IpfsNode
+// instances during initialization - first an offline node during early init, then
+// the proper online daemon node. Without clearing the cache, HTTP RPC handlers may
+// end up using the first (offline) cached node instead of the intended online daemon node.
+//
+// This behavior was likely present forever in go-ipfs, but recent changes made it more
+// prominent and forced us to proactively mitigate FX shortcomings. The daemon calls
+// this method immediately before setting its ConstructNode function to ensure that
+// subsequent GetNode() calls use the correct online daemon node rather than any
+// stale cached offline node from initialization.
+func (c *Context) ClearCachedNode() {
+ c.node = nil
+}
+
// GetAPI returns CoreAPI instance backed by ipfs node.
// It may construct the node with the provided function.
func (c *Context) GetAPI() (coreiface.CoreAPI, error) {
diff --git a/config/autoconf.go b/config/autoconf.go
new file mode 100644
index 000000000..2f1d41b26
--- /dev/null
+++ b/config/autoconf.go
@@ -0,0 +1,319 @@
+package config
+
+import (
+ "maps"
+ "math/rand"
+ "strings"
+
+ "github.com/ipfs/boxo/autoconf"
+ logging "github.com/ipfs/go-log/v2"
+ peer "github.com/libp2p/go-libp2p/core/peer"
+)
+
+var log = logging.Logger("config")
+
+// AutoConf contains the configuration for the autoconf subsystem
+type AutoConf struct {
+ // URL is the HTTP(S) URL to fetch the autoconf.json from
+ // Default: see boxo/autoconf.MainnetAutoConfURL
+ URL *OptionalString `json:",omitempty"`
+
+ // Enabled determines whether to use autoconf
+ // Default: true
+ Enabled Flag `json:",omitempty"`
+
+ // RefreshInterval is how often to refresh autoconf data
+ // Default: 24h
+ RefreshInterval *OptionalDuration `json:",omitempty"`
+
+ // TLSInsecureSkipVerify allows skipping TLS verification (for testing only)
+ // Default: false
+ TLSInsecureSkipVerify Flag `json:",omitempty"`
+}
+
+const (
+ // AutoPlaceholder is the string used as a placeholder for autoconf values
+ AutoPlaceholder = "auto"
+
+ // DefaultAutoConfEnabled is the default value for AutoConf.Enabled
+ DefaultAutoConfEnabled = true
+
+ // DefaultAutoConfURL is the default URL for fetching autoconf
+ DefaultAutoConfURL = autoconf.MainnetAutoConfURL
+
+ // DefaultAutoConfRefreshInterval is the default interval for refreshing autoconf data
+ DefaultAutoConfRefreshInterval = autoconf.DefaultRefreshInterval
+
+ // AutoConf client configuration constants
+ DefaultAutoConfCacheSize = autoconf.DefaultCacheSize
+ DefaultAutoConfTimeout = autoconf.DefaultTimeout
+)
+
+// getNativeSystems returns the list of systems that should be used natively based on routing type
+func getNativeSystems(routingType string) []string {
+ switch routingType {
+ case "dht", "dhtclient", "dhtserver":
+ return []string{autoconf.SystemAminoDHT} // Only native DHT
+ case "auto", "autoclient":
+ return []string{autoconf.SystemAminoDHT} // Native DHT, delegated others
+ case "delegated":
+ return []string{} // Everything delegated
+ case "none":
+ return []string{} // No native systems
+ default:
+ return []string{} // Custom mode
+ }
+}
+
+// selectRandomResolver picks a random resolver from a list for load balancing
+func selectRandomResolver(resolvers []string) string {
+ if len(resolvers) == 0 {
+ return ""
+ }
+ return resolvers[rand.Intn(len(resolvers))]
+}
+
+// DNSResolversWithAutoConf returns DNS resolvers with "auto" values replaced by autoconf values
+func (c *Config) DNSResolversWithAutoConf() map[string]string {
+ if c.DNS.Resolvers == nil {
+ return nil
+ }
+
+ resolved := make(map[string]string)
+ autoConf := c.getAutoConf()
+ autoExpanded := 0
+
+ // Process each configured resolver
+ for domain, resolver := range c.DNS.Resolvers {
+ if resolver == AutoPlaceholder {
+ // Try to resolve from autoconf
+ if autoConf != nil && autoConf.DNSResolvers != nil {
+ if resolvers, exists := autoConf.DNSResolvers[domain]; exists && len(resolvers) > 0 {
+ resolved[domain] = selectRandomResolver(resolvers)
+ autoExpanded++
+ }
+ }
+ // If autoConf is disabled or domain not found, skip this "auto" resolver
+ } else {
+ // Keep custom resolver as-is
+ resolved[domain] = resolver
+ }
+ }
+
+ // Add default resolvers from autoconf that aren't already configured
+ if autoConf != nil && autoConf.DNSResolvers != nil {
+ for domain, resolvers := range autoConf.DNSResolvers {
+ if _, exists := resolved[domain]; !exists && len(resolvers) > 0 {
+ resolved[domain] = selectRandomResolver(resolvers)
+ }
+ }
+ }
+
+ // Log expansion statistics
+ if autoExpanded > 0 {
+ log.Debugf("expanded %d 'auto' DNS.Resolvers from autoconf", autoExpanded)
+ }
+
+ return resolved
+}
+
+// expandAutoConfSlice is a generic helper for expanding "auto" placeholders in string slices
+// It handles the common pattern of: iterate through slice, expand "auto" once, keep custom values
+func expandAutoConfSlice(sourceSlice []string, autoConfData []string) []string {
+ var resolved []string
+ autoExpanded := false
+
+ for _, item := range sourceSlice {
+ if item == AutoPlaceholder {
+ // Replace with autoconf data (only once)
+ if autoConfData != nil && !autoExpanded {
+ resolved = append(resolved, autoConfData...)
+ autoExpanded = true
+ }
+ // If autoConfData is nil or already expanded, skip redundant "auto" entries silently
+ } else {
+ // Keep custom item
+ resolved = append(resolved, item)
+ }
+ }
+
+ return resolved
+}
+
+// BootstrapWithAutoConf returns bootstrap config with "auto" values replaced by autoconf values
+func (c *Config) BootstrapWithAutoConf() []string {
+ autoConf := c.getAutoConf()
+ var autoConfData []string
+
+ if autoConf != nil {
+ routingType := c.Routing.Type.WithDefault(DefaultRoutingType)
+ nativeSystems := getNativeSystems(routingType)
+ autoConfData = autoConf.GetBootstrapPeers(nativeSystems...)
+ log.Debugf("BootstrapWithAutoConf: processing with routing type: %s", routingType)
+ } else {
+ log.Debugf("BootstrapWithAutoConf: autoConf disabled, using original config")
+ }
+
+ result := expandAutoConfSlice(c.Bootstrap, autoConfData)
+ log.Debugf("BootstrapWithAutoConf: final result contains %d peers", len(result))
+ return result
+}
+
+// getAutoConf is a helper to get autoconf data with fallbacks
+func (c *Config) getAutoConf() *autoconf.Config {
+ if !c.AutoConf.Enabled.WithDefault(DefaultAutoConfEnabled) {
+ log.Debugf("getAutoConf: AutoConf disabled, returning nil")
+ return nil
+ }
+
+ // Create or get cached client with config
+ client, err := GetAutoConfClient(c)
+ if err != nil {
+ log.Debugf("getAutoConf: client creation failed - %v", err)
+ return nil
+ }
+
+ // Use GetCached to avoid network I/O during config operations
+ // This ensures config retrieval doesn't block on network operations
+ result := client.GetCached()
+
+ log.Debugf("getAutoConf: returning autoconf data")
+ return result
+}
+
+// BootstrapPeersWithAutoConf returns bootstrap peers with "auto" values replaced by autoconf values
+// and parsed into peer.AddrInfo structures
+func (c *Config) BootstrapPeersWithAutoConf() ([]peer.AddrInfo, error) {
+ bootstrapStrings := c.BootstrapWithAutoConf()
+ return ParseBootstrapPeers(bootstrapStrings)
+}
+
+// DelegatedRoutersWithAutoConf returns delegated router URLs without trailing slashes
+func (c *Config) DelegatedRoutersWithAutoConf() []string {
+ autoConf := c.getAutoConf()
+
+ // Use autoconf to expand the endpoints with supported paths for read operations
+ routingType := c.Routing.Type.WithDefault(DefaultRoutingType)
+ nativeSystems := getNativeSystems(routingType)
+ return autoconf.ExpandDelegatedEndpoints(
+ c.Routing.DelegatedRouters,
+ autoConf,
+ nativeSystems,
+ // Kubo supports all read paths
+ autoconf.RoutingV1ProvidersPath,
+ autoconf.RoutingV1PeersPath,
+ autoconf.RoutingV1IPNSPath,
+ )
+}
+
+// DelegatedPublishersWithAutoConf returns delegated publisher URLs without trailing slashes
+func (c *Config) DelegatedPublishersWithAutoConf() []string {
+ autoConf := c.getAutoConf()
+
+ // Use autoconf to expand the endpoints with IPNS write path
+ routingType := c.Routing.Type.WithDefault(DefaultRoutingType)
+ nativeSystems := getNativeSystems(routingType)
+ return autoconf.ExpandDelegatedEndpoints(
+ c.Ipns.DelegatedPublishers,
+ autoConf,
+ nativeSystems,
+ autoconf.RoutingV1IPNSPath, // Only IPNS operations (for write)
+ )
+}
+
+// expandConfigField expands a specific config field with autoconf values
+// Handles both top-level fields ("Bootstrap") and nested fields ("DNS.Resolvers")
+func (c *Config) expandConfigField(expandedCfg map[string]any, fieldPath string) {
+ // Check if this field supports autoconf expansion
+ expandFunc, supported := supportedAutoConfFields[fieldPath]
+ if !supported {
+ return
+ }
+
+ // Handle top-level fields (no dot in path)
+ if !strings.Contains(fieldPath, ".") {
+ if _, exists := expandedCfg[fieldPath]; exists {
+ expandedCfg[fieldPath] = expandFunc(c)
+ }
+ return
+ }
+
+ // Handle nested fields (section.field format)
+ parts := strings.SplitN(fieldPath, ".", 2)
+ if len(parts) != 2 {
+ return
+ }
+
+ sectionName, fieldName := parts[0], parts[1]
+ if section, exists := expandedCfg[sectionName]; exists {
+ if sectionMap, ok := section.(map[string]any); ok {
+ if _, exists := sectionMap[fieldName]; exists {
+ sectionMap[fieldName] = expandFunc(c)
+ expandedCfg[sectionName] = sectionMap
+ }
+ }
+ }
+}
+
+// ExpandAutoConfValues expands "auto" placeholders in config with their actual values using the same methods as the daemon
+func (c *Config) ExpandAutoConfValues(cfg map[string]any) (map[string]any, error) {
+ // Create a deep copy of the config map to avoid modifying the original
+ expandedCfg := maps.Clone(cfg)
+
+ // Use the same expansion methods that the daemon uses - ensures runtime consistency
+ // Unified expansion for all supported autoconf fields
+ c.expandConfigField(expandedCfg, "Bootstrap")
+ c.expandConfigField(expandedCfg, "DNS.Resolvers")
+ c.expandConfigField(expandedCfg, "Routing.DelegatedRouters")
+ c.expandConfigField(expandedCfg, "Ipns.DelegatedPublishers")
+
+ return expandedCfg, nil
+}
+
+// supportedAutoConfFields maps field keys to their expansion functions
+var supportedAutoConfFields = map[string]func(*Config) any{
+ "Bootstrap": func(c *Config) any {
+ expanded := c.BootstrapWithAutoConf()
+ return stringSliceToInterfaceSlice(expanded)
+ },
+ "DNS.Resolvers": func(c *Config) any {
+ expanded := c.DNSResolversWithAutoConf()
+ return stringMapToInterfaceMap(expanded)
+ },
+ "Routing.DelegatedRouters": func(c *Config) any {
+ expanded := c.DelegatedRoutersWithAutoConf()
+ return stringSliceToInterfaceSlice(expanded)
+ },
+ "Ipns.DelegatedPublishers": func(c *Config) any {
+ expanded := c.DelegatedPublishersWithAutoConf()
+ return stringSliceToInterfaceSlice(expanded)
+ },
+}
+
+// ExpandConfigField expands auto values for a specific config field using the same methods as the daemon
+func (c *Config) ExpandConfigField(key string, value any) any {
+ if expandFunc, supported := supportedAutoConfFields[key]; supported {
+ return expandFunc(c)
+ }
+
+ // Return original value if no expansion needed (not a field that supports auto values)
+ return value
+}
+
+// Helper functions for type conversion between string types and any types for JSON compatibility
+
+func stringSliceToInterfaceSlice(slice []string) []any {
+ result := make([]any, len(slice))
+ for i, v := range slice {
+ result[i] = v
+ }
+ return result
+}
+
+func stringMapToInterfaceMap(m map[string]string) map[string]any {
+ result := make(map[string]any)
+ for k, v := range m {
+ result[k] = v
+ }
+ return result
+}
diff --git a/config/autoconf_client.go b/config/autoconf_client.go
new file mode 100644
index 000000000..1775fc445
--- /dev/null
+++ b/config/autoconf_client.go
@@ -0,0 +1,136 @@
+package config
+
+import (
+ "fmt"
+ "path/filepath"
+ "sync"
+
+ "github.com/ipfs/boxo/autoconf"
+ logging "github.com/ipfs/go-log/v2"
+ version "github.com/ipfs/kubo"
+)
+
+var autoconfLog = logging.Logger("autoconf")
+
+// Singleton state for autoconf client
+var (
+ clientOnce sync.Once
+ clientCache *autoconf.Client
+ clientErr error
+)
+
+// GetAutoConfClient returns a cached autoconf client or creates a new one.
+// This is thread-safe and uses a singleton pattern.
+func GetAutoConfClient(cfg *Config) (*autoconf.Client, error) {
+ clientOnce.Do(func() {
+ clientCache, clientErr = newAutoConfClient(cfg)
+ })
+ return clientCache, clientErr
+}
+
+// newAutoConfClient creates a new autoconf client with the given config
+func newAutoConfClient(cfg *Config) (*autoconf.Client, error) {
+ // Get repo path for cache directory
+ repoPath, err := PathRoot()
+ if err != nil {
+ return nil, fmt.Errorf("failed to get repo path: %w", err)
+ }
+
+ // Prepare refresh interval with nil check
+ refreshInterval := cfg.AutoConf.RefreshInterval
+ if refreshInterval == nil {
+ refreshInterval = &OptionalDuration{}
+ }
+
+ // Use default URL if not specified
+ url := cfg.AutoConf.URL.WithDefault(DefaultAutoConfURL)
+
+ // Build client options
+ options := []autoconf.Option{
+ autoconf.WithCacheDir(filepath.Join(repoPath, "autoconf")),
+ autoconf.WithUserAgent(version.GetUserAgentVersion()),
+ autoconf.WithCacheSize(DefaultAutoConfCacheSize),
+ autoconf.WithTimeout(DefaultAutoConfTimeout),
+ autoconf.WithRefreshInterval(refreshInterval.WithDefault(DefaultAutoConfRefreshInterval)),
+ autoconf.WithFallback(autoconf.GetMainnetFallbackConfig),
+ autoconf.WithURL(url),
+ }
+
+ return autoconf.NewClient(options...)
+}
+
+// ValidateAutoConfWithRepo validates that autoconf setup is correct at daemon startup with repo access
+func ValidateAutoConfWithRepo(cfg *Config, swarmKeyExists bool) error {
+ if !cfg.AutoConf.Enabled.WithDefault(DefaultAutoConfEnabled) {
+ // AutoConf is disabled, check for "auto" values and warn
+ return validateAutoConfDisabled(cfg)
+ }
+
+ // Check for private network with default mainnet URL
+ url := cfg.AutoConf.URL.WithDefault(DefaultAutoConfURL)
+ if swarmKeyExists && url == DefaultAutoConfURL {
+ return fmt.Errorf("AutoConf cannot use the default mainnet URL (%s) on a private network (swarm.key or LIBP2P_FORCE_PNET detected). Either disable AutoConf by setting AutoConf.Enabled=false, or configure AutoConf.URL to point to a configuration service specific to your private swarm", DefaultAutoConfURL)
+ }
+
+ // Further validation will happen lazily when config is accessed
+ return nil
+}
+
+// validateAutoConfDisabled checks for "auto" values when AutoConf is disabled and logs errors
+func validateAutoConfDisabled(cfg *Config) error {
+ hasAutoValues := false
+ var errors []string
+
+ // Check Bootstrap
+ for _, peer := range cfg.Bootstrap {
+ if peer == AutoPlaceholder {
+ hasAutoValues = true
+ errors = append(errors, "Bootstrap contains 'auto' but AutoConf.Enabled=false")
+ break
+ }
+ }
+
+ // Check DNS.Resolvers
+ if cfg.DNS.Resolvers != nil {
+ for _, resolver := range cfg.DNS.Resolvers {
+ if resolver == AutoPlaceholder {
+ hasAutoValues = true
+ errors = append(errors, "DNS.Resolvers contains 'auto' but AutoConf.Enabled=false")
+ break
+ }
+ }
+ }
+
+ // Check Routing.DelegatedRouters
+ for _, router := range cfg.Routing.DelegatedRouters {
+ if router == AutoPlaceholder {
+ hasAutoValues = true
+ errors = append(errors, "Routing.DelegatedRouters contains 'auto' but AutoConf.Enabled=false")
+ break
+ }
+ }
+
+ // Check Ipns.DelegatedPublishers
+ for _, publisher := range cfg.Ipns.DelegatedPublishers {
+ if publisher == AutoPlaceholder {
+ hasAutoValues = true
+ errors = append(errors, "Ipns.DelegatedPublishers contains 'auto' but AutoConf.Enabled=false")
+ break
+ }
+ }
+
+ // Log all errors
+ for _, errMsg := range errors {
+ autoconfLog.Error(errMsg)
+ }
+
+ // If only auto values exist and no static ones, fail to start
+ if hasAutoValues {
+ if len(cfg.Bootstrap) == 1 && cfg.Bootstrap[0] == AutoPlaceholder {
+ autoconfLog.Error("Kubo cannot start with only 'auto' Bootstrap values when AutoConf.Enabled=false")
+ return fmt.Errorf("no usable bootstrap peers: AutoConf is disabled (AutoConf.Enabled=false) but 'auto' placeholder is used in Bootstrap config. Either set AutoConf.Enabled=true to enable automatic configuration, or replace 'auto' with specific Bootstrap peer addresses")
+ }
+ }
+
+ return nil
+}
diff --git a/config/autoconf_test.go b/config/autoconf_test.go
new file mode 100644
index 000000000..f4d447dc5
--- /dev/null
+++ b/config/autoconf_test.go
@@ -0,0 +1,92 @@
+package config
+
+import (
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+)
+
+func TestAutoConfDefaults(t *testing.T) {
+ // Test that AutoConf has the correct default values
+ cfg := &Config{
+ AutoConf: AutoConf{
+ URL: NewOptionalString(DefaultAutoConfURL),
+ Enabled: True,
+ },
+ }
+
+ assert.Equal(t, DefaultAutoConfURL, cfg.AutoConf.URL.WithDefault(DefaultAutoConfURL))
+ assert.True(t, cfg.AutoConf.Enabled.WithDefault(DefaultAutoConfEnabled))
+
+ // Test default refresh interval
+ if cfg.AutoConf.RefreshInterval == nil {
+ // This is expected - nil means use default
+ duration := (*OptionalDuration)(nil).WithDefault(DefaultAutoConfRefreshInterval)
+ assert.Equal(t, DefaultAutoConfRefreshInterval, duration)
+ }
+}
+
+func TestAutoConfProfile(t *testing.T) {
+ cfg := &Config{
+ Bootstrap: []string{"some", "existing", "peers"},
+ DNS: DNS{
+ Resolvers: map[string]string{
+ "eth.": "https://example.com",
+ },
+ },
+ Routing: Routing{
+ DelegatedRouters: []string{"https://existing.router"},
+ },
+ Ipns: Ipns{
+ DelegatedPublishers: []string{"https://existing.publisher"},
+ },
+ AutoConf: AutoConf{
+ Enabled: False,
+ },
+ }
+
+ // Apply autoconf profile
+ profile, ok := Profiles["autoconf-on"]
+ require.True(t, ok, "autoconf-on profile not found")
+
+ err := profile.Transform(cfg)
+ require.NoError(t, err)
+
+ // Check that values were set to "auto"
+ assert.Equal(t, []string{AutoPlaceholder}, cfg.Bootstrap)
+ assert.Equal(t, AutoPlaceholder, cfg.DNS.Resolvers["."])
+ assert.Equal(t, []string{AutoPlaceholder}, cfg.Routing.DelegatedRouters)
+ assert.Equal(t, []string{AutoPlaceholder}, cfg.Ipns.DelegatedPublishers)
+
+ // Check that AutoConf was enabled
+ assert.True(t, cfg.AutoConf.Enabled.WithDefault(DefaultAutoConfEnabled))
+
+ // Check that URL was set
+ assert.Equal(t, DefaultAutoConfURL, cfg.AutoConf.URL.WithDefault(DefaultAutoConfURL))
+}
+
+func TestInitWithAutoValues(t *testing.T) {
+ identity := Identity{
+ PeerID: "QmTest",
+ }
+
+ cfg, err := InitWithIdentity(identity)
+ require.NoError(t, err)
+
+ // Check that Bootstrap is set to "auto"
+ assert.Equal(t, []string{AutoPlaceholder}, cfg.Bootstrap)
+
+ // Check that DNS resolver is set to "auto"
+ assert.Equal(t, AutoPlaceholder, cfg.DNS.Resolvers["."])
+
+ // Check that DelegatedRouters is set to "auto"
+ assert.Equal(t, []string{AutoPlaceholder}, cfg.Routing.DelegatedRouters)
+
+ // Check that DelegatedPublishers is set to "auto"
+ assert.Equal(t, []string{AutoPlaceholder}, cfg.Ipns.DelegatedPublishers)
+
+ // Check that AutoConf is enabled with correct URL
+ assert.True(t, cfg.AutoConf.Enabled.WithDefault(DefaultAutoConfEnabled))
+ assert.Equal(t, DefaultAutoConfURL, cfg.AutoConf.URL.WithDefault(DefaultAutoConfURL))
+}
diff --git a/config/bootstrap_peers.go b/config/bootstrap_peers.go
index 55fe66a98..54670b4c9 100644
--- a/config/bootstrap_peers.go
+++ b/config/bootstrap_peers.go
@@ -2,28 +2,11 @@ package config
import (
"errors"
- "fmt"
peer "github.com/libp2p/go-libp2p/core/peer"
ma "github.com/multiformats/go-multiaddr"
)
-// DefaultBootstrapAddresses are the hardcoded bootstrap addresses
-// for IPFS. they are nodes run by the IPFS team. docs on these later.
-// As with all p2p networks, bootstrap is an important security concern.
-//
-// NOTE: This is here -- and not inside cmd/ipfs/init.go -- because of an
-// import dependency issue. TODO: move this into a config/default/ package.
-var DefaultBootstrapAddresses = []string{
- "/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN",
- "/dnsaddr/bootstrap.libp2p.io/p2p/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa", // rust-libp2p-server
- "/dnsaddr/bootstrap.libp2p.io/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb",
- "/dnsaddr/bootstrap.libp2p.io/p2p/QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt",
- "/dnsaddr/va1.bootstrap.libp2p.io/p2p/12D3KooWKnDdG3iXw9eTFijk3EWSunZcFi54Zka4wmtqtt6rPxc8", // js-libp2p-amino-dht-bootstrapper
- "/ip4/104.131.131.82/tcp/4001/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ", // mars.i.ipfs.io
- "/ip4/104.131.131.82/udp/4001/quic-v1/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ", // mars.i.ipfs.io
-}
-
// ErrInvalidPeerAddr signals an address is not a valid peer address.
var ErrInvalidPeerAddr = errors.New("invalid peer address")
@@ -31,18 +14,6 @@ func (c *Config) BootstrapPeers() ([]peer.AddrInfo, error) {
return ParseBootstrapPeers(c.Bootstrap)
}
-// DefaultBootstrapPeers returns the (parsed) set of default bootstrap peers.
-// if it fails, it returns a meaningful error for the user.
-// This is here (and not inside cmd/ipfs/init) because of module dependency problems.
-func DefaultBootstrapPeers() ([]peer.AddrInfo, error) {
- ps, err := ParseBootstrapPeers(DefaultBootstrapAddresses)
- if err != nil {
- return nil, fmt.Errorf(`failed to parse hardcoded bootstrap peers: %w
-This is a problem with the ipfs codebase. Please report it to the dev team`, err)
- }
- return ps, nil
-}
-
func (c *Config) SetBootstrapPeers(bps []peer.AddrInfo) {
c.Bootstrap = BootstrapPeerStrings(bps)
}
diff --git a/config/bootstrap_peers_test.go b/config/bootstrap_peers_test.go
index 2d2b66045..f07f2f24a 100644
--- a/config/bootstrap_peers_test.go
+++ b/config/bootstrap_peers_test.go
@@ -1,24 +1,28 @@
package config
import (
- "sort"
"testing"
+
+ "github.com/ipfs/boxo/autoconf"
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestBootstrapPeerStrings(t *testing.T) {
- parsed, err := ParseBootstrapPeers(DefaultBootstrapAddresses)
- if err != nil {
- t.Fatal(err)
- }
+ // Test round-trip: string -> parse -> format -> string
+ // This ensures that parsing and formatting are inverse operations
- formatted := BootstrapPeerStrings(parsed)
- sort.Strings(formatted)
- expected := append([]string{}, DefaultBootstrapAddresses...)
- sort.Strings(expected)
+ // Start with the default bootstrap peer multiaddr strings
+ originalStrings := autoconf.FallbackBootstrapPeers
- for i, s := range formatted {
- if expected[i] != s {
- t.Fatalf("expected %s, %s", expected[i], s)
- }
- }
+ // Parse multiaddr strings into structured peer data
+ parsed, err := ParseBootstrapPeers(originalStrings)
+ require.NoError(t, err, "parsing bootstrap peers should succeed")
+
+ // Format the parsed data back into multiaddr strings
+ formattedStrings := BootstrapPeerStrings(parsed)
+
+ // Verify round-trip: we should get back exactly what we started with
+ assert.ElementsMatch(t, originalStrings, formattedStrings,
+ "round-trip through parse/format should preserve all bootstrap peers")
}
diff --git a/config/config.go b/config/config.go
index eee7e768b..3236ad003 100644
--- a/config/config.go
+++ b/config/config.go
@@ -31,7 +31,9 @@ type Config struct {
Pubsub PubsubConfig
Peering Peering
DNS DNS
+
Migration Migration
+ AutoConf AutoConf
Provider Provider
Reprovider Reprovider
diff --git a/config/dns.go b/config/dns.go
index 8e1fc85a5..0b269675f 100644
--- a/config/dns.go
+++ b/config/dns.go
@@ -10,7 +10,7 @@ type DNS struct {
//
// Example:
// - Custom resolver for ENS: `eth.` โ `https://dns.eth.limo/dns-query`
- // - Override the default OS resolver: `.` โ `https://doh.applied-privacy.net/query`
+ // - Override the default OS resolver: `.` โ `https://1.1.1.1/dns-query`
Resolvers map[string]string
// MaxCacheTTL is the maximum duration DNS entries are valid in the cache.
MaxCacheTTL *OptionalDuration `json:",omitempty"`
diff --git a/config/init.go b/config/init.go
index 373d744d4..cc7b22ca8 100644
--- a/config/init.go
+++ b/config/init.go
@@ -23,11 +23,6 @@ func Init(out io.Writer, nBitsForKeypair int) (*Config, error) {
}
func InitWithIdentity(identity Identity) (*Config, error) {
- bootstrapPeers, err := DefaultBootstrapPeers()
- if err != nil {
- return nil, err
- }
-
datastore := DefaultDatastoreConfig()
conf := &Config{
@@ -40,7 +35,7 @@ func InitWithIdentity(identity Identity) (*Config, error) {
Addresses: addressesConfig(),
Datastore: datastore,
- Bootstrap: BootstrapPeerStrings(bootstrapPeers),
+ Bootstrap: []string{AutoPlaceholder},
Identity: identity,
Discovery: Discovery{
MDNS: MDNS{
@@ -56,7 +51,8 @@ func InitWithIdentity(identity Identity) (*Config, error) {
},
Ipns: Ipns{
- ResolveCacheSize: 128,
+ ResolveCacheSize: 128,
+ DelegatedPublishers: []string{AutoPlaceholder},
},
Gateway: Gateway{
@@ -72,11 +68,12 @@ func InitWithIdentity(identity Identity) (*Config, error) {
RemoteServices: map[string]RemotePinningService{},
},
DNS: DNS{
- Resolvers: map[string]string{},
+ Resolvers: map[string]string{
+ ".": AutoPlaceholder,
+ },
},
- Migration: Migration{
- DownloadSources: []string{},
- Keep: "",
+ Routing: Routing{
+ DelegatedRouters: []string{AutoPlaceholder},
},
}
diff --git a/config/ipns.go b/config/ipns.go
index 288421973..6ffe981bc 100644
--- a/config/ipns.go
+++ b/config/ipns.go
@@ -20,4 +20,7 @@ type Ipns struct {
// Enable namesys pubsub (--enable-namesys-pubsub)
UsePubsub Flag `json:",omitempty"`
+
+ // Simplified configuration for delegated IPNS publishers
+ DelegatedPublishers []string
}
diff --git a/config/migration.go b/config/migration.go
index e172988a9..d2626800c 100644
--- a/config/migration.go
+++ b/config/migration.go
@@ -2,16 +2,18 @@ package config
const DefaultMigrationKeep = "cache"
-var DefaultMigrationDownloadSources = []string{"HTTPS", "IPFS"}
+// DefaultMigrationDownloadSources defines the default download sources for legacy migrations (repo versions <16).
+// Only HTTPS is supported for legacy migrations. IPFS downloads are not supported.
+var DefaultMigrationDownloadSources = []string{"HTTPS"}
-// Migration configures how migrations are downloaded and if the downloads are
-// added to IPFS locally.
+// Migration configures how legacy migrations are downloaded (repo versions <16).
+//
+// DEPRECATED: This configuration only applies to legacy external migrations for repository
+// versions below 16. Modern repositories (v16+) use embedded migrations that do not require
+// external downloads. These settings will be ignored for modern repository versions.
type Migration struct {
- // Sources in order of preference, where "IPFS" means use IPFS and "HTTPS"
- // means use default gateways. Any other values are interpreted as
- // hostnames for custom gateways. Empty list means "use default sources".
- DownloadSources []string
- // Whether or not to keep the migration after downloading it.
- // Options are "discard", "cache", "pin". Empty string for default.
- Keep string
+ // DEPRECATED: This field is deprecated and ignored for modern repositories (repo versions โฅ16).
+ DownloadSources []string `json:",omitempty"`
+ // DEPRECATED: This field is deprecated and ignored for modern repositories (repo versions โฅ16).
+ Keep string `json:",omitempty"`
}
diff --git a/config/profile.go b/config/profile.go
index ec2e5a0b7..1479bfc13 100644
--- a/config/profile.go
+++ b/config/profile.go
@@ -87,6 +87,12 @@ is useful when using the daemon in test environments.`,
c.Bootstrap = []string{}
c.Discovery.MDNS.Enabled = false
c.AutoTLS.Enabled = False
+ c.AutoConf.Enabled = False
+
+ // Explicitly set autoconf-controlled fields to empty when autoconf is disabled
+ c.DNS.Resolvers = map[string]string{}
+ c.Routing.DelegatedRouters = []string{}
+ c.Ipns.DelegatedPublishers = []string{}
return nil
},
},
@@ -97,11 +103,10 @@ Inverse profile of the test profile.`,
Transform: func(c *Config) error {
c.Addresses = addressesConfig()
- bootstrapPeers, err := DefaultBootstrapPeers()
- if err != nil {
- return err
- }
- c.Bootstrap = appendSingle(c.Bootstrap, BootstrapPeerStrings(bootstrapPeers))
+ // Use AutoConf system for bootstrap peers
+ c.Bootstrap = []string{AutoPlaceholder}
+ c.AutoConf.Enabled = Default
+ c.AutoConf.URL = nil // Clear URL to use implicit default
c.Swarm.DisableNatPortMap = false
c.Discovery.MDNS.Enabled = true
@@ -349,6 +354,39 @@ fetching may be degraded.
return nil
},
},
+ "autoconf-on": {
+ Description: `Sets configuration to use implicit defaults from remote autoconf service.
+Bootstrap peers, DNS resolvers, delegated routers, and IPNS delegated publishers are set to "auto".
+This profile requires AutoConf to be enabled and configured.`,
+
+ Transform: func(c *Config) error {
+ c.Bootstrap = []string{AutoPlaceholder}
+ c.DNS.Resolvers = map[string]string{
+ ".": AutoPlaceholder,
+ }
+ c.Routing.DelegatedRouters = []string{AutoPlaceholder}
+ c.Ipns.DelegatedPublishers = []string{AutoPlaceholder}
+ c.AutoConf.Enabled = True
+ if c.AutoConf.URL == nil {
+ c.AutoConf.URL = NewOptionalString(DefaultAutoConfURL)
+ }
+ return nil
+ },
+ },
+ "autoconf-off": {
+ Description: `Disables AutoConf and sets networking fields to empty for manual configuration.
+Bootstrap peers, DNS resolvers, delegated routers, and IPNS delegated publishers are set to empty.
+Use this when you want normal networking but prefer manual control over all endpoints.`,
+
+ Transform: func(c *Config) error {
+ c.Bootstrap = nil
+ c.DNS.Resolvers = nil
+ c.Routing.DelegatedRouters = nil
+ c.Ipns.DelegatedPublishers = nil
+ c.AutoConf.Enabled = False
+ return nil
+ },
+ },
}
func getAvailablePort() (port int, err error) {
diff --git a/config/routing.go b/config/routing.go
index aea60c3bd..bd234e8a3 100644
--- a/config/routing.go
+++ b/config/routing.go
@@ -11,6 +11,7 @@ import (
const (
DefaultAcceleratedDHTClient = false
DefaultLoopbackAddressesOnLanDHT = false
+ DefaultRoutingType = "auto"
CidContactRoutingURL = "https://cid.contact"
PublicGoodDelegatedRoutingURL = "https://delegated-ipfs.dev" // cid.contact + amino dht (incl. IPNS PUTs)
EnvHTTPRouters = "IPFS_HTTP_ROUTERS"
@@ -18,11 +19,6 @@ const (
)
var (
- // Default HTTP routers used in parallel to DHT when Routing.Type = "auto"
- DefaultHTTPRouters = getEnvOrDefault(EnvHTTPRouters, []string{
- CidContactRoutingURL, // https://github.com/ipfs/kubo/issues/9422#issuecomment-1338142084
- })
-
// Default filter-protocols to pass along with delegated routing requests (as defined in IPIP-484)
// and also filter out locally
DefaultHTTPRoutersFilterProtocols = getEnvOrDefault(EnvHTTPRoutersFilterProtocols, []string{
@@ -37,8 +33,9 @@ var (
type Routing struct {
// Type sets default daemon routing mode.
//
- // Can be one of "auto", "autoclient", "dht", "dhtclient", "dhtserver", "none", or "custom".
+ // Can be one of "auto", "autoclient", "dht", "dhtclient", "dhtserver", "none", "delegated", or "custom".
// When unset or set to "auto", DHT and implicit routers are used.
+ // When "delegated" is set, only HTTP delegated routers and IPNS publishers are used (no DHT).
// When "custom" is set, user-provided Routing.Routers is used.
Type *OptionalString `json:",omitempty"`
@@ -49,7 +46,7 @@ type Routing struct {
IgnoreProviders []string `json:",omitempty"`
// Simplified configuration used by default when Routing.Type=auto|autoclient
- DelegatedRouters []string `json:",omitempty"`
+ DelegatedRouters []string
// Advanced configuration used when Routing.Type=custom
Routers Routers `json:",omitempty"`
diff --git a/core/commands/bootstrap.go b/core/commands/bootstrap.go
index 6d760f47f..e5a55dfab 100644
--- a/core/commands/bootstrap.go
+++ b/core/commands/bootstrap.go
@@ -41,15 +41,15 @@ Running 'ipfs bootstrap' with no arguments will run 'ipfs bootstrap list'.
},
}
-const (
- defaultOptionName = "default"
-)
-
var bootstrapAddCmd = &cmds.Command{
Helptext: cmds.HelpText{
Tagline: "Add peers to the bootstrap list.",
ShortDescription: `Outputs a list of peers that were added (that weren't already
in the bootstrap list).
+
+The special values 'default' and 'auto' can be used to add the default
+bootstrap peers. Both are equivalent and will add the 'auto' placeholder to
+the bootstrap list, which gets resolved using the AutoConf system.
` + bootstrapSecurityWarning,
},
@@ -57,29 +57,23 @@ in the bootstrap list).
cmds.StringArg("peer", false, true, peerOptionDesc).EnableStdin(),
},
- Options: []cmds.Option{
- cmds.BoolOption(defaultOptionName, "Add default bootstrap nodes. (Deprecated, use 'default' subcommand instead)"),
- },
- Subcommands: map[string]*cmds.Command{
- "default": bootstrapAddDefaultCmd,
- },
-
Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
- deflt, _ := req.Options[defaultOptionName].(bool)
-
- inputPeers := config.DefaultBootstrapAddresses
- if !deflt {
- if err := req.ParseBodyArgs(); err != nil {
- return err
- }
-
- inputPeers = req.Arguments
+ if err := req.ParseBodyArgs(); err != nil {
+ return err
}
+ inputPeers := req.Arguments
if len(inputPeers) == 0 {
return errors.New("no bootstrap peers to add")
}
+ // Convert "default" to "auto" for backward compatibility
+ for i, peer := range inputPeers {
+ if peer == "default" {
+ inputPeers[i] = "auto"
+ }
+ }
+
cfgRoot, err := cmdenv.GetConfigRoot(env)
if err != nil {
return err
@@ -95,6 +89,13 @@ in the bootstrap list).
return err
}
+ // Check if trying to add "auto" when AutoConf is disabled
+ for _, peer := range inputPeers {
+ if peer == config.AutoPlaceholder && !cfg.AutoConf.Enabled.WithDefault(config.DefaultAutoConfEnabled) {
+ return errors.New("cannot add default bootstrap peers: AutoConf is disabled (AutoConf.Enabled=false). Enable AutoConf by setting AutoConf.Enabled=true in your config, or add specific peer addresses instead")
+ }
+ }
+
added, err := bootstrapAdd(r, cfg, inputPeers)
if err != nil {
return err
@@ -110,44 +111,6 @@ in the bootstrap list).
},
}
-var bootstrapAddDefaultCmd = &cmds.Command{
- Helptext: cmds.HelpText{
- Tagline: "Add default peers to the bootstrap list.",
- ShortDescription: `Outputs a list of peers that were added (that weren't already
-in the bootstrap list).`,
- },
- Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
- cfgRoot, err := cmdenv.GetConfigRoot(env)
- if err != nil {
- return err
- }
-
- r, err := fsrepo.Open(cfgRoot)
- if err != nil {
- return err
- }
-
- defer r.Close()
- cfg, err := r.Config()
- if err != nil {
- return err
- }
-
- added, err := bootstrapAdd(r, cfg, config.DefaultBootstrapAddresses)
- if err != nil {
- return err
- }
-
- return cmds.EmitOnce(res, &BootstrapOutput{added})
- },
- Type: BootstrapOutput{},
- Encoders: cmds.EncoderMap{
- cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, out *BootstrapOutput) error {
- return bootstrapWritePeers(w, "added ", out.Peers)
- }),
- },
-}
-
const (
bootstrapAllOptionName = "all"
)
@@ -251,6 +214,9 @@ var bootstrapListCmd = &cmds.Command{
Tagline: "Show peers in the bootstrap list.",
ShortDescription: "Peers are output in the format '/'.",
},
+ Options: []cmds.Option{
+ cmds.BoolOption(configExpandAutoName, "Expand 'auto' placeholders from AutoConf service."),
+ },
Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
cfgRoot, err := cmdenv.GetConfigRoot(env)
@@ -268,12 +234,16 @@ var bootstrapListCmd = &cmds.Command{
return err
}
- peers, err := cfg.BootstrapPeers()
- if err != nil {
- return err
+ // Check if user wants to expand auto values
+ expandAuto, _ := req.Options[configExpandAutoName].(bool)
+ if expandAuto {
+ // Use the same expansion method as the daemon
+ expandedBootstrap := cfg.BootstrapWithAutoConf()
+ return cmds.EmitOnce(res, &BootstrapOutput{expandedBootstrap})
}
- return cmds.EmitOnce(res, &BootstrapOutput{config.BootstrapPeerStrings(peers)})
+ // Simply return the bootstrap config as-is, including any "auto" values
+ return cmds.EmitOnce(res, &BootstrapOutput{cfg.Bootstrap})
},
Type: BootstrapOutput{},
Encoders: cmds.EncoderMap{
@@ -297,7 +267,11 @@ func bootstrapWritePeers(w io.Writer, prefix string, peers []string) error {
}
func bootstrapAdd(r repo.Repo, cfg *config.Config, peers []string) ([]string, error) {
+ // Validate peers - skip validation for "auto" placeholder
for _, p := range peers {
+ if p == config.AutoPlaceholder {
+ continue // Skip validation for "auto" placeholder
+ }
m, err := ma.NewMultiaddr(p)
if err != nil {
return nil, err
@@ -347,6 +321,16 @@ func bootstrapAdd(r repo.Repo, cfg *config.Config, peers []string) ([]string, er
}
func bootstrapRemove(r repo.Repo, cfg *config.Config, toRemove []string) ([]string, error) {
+ // Check if bootstrap contains "auto"
+ hasAuto := slices.Contains(cfg.Bootstrap, config.AutoPlaceholder)
+
+ if hasAuto && cfg.AutoConf.Enabled.WithDefault(config.DefaultAutoConfEnabled) {
+ // Cannot selectively remove peers when using "auto" bootstrap
+ // Users should either disable AutoConf or replace "auto" with specific peers
+ return nil, fmt.Errorf("cannot remove individual bootstrap peers when using 'auto' placeholder: the 'auto' value is managed by AutoConf. Either disable AutoConf by setting AutoConf.Enabled=false and replace 'auto' with specific peer addresses, or use 'ipfs bootstrap rm --all' to remove all peers")
+ }
+
+ // Original logic for non-auto bootstrap
removed := make([]peer.AddrInfo, 0, len(toRemove))
keep := make([]peer.AddrInfo, 0, len(cfg.Bootstrap))
@@ -406,16 +390,28 @@ func bootstrapRemove(r repo.Repo, cfg *config.Config, toRemove []string) ([]stri
}
func bootstrapRemoveAll(r repo.Repo, cfg *config.Config) ([]string, error) {
- removed, err := cfg.BootstrapPeers()
- if err != nil {
- return nil, err
+ // Check if bootstrap contains "auto" - if so, we need special handling
+ hasAuto := slices.Contains(cfg.Bootstrap, config.AutoPlaceholder)
+
+ var removed []string
+ if hasAuto {
+ // When "auto" is present, we can't parse it as peer.AddrInfo
+ // Just return the raw bootstrap list as strings for display
+ removed = slices.Clone(cfg.Bootstrap)
+ } else {
+ // Original logic for configs without "auto"
+ removedPeers, err := cfg.BootstrapPeers()
+ if err != nil {
+ return nil, err
+ }
+ removed = config.BootstrapPeerStrings(removedPeers)
}
cfg.Bootstrap = nil
if err := r.SetConfig(cfg); err != nil {
return nil, err
}
- return config.BootstrapPeerStrings(removed), nil
+ return removed, nil
}
const bootstrapSecurityWarning = `
diff --git a/core/commands/commands_test.go b/core/commands/commands_test.go
index 2ab3f1733..23782f209 100644
--- a/core/commands/commands_test.go
+++ b/core/commands/commands_test.go
@@ -30,7 +30,6 @@ func TestCommands(t *testing.T) {
"/block/stat",
"/bootstrap",
"/bootstrap/add",
- "/bootstrap/add/default",
"/bootstrap/list",
"/bootstrap/rm",
"/bootstrap/rm/all",
diff --git a/core/commands/config.go b/core/commands/config.go
index 8329e972f..c28466a98 100644
--- a/core/commands/config.go
+++ b/core/commands/config.go
@@ -5,8 +5,10 @@ import (
"errors"
"fmt"
"io"
+ "maps"
"os"
"os/exec"
+ "slices"
"strings"
"github.com/anmitsu/go-shlex"
@@ -33,6 +35,7 @@ const (
configBoolOptionName = "bool"
configJSONOptionName = "json"
configDryRunOptionName = "dry-run"
+ configExpandAutoName = "expand-auto"
)
var ConfigCmd = &cmds.Command{
@@ -75,6 +78,7 @@ Set multiple values in the 'Addresses.AppendAnnounce' array:
Options: []cmds.Option{
cmds.BoolOption(configBoolOptionName, "Set a boolean value."),
cmds.BoolOption(configJSONOptionName, "Parse stringified JSON."),
+ cmds.BoolOption(configExpandAutoName, "Expand 'auto' placeholders to their expanded values from AutoConf service."),
},
Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
args := req.Arguments
@@ -105,6 +109,11 @@ Set multiple values in the 'Addresses.AppendAnnounce' array:
}
defer r.Close()
if len(args) == 2 {
+ // Check if user is trying to write config with expand flag
+ if expandAuto, _ := req.Options[configExpandAutoName].(bool); expandAuto {
+ return fmt.Errorf("--expand-auto can only be used for reading config values, not for setting them")
+ }
+
value := args[1]
if parseJSON, _ := req.Options[configJSONOptionName].(bool); parseJSON {
@@ -121,7 +130,13 @@ Set multiple values in the 'Addresses.AppendAnnounce' array:
output, err = setConfig(r, key, value)
}
} else {
- output, err = getConfig(r, key)
+ // Check if user wants to expand auto values for getter
+ expandAuto, _ := req.Options[configExpandAutoName].(bool)
+ if expandAuto {
+ output, err = getConfigWithAutoExpand(r, key)
+ } else {
+ output, err = getConfig(r, key)
+ }
}
if err != nil {
@@ -208,6 +223,23 @@ NOTE: For security reasons, this command will omit your private key and remote s
return err
}
+ // Check if user wants to expand auto values
+ expandAuto, _ := req.Options[configExpandAutoName].(bool)
+ if expandAuto {
+ // Load full config to use resolution methods
+ var fullCfg config.Config
+ err = json.Unmarshal(data, &fullCfg)
+ if err != nil {
+ return err
+ }
+
+ // Expand auto values and update the map
+ cfg, err = fullCfg.ExpandAutoConfValues(cfg)
+ if err != nil {
+ return err
+ }
+ }
+
cfg, err = scrubValue(cfg, []string{config.IdentityTag, config.PrivKeyTag})
if err != nil {
return err
@@ -417,7 +449,8 @@ var configProfileApplyCmd = &cmds.Command{
func buildProfileHelp() string {
var out string
- for name, profile := range config.Profiles {
+ for _, name := range slices.Sorted(maps.Keys(config.Profiles)) {
+ profile := config.Profiles[name]
dlines := strings.Split(profile.Description, "\n")
for i := range dlines {
dlines[i] = " " + dlines[i]
@@ -498,6 +531,28 @@ func getConfig(r repo.Repo, key string) (*ConfigField, error) {
}, nil
}
+func getConfigWithAutoExpand(r repo.Repo, key string) (*ConfigField, error) {
+ // First get the current value
+ value, err := r.GetConfigKey(key)
+ if err != nil {
+ return nil, fmt.Errorf("failed to get config value: %q", err)
+ }
+
+ // Load full config for resolution
+ fullCfg, err := r.Config()
+ if err != nil {
+ return nil, fmt.Errorf("failed to load config: %q", err)
+ }
+
+ // Expand auto values based on the key
+ expandedValue := fullCfg.ExpandConfigField(key, value)
+
+ return &ConfigField{
+ Key: key,
+ Value: expandedValue,
+ }, nil
+}
+
func setConfig(r repo.Repo, key string, value interface{}) (*ConfigField, error) {
err := r.SetConfigKey(key, value)
if err != nil {
diff --git a/core/commands/name/publish.go b/core/commands/name/publish.go
index db97b3b13..918606d63 100644
--- a/core/commands/name/publish.go
+++ b/core/commands/name/publish.go
@@ -16,18 +16,19 @@ import (
options "github.com/ipfs/kubo/core/coreiface/options"
)
-var errAllowOffline = errors.New("can't publish while offline: pass `--allow-offline` to override")
+var errAllowOffline = errors.New("can't publish while offline: pass `--allow-offline` to override or `--allow-delegated` if Ipns.DelegatedPublishers are set up")
const (
- ipfsPathOptionName = "ipfs-path"
- resolveOptionName = "resolve"
- allowOfflineOptionName = "allow-offline"
- lifeTimeOptionName = "lifetime"
- ttlOptionName = "ttl"
- keyOptionName = "key"
- quieterOptionName = "quieter"
- v1compatOptionName = "v1compat"
- sequenceOptionName = "sequence"
+ ipfsPathOptionName = "ipfs-path"
+ resolveOptionName = "resolve"
+ allowOfflineOptionName = "allow-offline"
+ allowDelegatedOptionName = "allow-delegated"
+ lifeTimeOptionName = "lifetime"
+ ttlOptionName = "ttl"
+ keyOptionName = "key"
+ quieterOptionName = "quieter"
+ v1compatOptionName = "v1compat"
+ sequenceOptionName = "sequence"
)
var PublishCmd = &cmds.Command{
@@ -48,6 +49,14 @@ which is the hash of its public key.
You can use the 'ipfs key' commands to list and generate more names and their
respective keys.
+Publishing Modes:
+
+By default, IPNS records are published to both the DHT and any configured
+HTTP delegated publishers. You can control this behavior with the following flags:
+
+ --allow-offline Allow publishing when offline (publishes to local datastore, network operations are optional)
+ --allow-delegated Allow publishing without DHT connectivity (local + HTTP delegated publishers only)
+
Examples:
Publish an with your default name:
@@ -55,16 +64,14 @@ Publish an with your default name:
> ipfs name publish /ipfs/QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy
Published to QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n: /ipfs/QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy
-Publish an with another name, added by an 'ipfs key' command:
+Publish without DHT (HTTP delegated publishers only):
- > ipfs key gen --type=rsa --size=2048 mykey
- > ipfs name publish --key=mykey /ipfs/QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy
- Published to QmSrPmbaUKA3ZodhzPWZnpFgcPMFWF4QsxXbkWfEptTBJd: /ipfs/QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy
+ > ipfs name publish --allow-delegated /ipfs/QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy
+ Published to QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n: /ipfs/QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy
-Alternatively, publish an using a valid PeerID (as listed by
-'ipfs key list -l'):
+Publish when offline (local publish, network optional):
- > ipfs name publish --key=QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n /ipfs/QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy
+ > ipfs name publish --allow-offline /ipfs/QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy
Published to QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n: /ipfs/QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy
Notes:
@@ -97,7 +104,8 @@ For faster IPNS updates, consider:
cmds.StringOption(ttlOptionName, "Time duration hint, akin to --lifetime, indicating how long to cache this record before checking for updates.").WithDefault(ipns.DefaultRecordTTL.String()),
cmds.BoolOption(quieterOptionName, "Q", "Write only final IPNS Name encoded as CIDv1 (for use in /ipns content paths)."),
cmds.BoolOption(v1compatOptionName, "Produce a backward-compatible IPNS Record by including fields for both V1 and V2 signatures.").WithDefault(true),
- cmds.BoolOption(allowOfflineOptionName, "When --offline, save the IPNS record to the local datastore without broadcasting to the network (instead of failing)."),
+ cmds.BoolOption(allowOfflineOptionName, "Allow publishing when offline - publishes to local datastore without requiring network connectivity."),
+ cmds.BoolOption(allowDelegatedOptionName, "Allow publishing without DHT connectivity - uses local datastore and HTTP delegated publishers only."),
cmds.Uint64Option(sequenceOptionName, "Set a custom sequence number for the IPNS record (must be higher than current)."),
ke.OptionIPNSBase,
},
@@ -108,9 +116,15 @@ For faster IPNS updates, consider:
}
allowOffline, _ := req.Options[allowOfflineOptionName].(bool)
+ allowDelegated, _ := req.Options[allowDelegatedOptionName].(bool)
compatibleWithV1, _ := req.Options[v1compatOptionName].(bool)
kname, _ := req.Options[keyOptionName].(string)
+ // Validate flag combinations
+ if allowOffline && allowDelegated {
+ return errors.New("cannot use both --allow-offline and --allow-delegated flags")
+ }
+
validTimeOpt, _ := req.Options[lifeTimeOptionName].(string)
validTime, err := time.ParseDuration(validTimeOpt)
if err != nil {
@@ -119,6 +133,7 @@ For faster IPNS updates, consider:
opts := []options.NamePublishOption{
options.Name.AllowOffline(allowOffline),
+ options.Name.AllowDelegated(allowDelegated),
options.Name.Key(kname),
options.Name.ValidTime(validTime),
options.Name.CompatibleWithV1(compatibleWithV1),
diff --git a/core/commands/repo.go b/core/commands/repo.go
index ba27c71dd..017143127 100644
--- a/core/commands/repo.go
+++ b/core/commands/repo.go
@@ -16,7 +16,6 @@ import (
corerepo "github.com/ipfs/kubo/core/corerepo"
fsrepo "github.com/ipfs/kubo/repo/fsrepo"
"github.com/ipfs/kubo/repo/fsrepo/migrations"
- "github.com/ipfs/kubo/repo/fsrepo/migrations/ipfsfetcher"
humanize "github.com/dustin/go-humanize"
bstore "github.com/ipfs/boxo/blockstore"
@@ -57,6 +56,7 @@ const (
repoQuietOptionName = "quiet"
repoSilentOptionName = "silent"
repoAllowDowngradeOptionName = "allow-downgrade"
+ repoToVersionOptionName = "to"
)
var repoGcCmd = &cmds.Command{
@@ -373,63 +373,81 @@ var repoVersionCmd = &cmds.Command{
var repoMigrateCmd = &cmds.Command{
Helptext: cmds.HelpText{
- Tagline: "Apply any outstanding migrations to the repo.",
+ Tagline: "Apply repository migrations to a specific version.",
+ ShortDescription: `
+'ipfs repo migrate' applies repository migrations to bring the repository
+to a specific version. By default, migrates to the latest version supported
+by this IPFS binary.
+
+Examples:
+ ipfs repo migrate # Migrate to latest version
+ ipfs repo migrate --to=17 # Migrate to version 17
+ ipfs repo migrate --to=16 --allow-downgrade # Downgrade to version 16
+
+WARNING: Downgrading a repository may cause data loss and requires using
+an older IPFS binary that supports the target version. After downgrading,
+you must use an IPFS implementation compatible with that repository version.
+
+Repository versions 16+ use embedded migrations for faster, more reliable
+migration. Versions below 16 require external migration tools.
+`,
},
Options: []cmds.Option{
+ cmds.IntOption(repoToVersionOptionName, "Target repository version").WithDefault(fsrepo.RepoVersion),
cmds.BoolOption(repoAllowDowngradeOptionName, "Allow downgrading to a lower repo version"),
},
NoRemote: true,
+ // SetDoesNotUseRepo(true) might seem counter-intuitive since migrations
+ // do access the repo, but it's correct - we need direct filesystem access
+ // without going through the daemon. Migrations handle their own locking.
+ Extra: CreateCmdExtras(SetDoesNotUseRepo(true)),
Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
cctx := env.(*oldcmds.Context)
allowDowngrade, _ := req.Options[repoAllowDowngradeOptionName].(bool)
+ targetVersion, _ := req.Options[repoToVersionOptionName].(int)
- _, err := fsrepo.Open(cctx.ConfigRoot)
+ // Get current repo version
+ currentVersion, err := migrations.RepoVersion(cctx.ConfigRoot)
+ if err != nil {
+ return fmt.Errorf("could not get current repo version: %w", err)
+ }
- if err == nil {
- fmt.Println("Repo does not require migration.")
+ // Check if migration is needed
+ if currentVersion == targetVersion {
+ fmt.Printf("Repository is already at version %d.\n", targetVersion)
return nil
- } else if err != fsrepo.ErrNeedMigration {
- return err
}
- fmt.Println("Found outdated fs-repo, starting migration.")
+ // Validate downgrade request
+ if targetVersion < currentVersion && !allowDowngrade {
+ return fmt.Errorf("downgrade from version %d to %d requires --allow-downgrade flag", currentVersion, targetVersion)
+ }
- // Read Migration section of IPFS config
- configFileOpt, _ := req.Options[ConfigFileOption].(string)
- migrationCfg, err := migrations.ReadMigrationConfig(cctx.ConfigRoot, configFileOpt)
+ // Check if repo is locked by daemon before running migration
+ locked, err := fsrepo.LockedByOtherProcess(cctx.ConfigRoot)
if err != nil {
- return err
+ return fmt.Errorf("could not check repo lock: %w", err)
+ }
+ if locked {
+ return fmt.Errorf("cannot run migration while daemon is running (repo.lock exists)")
}
- // Define function to create IPFS fetcher. Do not supply an
- // already-constructed IPFS fetcher, because this may be expensive and
- // not needed according to migration config. Instead, supply a function
- // to construct the particular IPFS fetcher implementation used here,
- // which is called only if an IPFS fetcher is needed.
- newIpfsFetcher := func(distPath string) migrations.Fetcher {
- return ipfsfetcher.NewIpfsFetcher(distPath, 0, &cctx.ConfigRoot, configFileOpt)
- }
+ fmt.Printf("Migrating repository from version %d to %d...\n", currentVersion, targetVersion)
- // Fetch migrations from current distribution, or location from environ
- fetchDistPath := migrations.GetDistPathEnv(migrations.CurrentIpfsDist)
-
- // Create fetchers according to migrationCfg.DownloadSources
- fetcher, err := migrations.GetMigrationFetcher(migrationCfg.DownloadSources, fetchDistPath, newIpfsFetcher)
+ // Use hybrid migration strategy that intelligently combines external and embedded migrations
+ err = migrations.RunHybridMigrations(cctx.Context(), targetVersion, cctx.ConfigRoot, allowDowngrade)
if err != nil {
- return err
- }
- defer fetcher.Close()
-
- err = migrations.RunMigration(cctx.Context(), fetcher, fsrepo.RepoVersion, "", allowDowngrade)
- if err != nil {
- fmt.Println("The migrations of fs-repo failed:")
+ fmt.Println("Repository migration failed:")
fmt.Printf(" %s\n", err)
fmt.Println("If you think this is a bug, please file an issue and include this whole log output.")
- fmt.Println(" https://github.com/ipfs/fs-repo-migrations")
+ fmt.Println(" https://github.com/ipfs/kubo")
return err
}
- fmt.Printf("Success: fs-repo has been migrated to version %d.\n", fsrepo.RepoVersion)
+ fmt.Printf("Repository successfully migrated to version %d.\n", targetVersion)
+ if targetVersion < fsrepo.RepoVersion {
+ fmt.Println("WARNING: After downgrading, you must use an IPFS binary compatible with this repository version.")
+ }
return nil
},
}
diff --git a/core/core.go b/core/core.go
index 10571ba3e..f8a6a258f 100644
--- a/core/core.go
+++ b/core/core.go
@@ -213,7 +213,8 @@ func (n *IpfsNode) loadBootstrapPeers() ([]peer.AddrInfo, error) {
return nil, err
}
- return cfg.BootstrapPeers()
+ // Use auto-config resolution for actual bootstrap connectivity
+ return cfg.BootstrapPeersWithAutoConf()
}
func (n *IpfsNode) saveTempBootstrapPeers(ctx context.Context, peerList []peer.AddrInfo) error {
diff --git a/core/coreapi/name.go b/core/coreapi/name.go
index b43f9def6..5e7971698 100644
--- a/core/coreapi/name.go
+++ b/core/coreapi/name.go
@@ -45,9 +45,25 @@ func (api *NameAPI) Publish(ctx context.Context, p path.Path, opts ...caopts.Nam
span.SetAttributes(attribute.Float64("ttl", options.TTL.Seconds()))
}
- err = api.checkOnline(options.AllowOffline)
- if err != nil {
- return ipns.Name{}, err
+ // Handle different publishing modes
+ if options.AllowDelegated {
+ // AllowDelegated mode: check if delegated publishers are configured
+ cfg, err := api.repo.Config()
+ if err != nil {
+ return ipns.Name{}, fmt.Errorf("failed to read config: %w", err)
+ }
+ delegatedPublishers := cfg.DelegatedPublishersWithAutoConf()
+ if len(delegatedPublishers) == 0 {
+ return ipns.Name{}, errors.New("no delegated publishers configured: add Ipns.DelegatedPublishers or use --allow-offline for local-only publishing")
+ }
+ // For allow-delegated mode, we only require that we have delegated publishers configured
+ // The node doesn't need P2P connectivity since we're using HTTP publishing
+ } else {
+ // Normal mode: check online status with allow-offline flag
+ err = api.checkOnline(options.AllowOffline)
+ if err != nil {
+ return ipns.Name{}, err
+ }
}
k, err := keylookup(api.privateKey, api.repo.Keystore(), options.Key)
diff --git a/core/coreiface/options/name.go b/core/coreiface/options/name.go
index d62c427ad..8fc4f552a 100644
--- a/core/coreiface/options/name.go
+++ b/core/coreiface/options/name.go
@@ -16,6 +16,7 @@ type NamePublishSettings struct {
TTL *time.Duration
CompatibleWithV1 bool
AllowOffline bool
+ AllowDelegated bool
Sequence *uint64
}
@@ -35,7 +36,8 @@ func NamePublishOptions(opts ...NamePublishOption) (*NamePublishSettings, error)
ValidTime: DefaultNameValidTime,
Key: "self",
- AllowOffline: false,
+ AllowOffline: false,
+ AllowDelegated: false,
}
for _, opt := range opts {
@@ -97,6 +99,16 @@ func (nameOpts) AllowOffline(allow bool) NamePublishOption {
}
}
+// AllowDelegated is an option for Name.Publish which allows publishing without
+// DHT connectivity, using local datastore and HTTP delegated publishers only.
+// Default value is false
+func (nameOpts) AllowDelegated(allowDelegated bool) NamePublishOption {
+ return func(settings *NamePublishSettings) error {
+ settings.AllowDelegated = allowDelegated
+ return nil
+ }
+}
+
// TTL is an option for Name.Publish which specifies the time duration the
// published record should be cached for (caution: experimental).
func (nameOpts) TTL(ttl time.Duration) NamePublishOption {
diff --git a/core/coreiface/tests/name.go b/core/coreiface/tests/name.go
index 1e739fdd0..0e091548a 100644
--- a/core/coreiface/tests/name.go
+++ b/core/coreiface/tests/name.go
@@ -142,8 +142,6 @@ func (tp *TestSuite) TestBasicPublishResolveKey(t *testing.T) {
}
func (tp *TestSuite) TestBasicPublishResolveTimeout(t *testing.T) {
- t.Skip("ValidTime doesn't appear to work at this time resolution")
-
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
apis, err := tp.MakeAPISwarm(t, ctx, 5)
@@ -155,14 +153,25 @@ func (tp *TestSuite) TestBasicPublishResolveTimeout(t *testing.T) {
self, err := api.Key().Self(ctx)
require.NoError(t, err)
- name, err := api.Name().Publish(ctx, p, opt.Name.ValidTime(time.Millisecond*100))
+ name, err := api.Name().Publish(ctx, p, opt.Name.ValidTime(time.Second*1))
require.NoError(t, err)
require.Equal(t, name.String(), ipns.NameFromPeer(self.ID()).String())
- time.Sleep(time.Second)
-
- _, err = api.Name().Resolve(ctx, name.String())
+ // First resolve should succeed (before expiration)
+ resPath, err := api.Name().Resolve(ctx, name.String())
require.NoError(t, err)
+ require.Equal(t, p.String(), resPath.String())
+
+ // Wait for record to expire (1 second ValidTime + buffer)
+ time.Sleep(time.Second * 2)
+
+ // Second resolve should now fail after ValidTime expiration (cached)
+ _, err = api.Name().Resolve(ctx, name.String())
+ require.Error(t, err, "IPNS resolution should fail after ValidTime expires (cached)")
+
+ // Third resolve should also fail after ValidTime expiration (non-cached)
+ _, err = api.Name().Resolve(ctx, name.String(), opt.Name.Cache(false))
+ require.Error(t, err, "IPNS resolution should fail after ValidTime expires (non-cached)")
}
// TODO: When swarm api is created, add multinode tests
diff --git a/core/node/builder.go b/core/node/builder.go
index 411e3228c..4014308f5 100644
--- a/core/node/builder.go
+++ b/core/node/builder.go
@@ -7,6 +7,7 @@ import (
"go.uber.org/fx"
+ "github.com/ipfs/boxo/autoconf"
"github.com/ipfs/kubo/core/node/helpers"
"github.com/ipfs/kubo/core/node/libp2p"
"github.com/ipfs/kubo/repo"
@@ -125,7 +126,7 @@ func defaultRepo(dstore repo.Datastore) (repo.Repo, error) {
return nil, err
}
- c.Bootstrap = cfg.DefaultBootstrapAddresses
+ c.Bootstrap = autoconf.FallbackBootstrapPeers
c.Addresses.Swarm = []string{"/ip4/0.0.0.0/tcp/4001", "/ip4/0.0.0.0/udp/4001/quic-v1"}
c.Identity.PeerID = pid.String()
c.Identity.PrivKey = base64.StdEncoding.EncodeToString(privkeyb)
diff --git a/core/node/dns.go b/core/node/dns.go
index d338e0e8b..3f0875afb 100644
--- a/core/node/dns.go
+++ b/core/node/dns.go
@@ -16,5 +16,8 @@ func DNSResolver(cfg *config.Config) (*madns.Resolver, error) {
dohOpts = append(dohOpts, doh.WithMaxCacheTTL(cfg.DNS.MaxCacheTTL.WithDefault(time.Duration(math.MaxUint32)*time.Second)))
}
- return gateway.NewDNSResolver(cfg.DNS.Resolvers, dohOpts...)
+ // Replace "auto" DNS resolver placeholders with autoconf values
+ resolvers := cfg.DNSResolversWithAutoConf()
+
+ return gateway.NewDNSResolver(resolvers, dohOpts...)
}
diff --git a/core/node/libp2p/host.go b/core/node/libp2p/host.go
index 7950f3dc6..9e71d3359 100644
--- a/core/node/libp2p/host.go
+++ b/core/node/libp2p/host.go
@@ -49,7 +49,8 @@ func Host(mctx helpers.MetricsCtx, lc fx.Lifecycle, params P2PHostIn) (out P2PHo
if err != nil {
return out, err
}
- bootstrappers, err := cfg.BootstrapPeers()
+ // Use auto-config resolution for actual connectivity
+ bootstrappers, err := cfg.BootstrapPeersWithAutoConf()
if err != nil {
return out, err
}
diff --git a/core/node/libp2p/routing.go b/core/node/libp2p/routing.go
index 5e16564de..6fafe37a4 100644
--- a/core/node/libp2p/routing.go
+++ b/core/node/libp2p/routing.go
@@ -95,7 +95,8 @@ func BaseRouting(cfg *config.Config) interface{} {
if err != nil {
return out, err
}
- bspeers, err := cfg.BootstrapPeers()
+ // Use auto-config resolution for actual connectivity
+ bspeers, err := cfg.BootstrapPeersWithAutoConf()
if err != nil {
return out, err
}
diff --git a/core/node/libp2p/routingopt.go b/core/node/libp2p/routingopt.go
index 43565265b..c8f22af2f 100644
--- a/core/node/libp2p/routingopt.go
+++ b/core/node/libp2p/routingopt.go
@@ -2,9 +2,12 @@ package libp2p
import (
"context"
+ "fmt"
"os"
+ "strings"
"time"
+ "github.com/ipfs/boxo/autoconf"
"github.com/ipfs/go-datastore"
"github.com/ipfs/kubo/config"
irouting "github.com/ipfs/kubo/routing"
@@ -32,46 +35,144 @@ type RoutingOption func(args RoutingOptionArgs) (routing.Routing, error)
var noopRouter = routinghelpers.Null{}
+// EndpointSource tracks where a URL came from to determine appropriate capabilities
+type EndpointSource struct {
+ URL string
+ SupportsRead bool // came from DelegatedRoutersWithAutoConf (Read operations)
+ SupportsWrite bool // came from DelegatedPublishersWithAutoConf (Write operations)
+}
+
+// determineCapabilities determines endpoint capabilities based on URL path and source
+func determineCapabilities(endpoint EndpointSource) (string, autoconf.EndpointCapabilities, error) {
+ parsed, err := autoconf.DetermineKnownCapabilities(endpoint.URL, endpoint.SupportsRead, endpoint.SupportsWrite)
+ if err != nil {
+ log.Debugf("Skipping endpoint %q: %v", endpoint.URL, err)
+ return "", autoconf.EndpointCapabilities{}, nil // Return empty caps, not error
+ }
+
+ return parsed.BaseURL, parsed.Capabilities, nil
+}
+
+// collectAllEndpoints gathers URLs from both router and publisher sources
+func collectAllEndpoints(cfg *config.Config) []EndpointSource {
+ var endpoints []EndpointSource
+
+ // Get router URLs (Read operations)
+ var routerURLs []string
+ if envRouters := os.Getenv(config.EnvHTTPRouters); envRouters != "" {
+ // Use environment variable override if set (space or comma separated)
+ splitFunc := func(r rune) bool { return r == ',' || r == ' ' }
+ routerURLs = strings.FieldsFunc(envRouters, splitFunc)
+ log.Warnf("Using HTTP routers from %s environment variable instead of config/autoconf: %v", config.EnvHTTPRouters, routerURLs)
+ } else {
+ // Use delegated routers from autoconf
+ routerURLs = cfg.DelegatedRoutersWithAutoConf()
+ // No fallback - if autoconf doesn't provide endpoints, use empty list
+ // This exposes any autoconf issues rather than masking them with hardcoded defaults
+ }
+
+ // Add router URLs to collection
+ for _, url := range routerURLs {
+ endpoints = append(endpoints, EndpointSource{
+ URL: url,
+ SupportsRead: true,
+ SupportsWrite: false,
+ })
+ }
+
+ // Get publisher URLs (Write operations)
+ publisherURLs := cfg.DelegatedPublishersWithAutoConf()
+
+ // Add publisher URLs, merging with existing router URLs if they match
+ for _, url := range publisherURLs {
+ found := false
+ for i, existing := range endpoints {
+ if existing.URL == url {
+ endpoints[i].SupportsWrite = true
+ found = true
+ break
+ }
+ }
+ if !found {
+ endpoints = append(endpoints, EndpointSource{
+ URL: url,
+ SupportsRead: false,
+ SupportsWrite: true,
+ })
+ }
+ }
+
+ return endpoints
+}
+
func constructDefaultHTTPRouters(cfg *config.Config) ([]*routinghelpers.ParallelRouter, error) {
var routers []*routinghelpers.ParallelRouter
httpRetrievalEnabled := cfg.HTTPRetrieval.Enabled.WithDefault(config.DefaultHTTPRetrievalEnabled)
- // Use config.DefaultHTTPRouters if custom override was sent via config.EnvHTTPRouters
- // or if user did not set any preference in cfg.Routing.DelegatedRouters
- var httpRouterEndpoints []string
- if os.Getenv(config.EnvHTTPRouters) != "" || len(cfg.Routing.DelegatedRouters) == 0 {
- httpRouterEndpoints = config.DefaultHTTPRouters
- } else {
- httpRouterEndpoints = cfg.Routing.DelegatedRouters
+ // Collect URLs from both router and publisher sources
+ endpoints := collectAllEndpoints(cfg)
+
+ // Group endpoints by origin (base URL) and aggregate capabilities
+ originCapabilities := make(map[string]autoconf.EndpointCapabilities)
+ for _, endpoint := range endpoints {
+ // Parse endpoint and determine capabilities based on source
+ baseURL, capabilities, err := determineCapabilities(endpoint)
+ if err != nil {
+ return nil, fmt.Errorf("failed to parse endpoint %q: %w", endpoint.URL, err)
+ }
+
+ // Aggregate capabilities for this origin
+ existing := originCapabilities[baseURL]
+ existing.Merge(capabilities)
+ originCapabilities[baseURL] = existing
}
- // Append HTTP routers for additional speed
- for _, endpoint := range httpRouterEndpoints {
- httpRouter, err := irouting.ConstructHTTPRouter(endpoint, cfg.Identity.PeerID, httpAddrsFromConfig(cfg.Addresses), cfg.Identity.PrivKey, httpRetrievalEnabled)
+ // Create single HTTP router and composer per origin
+ for baseURL, capabilities := range originCapabilities {
+ // Construct HTTP router using base URL (without path)
+ httpRouter, err := irouting.ConstructHTTPRouter(baseURL, cfg.Identity.PeerID, httpAddrsFromConfig(cfg.Addresses), cfg.Identity.PrivKey, httpRetrievalEnabled)
if err != nil {
return nil, err
}
- // Mapping router to /routing/v1/* endpoints
+
+ // Configure router operations based on aggregated capabilities
// https://specs.ipfs.tech/routing/http-routing-v1/
- r := &irouting.Composer{
- GetValueRouter: httpRouter, // GET /routing/v1/ipns
- PutValueRouter: httpRouter, // PUT /routing/v1/ipns
+ composer := &irouting.Composer{
+ GetValueRouter: noopRouter, // Default disabled, enabled below based on capabilities
+ PutValueRouter: noopRouter, // Default disabled, enabled below based on capabilities
ProvideRouter: noopRouter, // we don't have spec for sending provides to /routing/v1 (revisit once https://github.com/ipfs/specs/pull/378 or similar is ratified)
- FindPeersRouter: httpRouter, // /routing/v1/peers
- FindProvidersRouter: httpRouter, // /routing/v1/providers
+ FindPeersRouter: noopRouter, // Default disabled, enabled below based on capabilities
+ FindProvidersRouter: noopRouter, // Default disabled, enabled below based on capabilities
}
- if endpoint == config.CidContactRoutingURL {
- // Special-case: cid.contact only supports /routing/v1/providers/cid
- // we disable other endpoints to avoid sending requests that always fail
- r.GetValueRouter = noopRouter
- r.PutValueRouter = noopRouter
- r.ProvideRouter = noopRouter
- r.FindPeersRouter = noopRouter
+ // Enable specific capabilities
+ if capabilities.IPNSGet {
+ composer.GetValueRouter = httpRouter // GET /routing/v1/ipns for IPNS resolution
+ }
+ if capabilities.IPNSPut {
+ composer.PutValueRouter = httpRouter // PUT /routing/v1/ipns for IPNS publishing
+ }
+ if capabilities.Peers {
+ composer.FindPeersRouter = httpRouter // GET /routing/v1/peers
+ }
+ if capabilities.Providers {
+ composer.FindProvidersRouter = httpRouter // GET /routing/v1/providers
+ }
+
+ // Handle special cases and backward compatibility
+ if baseURL == config.CidContactRoutingURL {
+ // Special-case: cid.contact only supports /routing/v1/providers/cid endpoint
+ // Override any capabilities detected from URL path to ensure only providers is enabled
+ // TODO: Consider moving this to configuration or removing once cid.contact adds more capabilities
+ composer.GetValueRouter = noopRouter
+ composer.PutValueRouter = noopRouter
+ composer.ProvideRouter = noopRouter
+ composer.FindPeersRouter = noopRouter
+ composer.FindProvidersRouter = httpRouter // Only providers supported
}
routers = append(routers, &routinghelpers.ParallelRouter{
- Router: r,
+ Router: composer,
IgnoreError: true, // https://github.com/ipfs/kubo/pull/9475#discussion_r1042507387
Timeout: 15 * time.Second, // 5x server value from https://github.com/ipfs/kubo/pull/9475#discussion_r1042428529
DoNotWaitForSearchValue: true,
@@ -81,6 +182,31 @@ func constructDefaultHTTPRouters(cfg *config.Config) ([]*routinghelpers.Parallel
return routers, nil
}
+// ConstructDelegatedOnlyRouting returns routers used when Routing.Type is set to "delegated"
+// This provides HTTP-only routing without DHT, using only delegated routers and IPNS publishers.
+// Useful for environments where DHT connectivity is not available or desired
+func ConstructDelegatedOnlyRouting(cfg *config.Config) RoutingOption {
+ return func(args RoutingOptionArgs) (routing.Routing, error) {
+ // Use only HTTP routers (includes both read and write capabilities) - no DHT
+ var routers []*routinghelpers.ParallelRouter
+
+ // Add HTTP delegated routers (includes both router and publisher capabilities)
+ httpRouters, err := constructDefaultHTTPRouters(cfg)
+ if err != nil {
+ return nil, err
+ }
+ routers = append(routers, httpRouters...)
+
+ // Validate that we have at least one router configured
+ if len(routers) == 0 {
+ return nil, fmt.Errorf("no delegated routers or publishers configured for 'delegated' routing mode")
+ }
+
+ routing := routinghelpers.NewComposableParallel(routers)
+ return routing, nil
+ }
+}
+
// ConstructDefaultRouting returns routers used when Routing.Type is unset or set to "auto"
func ConstructDefaultRouting(cfg *config.Config, routingOpt RoutingOption) RoutingOption {
return func(args RoutingOptionArgs) (routing.Routing, error) {
diff --git a/core/node/libp2p/routingopt_test.go b/core/node/libp2p/routingopt_test.go
index 801fc0344..1a06045d9 100644
--- a/core/node/libp2p/routingopt_test.go
+++ b/core/node/libp2p/routingopt_test.go
@@ -3,7 +3,9 @@ package libp2p
import (
"testing"
+ "github.com/ipfs/boxo/autoconf"
config "github.com/ipfs/kubo/config"
+ "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
@@ -32,3 +34,191 @@ func TestHttpAddrsFromConfig(t *testing.T) {
AppendAnnounce: []string{"/ip4/192.168.0.2/tcp/4001"},
}), "AppendAnnounce addrs should be included if specified")
}
+
+func TestDetermineCapabilities(t *testing.T) {
+ tests := []struct {
+ name string
+ endpoint EndpointSource
+ expectedBaseURL string
+ expectedCapabilities autoconf.EndpointCapabilities
+ expectError bool
+ }{
+ {
+ name: "URL with no path should have all Read capabilities",
+ endpoint: EndpointSource{
+ URL: "https://example.com",
+ SupportsRead: true,
+ SupportsWrite: false,
+ },
+ expectedBaseURL: "https://example.com",
+ expectedCapabilities: autoconf.EndpointCapabilities{
+ Providers: true,
+ Peers: true,
+ IPNSGet: true,
+ IPNSPut: false,
+ },
+ expectError: false,
+ },
+ {
+ name: "URL with trailing slash should have all Read capabilities",
+ endpoint: EndpointSource{
+ URL: "https://example.com/",
+ SupportsRead: true,
+ SupportsWrite: false,
+ },
+ expectedBaseURL: "https://example.com",
+ expectedCapabilities: autoconf.EndpointCapabilities{
+ Providers: true,
+ Peers: true,
+ IPNSGet: true,
+ IPNSPut: false,
+ },
+ expectError: false,
+ },
+ {
+ name: "URL with IPNS path should have only IPNS capabilities",
+ endpoint: EndpointSource{
+ URL: "https://example.com/routing/v1/ipns",
+ SupportsRead: true,
+ SupportsWrite: true,
+ },
+ expectedBaseURL: "https://example.com",
+ expectedCapabilities: autoconf.EndpointCapabilities{
+ Providers: false,
+ Peers: false,
+ IPNSGet: true,
+ IPNSPut: true,
+ },
+ expectError: false,
+ },
+ {
+ name: "URL with providers path should have only Providers capability",
+ endpoint: EndpointSource{
+ URL: "https://example.com/routing/v1/providers",
+ SupportsRead: true,
+ SupportsWrite: false,
+ },
+ expectedBaseURL: "https://example.com",
+ expectedCapabilities: autoconf.EndpointCapabilities{
+ Providers: true,
+ Peers: false,
+ IPNSGet: false,
+ IPNSPut: false,
+ },
+ expectError: false,
+ },
+ {
+ name: "URL with peers path should have only Peers capability",
+ endpoint: EndpointSource{
+ URL: "https://example.com/routing/v1/peers",
+ SupportsRead: true,
+ SupportsWrite: false,
+ },
+ expectedBaseURL: "https://example.com",
+ expectedCapabilities: autoconf.EndpointCapabilities{
+ Providers: false,
+ Peers: true,
+ IPNSGet: false,
+ IPNSPut: false,
+ },
+ expectError: false,
+ },
+ {
+ name: "URL with Write support only should enable IPNSPut for no-path endpoint",
+ endpoint: EndpointSource{
+ URL: "https://example.com",
+ SupportsRead: false,
+ SupportsWrite: true,
+ },
+ expectedBaseURL: "https://example.com",
+ expectedCapabilities: autoconf.EndpointCapabilities{
+ Providers: false,
+ Peers: false,
+ IPNSGet: false,
+ IPNSPut: true,
+ },
+ expectError: false,
+ },
+ }
+
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ baseURL, capabilities, err := determineCapabilities(tt.endpoint)
+
+ if tt.expectError {
+ assert.Error(t, err)
+ return
+ }
+
+ require.NoError(t, err)
+ assert.Equal(t, tt.expectedBaseURL, baseURL)
+ assert.Equal(t, tt.expectedCapabilities, capabilities)
+ })
+ }
+}
+
+func TestEndpointCapabilitiesReadWriteLogic(t *testing.T) {
+ t.Run("Read endpoint with no path should enable read capabilities", func(t *testing.T) {
+ endpoint := EndpointSource{
+ URL: "https://example.com",
+ SupportsRead: true,
+ SupportsWrite: false,
+ }
+ _, capabilities, err := determineCapabilities(endpoint)
+ require.NoError(t, err)
+
+ // Read endpoint with no path should enable all read capabilities
+ assert.True(t, capabilities.Providers)
+ assert.True(t, capabilities.Peers)
+ assert.True(t, capabilities.IPNSGet)
+ assert.False(t, capabilities.IPNSPut) // Write capability should be false
+ })
+
+ t.Run("Write endpoint with no path should enable write capabilities", func(t *testing.T) {
+ endpoint := EndpointSource{
+ URL: "https://example.com",
+ SupportsRead: false,
+ SupportsWrite: true,
+ }
+ _, capabilities, err := determineCapabilities(endpoint)
+ require.NoError(t, err)
+
+ // Write endpoint with no path should only enable IPNS write capability
+ assert.False(t, capabilities.Providers)
+ assert.False(t, capabilities.Peers)
+ assert.False(t, capabilities.IPNSGet)
+ assert.True(t, capabilities.IPNSPut) // Only write capability should be true
+ })
+
+ t.Run("Specific path should only enable matching capabilities", func(t *testing.T) {
+ endpoint := EndpointSource{
+ URL: "https://example.com/routing/v1/ipns",
+ SupportsRead: true,
+ SupportsWrite: true,
+ }
+ _, capabilities, err := determineCapabilities(endpoint)
+ require.NoError(t, err)
+
+ // Specific IPNS path should only enable IPNS capabilities based on source
+ assert.False(t, capabilities.Providers)
+ assert.False(t, capabilities.Peers)
+ assert.True(t, capabilities.IPNSGet) // Read capability enabled
+ assert.True(t, capabilities.IPNSPut) // Write capability enabled
+ })
+
+ t.Run("Unsupported paths should result in empty capabilities", func(t *testing.T) {
+ endpoint := EndpointSource{
+ URL: "https://example.com/routing/v1/unsupported",
+ SupportsRead: true,
+ SupportsWrite: false,
+ }
+ _, capabilities, err := determineCapabilities(endpoint)
+ require.NoError(t, err)
+
+ // Unsupported paths should result in no capabilities
+ assert.False(t, capabilities.Providers)
+ assert.False(t, capabilities.Peers)
+ assert.False(t, capabilities.IPNSGet)
+ assert.False(t, capabilities.IPNSPut)
+ })
+}
diff --git a/docs/changelogs/v0.37.md b/docs/changelogs/v0.37.md
index bc48c8ff3..196d9b646 100644
--- a/docs/changelogs/v0.37.md
+++ b/docs/changelogs/v0.37.md
@@ -10,7 +10,10 @@ This release was brought to you by the [Shipyard](https://ipshipyard.com/) team.
- [Overview](#overview)
- [๐ฆ Highlights](#-highlights)
+ - [๐ Repository migration from v16 to v17 with embedded tooling](#-repository-migration-from-v16-to-v17-with-embedded-tooling)
- [๐ฆ Gateway concurrent request limits and retrieval timeouts](#-gateway-concurrent-request-limits-and-retrieval-timeouts)
+ - [๐ง AutoConf: Complete control over network defaults](#-autoconf-complete-control-over-network-defaults)
+ - [New IPNS publishing options](#new-ipns-publishing-options)
- [Clear provide queue when reprovide strategy changes](#clear-provide-queue-when-reprovide-strategy-changes)
- [๐ชต Revamped `ipfs log level` command](#-revamped-ipfs-log-level-command)
- [๐ Named pins in `ipfs add` command](#-named-pins-in-ipfs-add-command)
@@ -29,6 +32,14 @@ This release was brought to you by the [Shipyard](https://ipshipyard.com/) team.
### ๐ฆ Highlights
+#### ๐ Repository migration from v16 to v17 with embedded tooling
+
+This release migrates the Kubo repository from version 16 to version 17. Migrations are now built directly into the binary - completing in milliseconds without internet access or external downloads.
+
+`ipfs daemon --migrate` performs migrations automatically. Manual migration: `ipfs repo migrate --to=17` (or `--to=16 --allow-downgrade` for compatibility). Embedded migrations apply to v17+; older versions still require external tools.
+
+**Legacy migration deprecation**: Support for legacy migrations that download binaries from the internet will be removed in a future version. Only embedded migrations for the last 3 releases will be supported. Users with very old repositories should update in stages rather than skipping multiple versions.
+
#### ๐ฆ Gateway concurrent request limits and retrieval timeouts
New configurable limits protect gateway resources during high load:
@@ -48,13 +59,62 @@ Tuning tips:
- Watch `ipfs_http_gw_concurrent_requests` for saturation
- Track `ipfs_http_gw_retrieval_timeouts_total` vs success rates to identify timeout patterns indicating routing or storage provider issues
+#### ๐ง AutoConf: Complete control over network defaults
+
+Configuration fields now support `["auto"]` placeholders that resolve to network defaults from [`AutoConf.URL`](https://github.com/ipfs/kubo/blob/master/docs/config.md#autoconfurl). These defaults can be inspected, replaced with custom values, or disabled entirely. Previously, empty configuration fields like `Routing.DelegatedRouters: []` would use hardcoded defaults - this system makes those defaults explicit through `"auto"` values. When upgrading to Kubo 0.37, custom configurations remain unchanged.
+
+New `--expand-auto` flag shows resolved values for any config field:
+
+```bash
+ipfs config show --expand-auto # View all resolved endpoints
+ipfs config Bootstrap --expand-auto # Check specific values
+ipfs config Routing.DelegatedRouters --expand-auto
+ipfs config DNS.Resolvers --expand-auto
+```
+
+Configuration can be managed via:
+- Replace `"auto"` with custom endpoints or set `[]` to disable features
+- Switch modes with `--profile=autoconf-on|autoconf-off`
+- Configure via `AutoConf.Enabled` and custom manifests via `AutoConf.URL`
+
+```bash
+# Enable automatic configuration
+ipfs config profiles apply autoconf-on
+
+# Or manually set specific fields
+ipfs config Bootstrap '["auto"]'
+ipfs config --json DNS.Resolvers '{".": ["https://dns.example.com/dns-query"], "eth.": ["auto"]}'
+```
+
+Organizations can host custom AutoConf manifests for private networks. See [AutoConf documentation](https://github.com/ipfs/kubo/blob/master/docs/config.md#autoconf) and format spec at https://conf.ipfs-mainnet.org/
+
+#### New IPNS publishing options
+
+Added support for controlling IPNS record publishing strategies.
+
+**Delegated publishers configuration:**
+
+[`Ipns.DelegatedPublishers`](https://github.com/ipfs/kubo/blob/master/docs/config.md#ipnsdelegatedpublishers) configures HTTP endpoints for IPNS publishing. Supports `"auto"` for network defaults or custom HTTP endpoints.
+
+**New command flags:**
+```bash
+# Publish only to HTTP services defined in Ipns.DelegatedPublishers (skip DHT entirely)
+ipfs name publish --delegated-only /ipfs/QmHash
+
+# Publish only locally (no network requests)
+ipfs name publish --allow-offline /ipfs/QmHash
+```
+
+These flags enable HTTP-only publishing or offline-only operations for testing.
+
+
#### Clear provide queue when reprovide strategy changes
-Your content sharing strategy changes now take effect cleanly, without interference from previously queued items.
+Changing [`Reprovider.Strategy`](https://github.com/ipfs/kubo/blob/master/docs/config.md#reproviderstrategy) and restarting Kubo now automatically clears the provide queue. Only content matching the new strategy will be announced.
-When you change [`Reprovider.Strategy`](https://github.com/ipfs/kubo/blob/master/docs/config.md#reproviderstrategy) and restart Kubo, the provide queue is automatically cleared. This ensures only content matching your new strategy will be announced to the network.
+Manual queue clearing is also available:
-A new `ipfs provide clear` command also allows manual queue clearing for debugging purposes.
+- `ipfs provide clear` - clear all queued content announcements
> [!NOTE]
> Upgrading to Kubo 0.37 will automatically clear any preexisting provide queue. The next time `Reprovider.Interval` hits, `Reprovider.Strategy` will be executed on a clean slate, ensuring consistent behavior with your current configuration.
@@ -160,6 +220,8 @@ Per a suggestion from the IPFS Foundation, Kubo now sends optional anonymized te
"routing_delegated_count": 0,
"autonat_service_mode": "enabled",
"autonat_reachability": "",
+ "autoconf": true,
+ "autoconf_custom": false,
"swarm_enable_hole_punching": true,
"swarm_circuit_addresses": false,
"swarm_ipv4_public_addresses": true,
diff --git a/docs/config.md b/docs/config.md
index 79d51bec4..73ac30c72 100644
--- a/docs/config.md
+++ b/docs/config.md
@@ -36,6 +36,11 @@ config file at runtime.
- [`AutoTLS.RegistrationToken`](#autotlsregistrationtoken)
- [`AutoTLS.RegistrationDelay`](#autotlsregistrationdelay)
- [`AutoTLS.CAEndpoint`](#autotlscaendpoint)
+ - [`AutoConf`](#autoconf)
+ - [`AutoConf.URL`](#autoconfurl)
+ - [`AutoConf.Enabled`](#autoconfenabled)
+ - [`AutoConf.RefreshInterval`](#autoconfrefreshinterval)
+ - [`AutoConf.TLSInsecureSkipVerify`](#autoconftlsinsecureskipverify)
- [`Bitswap`](#bitswap)
- [`Bitswap.Libp2pEnabled`](#bitswaplibp2penabled)
- [`Bitswap.ServerEnabled`](#bitswapserverenabled)
@@ -100,6 +105,7 @@ config file at runtime.
- [`Ipns.ResolveCacheSize`](#ipnsresolvecachesize)
- [`Ipns.MaxCacheTTL`](#ipnsmaxcachettl)
- [`Ipns.UsePubsub`](#ipnsusepubsub)
+ - [`Ipns.DelegatedPublishers`](#ipnsdelegatedpublishers)
- [`Migration`](#migration)
- [`Migration.DownloadSources`](#migrationdownloadsources)
- [`Migration.Keep`](#migrationkeep)
@@ -225,6 +231,8 @@ config file at runtime.
- [`default-datastore` profile](#default-datastore-profile)
- [`local-discovery` profile](#local-discovery-profile)
- [`default-networking` profile](#default-networking-profile)
+ - [`autoconf-on` profile](#autoconf-on-profile)
+ - [`autoconf-off` profile](#autoconf-off-profile)
- [`flatfs` profile](#flatfs-profile)
- [`flatfs-measure` profile](#flatfs-measure-profile)
- [`pebbleds` profile](#pebbleds-profile)
@@ -538,6 +546,150 @@ Default: 1 Minute
Type: `duration` (when `0`/unset, the default value is used)
+## `AutoConf`
+
+The AutoConf feature enables Kubo nodes to automatically fetch and apply network configuration from a remote JSON endpoint. This system allows dynamic configuration updates for bootstrap peers, DNS resolvers, delegated routing, and IPNS publishing endpoints without requiring manual updates to each node's local config.
+
+AutoConf works by using special `"auto"` placeholder values in configuration fields. When Kubo encounters these placeholders, it fetches the latest configuration from the specified URL and resolves the placeholders with the appropriate values at runtime. The original configuration file remains unchanged - `"auto"` values are preserved in the JSON and only resolved in memory during node operation.
+
+### Key Features
+
+- **Remote Configuration**: Fetch network defaults from a trusted URL
+- **Automatic Updates**: Periodic background checks for configuration updates
+- **Graceful Fallback**: Uses hardcoded IPFS Mainnet bootstrappers when remote config is unavailable
+- **Validation**: Ensures all fetched configuration values are valid multiaddrs and URLs
+- **Caching**: Stores multiple versions locally with ETags for efficient updates
+- **User Notification**: Logs ERROR when new configuration is available requiring node restart
+- **Debug Logging**: AutoConf operations can be inspected by setting `GOLOG_LOG_LEVEL="error,autoconf=debug"`
+
+### Supported Fields
+
+AutoConf can resolve `"auto"` placeholders in the following configuration fields:
+
+- `Bootstrap` - Bootstrap peer addresses
+- `DNS.Resolvers` - DNS-over-HTTPS resolver endpoints
+- `Routing.DelegatedRouters` - Delegated routing HTTP API endpoints
+- `Ipns.DelegatedPublishers` - IPNS delegated publishing HTTP API endpoints
+
+### Usage Example
+
+```json
+{
+ "AutoConf": {
+ "URL": "https://example.com/autoconf.json",
+ "Enabled": true,
+ "RefreshInterval": "24h"
+ },
+ "Bootstrap": ["auto"],
+ "DNS": {
+ "Resolvers": {
+ ".": ["auto"],
+ "eth.": ["auto"],
+ "custom.": ["https://dns.example.com/dns-query"]
+ }
+ },
+ "Routing": {
+ "DelegatedRouters": ["auto", "https://router.example.org/routing/v1"]
+ }
+}
+```
+
+**Notes:**
+
+- Configuration fetching happens at daemon startup and periodically in the background
+- When new configuration is detected, users must restart their node to apply changes
+- Mixed configurations are supported: you can use both `"auto"` and static values
+- If AutoConf is disabled but `"auto"` values exist, daemon startup will fail with validation errors
+- Cache is stored in `$IPFS_PATH/autoconf/` with up to 3 versions retained
+
+### Path-Based Routing Configuration
+
+AutoConf supports path-based routing URLs that automatically enable specific routing operations based on the URL path. This allows precise control over which HTTP Routing V1 endpoints are used for different operations:
+
+**Supported paths:**
+- `/routing/v1/providers` - Enables provider record lookups only
+- `/routing/v1/peers` - Enables peer routing lookups only
+- `/routing/v1/ipns` - Enables IPNS record operations only
+- No path - Enables all routing operations (backward compatibility)
+
+**AutoConf JSON structure with path-based routing:**
+
+```json
+{
+ "DelegatedRouters": {
+ "mainnet-for-nodes-with-dht": [
+ "https://cid.contact/routing/v1/providers"
+ ],
+ "mainnet-for-nodes-without-dht": [
+ "https://delegated-ipfs.dev/routing/v1/providers",
+ "https://delegated-ipfs.dev/routing/v1/peers",
+ "https://delegated-ipfs.dev/routing/v1/ipns"
+ ]
+ },
+ "DelegatedPublishers": {
+ "mainnet-for-ipns-publishers-with-http": [
+ "https://delegated-ipfs.dev/routing/v1/ipns"
+ ]
+ }
+}
+```
+
+**Node type categories:**
+- `mainnet-for-nodes-with-dht`: Mainnet nodes with DHT enabled (typically only need additional provider lookups)
+- `mainnet-for-nodes-without-dht`: Mainnet nodes without DHT (need comprehensive routing services)
+- `mainnet-for-ipns-publishers-with-http`: Mainnet nodes that publish IPNS records via HTTP
+
+This design enables efficient, selective routing where each endpoint URL automatically determines its capabilities based on the path, while maintaining semantic grouping by node configuration type.
+
+Default: `{}`
+
+Type: `object`
+
+### `AutoConf.Enabled`
+
+Controls whether the AutoConf system is active. When enabled, Kubo will fetch configuration from the specified URL and resolve `"auto"` placeholders at runtime. When disabled, any `"auto"` values in the configuration will cause daemon startup to fail with validation errors.
+
+This provides a safety mechanism to ensure nodes don't start with unresolved placeholders when AutoConf is intentionally disabled.
+
+Default: `true`
+
+Type: `flag`
+
+### `AutoConf.URL`
+
+Specifies the HTTP(S) URL from which to fetch the autoconf JSON. The endpoint should return a JSON document containing Bootstrap peers, DNS resolvers, delegated routing endpoints, and IPNS publishing endpoints that will replace `"auto"` placeholders in the local configuration.
+
+The URL must serve a JSON document matching the AutoConf schema. Kubo validates all multiaddr and URL values before caching to ensure they are properly formatted.
+
+When not specified in the configuration, the default mainnet URL is used automatically.
+
+
+
+> [!NOTE]
+> Public good autoconf manifest at `conf.ipfs-mainnet.org` is provided by the team at [Shipyard](https://ipshipyard.com).
+
+Default: `"https://conf.ipfs-mainnet.org/autoconf.json"` (when not specified)
+
+Type: `optionalString`
+
+### `AutoConf.RefreshInterval`
+
+Specifies how frequently Kubo should refresh autoconf data. This controls both how often cached autoconf data is considered fresh and how frequently the background service checks for new configuration updates.
+
+When a new configuration version is detected during background updates, Kubo logs an ERROR message informing the user that a node restart is required to apply the changes to any `"auto"` entries in their configuration.
+
+Default: `24h`
+
+Type: `optionalDuration`
+
+### `AutoConf.TLSInsecureSkipVerify`
+
+**FOR TESTING ONLY** - Allows skipping TLS certificate verification when fetching autoconf from HTTPS URLs. This should never be enabled in production as it makes the configuration fetching vulnerable to man-in-the-middle attacks.
+
+Default: `false`
+
+Type: `flag`
+
## `AutoTLS`
The [AutoTLS](https://blog.libp2p.io/autotls/) feature enables publicly reachable Kubo nodes (those dialable from the public
@@ -657,6 +809,7 @@ Default: [certmagic.LetsEncryptProductionCA](https://pkg.go.dev/github.com/caddy
Type: `optionalString`
+
## `Bitswap`
High level client and server configuration of the [Bitswap Protocol](https://specs.ipfs.tech/bitswap-protocol/) over libp2p.
@@ -690,11 +843,18 @@ Type: `flag`
## `Bootstrap`
-Bootstrap is an array of [multiaddrs][multiaddr] of trusted nodes that your node connects to, to fetch other nodes of the network on startup.
+Bootstrap peers help your node discover and connect to the IPFS network when starting up. This array contains [multiaddrs][multiaddr] of trusted nodes that your node contacts first to find other peers and content.
-Default: [`config.DefaultBootstrapAddresses`](https://github.com/ipfs/kubo/blob/master/config/bootstrap_peers.go)
+The special value `"auto"` automatically uses curated, up-to-date bootstrap peers from [AutoConf](#autoconf), ensuring your node can always connect to the healthy network without manual maintenance.
-Type: `array[string]` ([multiaddrs][multiaddr])
+**What this gives you:**
+- **Reliable startup**: Your node can always find the network, even if some bootstrap peers go offline
+- **Automatic updates**: New bootstrap peers are added as the network evolves
+- **Custom control**: Add your own trusted peers alongside or instead of the defaults
+
+Default: `["auto"]`
+
+Type: `array[string]` ([multiaddrs][multiaddr] or `"auto"`)
## `Datastore`
@@ -1484,21 +1644,52 @@ Default: `disabled`
Type: `flag`
+### `Ipns.DelegatedPublishers`
+
+A list of IPNS publishers to delegate publishing operations to. When configured, IPNS publish operations are sent to these remote HTTP services in addition to or instead of local DHT publishing, depending on [`Routing.Type`](#routingtype) configuration.
+
+These endpoints must support the [IPNS API](https://specs.ipfs.tech/routing/http-routing-v1/#ipns-api) from the Delegated Routing V1 HTTP specification.
+
+The special value `"auto"` uses delegated publishers from [AutoConf](#autoconf) when enabled.
+
+**Publishing behavior depends on routing configuration:**
+
+- `Routing.Type=auto` (default): Uses both DHT and HTTP delegated publishers
+- `Routing.Type=delegated`: Uses only HTTP delegated publishers (DHT disabled)
+
+**Command flags control publishing method:**
+
+- `ipfs name publish /ipfs/QmHash` - Uses configured routing (default behavior)
+- `ipfs name publish --allow-offline /ipfs/QmHash` - Local datastore only, no network requests
+- `ipfs name publish --delegated-only /ipfs/QmHash` - HTTP delegated publishers only, requires configuration
+
+For self-hosting, you can run your own `/routing/v1/ipns` endpoint using [someguy](https://github.com/ipfs/someguy/).
+
+Default: `["auto"]`
+
+Type: `array[string]` (URLs or `"auto"`)
+
## `Migration`
-Migration configures how migrations are downloaded and if the downloads are added to IPFS locally.
+> [!WARNING]
+> **DEPRECATED:** Only applies to legacy migrations (repo versions <16). Modern repos (v16+) use embedded migrations.
+> This section is optional and will not appear in new configurations.
### `Migration.DownloadSources`
-Sources in order of preference, where "IPFS" means use IPFS and "HTTPS" means use default gateways. Any other values are interpreted as hostnames for custom gateways. An empty list means "use default sources".
+**DEPRECATED:** Download sources for legacy migrations. Only `"HTTPS"` is supported.
-Default: `["HTTPS", "IPFS"]`
+Type: `array[string]` (optional)
+
+Default: `["HTTPS"]`
### `Migration.Keep`
-Specifies whether or not to keep the migration after downloading it. Options are "discard", "cache", "pin". Empty string for default.
+**DEPRECATED:** Controls retention of legacy migration binaries. Options: `"cache"` (default), `"discard"`, `"keep"`.
-Default: `cache`
+Type: `string` (optional)
+
+Default: `"cache"`
## `Mounts`
@@ -1908,7 +2099,7 @@ Contains options for content, peer, and IPNS routing mechanisms.
### `Routing.Type`
-There are multiple routing options: "auto", "autoclient", "none", "dht", "dhtclient", and "custom".
+There are multiple routing options: "auto", "autoclient", "none", "dht", "dhtclient", "delegated", and "custom".
* **DEFAULT:** If unset, or set to "auto", your node will use the public IPFS DHT (aka "Amino")
and parallel [`Routing.DelegatedRouters`](#routingdelegatedrouters) for additional speed.
@@ -1945,6 +2136,15 @@ by leveraging [`Routing.DelegatedRouters`](#routingdelegatedrouters) HTTP endpoi
introduced in [IPIP-337](https://github.com/ipfs/specs/pull/337)
in addition to the Amino DHT.
+When `Routing.Type` is set to `delegated`, your node will use **only** HTTP delegated routers and IPNS publishers,
+without initializing the Amino DHT at all. This mode is useful for environments where peer-to-peer DHT connectivity
+is not available or desired, while still enabling content routing and IPNS publishing via HTTP APIs.
+This mode requires configuring [`Routing.DelegatedRouters`](#routingdelegatedrouters) for content routing and
+[`Ipns.DelegatedPublishers`](#ipnsdelegatedpublishers) for IPNS publishing.
+
+**Note:** `delegated` mode operates as read-only for content providing - your node cannot announce content to the network
+since there is no DHT connectivity. Content providing is automatically disabled when using this routing type.
+
[Advanced routing rules](https://github.com/ipfs/kubo/blob/master/docs/delegated-routing.md) can be configured in `Routing.Routers` after setting `Routing.Type` to `custom`.
Default: `auto` (DHT + [`Routing.DelegatedRouters`](#routingdelegatedrouters))
@@ -2031,14 +2231,16 @@ Type: `array[string]`
An array of URL hostnames for delegated routers to be queried in addition to the Amino DHT when `Routing.Type` is set to `auto` (default) or `autoclient`.
These endpoints must support the [Delegated Routing V1 HTTP API](https://specs.ipfs.tech/routing/http-routing-v1/).
+The special value `"auto"` uses delegated routers from [AutoConf](#autoconf) when enabled.
+
> [!TIP]
> Delegated routing allows IPFS implementations to offload tasks like content routing, peer routing, and naming to a separate process or server while also benefiting from HTTP caching.
>
> One can run their own delegated router either by implementing the [Delegated Routing V1 HTTP API](https://specs.ipfs.tech/routing/http-routing-v1/) themselves, or by using [Someguy](https://github.com/ipfs/someguy), a turn-key implementation that proxies requests to other routing systems. A public utility instance of Someguy is hosted at [`https://delegated-ipfs.dev`](https://docs.ipfs.tech/concepts/public-utilities/#delegated-routing).
-Default: `["https://cid.contact"]` (empty or `nil` will also use this default; to disable delegated routing, set `Routing.Type` to `dht` or `dhtclient`)
+Default: `["auto"]`
-Type: `array[string]`
+Type: `array[string]` (URLs or `"auto"`)
### `Routing.Routers`
@@ -2795,16 +2997,10 @@ Example:
Be mindful that:
- Currently only `https://` URLs for [DNS over HTTPS (DoH)](https://en.wikipedia.org/wiki/DNS_over_HTTPS) endpoints are supported as values.
- The default catch-all resolver is the cleartext one provided by your operating system. It can be overridden by adding a DoH entry for the DNS root indicated by `.` as illustrated above.
-- Out-of-the-box support for selected non-ICANN TLDs relies on third-party centralized services provided by respective communities on best-effort basis. The implicit DoH resolvers are:
- ```json
- {
- "eth.": "https://dns.eth.limo/dns-query",
- "crypto.": "https://resolver.unstoppable.io/dns-query"
- }
- ```
- To get all the benefits of a decentralized naming system we strongly suggest setting DoH endpoint to an empty string and running own decentralized resolver as catch-all one on localhost.
+- Out-of-the-box support for selected non-ICANN TLDs relies on third-party centralized services provided by respective communities on best-effort basis.
+- The special value `"auto"` uses DNS resolvers from [AutoConf](#autoconf) when enabled. For example: `{".": "auto"}` uses any custom DoH resolver (global or per TLD) provided by AutoConf system.
-Default: `{}`
+Default: `{".": "auto"}`
Type: `object[string -> string]`
@@ -3137,6 +3333,16 @@ is useful when using the daemon in test environments.
Restores default network settings.
Inverse profile of the test profile.
+### `autoconf-on` profile
+
+Safe default for joining the public IPFS Mainnet swarm with automatic configuration.
+Can also be used with custom AutoConf.URL for other networks.
+
+### `autoconf-off` profile
+
+Disables AutoConf and clears all networking fields for manual configuration.
+Use this for private networks or when you want explicit control over all endpoints.
+
### `flatfs` profile
Configures the node to use the flatfs datastore.
diff --git a/docs/environment-variables.md b/docs/environment-variables.md
index 2942bf788..cd900de94 100644
--- a/docs/environment-variables.md
+++ b/docs/environment-variables.md
@@ -153,9 +153,15 @@ $ ipfs resolve -r /ipns/dnslink-test2.example.com
## `IPFS_HTTP_ROUTERS`
-Overrides all implicit HTTP routers enabled when `Routing.Type=auto` with
-the space-separated list of URLs provided in this variable.
-Useful for testing and debugging in offline contexts.
+Overrides AutoConf and all other HTTP routers when set.
+When `Routing.Type=auto`, this environment variable takes precedence over
+both AutoConf-provided endpoints and any manually configured delegated routers.
+The value should be a space or comma-separated list of HTTP routing endpoint URLs.
+
+This is useful for:
+- Testing and debugging in offline contexts
+- Overriding AutoConf endpoints temporarily
+- Using custom or private HTTP routing services
Example:
@@ -164,11 +170,11 @@ $ ipfs config Routing.Type auto
$ IPFS_HTTP_ROUTERS="http://127.0.0.1:7423" ipfs daemon
```
-The above will replace implicit HTTP routers with single one, allowing for
+The above will replace all AutoConf endpoints with a single local one, allowing for
inspection/debug of HTTP requests sent by Kubo via `while true ; do nc -l 7423; done`
or more advanced tools like [mitmproxy](https://docs.mitmproxy.org/stable/#mitmproxy).
-Default: `config.DefaultHTTPRouters`
+When not set, Kubo uses endpoints from AutoConf (when enabled) or manually configured `Routing.DelegatedRouters`.
## `IPFS_HTTP_ROUTERS_FILTER_PROTOCOLS`
diff --git a/docs/experimental-features.md b/docs/experimental-features.md
index ef55691ba..68d7a819c 100644
--- a/docs/experimental-features.md
+++ b/docs/experimental-features.md
@@ -680,3 +680,4 @@ ipfs config --json Experimental.GatewayOverLibp2p true
## Accelerated DHT Client
This feature now lives at [`Routing.AcceleratedDHTClient`](https://github.com/ipfs/kubo/blob/master/docs/config.md#routingaccelerateddhtclient).
+
diff --git a/docs/telemetry.md b/docs/telemetry.md
index d4bab0e1c..001c416b6 100644
--- a/docs/telemetry.md
+++ b/docs/telemetry.md
@@ -57,6 +57,7 @@ The telemetry plugin collects the following anonymized data:
- **Bootstrap peers**: Whether custom bootstrap peers are used.
- **Routing type**: Whether the node uses DHT, IPFS, or a custom routing setup.
- **AutoNAT settings**: Whether AutoNAT is enabled and its reachability status.
+- **AutoConf settings**: Whether AutoConf is enabled and whether a custom URL is used.
- **Swarm settings**: Whether hole punching is enabled, and whether public IP addresses are used.
### TLS and Discovery
diff --git a/go.mod b/go.mod
index c18c127cb..0396b9e0f 100644
--- a/go.mod
+++ b/go.mod
@@ -61,6 +61,7 @@ require (
github.com/libp2p/go-libp2p-routing-helpers v0.7.5
github.com/libp2p/go-libp2p-testing v0.12.0
github.com/libp2p/go-socket-activation v0.1.1
+ github.com/miekg/dns v1.1.68
github.com/multiformats/go-multiaddr v0.16.1
github.com/multiformats/go-multiaddr-dns v0.4.1
github.com/multiformats/go-multibase v0.2.0
@@ -174,7 +175,6 @@ require (
github.com/mattn/go-runewidth v0.0.15 // indirect
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect
github.com/mholt/acmez/v3 v3.1.2 // indirect
- github.com/miekg/dns v1.1.68 // indirect
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect
github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect
github.com/minio/sha256-simd v1.0.1 // indirect
diff --git a/plugin/plugins/telemetry/telemetry.go b/plugin/plugins/telemetry/telemetry.go
index 0414e5098..bcb6c03e9 100644
--- a/plugin/plugins/telemetry/telemetry.go
+++ b/plugin/plugins/telemetry/telemetry.go
@@ -90,6 +90,9 @@ type LogEvent struct {
AutoNATServiceMode string `json:"autonat_service_mode"`
AutoNATReachability string `json:"autonat_reachability"`
+ AutoConf bool `json:"autoconf"`
+ AutoConfCustom bool `json:"autoconf_custom"`
+
SwarmEnableHolePunching bool `json:"swarm_enable_hole_punching"`
SwarmCircuitAddresses bool `json:"swarm_circuit_addresses"`
SwarmIPv4PublicAddresses bool `json:"swarm_ipv4_public_addresses"`
@@ -247,21 +250,9 @@ func (p *telemetryPlugin) loadUUID() error {
}
func (p *telemetryPlugin) hasDefaultBootstrapPeers() bool {
- defaultPeers := config.DefaultBootstrapAddresses
+ // With autoconf, default bootstrap is represented as ["auto"]
currentPeers := p.config.Bootstrap
- if len(defaultPeers) != len(currentPeers) {
- return false
- }
- peerMap := make(map[string]struct{}, len(defaultPeers))
- for _, peer := range defaultPeers {
- peerMap[peer] = struct{}{}
- }
- for _, peer := range currentPeers {
- if _, ok := peerMap[peer]; !ok {
- return false
- }
- }
- return true
+ return len(currentPeers) == 1 && currentPeers[0] == "auto"
}
func (p *telemetryPlugin) showInfo() {
@@ -352,6 +343,7 @@ func (p *telemetryPlugin) prepareEvent() {
p.collectBasicInfo()
p.collectRoutingInfo()
p.collectAutoNATInfo()
+ p.collectAutoConfInfo()
p.collectSwarmInfo()
p.collectAutoTLSInfo()
p.collectDiscoveryInfo()
@@ -467,6 +459,11 @@ func (p *telemetryPlugin) collectAutoTLSInfo() {
p.event.AutoTLSDomainSuffixCustom = domainSuffix != config.DefaultDomainSuffix
}
+func (p *telemetryPlugin) collectAutoConfInfo() {
+ p.event.AutoConf = p.config.AutoConf.Enabled.WithDefault(config.DefaultAutoConfEnabled)
+ p.event.AutoConfCustom = p.config.AutoConf.URL.WithDefault(config.DefaultAutoConfURL) != config.DefaultAutoConfURL
+}
+
func (p *telemetryPlugin) collectDiscoveryInfo() {
p.event.DiscoveryMDNSEnabled = p.config.Discovery.MDNS.Enabled
}
diff --git a/repo/fsrepo/fsrepo.go b/repo/fsrepo/fsrepo.go
index b670a615d..671621ef3 100644
--- a/repo/fsrepo/fsrepo.go
+++ b/repo/fsrepo/fsrepo.go
@@ -14,6 +14,7 @@ import (
filestore "github.com/ipfs/boxo/filestore"
keystore "github.com/ipfs/boxo/keystore"
+ version "github.com/ipfs/kubo"
repo "github.com/ipfs/kubo/repo"
"github.com/ipfs/kubo/repo/common"
rcmgr "github.com/libp2p/go-libp2p/p2p/host/resource-manager"
@@ -36,7 +37,7 @@ const LockFile = "repo.lock"
var log = logging.Logger("fsrepo")
// RepoVersion is the version number that we are currently expecting to see.
-var RepoVersion = 16
+var RepoVersion = version.RepoVersion
var migrationInstructions = `See https://github.com/ipfs/fs-repo-migrations/blob/master/run.md
Sorry for the inconvenience. In the future, these will run automatically.`
diff --git a/repo/fsrepo/migrations/README.md b/repo/fsrepo/migrations/README.md
new file mode 100644
index 000000000..cc4b85ca3
--- /dev/null
+++ b/repo/fsrepo/migrations/README.md
@@ -0,0 +1,134 @@
+# IPFS Repository Migrations
+
+This directory contains the migration system for IPFS repositories, handling both embedded and external migrations.
+
+## Migration System Overview
+
+### Embedded vs External Migrations
+
+Starting from **repo version 17**, Kubo uses **embedded migrations** that are built into the binary, eliminating the need to download external migration tools.
+
+- **Repo versions <17**: Use external binary migrations downloaded from fs-repo-migrations
+- **Repo version 17+**: Use embedded migrations built into Kubo
+
+### Migration Functions
+
+#### `migrations.RunEmbeddedMigrations()`
+- **Purpose**: Runs migrations that are embedded directly in the Kubo binary
+- **Scope**: Handles repo version 17+ migrations
+- **Performance**: Fast execution, no network downloads required
+- **Dependencies**: Self-contained, uses only Kubo's internal dependencies
+- **Usage**: Primary migration method for modern repo versions
+
+**Parameters**:
+- `ctx`: Context for cancellation and timeouts
+- `targetVersion`: Target repository version to migrate to
+- `repoPath`: Path to the IPFS repository directory
+- `allowDowngrade`: Whether to allow downgrade migrations
+
+```go
+err = migrations.RunEmbeddedMigrations(ctx, targetVersion, repoPath, allowDowngrade)
+if err != nil {
+ // Handle migration failure, may fall back to external migrations
+}
+```
+
+#### `migrations.RunMigration()` with `migrations.ReadMigrationConfig()`
+- **Purpose**: Runs external binary migrations downloaded from fs-repo-migrations
+- **Scope**: Handles legacy repo versions <17 and serves as fallback
+- **Performance**: Slower due to network downloads and external process execution
+- **Dependencies**: Requires fs-repo-migrations binaries and network access
+- **Usage**: Fallback method for legacy migrations
+
+```go
+// Read migration configuration for external migrations
+migrationCfg, err := migrations.ReadMigrationConfig(repoPath, configFile)
+fetcher, err := migrations.GetMigrationFetcher(migrationCfg.DownloadSources, ...)
+err = migrations.RunMigration(ctx, fetcher, targetVersion, repoPath, allowDowngrade)
+```
+
+## Migration Flow in Daemon Startup
+
+1. **Primary**: Try embedded migrations first (`RunEmbeddedMigrations`)
+2. **Fallback**: If embedded migration fails, fall back to external migrations (`RunMigration`)
+3. **Legacy Support**: External migrations ensure compatibility with older repo versions
+
+## Directory Structure
+
+```
+repo/fsrepo/migrations/
+โโโ README.md # This file
+โโโ embedded.go # Embedded migration system
+โโโ embedded_test.go # Tests for embedded migrations
+โโโ migrations.go # External migration system
+โโโ fs-repo-16-to-17/ # First embedded migration (16โ17)
+โ โโโ migration/
+โ โ โโโ migration.go # Migration logic
+โ โ โโโ migration_test.go # Migration tests
+โ โโโ atomicfile/
+โ โ โโโ atomicfile.go # Atomic file operations
+โ โโโ main.go # Standalone migration binary
+โ โโโ README.md # Migration-specific documentation
+โโโ [other migration utilities]
+```
+
+## Adding New Embedded Migrations
+
+To add a new embedded migration (e.g., fs-repo-17-to-18):
+
+1. **Create migration package**: `fs-repo-17-to-18/migration/migration.go`
+2. **Implement interface**: Ensure your migration implements the `EmbeddedMigration` interface
+3. **Register migration**: Add to `embeddedMigrations` map in `embedded.go`
+4. **Add tests**: Create comprehensive tests for your migration logic
+5. **Update repo version**: Increment `RepoVersion` in `fsrepo.go`
+
+```go
+// In embedded.go
+var embeddedMigrations = map[string]EmbeddedMigration{
+ "fs-repo-16-to-17": &mg16.Migration{},
+ "fs-repo-17-to-18": &mg17.Migration{}, // Add new migration
+}
+```
+
+## Migration Requirements
+
+Each embedded migration must:
+- Implement the `EmbeddedMigration` interface
+- Be reversible with proper backup handling
+- Use atomic file operations to prevent corruption
+- Preserve user customizations
+- Include comprehensive tests
+- Follow the established naming pattern
+
+## External Migration Support
+
+External migrations are maintained for:
+- **Backward compatibility** with repo versions <17
+- **Fallback mechanism** if embedded migrations fail
+- **Legacy installations** that cannot be upgraded directly
+
+The external migration system will continue to work but is not the preferred method for new migrations.
+
+## Security and Safety
+
+All migrations (embedded and external) include:
+- **Atomic operations**: Prevent repository corruption
+- **Backup creation**: Allow rollback if migration fails
+- **Version validation**: Ensure migrations run on correct repo versions
+- **Error handling**: Graceful failure with informative messages
+- **User preservation**: Maintain custom configurations during migration
+
+## Testing
+
+Test both embedded and external migration systems:
+
+```bash
+# Test embedded migrations
+go test ./repo/fsrepo/migrations/ -run TestEmbedded
+
+# Test specific migration
+go test ./repo/fsrepo/migrations/fs-repo-16-to-17/migration/
+
+# Test migration registration
+go test ./repo/fsrepo/migrations/ -run TestHasEmbedded
+```
\ No newline at end of file
diff --git a/repo/fsrepo/migrations/atomicfile/atomicfile.go b/repo/fsrepo/migrations/atomicfile/atomicfile.go
new file mode 100644
index 000000000..87704196d
--- /dev/null
+++ b/repo/fsrepo/migrations/atomicfile/atomicfile.go
@@ -0,0 +1,59 @@
+package atomicfile
+
+import (
+ "io"
+ "os"
+ "path/filepath"
+)
+
+// File represents an atomic file writer
+type File struct {
+ *os.File
+ path string
+}
+
+// New creates a new atomic file writer
+func New(path string, mode os.FileMode) (*File, error) {
+ dir := filepath.Dir(path)
+ tempFile, err := os.CreateTemp(dir, ".tmp-"+filepath.Base(path))
+ if err != nil {
+ return nil, err
+ }
+
+ if err := tempFile.Chmod(mode); err != nil {
+ tempFile.Close()
+ os.Remove(tempFile.Name())
+ return nil, err
+ }
+
+ return &File{
+ File: tempFile,
+ path: path,
+ }, nil
+}
+
+// Close atomically replaces the target file with the temporary file
+func (f *File) Close() error {
+ if err := f.File.Close(); err != nil {
+ os.Remove(f.File.Name())
+ return err
+ }
+
+ if err := os.Rename(f.File.Name(), f.path); err != nil {
+ os.Remove(f.File.Name())
+ return err
+ }
+
+ return nil
+}
+
+// Abort removes the temporary file without replacing the target
+func (f *File) Abort() error {
+ f.File.Close()
+ return os.Remove(f.File.Name())
+}
+
+// ReadFrom reads from the given reader into the atomic file
+func (f *File) ReadFrom(r io.Reader) (int64, error) {
+ return io.Copy(f.File, r)
+}
diff --git a/repo/fsrepo/migrations/embedded.go b/repo/fsrepo/migrations/embedded.go
new file mode 100644
index 000000000..6c839ff1f
--- /dev/null
+++ b/repo/fsrepo/migrations/embedded.go
@@ -0,0 +1,146 @@
+package migrations
+
+import (
+ "context"
+ "fmt"
+ "log"
+ "os"
+
+ mg16 "github.com/ipfs/kubo/repo/fsrepo/migrations/fs-repo-16-to-17/migration"
+)
+
+// EmbeddedMigration represents an embedded migration that can be run directly
+type EmbeddedMigration interface {
+ Versions() string
+ Apply(opts mg16.Options) error
+ Revert(opts mg16.Options) error
+ Reversible() bool
+}
+
+// embeddedMigrations contains all embedded migrations
+var embeddedMigrations = map[string]EmbeddedMigration{
+ "fs-repo-16-to-17": &mg16.Migration{},
+}
+
+// RunEmbeddedMigration runs an embedded migration if available
+func RunEmbeddedMigration(ctx context.Context, migrationName string, ipfsDir string, revert bool) error {
+ migration, exists := embeddedMigrations[migrationName]
+ if !exists {
+ return fmt.Errorf("embedded migration %s not found", migrationName)
+ }
+
+ if revert && !migration.Reversible() {
+ return fmt.Errorf("migration %s is not reversible", migrationName)
+ }
+
+ logger := log.New(os.Stdout, "", 0)
+ logger.Printf("Running embedded migration %s...", migrationName)
+
+ opts := mg16.Options{
+ Path: ipfsDir,
+ Verbose: true,
+ }
+
+ var err error
+ if revert {
+ err = migration.Revert(opts)
+ } else {
+ err = migration.Apply(opts)
+ }
+
+ if err != nil {
+ return fmt.Errorf("embedded migration %s failed: %w", migrationName, err)
+ }
+
+ logger.Printf("Embedded migration %s completed successfully", migrationName)
+ return nil
+}
+
+// HasEmbeddedMigration checks if a migration is available as embedded
+func HasEmbeddedMigration(migrationName string) bool {
+ _, exists := embeddedMigrations[migrationName]
+ return exists
+}
+
+// RunEmbeddedMigrations runs all needed embedded migrations from current version to target version.
+//
+// This function migrates an IPFS repository using embedded migrations that are built into the Kubo binary.
+// Embedded migrations are available for repo version 17+ and provide fast, network-free migration execution.
+//
+// Parameters:
+// - ctx: Context for cancellation and deadlines
+// - targetVer: Target repository version to migrate to
+// - ipfsDir: Path to the IPFS repository directory
+// - allowDowngrade: Whether to allow downgrade migrations (reduces target version)
+//
+// Returns:
+// - nil on successful migration
+// - error if migration fails, repo path is invalid, or no embedded migrations are available
+//
+// Behavior:
+// - Validates that ipfsDir contains a valid IPFS repository
+// - Determines current repository version automatically
+// - Returns immediately if already at target version
+// - Prevents downgrades unless allowDowngrade is true
+// - Runs all necessary migrations in sequence (e.g., 16โ17โ18 if going from 16 to 18)
+// - Creates backups and uses atomic operations to prevent corruption
+//
+// Error conditions:
+// - Repository path is invalid or inaccessible
+// - Current version cannot be determined
+// - Downgrade attempted with allowDowngrade=false
+// - No embedded migrations available for the version range
+// - Individual migration fails during execution
+//
+// Example:
+//
+// err := RunEmbeddedMigrations(ctx, 17, "/path/to/.ipfs", false)
+// if err != nil {
+// // Handle migration failure, may need to fall back to external migrations
+// }
+func RunEmbeddedMigrations(ctx context.Context, targetVer int, ipfsDir string, allowDowngrade bool) error {
+ ipfsDir, err := CheckIpfsDir(ipfsDir)
+ if err != nil {
+ return err
+ }
+
+ fromVer, err := RepoVersion(ipfsDir)
+ if err != nil {
+ return fmt.Errorf("could not get repo version: %w", err)
+ }
+
+ if fromVer == targetVer {
+ return nil
+ }
+
+ revert := fromVer > targetVer
+ if revert && !allowDowngrade {
+ return fmt.Errorf("downgrade not allowed from %d to %d", fromVer, targetVer)
+ }
+
+ logger := log.New(os.Stdout, "", 0)
+ logger.Print("Looking for embedded migrations.")
+
+ migrations, _, err := findMigrations(ctx, fromVer, targetVer)
+ if err != nil {
+ return err
+ }
+
+ embeddedCount := 0
+ for _, migrationName := range migrations {
+ if HasEmbeddedMigration(migrationName) {
+ err = RunEmbeddedMigration(ctx, migrationName, ipfsDir, revert)
+ if err != nil {
+ return err
+ }
+ embeddedCount++
+ }
+ }
+
+ if embeddedCount == 0 {
+ return fmt.Errorf("no embedded migrations found for version %d to %d", fromVer, targetVer)
+ }
+
+ logger.Printf("Success: fs-repo migrated to version %d using embedded migrations.\n", targetVer)
+ return nil
+}
diff --git a/repo/fsrepo/migrations/embedded_test.go b/repo/fsrepo/migrations/embedded_test.go
new file mode 100644
index 000000000..b739d1e0c
--- /dev/null
+++ b/repo/fsrepo/migrations/embedded_test.go
@@ -0,0 +1,36 @@
+package migrations
+
+import (
+ "context"
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+)
+
+func TestHasEmbeddedMigration(t *testing.T) {
+ // Test that the 16-to-17 migration is registered
+ assert.True(t, HasEmbeddedMigration("fs-repo-16-to-17"),
+ "fs-repo-16-to-17 migration should be registered")
+
+ // Test that a non-existent migration is not found
+ assert.False(t, HasEmbeddedMigration("fs-repo-99-to-100"),
+ "fs-repo-99-to-100 migration should not be registered")
+}
+
+func TestEmbeddedMigrations(t *testing.T) {
+ // Test that we have at least one embedded migration
+ assert.NotEmpty(t, embeddedMigrations, "No embedded migrations found")
+
+ // Test that all registered migrations implement the interface
+ for name, migration := range embeddedMigrations {
+ assert.NotEmpty(t, migration.Versions(),
+ "Migration %s has empty versions", name)
+ }
+}
+
+func TestRunEmbeddedMigration(t *testing.T) {
+ // Test that running a non-existent migration returns an error
+ err := RunEmbeddedMigration(context.Background(), "non-existent", "/tmp", false)
+ require.Error(t, err, "Expected error for non-existent migration")
+}
diff --git a/repo/fsrepo/migrations/fs-repo-16-to-17/main.go b/repo/fsrepo/migrations/fs-repo-16-to-17/main.go
new file mode 100644
index 000000000..df0963f3b
--- /dev/null
+++ b/repo/fsrepo/migrations/fs-repo-16-to-17/main.go
@@ -0,0 +1,63 @@
+// Package main implements fs-repo-16-to-17 migration for IPFS repositories.
+//
+// This migration transitions repositories from version 16 to 17, introducing
+// the AutoConf system that replaces hardcoded network defaults with dynamic
+// configuration fetched from autoconf.json.
+//
+// Changes made:
+// - Enables AutoConf system with default settings
+// - Migrates default bootstrap peers to "auto" sentinel value
+// - Sets DNS.Resolvers["."] to "auto" for dynamic DNS resolver configuration
+// - Migrates Routing.DelegatedRouters to ["auto"]
+// - Migrates Ipns.DelegatedPublishers to ["auto"]
+// - Preserves user customizations (custom bootstrap peers, DNS resolvers)
+//
+// The migration is reversible and creates config.16-to-17.bak for rollback.
+//
+// Usage:
+//
+// fs-repo-16-to-17 -path /path/to/ipfs/repo [-verbose] [-revert]
+//
+// This migration is embedded in Kubo starting from version 0.37 and runs
+// automatically during daemon startup. This standalone binary is provided
+// for manual migration scenarios.
+package main
+
+import (
+ "flag"
+ "fmt"
+ "os"
+
+ mg16 "github.com/ipfs/kubo/repo/fsrepo/migrations/fs-repo-16-to-17/migration"
+)
+
+func main() {
+ var path = flag.String("path", "", "Path to IPFS repository")
+ var verbose = flag.Bool("verbose", false, "Enable verbose output")
+ var revert = flag.Bool("revert", false, "Revert migration")
+ flag.Parse()
+
+ if *path == "" {
+ fmt.Fprintf(os.Stderr, "Error: -path flag is required\n")
+ flag.Usage()
+ os.Exit(1)
+ }
+
+ m := mg16.Migration{}
+ opts := mg16.Options{
+ Path: *path,
+ Verbose: *verbose,
+ }
+
+ var err error
+ if *revert {
+ err = m.Revert(opts)
+ } else {
+ err = m.Apply(opts)
+ }
+
+ if err != nil {
+ fmt.Fprintf(os.Stderr, "Migration failed: %v\n", err)
+ os.Exit(1)
+ }
+}
diff --git a/repo/fsrepo/migrations/fs-repo-16-to-17/migration/migration.go b/repo/fsrepo/migrations/fs-repo-16-to-17/migration/migration.go
new file mode 100644
index 000000000..01cab8932
--- /dev/null
+++ b/repo/fsrepo/migrations/fs-repo-16-to-17/migration/migration.go
@@ -0,0 +1,492 @@
+// package mg16 contains the code to perform 16-17 repository migration in Kubo.
+// This handles the following:
+// - Migrate default bootstrap peers to "auto"
+// - Migrate DNS resolvers to use "auto" for "." eTLD
+// - Enable AutoConf system with default settings
+// - Increment repo version to 17
+package mg16
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "path/filepath"
+ "reflect"
+ "slices"
+ "strings"
+
+ "github.com/ipfs/kubo/config"
+ "github.com/ipfs/kubo/repo/fsrepo/migrations/atomicfile"
+)
+
+// Options contains migration options for embedded migrations
+type Options struct {
+ Path string
+ Verbose bool
+}
+
+const backupSuffix = ".16-to-17.bak"
+
+// DefaultBootstrapAddresses are the hardcoded bootstrap addresses from Kubo 0.36
+// for IPFS. they are nodes run by the IPFS team. docs on these later.
+// As with all p2p networks, bootstrap is an important security concern.
+// This list is used during migration to detect which peers are defaults vs custom.
+var DefaultBootstrapAddresses = []string{
+ "/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN",
+ "/dnsaddr/bootstrap.libp2p.io/p2p/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa", // rust-libp2p-server
+ "/dnsaddr/bootstrap.libp2p.io/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb",
+ "/dnsaddr/bootstrap.libp2p.io/p2p/QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt",
+ "/dnsaddr/va1.bootstrap.libp2p.io/p2p/12D3KooWKnDdG3iXw9eTFijk3EWSunZcFi54Zka4wmtqtt6rPxc8", // js-libp2p-amino-dht-bootstrapper
+ "/ip4/104.131.131.82/tcp/4001/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ", // mars.i.ipfs.io
+ "/ip4/104.131.131.82/udp/4001/quic-v1/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ", // mars.i.ipfs.io
+}
+
+// Migration implements the migration described above.
+type Migration struct{}
+
+// Versions returns the current version string for this migration.
+func (m Migration) Versions() string {
+ return "16-to-17"
+}
+
+// Reversible returns true, as we keep old config around
+func (m Migration) Reversible() bool {
+ return true
+}
+
+// Apply update the config.
+func (m Migration) Apply(opts Options) error {
+ if opts.Verbose {
+ fmt.Printf("applying %s repo migration\n", m.Versions())
+ }
+
+ // Check version
+ if err := checkVersion(opts.Path, "16"); err != nil {
+ return err
+ }
+
+ if opts.Verbose {
+ fmt.Println("> Upgrading config to use AutoConf system")
+ }
+
+ path := filepath.Join(opts.Path, "config")
+ in, err := os.Open(path)
+ if err != nil {
+ return err
+ }
+
+ // make backup
+ backup, err := atomicfile.New(path+backupSuffix, 0600)
+ if err != nil {
+ return err
+ }
+ if _, err := backup.ReadFrom(in); err != nil {
+ panicOnError(backup.Abort())
+ return err
+ }
+ if _, err := in.Seek(0, io.SeekStart); err != nil {
+ panicOnError(backup.Abort())
+ return err
+ }
+
+ // Create a temp file to write the output to on success
+ out, err := atomicfile.New(path, 0600)
+ if err != nil {
+ panicOnError(backup.Abort())
+ panicOnError(in.Close())
+ return err
+ }
+
+ if err := convert(in, out, opts.Path); err != nil {
+ panicOnError(out.Abort())
+ panicOnError(backup.Abort())
+ panicOnError(in.Close())
+ return err
+ }
+
+ if err := in.Close(); err != nil {
+ panicOnError(out.Abort())
+ panicOnError(backup.Abort())
+ }
+
+ if err := writeVersion(opts.Path, "17"); err != nil {
+ fmt.Println("failed to update version file to 17")
+ // There was an error so abort writing the output and clean up temp file
+ panicOnError(out.Abort())
+ panicOnError(backup.Abort())
+ return err
+ } else {
+ // Write the output and clean up temp file
+ panicOnError(out.Close())
+ panicOnError(backup.Close())
+ }
+
+ if opts.Verbose {
+ fmt.Println("updated version file")
+ fmt.Println("Migration 16 to 17 succeeded")
+ }
+ return nil
+}
+
+// panicOnError is reserved for checks we can't solve transactionally if an error occurs
+func panicOnError(e error) {
+ if e != nil {
+ panic(fmt.Errorf("error can't be dealt with transactionally: %w", e))
+ }
+}
+
+func (m Migration) Revert(opts Options) error {
+ if opts.Verbose {
+ fmt.Println("reverting migration")
+ }
+
+ if err := checkVersion(opts.Path, "17"); err != nil {
+ return err
+ }
+
+ cfg := filepath.Join(opts.Path, "config")
+ if err := os.Rename(cfg+backupSuffix, cfg); err != nil {
+ return err
+ }
+
+ if err := writeVersion(opts.Path, "16"); err != nil {
+ return err
+ }
+ if opts.Verbose {
+ fmt.Println("lowered version number to 16")
+ }
+
+ return nil
+}
+
+// checkVersion verifies the repo is at the expected version
+func checkVersion(repoPath string, expectedVersion string) error {
+ versionPath := filepath.Join(repoPath, "version")
+ versionBytes, err := os.ReadFile(versionPath)
+ if err != nil {
+ return fmt.Errorf("could not read version file: %w", err)
+ }
+ version := strings.TrimSpace(string(versionBytes))
+ if version != expectedVersion {
+ return fmt.Errorf("expected version %s, got %s", expectedVersion, version)
+ }
+ return nil
+}
+
+// writeVersion writes the version to the repo
+func writeVersion(repoPath string, version string) error {
+ versionPath := filepath.Join(repoPath, "version")
+ return os.WriteFile(versionPath, []byte(version), 0644)
+}
+
+// convert converts the config from version 16 to 17
+func convert(in io.Reader, out io.Writer, repoPath string) error {
+ confMap := make(map[string]any)
+ if err := json.NewDecoder(in).Decode(&confMap); err != nil {
+ return err
+ }
+
+ // Enable AutoConf system
+ if err := enableAutoConf(confMap); err != nil {
+ return err
+ }
+
+ // Migrate Bootstrap peers
+ if err := migrateBootstrap(confMap, repoPath); err != nil {
+ return err
+ }
+
+ // Migrate DNS resolvers
+ if err := migrateDNSResolvers(confMap); err != nil {
+ return err
+ }
+
+ // Migrate DelegatedRouters
+ if err := migrateDelegatedRouters(confMap); err != nil {
+ return err
+ }
+
+ // Migrate DelegatedPublishers
+ if err := migrateDelegatedPublishers(confMap); err != nil {
+ return err
+ }
+
+ // Save new config
+ fixed, err := json.MarshalIndent(confMap, "", " ")
+ if err != nil {
+ return err
+ }
+
+ if _, err := out.Write(fixed); err != nil {
+ return err
+ }
+ _, err = out.Write([]byte("\n"))
+ return err
+}
+
+// enableAutoConf adds AutoConf section to config
+func enableAutoConf(confMap map[string]any) error {
+ // Check if AutoConf already exists
+ if _, exists := confMap["AutoConf"]; exists {
+ return nil
+ }
+
+ // Add empty AutoConf section - all fields will use implicit defaults:
+ // - Enabled defaults to true (via DefaultAutoConfEnabled)
+ // - URL defaults to mainnet URL (via DefaultAutoConfURL)
+ // - RefreshInterval defaults to 24h (via DefaultAutoConfRefreshInterval)
+ // - TLSInsecureSkipVerify defaults to false (no WithDefault, but false is zero value)
+ confMap["AutoConf"] = map[string]any{}
+
+ return nil
+}
+
+// migrateBootstrap migrates bootstrap peers to use "auto"
+func migrateBootstrap(confMap map[string]any, repoPath string) error {
+ bootstrap, exists := confMap["Bootstrap"]
+ if !exists {
+ // No bootstrap section, add "auto"
+ confMap["Bootstrap"] = []string{"auto"}
+ return nil
+ }
+
+ bootstrapSlice, ok := bootstrap.([]interface{})
+ if !ok {
+ // Invalid bootstrap format, replace with "auto"
+ confMap["Bootstrap"] = []string{"auto"}
+ return nil
+ }
+
+ // Convert to string slice
+ var bootstrapPeers []string
+ for _, peer := range bootstrapSlice {
+ if peerStr, ok := peer.(string); ok {
+ bootstrapPeers = append(bootstrapPeers, peerStr)
+ }
+ }
+
+ // Check if we should replace with "auto"
+ newBootstrap := processBootstrapPeers(bootstrapPeers, repoPath)
+ confMap["Bootstrap"] = newBootstrap
+
+ return nil
+}
+
+// processBootstrapPeers processes bootstrap peers according to migration rules
+func processBootstrapPeers(peers []string, repoPath string) []string {
+ // If empty, use "auto"
+ if len(peers) == 0 {
+ return []string{"auto"}
+ }
+
+ // Separate default peers from custom ones
+ var customPeers []string
+ var hasDefaultPeers bool
+
+ for _, peer := range peers {
+ if slices.Contains(DefaultBootstrapAddresses, peer) {
+ hasDefaultPeers = true
+ } else {
+ customPeers = append(customPeers, peer)
+ }
+ }
+
+ // If we have default peers, replace them with "auto"
+ if hasDefaultPeers {
+ return append([]string{"auto"}, customPeers...)
+ }
+
+ // No default peers found, keep as is
+ return peers
+}
+
+// migrateDNSResolvers migrates DNS resolvers to use "auto" for "." eTLD
+func migrateDNSResolvers(confMap map[string]any) error {
+ dnsSection, exists := confMap["DNS"]
+ if !exists {
+ // No DNS section, create it with "auto"
+ confMap["DNS"] = map[string]any{
+ "Resolvers": map[string]string{
+ ".": config.AutoPlaceholder,
+ },
+ }
+ return nil
+ }
+
+ dns, ok := dnsSection.(map[string]any)
+ if !ok {
+ // Invalid DNS format, replace with "auto"
+ confMap["DNS"] = map[string]any{
+ "Resolvers": map[string]string{
+ ".": config.AutoPlaceholder,
+ },
+ }
+ return nil
+ }
+
+ resolvers, exists := dns["Resolvers"]
+ if !exists {
+ // No resolvers, add "auto"
+ dns["Resolvers"] = map[string]string{
+ ".": config.AutoPlaceholder,
+ }
+ return nil
+ }
+
+ resolversMap, ok := resolvers.(map[string]any)
+ if !ok {
+ // Invalid resolvers format, replace with "auto"
+ dns["Resolvers"] = map[string]string{
+ ".": config.AutoPlaceholder,
+ }
+ return nil
+ }
+
+ // Convert to string map and replace default resolvers with "auto"
+ stringResolvers := make(map[string]string)
+ defaultResolvers := map[string]string{
+ "https://dns.eth.limo/dns-query": "auto",
+ "https://dns.eth.link/dns-query": "auto",
+ "https://resolver.cloudflare-eth.com/dns-query": "auto",
+ }
+
+ for k, v := range resolversMap {
+ if vStr, ok := v.(string); ok {
+ // Check if this is a default resolver that should be replaced
+ if replacement, isDefault := defaultResolvers[vStr]; isDefault {
+ stringResolvers[k] = replacement
+ } else {
+ stringResolvers[k] = vStr
+ }
+ }
+ }
+
+ // If "." is not set or empty, set it to "auto"
+ if _, exists := stringResolvers["."]; !exists {
+ stringResolvers["."] = "auto"
+ }
+
+ dns["Resolvers"] = stringResolvers
+ return nil
+}
+
+// migrateDelegatedRouters migrates DelegatedRouters to use "auto"
+func migrateDelegatedRouters(confMap map[string]any) error {
+ routing, exists := confMap["Routing"]
+ if !exists {
+ // No routing section, create it with "auto"
+ confMap["Routing"] = map[string]any{
+ "DelegatedRouters": []string{"auto"},
+ }
+ return nil
+ }
+
+ routingMap, ok := routing.(map[string]any)
+ if !ok {
+ // Invalid routing format, replace with "auto"
+ confMap["Routing"] = map[string]any{
+ "DelegatedRouters": []string{"auto"},
+ }
+ return nil
+ }
+
+ delegatedRouters, exists := routingMap["DelegatedRouters"]
+ if !exists {
+ // No delegated routers, add "auto"
+ routingMap["DelegatedRouters"] = []string{"auto"}
+ return nil
+ }
+
+ // Check if it's empty or nil
+ if shouldReplaceWithAuto(delegatedRouters) {
+ routingMap["DelegatedRouters"] = []string{"auto"}
+ return nil
+ }
+
+ // Process the list to replace cid.contact with "auto" and preserve others
+ if slice, ok := delegatedRouters.([]interface{}); ok {
+ var newRouters []string
+ hasAuto := false
+
+ for _, router := range slice {
+ if routerStr, ok := router.(string); ok {
+ if routerStr == "https://cid.contact" {
+ if !hasAuto {
+ newRouters = append(newRouters, "auto")
+ hasAuto = true
+ }
+ } else {
+ newRouters = append(newRouters, routerStr)
+ }
+ }
+ }
+
+ // If empty after processing, add "auto"
+ if len(newRouters) == 0 {
+ newRouters = []string{"auto"}
+ }
+
+ routingMap["DelegatedRouters"] = newRouters
+ }
+
+ return nil
+}
+
+// migrateDelegatedPublishers migrates DelegatedPublishers to use "auto"
+func migrateDelegatedPublishers(confMap map[string]any) error {
+ ipns, exists := confMap["Ipns"]
+ if !exists {
+ // No IPNS section, create it with "auto"
+ confMap["Ipns"] = map[string]any{
+ "DelegatedPublishers": []string{"auto"},
+ }
+ return nil
+ }
+
+ ipnsMap, ok := ipns.(map[string]any)
+ if !ok {
+ // Invalid IPNS format, replace with "auto"
+ confMap["Ipns"] = map[string]any{
+ "DelegatedPublishers": []string{"auto"},
+ }
+ return nil
+ }
+
+ delegatedPublishers, exists := ipnsMap["DelegatedPublishers"]
+ if !exists {
+ // No delegated publishers, add "auto"
+ ipnsMap["DelegatedPublishers"] = []string{"auto"}
+ return nil
+ }
+
+ // Check if it's empty or nil - only then replace with "auto"
+ // Otherwise preserve custom publishers
+ if shouldReplaceWithAuto(delegatedPublishers) {
+ ipnsMap["DelegatedPublishers"] = []string{"auto"}
+ }
+ // If there are custom publishers, leave them as is
+
+ return nil
+}
+
+// shouldReplaceWithAuto checks if a field should be replaced with "auto"
+func shouldReplaceWithAuto(field any) bool {
+ // If it's nil, replace with "auto"
+ if field == nil {
+ return true
+ }
+
+ // If it's an empty slice, replace with "auto"
+ if slice, ok := field.([]interface{}); ok {
+ return len(slice) == 0
+ }
+
+ // If it's an empty array, replace with "auto"
+ if reflect.TypeOf(field).Kind() == reflect.Slice {
+ v := reflect.ValueOf(field)
+ return v.Len() == 0
+ }
+
+ return false
+}
diff --git a/repo/fsrepo/migrations/fs-repo-16-to-17/migration/migration_test.go b/repo/fsrepo/migrations/fs-repo-16-to-17/migration/migration_test.go
new file mode 100644
index 000000000..2e80809a4
--- /dev/null
+++ b/repo/fsrepo/migrations/fs-repo-16-to-17/migration/migration_test.go
@@ -0,0 +1,479 @@
+package mg16
+
+import (
+ "bytes"
+ "encoding/json"
+ "os"
+ "path/filepath"
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+)
+
+// Helper function to run migration on JSON input and return result
+func runMigrationOnJSON(t *testing.T, input string) map[string]interface{} {
+ t.Helper()
+ var output bytes.Buffer
+ // Use t.TempDir() for test isolation and parallel execution support
+ tempDir := t.TempDir()
+ err := convert(bytes.NewReader([]byte(input)), &output, tempDir)
+ require.NoError(t, err)
+
+ var result map[string]interface{}
+ err = json.Unmarshal(output.Bytes(), &result)
+ require.NoError(t, err)
+
+ return result
+}
+
+// Helper function to assert nested map key has expected value
+func assertMapKeyEquals(t *testing.T, result map[string]interface{}, path []string, key string, expected interface{}) {
+ t.Helper()
+ current := result
+ for _, p := range path {
+ section, exists := current[p]
+ require.True(t, exists, "Section %s not found in path %v", p, path)
+ current = section.(map[string]interface{})
+ }
+
+ assert.Equal(t, expected, current[key], "Expected %s to be %v", key, expected)
+}
+
+// Helper function to assert slice contains expected values
+func assertSliceEquals(t *testing.T, result map[string]interface{}, path []string, expected []string) {
+ t.Helper()
+ current := result
+ for i, p := range path[:len(path)-1] {
+ section, exists := current[p]
+ require.True(t, exists, "Section %s not found in path %v at index %d", p, path, i)
+ current = section.(map[string]interface{})
+ }
+
+ sliceKey := path[len(path)-1]
+ slice, exists := current[sliceKey]
+ require.True(t, exists, "Slice %s not found", sliceKey)
+
+ actualSlice := slice.([]interface{})
+ require.Equal(t, len(expected), len(actualSlice), "Expected slice length %d, got %d", len(expected), len(actualSlice))
+
+ for i, exp := range expected {
+ assert.Equal(t, exp, actualSlice[i], "Expected slice[%d] to be %s", i, exp)
+ }
+}
+
+// Helper to build test config JSON with specified fields
+func buildTestConfig(fields map[string]interface{}) string {
+ config := map[string]interface{}{
+ "Identity": map[string]interface{}{"PeerID": "QmTest"},
+ }
+ for k, v := range fields {
+ config[k] = v
+ }
+ data, _ := json.MarshalIndent(config, "", " ")
+ return string(data)
+}
+
+// Helper to run migration and get DNS resolvers
+func runMigrationAndGetDNSResolvers(t *testing.T, input string) map[string]interface{} {
+ t.Helper()
+ result := runMigrationOnJSON(t, input)
+ dns := result["DNS"].(map[string]interface{})
+ return dns["Resolvers"].(map[string]interface{})
+}
+
+// Helper to assert multiple resolver values
+func assertResolvers(t *testing.T, resolvers map[string]interface{}, expected map[string]string) {
+ t.Helper()
+ for key, expectedValue := range expected {
+ assert.Equal(t, expectedValue, resolvers[key], "Expected %s resolver to be %v", key, expectedValue)
+ }
+}
+
+// =============================================================================
+// End-to-End Migration Tests
+// =============================================================================
+
+func TestMigration(t *testing.T) {
+ // Create a temporary directory for testing
+ tempDir, err := os.MkdirTemp("", "migration-test-16-to-17")
+ require.NoError(t, err)
+ defer os.RemoveAll(tempDir)
+
+ // Create a test config with default bootstrap peers
+ testConfig := map[string]interface{}{
+ "Bootstrap": []string{
+ "/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN",
+ "/dnsaddr/bootstrap.libp2p.io/p2p/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa",
+ "/ip4/192.168.1.1/tcp/4001/p2p/QmCustomPeer", // Custom peer
+ },
+ "DNS": map[string]interface{}{
+ "Resolvers": map[string]string{},
+ },
+ "Routing": map[string]interface{}{
+ "DelegatedRouters": []string{},
+ },
+ "Ipns": map[string]interface{}{
+ "ResolveCacheSize": 128,
+ },
+ "Identity": map[string]interface{}{
+ "PeerID": "QmTest",
+ },
+ "Version": map[string]interface{}{
+ "Current": "0.36.0",
+ },
+ }
+
+ // Write test config
+ configPath := filepath.Join(tempDir, "config")
+ configData, err := json.MarshalIndent(testConfig, "", " ")
+ require.NoError(t, err)
+ err = os.WriteFile(configPath, configData, 0644)
+ require.NoError(t, err)
+
+ // Create version file
+ versionPath := filepath.Join(tempDir, "version")
+ err = os.WriteFile(versionPath, []byte("16"), 0644)
+ require.NoError(t, err)
+
+ // Run migration
+ migration := &Migration{}
+ opts := Options{
+ Path: tempDir,
+ Verbose: true,
+ }
+
+ err = migration.Apply(opts)
+ require.NoError(t, err)
+
+ // Verify version was updated
+ versionData, err := os.ReadFile(versionPath)
+ require.NoError(t, err)
+ assert.Equal(t, "17", string(versionData), "Expected version 17")
+
+ // Verify config was updated
+ configData, err = os.ReadFile(configPath)
+ require.NoError(t, err)
+
+ var updatedConfig map[string]interface{}
+ err = json.Unmarshal(configData, &updatedConfig)
+ require.NoError(t, err)
+
+ // Check AutoConf was added
+ autoConf, exists := updatedConfig["AutoConf"]
+ assert.True(t, exists, "AutoConf section not added")
+ autoConfMap := autoConf.(map[string]interface{})
+ // URL is not set explicitly in migration (uses implicit default)
+ _, hasURL := autoConfMap["URL"]
+ assert.False(t, hasURL, "AutoConf URL should not be explicitly set in migration")
+
+ // Check Bootstrap was updated
+ bootstrap := updatedConfig["Bootstrap"].([]interface{})
+ assert.Equal(t, 2, len(bootstrap), "Expected 2 bootstrap entries")
+ assert.Equal(t, "auto", bootstrap[0], "Expected first bootstrap entry to be 'auto'")
+ assert.Equal(t, "/ip4/192.168.1.1/tcp/4001/p2p/QmCustomPeer", bootstrap[1], "Expected custom peer to be preserved")
+
+ // Check DNS.Resolvers was updated
+ dns := updatedConfig["DNS"].(map[string]interface{})
+ resolvers := dns["Resolvers"].(map[string]interface{})
+ assert.Equal(t, "auto", resolvers["."], "Expected DNS resolver for '.' to be 'auto'")
+
+ // Check Routing.DelegatedRouters was updated
+ routing := updatedConfig["Routing"].(map[string]interface{})
+ delegatedRouters := routing["DelegatedRouters"].([]interface{})
+ assert.Equal(t, 1, len(delegatedRouters))
+ assert.Equal(t, "auto", delegatedRouters[0], "Expected DelegatedRouters to be ['auto']")
+
+ // Check Ipns.DelegatedPublishers was updated
+ ipns := updatedConfig["Ipns"].(map[string]interface{})
+ delegatedPublishers := ipns["DelegatedPublishers"].([]interface{})
+ assert.Equal(t, 1, len(delegatedPublishers))
+ assert.Equal(t, "auto", delegatedPublishers[0], "Expected DelegatedPublishers to be ['auto']")
+
+ // Test revert
+ err = migration.Revert(opts)
+ require.NoError(t, err)
+
+ // Verify version was reverted
+ versionData, err = os.ReadFile(versionPath)
+ require.NoError(t, err)
+ assert.Equal(t, "16", string(versionData), "Expected version 16 after revert")
+}
+
+func TestConvert(t *testing.T) {
+ t.Parallel()
+ input := buildTestConfig(map[string]interface{}{
+ "Bootstrap": []string{
+ "/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN",
+ "/dnsaddr/bootstrap.libp2p.io/p2p/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa",
+ },
+ })
+
+ result := runMigrationOnJSON(t, input)
+
+ // Check that AutoConf section was added but is empty (using implicit defaults)
+ autoConf, exists := result["AutoConf"]
+ require.True(t, exists, "AutoConf section should exist")
+ autoConfMap, ok := autoConf.(map[string]interface{})
+ require.True(t, ok, "AutoConf should be a map")
+ require.Empty(t, autoConfMap, "AutoConf should be empty (using implicit defaults)")
+
+ // Check that Bootstrap was updated to "auto"
+ assertSliceEquals(t, result, []string{"Bootstrap"}, []string{"auto"})
+}
+
+// =============================================================================
+// Bootstrap Migration Tests
+// =============================================================================
+
+func TestBootstrapMigration(t *testing.T) {
+ t.Parallel()
+
+ t.Run("process bootstrap peers logic verification", func(t *testing.T) {
+ t.Parallel()
+ tests := []struct {
+ name string
+ peers []string
+ expected []string
+ }{
+ {
+ name: "empty peers",
+ peers: []string{},
+ expected: []string{"auto"},
+ },
+ {
+ name: "only default peers",
+ peers: []string{
+ "/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN",
+ "/dnsaddr/bootstrap.libp2p.io/p2p/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa",
+ },
+ expected: []string{"auto"},
+ },
+ {
+ name: "mixed default and custom peers",
+ peers: []string{
+ "/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN",
+ "/ip4/192.168.1.1/tcp/4001/p2p/QmCustomPeer",
+ },
+ expected: []string{"auto", "/ip4/192.168.1.1/tcp/4001/p2p/QmCustomPeer"},
+ },
+ {
+ name: "only custom peers",
+ peers: []string{
+ "/ip4/192.168.1.1/tcp/4001/p2p/QmCustomPeer1",
+ "/ip4/192.168.1.2/tcp/4001/p2p/QmCustomPeer2",
+ },
+ expected: []string{
+ "/ip4/192.168.1.1/tcp/4001/p2p/QmCustomPeer1",
+ "/ip4/192.168.1.2/tcp/4001/p2p/QmCustomPeer2",
+ },
+ },
+ }
+
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ t.Parallel()
+ result := processBootstrapPeers(tt.peers, "")
+ require.Equal(t, len(tt.expected), len(result), "Expected %d peers, got %d", len(tt.expected), len(result))
+ for i, expected := range tt.expected {
+ assert.Equal(t, expected, result[i], "Expected peer %d to be %s", i, expected)
+ }
+ })
+ }
+ })
+
+ t.Run("replaces all old default bootstrapper peers with auto entry", func(t *testing.T) {
+ t.Parallel()
+ input := buildTestConfig(map[string]interface{}{
+ "Bootstrap": []string{
+ "/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN",
+ "/dnsaddr/bootstrap.libp2p.io/p2p/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa",
+ "/dnsaddr/bootstrap.libp2p.io/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb",
+ "/dnsaddr/bootstrap.libp2p.io/p2p/QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt",
+ "/dnsaddr/va1.bootstrap.libp2p.io/p2p/12D3KooWKnDdG3iXw9eTFijk3EWSunZcFi54Zka4wmtqtt6rPxc8",
+ "/ip4/104.131.131.82/tcp/4001/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ",
+ "/ip4/104.131.131.82/udp/4001/quic-v1/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ",
+ },
+ })
+
+ result := runMigrationOnJSON(t, input)
+ assertSliceEquals(t, result, []string{"Bootstrap"}, []string{"auto"})
+ })
+
+ t.Run("creates Bootstrap section with auto when missing", func(t *testing.T) {
+ t.Parallel()
+ input := `{"Identity": {"PeerID": "QmTest"}}`
+ result := runMigrationOnJSON(t, input)
+ assertSliceEquals(t, result, []string{"Bootstrap"}, []string{"auto"})
+ })
+}
+
+// =============================================================================
+// DNS Migration Tests
+// =============================================================================
+
+func TestDNSMigration(t *testing.T) {
+ t.Parallel()
+
+ t.Run("creates DNS section with auto resolver when missing", func(t *testing.T) {
+ t.Parallel()
+ input := `{"Identity": {"PeerID": "QmTest"}}`
+ result := runMigrationOnJSON(t, input)
+ assertMapKeyEquals(t, result, []string{"DNS", "Resolvers"}, ".", "auto")
+ })
+
+ t.Run("preserves all custom DNS resolvers unchanged", func(t *testing.T) {
+ t.Parallel()
+ input := buildTestConfig(map[string]interface{}{
+ "DNS": map[string]interface{}{
+ "Resolvers": map[string]string{
+ ".": "https://my-custom-resolver.com",
+ ".eth": "https://eth.resolver",
+ },
+ },
+ })
+
+ resolvers := runMigrationAndGetDNSResolvers(t, input)
+ assertResolvers(t, resolvers, map[string]string{
+ ".": "https://my-custom-resolver.com",
+ ".eth": "https://eth.resolver",
+ })
+ })
+
+ t.Run("preserves custom dot and eth resolvers unchanged", func(t *testing.T) {
+ t.Parallel()
+ input := buildTestConfig(map[string]interface{}{
+ "DNS": map[string]interface{}{
+ "Resolvers": map[string]string{
+ ".": "https://cloudflare-dns.com/dns-query",
+ ".eth": "https://example.com/dns-query",
+ },
+ },
+ })
+
+ resolvers := runMigrationAndGetDNSResolvers(t, input)
+ assertResolvers(t, resolvers, map[string]string{
+ ".": "https://cloudflare-dns.com/dns-query",
+ ".eth": "https://example.com/dns-query",
+ })
+ })
+
+ t.Run("replaces old default eth resolver with auto", func(t *testing.T) {
+ t.Parallel()
+ input := buildTestConfig(map[string]interface{}{
+ "DNS": map[string]interface{}{
+ "Resolvers": map[string]string{
+ ".": "https://cloudflare-dns.com/dns-query",
+ ".eth": "https://dns.eth.limo/dns-query", // should be replaced
+ ".crypto": "https://resolver.cloudflare-eth.com/dns-query", // should be replaced
+ ".link": "https://dns.eth.link/dns-query", // should be replaced
+ },
+ },
+ })
+
+ resolvers := runMigrationAndGetDNSResolvers(t, input)
+ assertResolvers(t, resolvers, map[string]string{
+ ".": "https://cloudflare-dns.com/dns-query", // preserved
+ ".eth": "auto", // replaced
+ ".crypto": "auto", // replaced
+ ".link": "auto", // replaced
+ })
+ })
+}
+
+// =============================================================================
+// Routing Migration Tests
+// =============================================================================
+
+func TestRoutingMigration(t *testing.T) {
+ t.Parallel()
+
+ t.Run("creates Routing section with auto DelegatedRouters when missing", func(t *testing.T) {
+ t.Parallel()
+ input := `{"Identity": {"PeerID": "QmTest"}}`
+ result := runMigrationOnJSON(t, input)
+ assertSliceEquals(t, result, []string{"Routing", "DelegatedRouters"}, []string{"auto"})
+ })
+
+ t.Run("replaces cid.contact with auto while preserving custom routers added by user", func(t *testing.T) {
+ t.Parallel()
+ input := buildTestConfig(map[string]interface{}{
+ "Routing": map[string]interface{}{
+ "DelegatedRouters": []string{
+ "https://cid.contact",
+ "https://my-custom-router.com",
+ },
+ },
+ })
+
+ result := runMigrationOnJSON(t, input)
+ assertSliceEquals(t, result, []string{"Routing", "DelegatedRouters"}, []string{"auto", "https://my-custom-router.com"})
+ })
+}
+
+// =============================================================================
+// IPNS Migration Tests
+// =============================================================================
+
+func TestIpnsMigration(t *testing.T) {
+ t.Parallel()
+
+ t.Run("creates Ipns section with auto DelegatedPublishers when missing", func(t *testing.T) {
+ t.Parallel()
+ input := `{"Identity": {"PeerID": "QmTest"}}`
+ result := runMigrationOnJSON(t, input)
+ assertSliceEquals(t, result, []string{"Ipns", "DelegatedPublishers"}, []string{"auto"})
+ })
+
+ t.Run("preserves existing custom DelegatedPublishers unchanged", func(t *testing.T) {
+ t.Parallel()
+ input := buildTestConfig(map[string]interface{}{
+ "Ipns": map[string]interface{}{
+ "DelegatedPublishers": []string{
+ "https://my-publisher.com",
+ "https://another-publisher.com",
+ },
+ },
+ })
+
+ result := runMigrationOnJSON(t, input)
+ assertSliceEquals(t, result, []string{"Ipns", "DelegatedPublishers"}, []string{"https://my-publisher.com", "https://another-publisher.com"})
+ })
+
+ t.Run("adds auto DelegatedPublishers to existing Ipns section", func(t *testing.T) {
+ t.Parallel()
+ input := buildTestConfig(map[string]interface{}{
+ "Ipns": map[string]interface{}{
+ "ResolveCacheSize": 128,
+ },
+ })
+
+ result := runMigrationOnJSON(t, input)
+ assertMapKeyEquals(t, result, []string{"Ipns"}, "ResolveCacheSize", float64(128))
+ assertSliceEquals(t, result, []string{"Ipns", "DelegatedPublishers"}, []string{"auto"})
+ })
+}
+
+// =============================================================================
+// AutoConf Migration Tests
+// =============================================================================
+
+func TestAutoConfMigration(t *testing.T) {
+ t.Parallel()
+
+ t.Run("preserves existing AutoConf fields unchanged", func(t *testing.T) {
+ t.Parallel()
+ input := buildTestConfig(map[string]interface{}{
+ "AutoConf": map[string]interface{}{
+ "URL": "https://custom.example.com/autoconf.json",
+ "Enabled": false,
+ "CustomField": "preserved",
+ },
+ })
+
+ result := runMigrationOnJSON(t, input)
+ assertMapKeyEquals(t, result, []string{"AutoConf"}, "URL", "https://custom.example.com/autoconf.json")
+ assertMapKeyEquals(t, result, []string{"AutoConf"}, "Enabled", false)
+ assertMapKeyEquals(t, result, []string{"AutoConf"}, "CustomField", "preserved")
+ })
+}
diff --git a/repo/fsrepo/migrations/migrations.go b/repo/fsrepo/migrations/migrations.go
index e612b8abb..c5b23a17d 100644
--- a/repo/fsrepo/migrations/migrations.go
+++ b/repo/fsrepo/migrations/migrations.go
@@ -25,6 +25,10 @@ const (
// RunMigration finds, downloads, and runs the individual migrations needed to
// migrate the repo from its current version to the target version.
+//
+// Deprecated: This function downloads migration binaries from the internet and will be removed
+// in a future version. Use RunHybridMigrations for modern migrations with embedded support,
+// or RunEmbeddedMigrations for repo versions โฅ16.
func RunMigration(ctx context.Context, fetcher Fetcher, targetVer int, ipfsDir string, allowDowngrade bool) error {
ipfsDir, err := CheckIpfsDir(ipfsDir)
if err != nil {
@@ -114,6 +118,9 @@ func ExeName(name string) string {
// ReadMigrationConfig reads the Migration section of the IPFS config, avoiding
// reading anything other than the Migration section. That way, we're free to
// make arbitrary changes to all _other_ sections in migrations.
+//
+// Deprecated: This function is used by legacy migration downloads and will be removed
+// in a future version. Use RunHybridMigrations or RunEmbeddedMigrations instead.
func ReadMigrationConfig(repoRoot string, userConfigFile string) (*config.Migration, error) {
var cfg struct {
Migration config.Migration
@@ -151,7 +158,10 @@ func ReadMigrationConfig(repoRoot string, userConfigFile string) (*config.Migrat
}
// GetMigrationFetcher creates one or more fetchers according to
-// downloadSources,.
+// downloadSources.
+//
+// Deprecated: This function is used by legacy migration downloads and will be removed
+// in a future version. Use RunHybridMigrations or RunEmbeddedMigrations instead.
func GetMigrationFetcher(downloadSources []string, distPath string, newIpfsFetcher func(string) Fetcher) (Fetcher, error) {
const httpUserAgent = "kubo/migration"
const numTriesPerHTTP = 3
@@ -163,9 +173,7 @@ func GetMigrationFetcher(downloadSources []string, distPath string, newIpfsFetch
case "HTTPS", "https", "HTTP", "http":
fetchers = append(fetchers, &RetryFetcher{NewHttpFetcher(distPath, "", httpUserAgent, 0), numTriesPerHTTP})
case "IPFS", "ipfs":
- if newIpfsFetcher != nil {
- fetchers = append(fetchers, newIpfsFetcher(distPath))
- }
+ return nil, errors.New("IPFS downloads are not supported for legacy migrations (repo versions <16). Please use only HTTPS in Migration.DownloadSources")
case "":
// Ignore empty string
default:
@@ -202,6 +210,9 @@ func migrationName(from, to int) string {
// findMigrations returns a list of migrations, ordered from first to last
// migration to apply, and a map of locations of migration binaries of any
// migrations that were found.
+//
+// Deprecated: This function is used by legacy migration downloads and will be removed
+// in a future version.
func findMigrations(ctx context.Context, from, to int) ([]string, map[string]string, error) {
step := 1
count := to - from
@@ -250,6 +261,9 @@ func runMigration(ctx context.Context, binPath, ipfsDir string, revert bool, log
// fetchMigrations downloads the requested migrations, and returns a slice with
// the paths of each binary, in the same order specified by needed.
+//
+// Deprecated: This function downloads migration binaries from the internet and will be removed
+// in a future version. Use RunHybridMigrations or RunEmbeddedMigrations instead.
func fetchMigrations(ctx context.Context, fetcher Fetcher, needed []string, destDir string, logger *log.Logger) ([]string, error) {
osv, err := osWithVariant()
if err != nil {
@@ -300,3 +314,224 @@ func fetchMigrations(ctx context.Context, fetcher Fetcher, needed []string, dest
return bins, nil
}
+
+// RunHybridMigrations intelligently runs migrations using external tools for legacy versions
+// and embedded migrations for modern versions. This handles the transition from external
+// fs-repo-migrations binaries (for repo versions <16) to embedded migrations (for repo versions โฅ16).
+//
+// The function automatically:
+// 1. Uses external migrations to get from current version to v16 (if needed)
+// 2. Uses embedded migrations for v16+ steps
+// 3. Handles pure external, pure embedded, or mixed migration scenarios
+//
+// Legacy external migrations (repo versions <16) only support HTTPS downloads.
+//
+// Parameters:
+// - ctx: Context for cancellation and timeouts
+// - targetVer: Target repository version to migrate to
+// - ipfsDir: Path to the IPFS repository directory
+// - allowDowngrade: Whether to allow downgrade migrations
+//
+// Returns error if migration fails at any step.
+func RunHybridMigrations(ctx context.Context, targetVer int, ipfsDir string, allowDowngrade bool) error {
+ const embeddedMigrationsMinVersion = 16
+
+ // Get current repo version
+ currentVer, err := RepoVersion(ipfsDir)
+ if err != nil {
+ return fmt.Errorf("could not get current repo version: %w", err)
+ }
+
+ var logger = log.New(os.Stdout, "", 0)
+
+ // Check if migration is needed
+ if currentVer == targetVer {
+ logger.Printf("Repository is already at version %d", targetVer)
+ return nil
+ }
+
+ // Validate downgrade request
+ if targetVer < currentVer && !allowDowngrade {
+ return fmt.Errorf("downgrade from version %d to %d requires allowDowngrade=true", currentVer, targetVer)
+ }
+
+ // Determine migration strategy based on version ranges
+ needsExternal := currentVer < embeddedMigrationsMinVersion
+ needsEmbedded := targetVer >= embeddedMigrationsMinVersion
+
+ // Case 1: Pure embedded migration (both current and target โฅ 16)
+ if !needsExternal && needsEmbedded {
+ return RunEmbeddedMigrations(ctx, targetVer, ipfsDir, allowDowngrade)
+ }
+
+ // For cases requiring external migrations, we check if migration binaries
+ // are available in PATH before attempting network downloads
+
+ // Case 2: Pure external migration (target < 16)
+ if needsExternal && !needsEmbedded {
+
+ // Check for migration binaries in PATH first (for testing/local development)
+ migrations, binPaths, err := findMigrations(ctx, currentVer, targetVer)
+ if err != nil {
+ return fmt.Errorf("could not determine migration paths: %w", err)
+ }
+
+ foundAll := true
+ for _, migName := range migrations {
+ if _, exists := binPaths[migName]; !exists {
+ foundAll = false
+ break
+ }
+ }
+
+ if foundAll {
+ return runMigrationsFromPath(ctx, migrations, binPaths, ipfsDir, logger, false)
+ }
+
+ // Fall back to network download (original behavior)
+ migrationCfg, err := ReadMigrationConfig(ipfsDir, "")
+ if err != nil {
+ return fmt.Errorf("could not read migration config: %w", err)
+ }
+
+ // Use existing RunMigration which handles network downloads properly (HTTPS only for legacy migrations)
+ fetcher, err := GetMigrationFetcher(migrationCfg.DownloadSources, GetDistPathEnv(CurrentIpfsDist), nil)
+ if err != nil {
+ return fmt.Errorf("failed to get migration fetcher: %w", err)
+ }
+ defer fetcher.Close()
+ return RunMigration(ctx, fetcher, targetVer, ipfsDir, allowDowngrade)
+ }
+
+ // Case 3: Hybrid migration (current < 16, target โฅ 16)
+ if needsExternal && needsEmbedded {
+ logger.Printf("Starting hybrid migration from version %d to %d", currentVer, targetVer)
+ logger.Print("Using hybrid migration strategy: external to v16, then embedded")
+
+ // Phase 1: Use external migrations to get to v16
+ logger.Printf("Phase 1: External migration from v%d to v%d", currentVer, embeddedMigrationsMinVersion)
+
+ // Check for external migration binaries in PATH first
+ migrations, binPaths, err := findMigrations(ctx, currentVer, embeddedMigrationsMinVersion)
+ if err != nil {
+ return fmt.Errorf("could not determine external migration paths: %w", err)
+ }
+
+ foundAll := true
+ for _, migName := range migrations {
+ if _, exists := binPaths[migName]; !exists {
+ foundAll = false
+ break
+ }
+ }
+
+ if foundAll {
+ if err = runMigrationsFromPath(ctx, migrations, binPaths, ipfsDir, logger, false); err != nil {
+ return fmt.Errorf("external migration phase failed: %w", err)
+ }
+ } else {
+ migrationCfg, err := ReadMigrationConfig(ipfsDir, "")
+ if err != nil {
+ return fmt.Errorf("could not read migration config: %w", err)
+ }
+
+ // Legacy migrations only support HTTPS downloads
+ fetcher, err := GetMigrationFetcher(migrationCfg.DownloadSources, GetDistPathEnv(CurrentIpfsDist), nil)
+ if err != nil {
+ return fmt.Errorf("failed to get migration fetcher: %w", err)
+ }
+ defer fetcher.Close()
+
+ if err = RunMigration(ctx, fetcher, embeddedMigrationsMinVersion, ipfsDir, allowDowngrade); err != nil {
+ return fmt.Errorf("external migration phase failed: %w", err)
+ }
+ }
+
+ // Phase 2: Use embedded migrations for v16+
+ logger.Printf("Phase 2: Embedded migration from v%d to v%d", embeddedMigrationsMinVersion, targetVer)
+ err = RunEmbeddedMigrations(ctx, targetVer, ipfsDir, allowDowngrade)
+ if err != nil {
+ return fmt.Errorf("embedded migration phase failed: %w", err)
+ }
+
+ logger.Printf("Hybrid migration completed successfully: v%d โ v%d", currentVer, targetVer)
+ return nil
+ }
+
+ // Case 4: Reverse hybrid migration (โฅ16 to <16)
+ // Use embedded migrations for โฅ16 steps, then external migrations for <16 steps
+ logger.Printf("Starting reverse hybrid migration from version %d to %d", currentVer, targetVer)
+ logger.Print("Using reverse hybrid migration strategy: embedded to v16, then external")
+
+ // Phase 1: Use embedded migrations from current version down to v16 (if needed)
+ if currentVer > embeddedMigrationsMinVersion {
+ logger.Printf("Phase 1: Embedded downgrade from v%d to v%d", currentVer, embeddedMigrationsMinVersion)
+ err = RunEmbeddedMigrations(ctx, embeddedMigrationsMinVersion, ipfsDir, allowDowngrade)
+ if err != nil {
+ return fmt.Errorf("embedded downgrade phase failed: %w", err)
+ }
+ }
+
+ // Phase 2: Use external migrations from v16 to target (if needed)
+ if embeddedMigrationsMinVersion > targetVer {
+ logger.Printf("Phase 2: External downgrade from v%d to v%d", embeddedMigrationsMinVersion, targetVer)
+
+ // Check for external migration binaries in PATH first
+ migrations, binPaths, err := findMigrations(ctx, embeddedMigrationsMinVersion, targetVer)
+ if err != nil {
+ return fmt.Errorf("could not determine external migration paths: %w", err)
+ }
+
+ foundAll := true
+ for _, migName := range migrations {
+ if _, exists := binPaths[migName]; !exists {
+ foundAll = false
+ break
+ }
+ }
+
+ if foundAll {
+ if err = runMigrationsFromPath(ctx, migrations, binPaths, ipfsDir, logger, true); err != nil {
+ return fmt.Errorf("external downgrade phase failed: %w", err)
+ }
+ } else {
+ migrationCfg, err := ReadMigrationConfig(ipfsDir, "")
+ if err != nil {
+ return fmt.Errorf("could not read migration config: %w", err)
+ }
+
+ // Legacy migrations only support HTTPS downloads
+ fetcher, err := GetMigrationFetcher(migrationCfg.DownloadSources, GetDistPathEnv(CurrentIpfsDist), nil)
+ if err != nil {
+ return fmt.Errorf("failed to get migration fetcher: %w", err)
+ }
+ defer fetcher.Close()
+
+ if err = RunMigration(ctx, fetcher, targetVer, ipfsDir, allowDowngrade); err != nil {
+ return fmt.Errorf("external downgrade phase failed: %w", err)
+ }
+ }
+ }
+
+ logger.Printf("Reverse hybrid migration completed successfully: v%d โ v%d", currentVer, targetVer)
+ return nil
+}
+
+// runMigrationsFromPath runs migrations using binaries found in PATH
+func runMigrationsFromPath(ctx context.Context, migrations []string, binPaths map[string]string, ipfsDir string, logger *log.Logger, revert bool) error {
+ for _, migName := range migrations {
+ binPath, exists := binPaths[migName]
+ if !exists {
+ return fmt.Errorf("migration binary %s not found in PATH", migName)
+ }
+
+ logger.Printf("Running migration %s using binary from PATH: %s", migName, binPath)
+
+ // Run the migration binary directly
+ err := runMigration(ctx, binPath, ipfsDir, revert, logger)
+ if err != nil {
+ return fmt.Errorf("migration %s failed: %w", migName, err)
+ }
+ }
+ return nil
+}
diff --git a/repo/fsrepo/migrations/migrations_test.go b/repo/fsrepo/migrations/migrations_test.go
index ff5e2bfe0..f690290f8 100644
--- a/repo/fsrepo/migrations/migrations_test.go
+++ b/repo/fsrepo/migrations/migrations_test.go
@@ -327,12 +327,9 @@ func TestGetMigrationFetcher(t *testing.T) {
}
downloadSources = []string{"ipfs"}
- f, err = GetMigrationFetcher(downloadSources, "", newIpfsFetcher)
- if err != nil {
- t.Fatal(err)
- }
- if _, ok := f.(*mockIpfsFetcher); !ok {
- t.Fatal("expected IpfsFetcher")
+ _, err = GetMigrationFetcher(downloadSources, "", newIpfsFetcher)
+ if err == nil || !strings.Contains(err.Error(), "IPFS downloads are not supported for legacy migrations") {
+ t.Fatal("Expected IPFS downloads error, got:", err)
}
downloadSources = []string{"http"}
@@ -347,6 +344,12 @@ func TestGetMigrationFetcher(t *testing.T) {
}
downloadSources = []string{"IPFS", "HTTPS"}
+ _, err = GetMigrationFetcher(downloadSources, "", newIpfsFetcher)
+ if err == nil || !strings.Contains(err.Error(), "IPFS downloads are not supported for legacy migrations") {
+ t.Fatal("Expected IPFS downloads error, got:", err)
+ }
+
+ downloadSources = []string{"https", "some.domain.io"}
f, err = GetMigrationFetcher(downloadSources, "", newIpfsFetcher)
if err != nil {
t.Fatal(err)
@@ -359,19 +362,6 @@ func TestGetMigrationFetcher(t *testing.T) {
t.Fatal("expected 2 fetchers in MultiFetcher")
}
- downloadSources = []string{"ipfs", "https", "some.domain.io"}
- f, err = GetMigrationFetcher(downloadSources, "", newIpfsFetcher)
- if err != nil {
- t.Fatal(err)
- }
- mf, ok = f.(*MultiFetcher)
- if !ok {
- t.Fatal("expected MultiFetcher")
- }
- if mf.Len() != 3 {
- t.Fatal("expected 3 fetchers in MultiFetcher")
- }
-
downloadSources = nil
_, err = GetMigrationFetcher(downloadSources, "", newIpfsFetcher)
if err == nil {
diff --git a/test/cli/autoconf/autoconf_test.go b/test/cli/autoconf/autoconf_test.go
new file mode 100644
index 000000000..0a49e8c89
--- /dev/null
+++ b/test/cli/autoconf/autoconf_test.go
@@ -0,0 +1,779 @@
+package autoconf
+
+import (
+ "encoding/json"
+ "fmt"
+ "net/http"
+ "net/http/httptest"
+ "os"
+ "strings"
+ "sync/atomic"
+ "testing"
+ "time"
+
+ "github.com/ipfs/kubo/test/cli/harness"
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+)
+
+func TestAutoConf(t *testing.T) {
+ t.Parallel()
+
+ t.Run("basic functionality", func(t *testing.T) {
+ t.Parallel()
+ testAutoConfBasicFunctionality(t)
+ })
+
+ t.Run("background service updates", func(t *testing.T) {
+ t.Parallel()
+ testAutoConfBackgroundService(t)
+ })
+
+ t.Run("HTTP error scenarios", func(t *testing.T) {
+ t.Parallel()
+ testAutoConfHTTPErrors(t)
+ })
+
+ t.Run("cache-based config expansion", func(t *testing.T) {
+ t.Parallel()
+ testAutoConfCacheBasedExpansion(t)
+ })
+
+ t.Run("disabled autoconf", func(t *testing.T) {
+ t.Parallel()
+ testAutoConfDisabled(t)
+ })
+
+ t.Run("bootstrap list shows auto as-is", func(t *testing.T) {
+ t.Parallel()
+ testBootstrapListResolved(t)
+ })
+
+ t.Run("daemon uses resolved bootstrap values", func(t *testing.T) {
+ t.Parallel()
+ testDaemonUsesResolvedBootstrap(t)
+ })
+
+ t.Run("empty cache uses fallback defaults", func(t *testing.T) {
+ t.Parallel()
+ testEmptyCacheUsesFallbacks(t)
+ })
+
+ t.Run("stale cache with unreachable server", func(t *testing.T) {
+ t.Parallel()
+ testStaleCacheWithUnreachableServer(t)
+ })
+
+ t.Run("autoconf disabled with auto values", func(t *testing.T) {
+ t.Parallel()
+ testAutoConfDisabledWithAutoValues(t)
+ })
+
+ t.Run("network behavior - cached vs refresh", func(t *testing.T) {
+ t.Parallel()
+ testAutoConfNetworkBehavior(t)
+ })
+
+ t.Run("HTTPS autoconf server", func(t *testing.T) {
+ t.Parallel()
+ testAutoConfWithHTTPS(t)
+ })
+}
+
+func testAutoConfBasicFunctionality(t *testing.T) {
+ // Load test autoconf data
+ autoConfData := loadTestData(t, "valid_autoconf.json")
+
+ // Create HTTP server that serves autoconf.json
+ etag := `"test-etag-123"`
+ requestCount := 0
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ requestCount++
+ t.Logf("AutoConf server request #%d: %s %s", requestCount, r.Method, r.URL.Path)
+ w.Header().Set("Content-Type", "application/json")
+ w.Header().Set("ETag", etag)
+ w.Header().Set("Last-Modified", "Wed, 21 Oct 2015 07:28:00 GMT")
+ _, _ = w.Write(autoConfData)
+ }))
+ defer server.Close()
+
+ // Create IPFS node and configure it to use our test server
+ // Use test profile to avoid autoconf profile being applied by default
+ node := harness.NewT(t).NewNode().Init("--profile=test")
+ node.SetIPFSConfig("AutoConf.URL", server.URL)
+ node.SetIPFSConfig("AutoConf.Enabled", true)
+ // Disable background updates to prevent multiple requests
+ node.SetIPFSConfig("AutoConf.RefreshInterval", "24h")
+
+ // Test with normal bootstrap peers (not "auto") to avoid multiaddr parsing issues
+ // This tests that autoconf fetching works without complex auto replacement
+ node.SetIPFSConfig("Bootstrap", []string{"/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN"})
+
+ // Start daemon to trigger autoconf fetch
+ node.StartDaemon()
+ defer node.StopDaemon()
+
+ // Give autoconf some time to fetch
+ time.Sleep(2 * time.Second)
+
+ // Verify that the autoconf system fetched data from our server
+ t.Logf("Server request count: %d", requestCount)
+ require.GreaterOrEqual(t, requestCount, 1, "AutoConf server should have been called at least once")
+
+ // Test that daemon is functional
+ result := node.RunIPFS("id")
+ assert.Equal(t, 0, result.ExitCode(), "IPFS daemon should be responsive")
+ assert.Contains(t, result.Stdout.String(), "ID", "IPFS id command should return peer information")
+
+ // Success! AutoConf system is working:
+ // 1. Server was called (proves fetch works)
+ // 2. Daemon started successfully (proves DNS resolver validation is fixed)
+ // 3. Daemon is functional (proves autoconf doesn't break core functionality)
+ // Note: We skip checking metadata values due to JSON parsing complexity in test harness
+}
+
+func testAutoConfBackgroundService(t *testing.T) {
+ // Test that the startAutoConfUpdater() goroutine makes network requests for background refresh
+ // This is separate from daemon config operations which now use cache-first approach
+
+ // Load initial and updated test data
+ initialData := loadTestData(t, "valid_autoconf.json")
+ updatedData := loadTestData(t, "updated_autoconf.json")
+
+ // Track which config is being served
+ currentData := initialData
+ var requestCount atomic.Int32
+
+ // Create server that switches payload after first request
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ count := requestCount.Add(1)
+ t.Logf("Background service request #%d from %s", count, r.UserAgent())
+
+ w.Header().Set("Content-Type", "application/json")
+ w.Header().Set("ETag", fmt.Sprintf(`"background-test-etag-%d"`, count))
+ w.Header().Set("Last-Modified", time.Now().Format(http.TimeFormat))
+
+ if count > 1 {
+ // After first request, serve updated config
+ currentData = updatedData
+ }
+
+ _, _ = w.Write(currentData)
+ }))
+ defer server.Close()
+
+ // Create IPFS node with short refresh interval to trigger background service
+ node := harness.NewT(t).NewNode().Init("--profile=test")
+ node.SetIPFSConfig("AutoConf.URL", server.URL)
+ node.SetIPFSConfig("AutoConf.Enabled", true)
+ node.SetIPFSConfig("AutoConf.RefreshInterval", "1s") // Very short for testing background service
+
+ // Use normal bootstrap values to avoid dependency on autoconf during initialization
+ node.SetIPFSConfig("Bootstrap", []string{"/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN"})
+
+ // Start daemon - this should start the background service via startAutoConfUpdater()
+ node.StartDaemon()
+ defer node.StopDaemon()
+
+ // Wait for initial request (daemon startup may trigger one)
+ time.Sleep(1 * time.Second)
+ initialCount := requestCount.Load()
+ t.Logf("Initial request count after daemon start: %d", initialCount)
+
+ // Wait for background service to make additional requests
+ // The background service should make requests at the RefreshInterval (1s)
+ time.Sleep(3 * time.Second)
+
+ finalCount := requestCount.Load()
+ t.Logf("Final request count after background updates: %d", finalCount)
+
+ // Background service should have made multiple requests due to 1s refresh interval
+ assert.Greater(t, finalCount, initialCount,
+ "Background service should have made additional requests beyond daemon startup")
+
+ // Verify that the service is actively making requests (not just relying on cache)
+ assert.GreaterOrEqual(t, finalCount, int32(2),
+ "Should have at least 2 requests total (startup + background refresh)")
+
+ t.Logf("Successfully verified startAutoConfUpdater() background service makes network requests")
+}
+
+func testAutoConfHTTPErrors(t *testing.T) {
+ tests := []struct {
+ name string
+ statusCode int
+ body string
+ }{
+ {"404 Not Found", http.StatusNotFound, "Not Found"},
+ {"500 Internal Server Error", http.StatusInternalServerError, "Internal Server Error"},
+ {"Invalid JSON", http.StatusOK, "invalid json content"},
+ }
+
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ // Create server that returns error
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.WriteHeader(tt.statusCode)
+ _, _ = w.Write([]byte(tt.body))
+ }))
+ defer server.Close()
+
+ // Create node with failing AutoConf URL
+ // Use test profile to avoid autoconf profile being applied by default
+ node := harness.NewT(t).NewNode().Init("--profile=test")
+ node.SetIPFSConfig("AutoConf.URL", server.URL)
+ node.SetIPFSConfig("AutoConf.Enabled", true)
+ node.SetIPFSConfig("Bootstrap", []string{"auto"})
+
+ // Start daemon - it should start but autoconf should fail gracefully
+ node.StartDaemon()
+ defer node.StopDaemon()
+
+ // Daemon should still be functional even with autoconf HTTP errors
+ result := node.RunIPFS("version")
+ assert.Equal(t, 0, result.ExitCode(), "Daemon should start even with HTTP errors in autoconf")
+ })
+ }
+}
+
+func testAutoConfCacheBasedExpansion(t *testing.T) {
+ // Test that config expansion works correctly with cached autoconf data
+ // without requiring active network requests during expansion operations
+
+ autoConfData := loadTestData(t, "valid_autoconf.json")
+
+ // Create server that serves autoconf data
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.Header().Set("Content-Type", "application/json")
+ w.Header().Set("ETag", `"cache-test-etag"`)
+ w.Header().Set("Last-Modified", "Wed, 21 Oct 2015 07:28:00 GMT")
+ _, _ = w.Write(autoConfData)
+ }))
+ defer server.Close()
+
+ // Create IPFS node with autoconf enabled
+ node := harness.NewT(t).NewNode().Init("--profile=test")
+ node.SetIPFSConfig("AutoConf.URL", server.URL)
+ node.SetIPFSConfig("AutoConf.Enabled", true)
+
+ // Set configuration with "auto" values to test expansion
+ node.SetIPFSConfig("Bootstrap", []string{"auto"})
+ node.SetIPFSConfig("Routing.DelegatedRouters", []string{"auto"})
+ node.SetIPFSConfig("DNS.Resolvers", map[string]string{"test.": "auto"})
+
+ // Populate cache by running a command that triggers autoconf (without daemon)
+ result := node.RunIPFS("bootstrap", "list", "--expand-auto")
+ require.Equal(t, 0, result.ExitCode(), "Initial bootstrap expansion should succeed")
+
+ expandedBootstrap := result.Stdout.String()
+ assert.NotContains(t, expandedBootstrap, "auto", "Expanded bootstrap should not contain 'auto' literal")
+ assert.Greater(t, len(strings.Fields(expandedBootstrap)), 0, "Should have expanded bootstrap peers")
+
+ // Test that subsequent config operations work with cached data (no network required)
+ // This simulates the cache-first behavior our architecture now uses
+
+ // Test Bootstrap expansion
+ result = node.RunIPFS("config", "Bootstrap", "--expand-auto")
+ require.Equal(t, 0, result.ExitCode(), "Cached bootstrap expansion should succeed")
+
+ var expandedBootstrapList []string
+ err := json.Unmarshal([]byte(result.Stdout.String()), &expandedBootstrapList)
+ require.NoError(t, err)
+ assert.NotContains(t, expandedBootstrapList, "auto", "Expanded bootstrap list should not contain 'auto'")
+ assert.Greater(t, len(expandedBootstrapList), 0, "Should have expanded bootstrap peers from cache")
+
+ // Test Routing.DelegatedRouters expansion
+ result = node.RunIPFS("config", "Routing.DelegatedRouters", "--expand-auto")
+ require.Equal(t, 0, result.ExitCode(), "Cached router expansion should succeed")
+
+ var expandedRouters []string
+ err = json.Unmarshal([]byte(result.Stdout.String()), &expandedRouters)
+ require.NoError(t, err)
+ assert.NotContains(t, expandedRouters, "auto", "Expanded routers should not contain 'auto'")
+
+ // Test DNS.Resolvers expansion
+ result = node.RunIPFS("config", "DNS.Resolvers", "--expand-auto")
+ require.Equal(t, 0, result.ExitCode(), "Cached DNS resolver expansion should succeed")
+
+ var expandedResolvers map[string]string
+ err = json.Unmarshal([]byte(result.Stdout.String()), &expandedResolvers)
+ require.NoError(t, err)
+
+ // Should have expanded the "auto" value for test. domain, or removed it if no autoconf data available
+ testResolver, exists := expandedResolvers["test."]
+ if exists {
+ assert.NotEqual(t, "auto", testResolver, "test. resolver should not be literal 'auto'")
+ t.Logf("Found expanded resolver for test.: %s", testResolver)
+ } else {
+ t.Logf("No resolver found for test. domain (autoconf may not have DNS resolver data)")
+ }
+
+ // Test full config expansion
+ result = node.RunIPFS("config", "show", "--expand-auto")
+ require.Equal(t, 0, result.ExitCode(), "Full config expansion should succeed")
+
+ expandedConfig := result.Stdout.String()
+ // Should not contain literal "auto" values after expansion
+ assert.NotContains(t, expandedConfig, `"auto"`, "Expanded config should not contain literal 'auto' values")
+ assert.Contains(t, expandedConfig, `"Bootstrap"`, "Should contain Bootstrap section")
+ assert.Contains(t, expandedConfig, `"DNS"`, "Should contain DNS section")
+
+ t.Logf("Successfully tested cache-based config expansion without active network requests")
+}
+
+func testAutoConfDisabled(t *testing.T) {
+ // Create node with AutoConf disabled but "auto" values
+ // Use test profile to avoid autoconf profile being applied by default
+ node := harness.NewT(t).NewNode().Init("--profile=test")
+ node.SetIPFSConfig("AutoConf.Enabled", false)
+ node.SetIPFSConfig("Bootstrap", []string{"auto"})
+
+ // Test by trying to list bootstrap - when AutoConf is disabled, it should show literal "auto"
+ result := node.RunIPFS("bootstrap", "list")
+ if result.ExitCode() == 0 {
+ // If command succeeds, it should show literal "auto" (no resolution)
+ output := result.Stdout.String()
+ assert.Contains(t, output, "auto", "Should show literal 'auto' when AutoConf is disabled")
+ } else {
+ // If command fails, error should mention autoconf issue
+ assert.Contains(t, result.Stderr.String(), "auto", "Should mention 'auto' values in error")
+ }
+}
+
+// Helper function to load test data files
+func loadTestData(t *testing.T, filename string) []byte {
+ t.Helper()
+
+ data, err := os.ReadFile("testdata/" + filename)
+ require.NoError(t, err, "Failed to read test data file: %s", filename)
+
+ return data
+}
+
+func testBootstrapListResolved(t *testing.T) {
+ // Test that bootstrap list shows "auto" as-is (not expanded)
+
+ // Load test autoconf data
+ autoConfData := loadTestData(t, "valid_autoconf.json")
+
+ // Create HTTP server that serves autoconf.json
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.Header().Set("Content-Type", "application/json")
+ _, _ = w.Write(autoConfData)
+ }))
+ defer server.Close()
+
+ // Create IPFS node with "auto" bootstrap value
+ node := harness.NewT(t).NewNode().Init("--profile=test")
+ node.SetIPFSConfig("AutoConf.URL", server.URL)
+ node.SetIPFSConfig("AutoConf.Enabled", true)
+ node.SetIPFSConfig("Bootstrap", []string{"auto"})
+
+ // Test 1: bootstrap list (without --expand-auto) shows "auto" as-is - NO DAEMON NEEDED!
+ result := node.RunIPFS("bootstrap", "list")
+ require.Equal(t, 0, result.ExitCode(), "bootstrap list command should succeed")
+
+ output := result.Stdout.String()
+ t.Logf("Bootstrap list output: %s", output)
+ assert.Contains(t, output, "auto", "bootstrap list should show 'auto' value as-is")
+
+ // Should NOT contain expanded bootstrap peers without --expand-auto
+ unexpectedPeers := []string{
+ "/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN",
+ "/dnsaddr/bootstrap.libp2p.io/p2p/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa",
+ "/dnsaddr/bootstrap.libp2p.io/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb",
+ }
+
+ for _, peer := range unexpectedPeers {
+ assert.NotContains(t, output, peer, "bootstrap list should not contain expanded peer: %s", peer)
+ }
+
+ // Test 2: bootstrap list --expand-auto shows expanded values (no daemon needed!)
+ result = node.RunIPFS("bootstrap", "list", "--expand-auto")
+ require.Equal(t, 0, result.ExitCode(), "bootstrap list --expand-auto command should succeed")
+
+ expandedOutput := result.Stdout.String()
+ t.Logf("Bootstrap list --expand-auto output: %s", expandedOutput)
+
+ // Should NOT contain "auto" literal when expanded
+ assert.NotContains(t, expandedOutput, "auto", "bootstrap list --expand-auto should not show 'auto' literal")
+
+ // Should contain at least one expanded bootstrap peer
+ expectedPeers := []string{
+ "/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN",
+ "/dnsaddr/bootstrap.libp2p.io/p2p/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa",
+ "/dnsaddr/bootstrap.libp2p.io/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb",
+ }
+
+ foundExpectedPeer := false
+ for _, peer := range expectedPeers {
+ if strings.Contains(expandedOutput, peer) {
+ foundExpectedPeer = true
+ t.Logf("Found expected expanded peer: %s", peer)
+ break
+ }
+ }
+ assert.True(t, foundExpectedPeer, "bootstrap list --expand-auto should contain at least one expanded bootstrap peer")
+}
+
+func testDaemonUsesResolvedBootstrap(t *testing.T) {
+ // Test that daemon actually uses expanded bootstrap values for P2P connections
+ // even though bootstrap list shows "auto"
+
+ // Step 1: Create bootstrap node (target for connections)
+ bootstrapNode := harness.NewT(t).NewNode().Init("--profile=test")
+ // Set a specific swarm port for the bootstrap node to avoid port 0 issues
+ bootstrapNode.SetIPFSConfig("Addresses.Swarm", []string{"/ip4/127.0.0.1/tcp/14001"})
+ // Disable routing and discovery to ensure it's only discoverable via explicit multiaddr
+ bootstrapNode.SetIPFSConfig("Routing.Type", "none")
+ bootstrapNode.SetIPFSConfig("Discovery.MDNS.Enabled", false)
+ bootstrapNode.SetIPFSConfig("Bootstrap", []string{}) // No bootstrap peers
+
+ // Start the bootstrap node first
+ bootstrapNode.StartDaemon()
+ defer bootstrapNode.StopDaemon()
+
+ // Get bootstrap node's peer ID and swarm address
+ bootstrapPeerID := bootstrapNode.PeerID()
+
+ // Use the configured swarm address (we set it to a specific port above)
+ bootstrapMultiaddr := fmt.Sprintf("/ip4/127.0.0.1/tcp/14001/p2p/%s", bootstrapPeerID.String())
+ t.Logf("Bootstrap node configured at: %s", bootstrapMultiaddr)
+
+ // Step 2: Create autoconf server that returns bootstrap node's address
+ autoConfData := fmt.Sprintf(`{
+ "AutoConfVersion": 2025072301,
+ "AutoConfSchema": 1,
+ "AutoConfTTL": 86400,
+ "SystemRegistry": {
+ "AminoDHT": {
+ "Description": "Test AminoDHT system",
+ "NativeConfig": {
+ "Bootstrap": ["%s"]
+ }
+ }
+ },
+ "DNSResolvers": {},
+ "DelegatedEndpoints": {}
+ }`, bootstrapMultiaddr)
+
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.Header().Set("Content-Type", "application/json")
+ _, _ = w.Write([]byte(autoConfData))
+ }))
+ defer server.Close()
+
+ // Step 3: Create autoconf-enabled node that should connect to bootstrap node
+ autoconfNode := harness.NewT(t).NewNode().Init("--profile=test")
+ autoconfNode.SetIPFSConfig("AutoConf.URL", server.URL)
+ autoconfNode.SetIPFSConfig("AutoConf.Enabled", true)
+ autoconfNode.SetIPFSConfig("Bootstrap", []string{"auto"}) // This should resolve to bootstrap node
+ // Disable other discovery methods to force bootstrap-only connectivity
+ autoconfNode.SetIPFSConfig("Routing.Type", "none")
+ autoconfNode.SetIPFSConfig("Discovery.MDNS.Enabled", false)
+
+ // Start the autoconf node
+ autoconfNode.StartDaemon()
+ defer autoconfNode.StopDaemon()
+
+ // Step 4: Give time for autoconf resolution and connection attempts
+ time.Sleep(8 * time.Second)
+
+ // Step 5: Verify both nodes are responsive
+ result := bootstrapNode.RunIPFS("id")
+ require.Equal(t, 0, result.ExitCode(), "Bootstrap node should be responsive: %s", result.Stderr.String())
+
+ result = autoconfNode.RunIPFS("id")
+ require.Equal(t, 0, result.ExitCode(), "AutoConf node should be responsive: %s", result.Stderr.String())
+
+ // Step 6: Verify that autoconf node connected to bootstrap node
+ // Check swarm peers on autoconf node - it should show bootstrap node's peer ID
+ result = autoconfNode.RunIPFS("swarm", "peers")
+ if result.ExitCode() == 0 {
+ peerOutput := result.Stdout.String()
+ if strings.Contains(peerOutput, bootstrapPeerID.String()) {
+ t.Logf("SUCCESS: AutoConf node connected to bootstrap peer %s", bootstrapPeerID.String())
+ } else {
+ t.Logf("No active connection found. Peers output: %s", peerOutput)
+ // This might be OK if connection attempt was made but didn't persist
+ }
+ } else {
+ // If swarm peers fails, try alternative verification via daemon logs
+ t.Logf("Swarm peers command failed, checking daemon logs for connection attempts")
+ daemonOutput := autoconfNode.Daemon.Stderr.String()
+ if strings.Contains(daemonOutput, bootstrapPeerID.String()) {
+ t.Logf("SUCCESS: Found bootstrap peer %s in daemon logs, connection attempted", bootstrapPeerID.String())
+ } else {
+ t.Logf("Daemon stderr: %s", daemonOutput)
+ }
+ }
+
+ // Step 7: Verify bootstrap configuration still shows "auto" (not resolved values)
+ result = autoconfNode.RunIPFS("bootstrap", "list")
+ require.Equal(t, 0, result.ExitCode(), "Bootstrap list command should work")
+ assert.Contains(t, result.Stdout.String(), "auto",
+ "Bootstrap list should still show 'auto' even though values were resolved for networking")
+}
+
+func testEmptyCacheUsesFallbacks(t *testing.T) {
+ // Test that daemon uses fallback defaults when no cache exists and server is unreachable
+
+ // Create IPFS node with auto values and unreachable autoconf server
+ node := harness.NewT(t).NewNode().Init("--profile=test")
+ node.SetIPFSConfig("AutoConf.URL", "http://127.0.0.1:9999/nonexistent")
+ node.SetIPFSConfig("AutoConf.Enabled", true)
+ node.SetIPFSConfig("Bootstrap", []string{"auto"})
+ node.SetIPFSConfig("Routing.DelegatedRouters", []string{"auto"})
+
+ // Start daemon - should succeed using fallback values
+ node.StartDaemon()
+ defer node.StopDaemon()
+
+ // Verify daemon started successfully (uses fallback bootstrap)
+ result := node.RunIPFS("id")
+ require.Equal(t, 0, result.ExitCode(), "Daemon should start successfully with fallback values")
+
+ // Verify config commands still show "auto"
+ result = node.RunIPFS("config", "Bootstrap")
+ require.Equal(t, 0, result.ExitCode())
+ assert.Contains(t, result.Stdout.String(), "auto", "Bootstrap config should still show 'auto'")
+
+ result = node.RunIPFS("config", "Routing.DelegatedRouters")
+ require.Equal(t, 0, result.ExitCode())
+ assert.Contains(t, result.Stdout.String(), "auto", "DelegatedRouters config should still show 'auto'")
+
+ // Check daemon logs for error about failed autoconf fetch
+ logOutput := node.Daemon.Stderr.String()
+ // The daemon should attempt to fetch autoconf but will use fallbacks on failure
+ // We don't require specific log messages as long as the daemon starts successfully
+ if logOutput != "" {
+ t.Logf("Daemon logs: %s", logOutput)
+ }
+}
+
+func testStaleCacheWithUnreachableServer(t *testing.T) {
+ // Test that daemon uses stale cache when server is unreachable
+
+ // First create a working autoconf server and cache
+ autoConfData := loadTestData(t, "valid_autoconf.json")
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.Header().Set("Content-Type", "application/json")
+ _, _ = w.Write(autoConfData)
+ }))
+
+ // Create node and fetch autoconf to populate cache
+ node := harness.NewT(t).NewNode().Init("--profile=test")
+ node.SetIPFSConfig("AutoConf.URL", server.URL)
+ node.SetIPFSConfig("AutoConf.Enabled", true)
+ node.SetIPFSConfig("Bootstrap", []string{"auto"})
+
+ // Start daemon briefly to populate cache
+ node.StartDaemon()
+ time.Sleep(1 * time.Second) // Allow cache population
+ node.StopDaemon()
+
+ // Close the server to make it unreachable
+ server.Close()
+
+ // Update config to point to unreachable server
+ node.SetIPFSConfig("AutoConf.URL", "http://127.0.0.1:9999/unreachable")
+
+ // Start daemon again - should use stale cache
+ node.StartDaemon()
+ defer node.StopDaemon()
+
+ // Verify daemon started successfully (uses cached autoconf)
+ result := node.RunIPFS("id")
+ require.Equal(t, 0, result.ExitCode(), "Daemon should start successfully with cached autoconf")
+
+ // Check daemon logs for error about using stale config
+ logOutput := node.Daemon.Stderr.String()
+ // The daemon should use cached config when server is unreachable
+ // We don't require specific log messages as long as the daemon starts successfully
+ if logOutput != "" {
+ t.Logf("Daemon logs: %s", logOutput)
+ }
+}
+
+func testAutoConfDisabledWithAutoValues(t *testing.T) {
+ // Test that daemon fails to start when AutoConf is disabled but "auto" values are present
+
+ // Create IPFS node with AutoConf disabled but "auto" values configured
+ node := harness.NewT(t).NewNode().Init("--profile=test")
+ node.SetIPFSConfig("AutoConf.Enabled", false)
+ node.SetIPFSConfig("Bootstrap", []string{"auto"})
+
+ // Test by trying to list bootstrap - when AutoConf is disabled, it should show literal "auto"
+ result := node.RunIPFS("bootstrap", "list")
+ if result.ExitCode() == 0 {
+ // If command succeeds, it should show literal "auto" (no resolution)
+ output := result.Stdout.String()
+ assert.Contains(t, output, "auto", "Should show literal 'auto' when AutoConf is disabled")
+ } else {
+ // If command fails, error should mention autoconf issue
+ logOutput := result.Stderr.String()
+ assert.Contains(t, logOutput, "auto", "Error should mention 'auto' values")
+ // Check that the error message contains information about disabled state
+ assert.True(t,
+ strings.Contains(logOutput, "disabled") || strings.Contains(logOutput, "AutoConf.Enabled=false"),
+ "Error should mention that AutoConf is disabled or show AutoConf.Enabled=false")
+ }
+}
+
+func testAutoConfNetworkBehavior(t *testing.T) {
+ // Test the network behavior differences between MustGetConfigCached and MustGetConfigWithRefresh
+ // This validates that our cache-first architecture works as expected
+
+ autoConfData := loadTestData(t, "valid_autoconf.json")
+ var requestCount atomic.Int32
+
+ // Create server that tracks all requests
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ count := requestCount.Add(1)
+ t.Logf("Network behavior test request #%d: %s %s", count, r.Method, r.URL.Path)
+
+ w.Header().Set("Content-Type", "application/json")
+ w.Header().Set("ETag", fmt.Sprintf(`"network-test-etag-%d"`, count))
+ w.Header().Set("Last-Modified", time.Now().Format(http.TimeFormat))
+ _, _ = w.Write(autoConfData)
+ }))
+ defer server.Close()
+
+ // Create IPFS node with autoconf
+ node := harness.NewT(t).NewNode().Init("--profile=test")
+ node.SetIPFSConfig("AutoConf.URL", server.URL)
+ node.SetIPFSConfig("AutoConf.Enabled", true)
+ node.SetIPFSConfig("Bootstrap", []string{"auto"})
+
+ // Phase 1: Test cache-first behavior (no network requests expected)
+ t.Logf("=== Phase 1: Testing cache-first behavior ===")
+ initialCount := requestCount.Load()
+
+ // Multiple config operations should NOT trigger network requests (cache-first)
+ result := node.RunIPFS("config", "Bootstrap")
+ require.Equal(t, 0, result.ExitCode(), "Bootstrap config read should succeed")
+
+ result = node.RunIPFS("config", "show")
+ require.Equal(t, 0, result.ExitCode(), "Config show should succeed")
+
+ result = node.RunIPFS("bootstrap", "list")
+ require.Equal(t, 0, result.ExitCode(), "Bootstrap list should succeed")
+
+ // Check that cache-first operations didn't trigger network requests
+ afterCacheOpsCount := requestCount.Load()
+ cachedRequestDiff := afterCacheOpsCount - initialCount
+ t.Logf("Network requests during cache-first operations: %d", cachedRequestDiff)
+
+ // Phase 2: Test explicit expansion (may trigger cache population)
+ t.Logf("=== Phase 2: Testing expansion operations ===")
+ beforeExpansionCount := requestCount.Load()
+
+ // Expansion operations may need to populate cache if empty
+ result = node.RunIPFS("bootstrap", "list", "--expand-auto")
+ if result.ExitCode() == 0 {
+ output := result.Stdout.String()
+ assert.NotContains(t, output, "auto", "Expanded bootstrap should not contain 'auto' literal")
+ t.Logf("Bootstrap expansion succeeded")
+ } else {
+ t.Logf("Bootstrap expansion failed (may be due to network/cache issues): %s", result.Stderr.String())
+ }
+
+ result = node.RunIPFS("config", "Bootstrap", "--expand-auto")
+ if result.ExitCode() == 0 {
+ t.Logf("Config Bootstrap expansion succeeded")
+ } else {
+ t.Logf("Config Bootstrap expansion failed: %s", result.Stderr.String())
+ }
+
+ afterExpansionCount := requestCount.Load()
+ expansionRequestDiff := afterExpansionCount - beforeExpansionCount
+ t.Logf("Network requests during expansion operations: %d", expansionRequestDiff)
+
+ // Phase 3: Test background service behavior (if daemon is started)
+ t.Logf("=== Phase 3: Testing background service behavior ===")
+ beforeDaemonCount := requestCount.Load()
+
+ // Set short refresh interval to test background service
+ node.SetIPFSConfig("AutoConf.RefreshInterval", "1s")
+
+ // Start daemon - this triggers startAutoConfUpdater() which should make network requests
+ node.StartDaemon()
+ defer node.StopDaemon()
+
+ // Wait for background service to potentially make requests
+ time.Sleep(2 * time.Second)
+
+ afterDaemonCount := requestCount.Load()
+ daemonRequestDiff := afterDaemonCount - beforeDaemonCount
+ t.Logf("Network requests from background service: %d", daemonRequestDiff)
+
+ // Verify expected behavior patterns
+ t.Logf("=== Summary ===")
+ t.Logf("Cache-first operations: %d requests", cachedRequestDiff)
+ t.Logf("Expansion operations: %d requests", expansionRequestDiff)
+ t.Logf("Background service: %d requests", daemonRequestDiff)
+
+ // Cache-first operations should minimize network requests
+ assert.LessOrEqual(t, cachedRequestDiff, int32(1),
+ "Cache-first config operations should make minimal network requests")
+
+ // Background service should make requests for refresh
+ if daemonRequestDiff > 0 {
+ t.Logf("โ Background service is making network requests as expected")
+ } else {
+ t.Logf("โ Background service made no requests (may be using existing cache)")
+ }
+
+ t.Logf("Successfully verified network behavior patterns in autoconf architecture")
+}
+
+func testAutoConfWithHTTPS(t *testing.T) {
+ // Test autoconf with HTTPS server and TLSInsecureSkipVerify enabled
+ autoConfData := loadTestData(t, "valid_autoconf.json")
+
+ // Create HTTPS server with self-signed certificate
+ server := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ t.Logf("HTTPS autoconf request from %s", r.UserAgent())
+ w.Header().Set("Content-Type", "application/json")
+ w.Header().Set("ETag", `"https-test-etag"`)
+ w.Header().Set("Last-Modified", "Wed, 21 Oct 2015 07:28:00 GMT")
+ _, _ = w.Write(autoConfData)
+ }))
+
+ // Enable HTTP/2 and start with TLS (self-signed certificate)
+ server.EnableHTTP2 = true
+ server.StartTLS()
+ defer server.Close()
+
+ // Create IPFS node with HTTPS autoconf server and TLS skip verify
+ node := harness.NewT(t).NewNode().Init("--profile=test")
+ node.SetIPFSConfig("AutoConf.URL", server.URL)
+ node.SetIPFSConfig("AutoConf.Enabled", true)
+ node.SetIPFSConfig("AutoConf.TLSInsecureSkipVerify", true) // Allow self-signed cert
+ node.SetIPFSConfig("AutoConf.RefreshInterval", "24h") // Disable background updates
+
+ // Use normal bootstrap peers to test HTTPS fetching without complex auto replacement
+ node.SetIPFSConfig("Bootstrap", []string{"/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN"})
+
+ // Start daemon to trigger HTTPS autoconf fetch
+ node.StartDaemon()
+ defer node.StopDaemon()
+
+ // Give autoconf time to fetch over HTTPS
+ time.Sleep(2 * time.Second)
+
+ // Verify daemon is functional with HTTPS autoconf
+ result := node.RunIPFS("id")
+ assert.Equal(t, 0, result.ExitCode(), "IPFS daemon should be responsive with HTTPS autoconf")
+ assert.Contains(t, result.Stdout.String(), "ID", "IPFS id command should return peer information")
+
+ // Test that config operations work with HTTPS-fetched autoconf cache
+ result = node.RunIPFS("config", "show")
+ assert.Equal(t, 0, result.ExitCode(), "Config show should work with HTTPS autoconf")
+
+ // Test bootstrap list functionality
+ result = node.RunIPFS("bootstrap", "list")
+ assert.Equal(t, 0, result.ExitCode(), "Bootstrap list should work with HTTPS autoconf")
+
+ t.Logf("Successfully tested AutoConf with HTTPS server and TLS skip verify")
+}
diff --git a/test/cli/autoconf/dns_test.go b/test/cli/autoconf/dns_test.go
new file mode 100644
index 000000000..13144fa46
--- /dev/null
+++ b/test/cli/autoconf/dns_test.go
@@ -0,0 +1,288 @@
+package autoconf
+
+import (
+ "encoding/base64"
+ "fmt"
+ "io"
+ "net/http"
+ "net/http/httptest"
+ "strings"
+ "sync"
+ "testing"
+
+ "github.com/ipfs/kubo/test/cli/harness"
+ "github.com/miekg/dns"
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+)
+
+func TestAutoConfDNS(t *testing.T) {
+ t.Parallel()
+
+ t.Run("DNS resolution with auto DoH resolver", func(t *testing.T) {
+ t.Parallel()
+ testDNSResolutionWithAutoDoH(t)
+ })
+
+ t.Run("DNS errors are handled properly", func(t *testing.T) {
+ t.Parallel()
+ testDNSErrorHandling(t)
+ })
+}
+
+// mockDoHServer implements a simple DNS-over-HTTPS server for testing
+type mockDoHServer struct {
+ t *testing.T
+ server *httptest.Server
+ mu sync.Mutex
+ requests []string
+ responseFunc func(name string) *dns.Msg
+}
+
+func newMockDoHServer(t *testing.T) *mockDoHServer {
+ m := &mockDoHServer{
+ t: t,
+ requests: []string{},
+ }
+
+ // Default response function returns a dnslink TXT record
+ m.responseFunc = func(name string) *dns.Msg {
+ msg := &dns.Msg{}
+ msg.SetReply(&dns.Msg{Question: []dns.Question{{Name: name, Qtype: dns.TypeTXT}}})
+
+ if strings.HasPrefix(name, "_dnslink.") {
+ // Return a valid dnslink record
+ rr := &dns.TXT{
+ Hdr: dns.RR_Header{
+ Name: name,
+ Rrtype: dns.TypeTXT,
+ Class: dns.ClassINET,
+ Ttl: 300,
+ },
+ Txt: []string{"dnslink=/ipfs/QmYNQJoKGNHTpPxCBPh9KkDpaExgd2duMa3aF6ytMpHdao"},
+ }
+ msg.Answer = append(msg.Answer, rr)
+ }
+
+ return msg
+ }
+
+ mux := http.NewServeMux()
+ mux.HandleFunc("/dns-query", m.handleDNSQuery)
+
+ m.server = httptest.NewServer(mux)
+ return m
+}
+
+func (m *mockDoHServer) handleDNSQuery(w http.ResponseWriter, r *http.Request) {
+ m.mu.Lock()
+ defer m.mu.Unlock()
+
+ var dnsMsg *dns.Msg
+
+ if r.Method == "GET" {
+ // Handle GET with ?dns= parameter
+ dnsParam := r.URL.Query().Get("dns")
+ if dnsParam == "" {
+ http.Error(w, "missing dns parameter", http.StatusBadRequest)
+ return
+ }
+
+ data, err := base64.RawURLEncoding.DecodeString(dnsParam)
+ if err != nil {
+ http.Error(w, "invalid base64", http.StatusBadRequest)
+ return
+ }
+
+ dnsMsg = &dns.Msg{}
+ if err := dnsMsg.Unpack(data); err != nil {
+ http.Error(w, "invalid DNS message", http.StatusBadRequest)
+ return
+ }
+ } else if r.Method == "POST" {
+ // Handle POST with DNS wire format
+ data, err := io.ReadAll(r.Body)
+ if err != nil {
+ http.Error(w, "failed to read body", http.StatusBadRequest)
+ return
+ }
+
+ dnsMsg = &dns.Msg{}
+ if err := dnsMsg.Unpack(data); err != nil {
+ http.Error(w, "invalid DNS message", http.StatusBadRequest)
+ return
+ }
+ } else {
+ http.Error(w, "method not allowed", http.StatusMethodNotAllowed)
+ return
+ }
+
+ // Log the DNS query
+ if len(dnsMsg.Question) > 0 {
+ qname := dnsMsg.Question[0].Name
+ m.requests = append(m.requests, qname)
+ m.t.Logf("DoH server received query for: %s", qname)
+ }
+
+ // Generate response
+ response := m.responseFunc(dnsMsg.Question[0].Name)
+ responseData, err := response.Pack()
+ if err != nil {
+ http.Error(w, "failed to pack response", http.StatusInternalServerError)
+ return
+ }
+
+ w.Header().Set("Content-Type", "application/dns-message")
+ _, _ = w.Write(responseData)
+}
+
+func (m *mockDoHServer) getRequests() []string {
+ m.mu.Lock()
+ defer m.mu.Unlock()
+ return append([]string{}, m.requests...)
+}
+
+func (m *mockDoHServer) close() {
+ m.server.Close()
+}
+
+func testDNSResolutionWithAutoDoH(t *testing.T) {
+ // Create mock DoH server
+ dohServer := newMockDoHServer(t)
+ defer dohServer.close()
+
+ // Create autoconf data with DoH resolver for "foo." domain
+ autoConfData := fmt.Sprintf(`{
+ "AutoConfVersion": 2025072302,
+ "AutoConfSchema": 1,
+ "AutoConfTTL": 86400,
+ "SystemRegistry": {
+ "AminoDHT": {
+ "Description": "Test AminoDHT system",
+ "NativeConfig": {
+ "Bootstrap": []
+ }
+ }
+ },
+ "DNSResolvers": {
+ "foo.": ["%s/dns-query"]
+ },
+ "DelegatedEndpoints": {}
+ }`, dohServer.server.URL)
+
+ // Create autoconf server
+ autoConfServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.Header().Set("Content-Type", "application/json")
+ _, _ = w.Write([]byte(autoConfData))
+ }))
+ defer autoConfServer.Close()
+
+ // Create IPFS node with auto DNS resolver
+ node := harness.NewT(t).NewNode().Init("--profile=test")
+ node.SetIPFSConfig("AutoConf.URL", autoConfServer.URL)
+ node.SetIPFSConfig("AutoConf.Enabled", true)
+ node.SetIPFSConfig("DNS.Resolvers", map[string]string{"foo.": "auto"})
+
+ // Start daemon
+ node.StartDaemon()
+ defer node.StopDaemon()
+
+ // Verify config still shows "auto" for DNS resolvers
+ result := node.RunIPFS("config", "DNS.Resolvers")
+ require.Equal(t, 0, result.ExitCode())
+ dnsResolversOutput := result.Stdout.String()
+ assert.Contains(t, dnsResolversOutput, "foo.", "DNS resolvers should contain foo. domain")
+ assert.Contains(t, dnsResolversOutput, "auto", "DNS resolver config should show 'auto'")
+
+ // Try to resolve a .foo domain
+ result = node.RunIPFS("resolve", "/ipns/example.foo")
+ require.Equal(t, 0, result.ExitCode())
+
+ // Should resolve to the IPFS path from our mock DoH server
+ output := strings.TrimSpace(result.Stdout.String())
+ assert.Equal(t, "/ipfs/QmYNQJoKGNHTpPxCBPh9KkDpaExgd2duMa3aF6ytMpHdao", output,
+ "Should resolve to the path returned by DoH server")
+
+ // Verify DoH server received the DNS query
+ requests := dohServer.getRequests()
+ require.Greater(t, len(requests), 0, "DoH server should have received at least one request")
+
+ foundDNSLink := false
+ for _, req := range requests {
+ if strings.Contains(req, "_dnslink.example.foo") {
+ foundDNSLink = true
+ break
+ }
+ }
+ assert.True(t, foundDNSLink, "DoH server should have received query for _dnslink.example.foo")
+}
+
+func testDNSErrorHandling(t *testing.T) {
+ // Create DoH server that returns NXDOMAIN
+ dohServer := newMockDoHServer(t)
+ defer dohServer.close()
+
+ // Configure to return NXDOMAIN
+ dohServer.responseFunc = func(name string) *dns.Msg {
+ msg := &dns.Msg{}
+ msg.SetReply(&dns.Msg{Question: []dns.Question{{Name: name, Qtype: dns.TypeTXT}}})
+ msg.Rcode = dns.RcodeNameError // NXDOMAIN
+ return msg
+ }
+
+ // Create autoconf data with DoH resolver
+ autoConfData := fmt.Sprintf(`{
+ "AutoConfVersion": 2025072302,
+ "AutoConfSchema": 1,
+ "AutoConfTTL": 86400,
+ "SystemRegistry": {
+ "AminoDHT": {
+ "Description": "Test AminoDHT system",
+ "NativeConfig": {
+ "Bootstrap": []
+ }
+ }
+ },
+ "DNSResolvers": {
+ "bar.": ["%s/dns-query"]
+ },
+ "DelegatedEndpoints": {}
+ }`, dohServer.server.URL)
+
+ // Create autoconf server
+ autoConfServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.Header().Set("Content-Type", "application/json")
+ _, _ = w.Write([]byte(autoConfData))
+ }))
+ defer autoConfServer.Close()
+
+ // Create IPFS node
+ node := harness.NewT(t).NewNode().Init("--profile=test")
+ node.SetIPFSConfig("AutoConf.URL", autoConfServer.URL)
+ node.SetIPFSConfig("AutoConf.Enabled", true)
+ node.SetIPFSConfig("DNS.Resolvers", map[string]string{"bar.": "auto"})
+
+ // Start daemon
+ node.StartDaemon()
+ defer node.StopDaemon()
+
+ // Try to resolve a non-existent domain
+ result := node.RunIPFS("resolve", "/ipns/nonexistent.bar")
+ require.NotEqual(t, 0, result.ExitCode(), "Resolution should fail for non-existent domain")
+
+ // Should contain appropriate error message
+ stderr := result.Stderr.String()
+ assert.Contains(t, stderr, "could not resolve name",
+ "Error should indicate DNS resolution failure")
+
+ // Verify DoH server received the query
+ requests := dohServer.getRequests()
+ foundQuery := false
+ for _, req := range requests {
+ if strings.Contains(req, "_dnslink.nonexistent.bar") {
+ foundQuery = true
+ break
+ }
+ }
+ assert.True(t, foundQuery, "DoH server should have received query even for failed resolution")
+}
diff --git a/test/cli/autoconf/expand_comprehensive_test.go b/test/cli/autoconf/expand_comprehensive_test.go
new file mode 100644
index 000000000..01dbcfda3
--- /dev/null
+++ b/test/cli/autoconf/expand_comprehensive_test.go
@@ -0,0 +1,698 @@
+// Package autoconf provides comprehensive tests for --expand-auto functionality.
+//
+// Test Scenarios:
+// 1. Tests WITH daemon: Most tests start a daemon to fetch and cache autoconf data,
+// then test CLI commands that read from that cache using MustGetConfigCached.
+// 2. Tests WITHOUT daemon: Error condition tests that don't need cached autoconf.
+//
+// The daemon setup uses startDaemonAndWaitForAutoConf() helper which:
+// - Starts the daemon
+// - Waits for HTTP request to mock server (not arbitrary timeout)
+// - Returns when autoconf is cached and ready for CLI commands
+package autoconf
+
+import (
+ "encoding/json"
+ "fmt"
+ "net/http"
+ "net/http/httptest"
+ "os"
+ "strings"
+ "sync/atomic"
+ "testing"
+ "time"
+
+ "github.com/ipfs/kubo/test/cli/harness"
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+)
+
+func TestExpandAutoComprehensive(t *testing.T) {
+ t.Parallel()
+
+ t.Run("all autoconf fields resolve correctly", func(t *testing.T) {
+ t.Parallel()
+ testAllAutoConfFieldsResolve(t)
+ })
+
+ t.Run("bootstrap list --expand-auto matches config Bootstrap --expand-auto", func(t *testing.T) {
+ t.Parallel()
+ testBootstrapCommandConsistency(t)
+ })
+
+ t.Run("write operations fail with --expand-auto", func(t *testing.T) {
+ t.Parallel()
+ testWriteOperationsFailWithExpandAuto(t)
+ })
+
+ t.Run("config show --expand-auto provides complete expanded view", func(t *testing.T) {
+ t.Parallel()
+ testConfigShowExpandAutoComplete(t)
+ })
+
+ t.Run("multiple expand-auto calls use cache (single HTTP request)", func(t *testing.T) {
+ t.Parallel()
+ testMultipleExpandAutoUsesCache(t)
+ })
+
+ t.Run("CLI uses cache only while daemon handles background updates", func(t *testing.T) {
+ t.Parallel()
+ testCLIUsesCacheOnlyDaemonUpdatesBackground(t)
+ })
+}
+
+// testAllAutoConfFieldsResolve verifies that all autoconf fields (Bootstrap, DNS.Resolvers,
+// Routing.DelegatedRouters, and Ipns.DelegatedPublishers) can be resolved from "auto" values
+// to their actual configuration using --expand-auto flag with daemon-cached autoconf data.
+//
+// This test is critical because:
+// 1. It validates the core autoconf resolution functionality across all supported fields
+// 2. It ensures that "auto" placeholders are properly replaced with real configuration values
+// 3. It verifies that the autoconf JSON structure is correctly parsed and applied
+// 4. It tests the end-to-end flow from HTTP fetch to config field expansion
+func testAllAutoConfFieldsResolve(t *testing.T) {
+ // Test scenario: CLI with daemon started and autoconf cached
+ // This validates core autoconf resolution functionality across all supported fields
+
+ // Track HTTP requests to verify mock server is being used
+ var requestCount atomic.Int32
+ var autoConfData []byte
+
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ count := requestCount.Add(1)
+ t.Logf("Mock autoconf server request #%d: %s %s", count, r.Method, r.URL.Path)
+
+ // Create comprehensive autoconf response matching Schema 4 format
+ // Use server URLs to ensure they're reachable and valid
+ serverURL := fmt.Sprintf("http://%s", r.Host) // Get the server URL from the request
+ autoConf := map[string]interface{}{
+ "AutoConfVersion": 2025072301,
+ "AutoConfSchema": 1,
+ "AutoConfTTL": 86400,
+ "SystemRegistry": map[string]interface{}{
+ "AminoDHT": map[string]interface{}{
+ "URL": "https://github.com/ipfs/specs/pull/497",
+ "Description": "Test AminoDHT system",
+ "NativeConfig": map[string]interface{}{
+ "Bootstrap": []string{
+ "/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN",
+ "/dnsaddr/bootstrap.libp2p.io/p2p/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa",
+ },
+ },
+ "DelegatedConfig": map[string]interface{}{
+ "Read": []string{"/routing/v1/providers", "/routing/v1/peers", "/routing/v1/ipns"},
+ "Write": []string{"/routing/v1/ipns"},
+ },
+ },
+ "IPNI": map[string]interface{}{
+ "URL": serverURL + "/ipni-system",
+ "Description": "Test IPNI system",
+ "DelegatedConfig": map[string]interface{}{
+ "Read": []string{"/routing/v1/providers"},
+ "Write": []string{},
+ },
+ },
+ "CustomIPNS": map[string]interface{}{
+ "URL": serverURL + "/ipns-system",
+ "Description": "Test IPNS system",
+ "DelegatedConfig": map[string]interface{}{
+ "Read": []string{"/routing/v1/ipns"},
+ "Write": []string{"/routing/v1/ipns"},
+ },
+ },
+ },
+ "DNSResolvers": map[string][]string{
+ ".": {"https://cloudflare-dns.com/dns-query"},
+ "eth.": {"https://dns.google/dns-query"},
+ },
+ "DelegatedEndpoints": map[string]interface{}{
+ serverURL: map[string]interface{}{
+ "Systems": []string{"IPNI", "CustomIPNS"}, // Use non-AminoDHT systems to avoid filtering
+ "Read": []string{"/routing/v1/providers", "/routing/v1/ipns"},
+ "Write": []string{"/routing/v1/ipns"},
+ },
+ },
+ }
+
+ var err error
+ autoConfData, err = json.Marshal(autoConf)
+ if err != nil {
+ t.Fatalf("Failed to marshal autoConf: %v", err)
+ }
+
+ t.Logf("Serving mock autoconf data: %s", string(autoConfData))
+
+ w.Header().Set("Content-Type", "application/json")
+ w.Header().Set("ETag", `"test-mock-config"`)
+ w.Header().Set("Last-Modified", "Wed, 21 Oct 2015 07:28:00 GMT")
+ _, _ = w.Write(autoConfData)
+ }))
+ defer server.Close()
+
+ // Create IPFS node with all auto values
+ node := harness.NewT(t).NewNode().Init("--profile=test")
+
+ // Clear any existing autoconf cache to prevent interference
+ result := node.RunIPFS("config", "show")
+ if result.ExitCode() == 0 {
+ var cfg map[string]interface{}
+ if json.Unmarshal([]byte(result.Stdout.String()), &cfg) == nil {
+ if repoPath, exists := cfg["path"]; exists {
+ if pathStr, ok := repoPath.(string); ok {
+ t.Logf("Clearing autoconf cache from %s/autoconf", pathStr)
+ // Note: We can't directly remove files, but clearing cache via config change should help
+ }
+ }
+ }
+ }
+ node.SetIPFSConfig("AutoConf.URL", server.URL)
+ node.SetIPFSConfig("AutoConf.Enabled", true)
+ node.SetIPFSConfig("AutoConf.RefreshInterval", "1s") // Force fresh fetches for testing
+ node.SetIPFSConfig("Bootstrap", []string{"auto"})
+ node.SetIPFSConfig("DNS.Resolvers", map[string]string{
+ ".": "auto",
+ "eth.": "auto",
+ })
+ node.SetIPFSConfig("Routing.DelegatedRouters", []string{"auto"})
+ node.SetIPFSConfig("Ipns.DelegatedPublishers", []string{"auto"})
+
+ // Start daemon and wait for autoconf fetch
+ daemon := startDaemonAndWaitForAutoConf(t, node, &requestCount)
+ defer daemon.StopDaemon()
+
+ // Test 1: Bootstrap resolution
+ result = node.RunIPFS("config", "Bootstrap", "--expand-auto")
+ require.Equal(t, 0, result.ExitCode(), "Bootstrap expansion should succeed")
+
+ var expandedBootstrap []string
+ var err error
+ err = json.Unmarshal([]byte(result.Stdout.String()), &expandedBootstrap)
+ require.NoError(t, err)
+
+ assert.NotContains(t, expandedBootstrap, "auto", "Bootstrap should not contain 'auto'")
+ assert.Contains(t, expandedBootstrap, "/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN")
+ assert.Contains(t, expandedBootstrap, "/dnsaddr/bootstrap.libp2p.io/p2p/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa")
+ t.Logf("Bootstrap expanded to: %v", expandedBootstrap)
+
+ // Test 2: DNS.Resolvers resolution
+ result = node.RunIPFS("config", "DNS.Resolvers", "--expand-auto")
+ require.Equal(t, 0, result.ExitCode(), "DNS.Resolvers expansion should succeed")
+
+ var expandedResolvers map[string]string
+ err = json.Unmarshal([]byte(result.Stdout.String()), &expandedResolvers)
+ require.NoError(t, err)
+
+ assert.NotContains(t, expandedResolvers, "auto", "DNS.Resolvers should not contain 'auto'")
+ assert.Equal(t, "https://cloudflare-dns.com/dns-query", expandedResolvers["."])
+ assert.Equal(t, "https://dns.google/dns-query", expandedResolvers["eth."])
+ t.Logf("DNS.Resolvers expanded to: %v", expandedResolvers)
+
+ // Test 3: Routing.DelegatedRouters resolution
+ result = node.RunIPFS("config", "Routing.DelegatedRouters", "--expand-auto")
+ require.Equal(t, 0, result.ExitCode(), "Routing.DelegatedRouters expansion should succeed")
+
+ var expandedRouters []string
+ err = json.Unmarshal([]byte(result.Stdout.String()), &expandedRouters)
+ require.NoError(t, err)
+
+ assert.NotContains(t, expandedRouters, "auto", "DelegatedRouters should not contain 'auto'")
+
+ // Test should strictly require mock autoconf to work - no fallback acceptance
+ // The mock endpoint has Read paths ["/routing/v1/providers", "/routing/v1/ipns"]
+ // so we expect 2 URLs with those paths
+ expectedMockURLs := []string{
+ server.URL + "/routing/v1/providers",
+ server.URL + "/routing/v1/ipns",
+ }
+ require.Equal(t, 2, len(expandedRouters),
+ "Should have exactly 2 routers from mock autoconf (one for each Read path). Got %d routers: %v. "+
+ "This indicates autoconf is not working properly - check if mock server data is being parsed and filtered correctly.",
+ len(expandedRouters), expandedRouters)
+
+ // Check that both expected URLs are present
+ for _, expectedURL := range expectedMockURLs {
+ assert.Contains(t, expandedRouters, expectedURL,
+ "Should contain mock autoconf endpoint with path %s. Got: %v. "+
+ "This indicates autoconf endpoint path generation is not working properly.",
+ expectedURL, expandedRouters)
+ }
+
+ // Test 4: Ipns.DelegatedPublishers resolution
+ result = node.RunIPFS("config", "Ipns.DelegatedPublishers", "--expand-auto")
+ require.Equal(t, 0, result.ExitCode(), "Ipns.DelegatedPublishers expansion should succeed")
+
+ var expandedPublishers []string
+ err = json.Unmarshal([]byte(result.Stdout.String()), &expandedPublishers)
+ require.NoError(t, err)
+
+ assert.NotContains(t, expandedPublishers, "auto", "DelegatedPublishers should not contain 'auto'")
+
+ // Test should require mock autoconf endpoint for IPNS publishing
+ // The mock endpoint supports /routing/v1/ipns write operations, so it should be included with path
+ expectedMockPublisherURL := server.URL + "/routing/v1/ipns"
+ require.Equal(t, 1, len(expandedPublishers),
+ "Should have exactly 1 IPNS publisher from mock autoconf. Got %d publishers: %v. "+
+ "This indicates autoconf IPNS publisher filtering is not working properly.",
+ len(expandedPublishers), expandedPublishers)
+ assert.Equal(t, expectedMockPublisherURL, expandedPublishers[0],
+ "Should use mock autoconf endpoint %s for IPNS publishing, not fallback. Got: %s. "+
+ "This indicates autoconf IPNS publisher resolution is not working properly.",
+ expectedMockPublisherURL, expandedPublishers[0])
+
+ // CRITICAL: Verify that mock server was actually used
+ finalRequestCount := requestCount.Load()
+ require.Greater(t, finalRequestCount, int32(0),
+ "Mock autoconf server should have been called at least once. Got %d requests. "+
+ "This indicates the test is using cached or fallback config instead of mock data.", finalRequestCount)
+ t.Logf("Mock server was called %d times - test is using mock data", finalRequestCount)
+}
+
+// testBootstrapCommandConsistency verifies that `ipfs bootstrap list --expand-auto` and
+// `ipfs config Bootstrap --expand-auto` return identical results when both use autoconf.
+//
+// This test is important because:
+// 1. It ensures consistency between different CLI commands that access the same data
+// 2. It validates that both the bootstrap-specific command and generic config command
+// use the same underlying autoconf resolution mechanism
+// 3. It prevents regression where different commands might resolve "auto" differently
+// 4. It ensures users get consistent results regardless of which command they use
+func testBootstrapCommandConsistency(t *testing.T) {
+ // Test scenario: CLI with daemon started and autoconf cached
+ // This ensures both bootstrap commands read from the same cached autoconf data
+
+ // Load test autoconf data
+ autoConfData := loadTestDataComprehensive(t, "valid_autoconf.json")
+
+ // Track HTTP requests to verify daemon fetches autoconf
+ var requestCount atomic.Int32
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ requestCount.Add(1)
+ t.Logf("Bootstrap consistency test request: %s %s", r.Method, r.URL.Path)
+ w.Header().Set("Content-Type", "application/json")
+ _, _ = w.Write(autoConfData)
+ }))
+ defer server.Close()
+
+ // Create IPFS node with auto bootstrap
+ node := harness.NewT(t).NewNode().Init("--profile=test")
+ node.SetIPFSConfig("AutoConf.URL", server.URL)
+ node.SetIPFSConfig("AutoConf.Enabled", true)
+ node.SetIPFSConfig("Bootstrap", []string{"auto"})
+
+ // Start daemon and wait for autoconf fetch
+ daemon := startDaemonAndWaitForAutoConf(t, node, &requestCount)
+ defer daemon.StopDaemon()
+
+ // Get bootstrap via config command
+ configResult := node.RunIPFS("config", "Bootstrap", "--expand-auto")
+ require.Equal(t, 0, configResult.ExitCode(), "config Bootstrap --expand-auto should succeed")
+
+ // Get bootstrap via bootstrap command
+ bootstrapResult := node.RunIPFS("bootstrap", "list", "--expand-auto")
+ require.Equal(t, 0, bootstrapResult.ExitCode(), "bootstrap list --expand-auto should succeed")
+
+ // Parse both results
+ var configBootstrap, bootstrapBootstrap []string
+ err := json.Unmarshal([]byte(configResult.Stdout.String()), &configBootstrap)
+ require.NoError(t, err)
+
+ // Bootstrap command output is line-separated, not JSON
+ bootstrapOutput := strings.TrimSpace(bootstrapResult.Stdout.String())
+ if bootstrapOutput != "" {
+ bootstrapBootstrap = strings.Split(bootstrapOutput, "\n")
+ }
+
+ // Results should be equivalent
+ assert.Equal(t, len(configBootstrap), len(bootstrapBootstrap), "Both commands should return same number of peers")
+
+ // Both should contain same peers (order might differ due to different output formats)
+ for _, peer := range configBootstrap {
+ found := false
+ for _, bsPeer := range bootstrapBootstrap {
+ if strings.TrimSpace(bsPeer) == peer {
+ found = true
+ break
+ }
+ }
+ assert.True(t, found, "Peer %s should be in both results", peer)
+ }
+
+ t.Logf("Config command result: %v", configBootstrap)
+ t.Logf("Bootstrap command result: %v", bootstrapBootstrap)
+}
+
+// testWriteOperationsFailWithExpandAuto verifies that --expand-auto flag is properly
+// restricted to read-only operations and fails when used with config write operations.
+//
+// This test is essential because:
+// 1. It enforces the security principle that --expand-auto should only be used for reading
+// 2. It prevents users from accidentally overwriting config with expanded values
+// 3. It ensures that "auto" placeholders are preserved in the stored configuration
+// 4. It validates proper error handling and user guidance when misused
+// 5. It protects against accidental loss of the "auto" semantic meaning
+func testWriteOperationsFailWithExpandAuto(t *testing.T) {
+ // Test scenario: CLI without daemon (tests error conditions)
+ // This test doesn't need daemon setup since it's testing that write operations
+ // with --expand-auto should fail with appropriate error messages
+
+ // Create IPFS node
+ node := harness.NewT(t).NewNode().Init("--profile=test")
+ node.SetIPFSConfig("Bootstrap", []string{"auto"})
+
+ // Test that setting config with --expand-auto fails
+ testCases := []struct {
+ name string
+ args []string
+ }{
+ {"config set with expand-auto", []string{"config", "Bootstrap", "[\"test\"]", "--expand-auto"}},
+ {"config set JSON with expand-auto", []string{"config", "Bootstrap", "[\"test\"]", "--json", "--expand-auto"}},
+ {"config set bool with expand-auto", []string{"config", "SomeField", "true", "--bool", "--expand-auto"}},
+ }
+
+ for _, tc := range testCases {
+ t.Run(tc.name, func(t *testing.T) {
+ result := node.RunIPFS(tc.args...)
+ assert.NotEqual(t, 0, result.ExitCode(), "Write operation with --expand-auto should fail")
+
+ stderr := result.Stderr.String()
+ assert.Contains(t, stderr, "--expand-auto", "Error should mention --expand-auto")
+ assert.Contains(t, stderr, "reading", "Error should mention reading limitation")
+ t.Logf("Expected error: %s", stderr)
+ })
+ }
+}
+
+// testConfigShowExpandAutoComplete verifies that `ipfs config show --expand-auto`
+// produces a complete configuration with all "auto" values expanded to their resolved forms.
+//
+// This test is important because:
+// 1. It validates the full-config expansion functionality for comprehensive troubleshooting
+// 2. It ensures that users can see the complete resolved configuration state
+// 3. It verifies that all "auto" placeholders are replaced, not just individual fields
+// 4. It tests that the resulting JSON is valid and well-formed
+// 5. It provides a way to export/backup the fully expanded configuration
+func testConfigShowExpandAutoComplete(t *testing.T) {
+ // Test scenario: CLI with daemon started and autoconf cached
+
+ // Load test autoconf data
+ autoConfData := loadTestDataComprehensive(t, "valid_autoconf.json")
+
+ // Track HTTP requests to verify daemon fetches autoconf
+ var requestCount atomic.Int32
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ requestCount.Add(1)
+ t.Logf("Config show test request: %s %s", r.Method, r.URL.Path)
+ w.Header().Set("Content-Type", "application/json")
+ _, _ = w.Write(autoConfData)
+ }))
+ defer server.Close()
+
+ // Create IPFS node with multiple auto values
+ node := harness.NewT(t).NewNode().Init("--profile=test")
+ node.SetIPFSConfig("AutoConf.URL", server.URL)
+ node.SetIPFSConfig("AutoConf.Enabled", true)
+ node.SetIPFSConfig("Bootstrap", []string{"auto"})
+ node.SetIPFSConfig("DNS.Resolvers", map[string]string{".": "auto"})
+
+ // Start daemon and wait for autoconf fetch
+ daemon := startDaemonAndWaitForAutoConf(t, node, &requestCount)
+ defer daemon.StopDaemon()
+
+ // Test config show --expand-auto
+ result := node.RunIPFS("config", "show", "--expand-auto")
+ require.Equal(t, 0, result.ExitCode(), "config show --expand-auto should succeed")
+
+ expandedConfig := result.Stdout.String()
+
+ // Should not contain any literal "auto" values
+ assert.NotContains(t, expandedConfig, `"auto"`, "Expanded config should not contain literal 'auto' values")
+
+ // Should contain expected expanded sections
+ assert.Contains(t, expandedConfig, `"Bootstrap"`, "Should contain Bootstrap section")
+ assert.Contains(t, expandedConfig, `"DNS"`, "Should contain DNS section")
+ assert.Contains(t, expandedConfig, `"Resolvers"`, "Should contain Resolvers section")
+
+ // Should contain expanded peer addresses (not "auto")
+ assert.Contains(t, expandedConfig, "bootstrap.libp2p.io", "Should contain expanded bootstrap peers")
+
+ // Should be valid JSON
+ var configMap map[string]interface{}
+ err := json.Unmarshal([]byte(expandedConfig), &configMap)
+ require.NoError(t, err, "Expanded config should be valid JSON")
+
+ // Verify specific fields were expanded
+ if bootstrap, ok := configMap["Bootstrap"].([]interface{}); ok {
+ assert.Greater(t, len(bootstrap), 0, "Bootstrap should have expanded entries")
+ for _, peer := range bootstrap {
+ assert.NotEqual(t, "auto", peer, "Bootstrap entries should not be 'auto'")
+ }
+ }
+
+ t.Logf("Config show --expand-auto produced %d characters of expanded config", len(expandedConfig))
+}
+
+// testMultipleExpandAutoUsesCache verifies that multiple consecutive --expand-auto calls
+// efficiently use cached autoconf data instead of making repeated HTTP requests.
+//
+// This test is critical for performance because:
+// 1. It validates that the caching mechanism works correctly to reduce network overhead
+// 2. It ensures that users can make multiple config queries without causing excessive HTTP traffic
+// 3. It verifies that cached data is shared across different config fields and commands
+// 4. It tests that HTTP headers (ETag/Last-Modified) are properly used for cache validation
+// 5. It prevents regression where each --expand-auto call would trigger a new HTTP request
+// 6. It demonstrates the performance benefit: 5 operations with only 1 network request
+func testMultipleExpandAutoUsesCache(t *testing.T) {
+ // Test scenario: CLI with daemon started and autoconf cached
+
+ // Create comprehensive autoconf response
+ autoConfData := loadTestDataComprehensive(t, "valid_autoconf.json")
+
+ // Track HTTP requests to verify caching
+ var requestCount atomic.Int32
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ count := requestCount.Add(1)
+ t.Logf("AutoConf cache test request #%d: %s %s", count, r.Method, r.URL.Path)
+
+ w.Header().Set("Content-Type", "application/json")
+ w.Header().Set("ETag", `"cache-test-123"`)
+ w.Header().Set("Last-Modified", "Wed, 21 Oct 2015 07:28:00 GMT")
+ _, _ = w.Write(autoConfData)
+ }))
+ defer server.Close()
+
+ // Create IPFS node with all auto values
+ node := harness.NewT(t).NewNode().Init("--profile=test")
+ node.SetIPFSConfig("AutoConf.URL", server.URL)
+ node.SetIPFSConfig("AutoConf.Enabled", true)
+ // Note: Using default RefreshInterval (24h) to ensure caching - explicit setting would require rebuilt binary
+
+ // Set up auto values for multiple fields
+ node.SetIPFSConfig("Bootstrap", []string{"auto"})
+ node.SetIPFSConfig("DNS.Resolvers", map[string]string{"foo.": "auto"})
+ node.SetIPFSConfig("Routing.DelegatedRouters", []string{"auto"})
+ node.SetIPFSConfig("Ipns.DelegatedPublishers", []string{"auto"})
+
+ // Start daemon and wait for autoconf fetch
+ daemon := startDaemonAndWaitForAutoConf(t, node, &requestCount)
+ defer daemon.StopDaemon()
+
+ // Reset counter to only track our expand-auto calls
+ requestCount.Store(0)
+
+ // Make multiple --expand-auto calls on different fields
+ t.Log("Testing multiple --expand-auto calls should use cache...")
+
+ // Call 1: Bootstrap --expand-auto (should trigger HTTP request)
+ result1 := node.RunIPFS("config", "Bootstrap", "--expand-auto")
+ require.Equal(t, 0, result1.ExitCode(), "Bootstrap --expand-auto should succeed")
+
+ var expandedBootstrap []string
+ err := json.Unmarshal([]byte(result1.Stdout.String()), &expandedBootstrap)
+ require.NoError(t, err)
+ assert.NotContains(t, expandedBootstrap, "auto", "Bootstrap should be expanded")
+ assert.Greater(t, len(expandedBootstrap), 0, "Bootstrap should have entries")
+
+ // Call 2: DNS.Resolvers --expand-auto (should use cache, no HTTP)
+ result2 := node.RunIPFS("config", "DNS.Resolvers", "--expand-auto")
+ require.Equal(t, 0, result2.ExitCode(), "DNS.Resolvers --expand-auto should succeed")
+
+ var expandedResolvers map[string]string
+ err = json.Unmarshal([]byte(result2.Stdout.String()), &expandedResolvers)
+ require.NoError(t, err)
+
+ // Call 3: Routing.DelegatedRouters --expand-auto (should use cache, no HTTP)
+ result3 := node.RunIPFS("config", "Routing.DelegatedRouters", "--expand-auto")
+ require.Equal(t, 0, result3.ExitCode(), "Routing.DelegatedRouters --expand-auto should succeed")
+
+ var expandedRouters []string
+ err = json.Unmarshal([]byte(result3.Stdout.String()), &expandedRouters)
+ require.NoError(t, err)
+ assert.NotContains(t, expandedRouters, "auto", "Routers should be expanded")
+
+ // Call 4: Ipns.DelegatedPublishers --expand-auto (should use cache, no HTTP)
+ result4 := node.RunIPFS("config", "Ipns.DelegatedPublishers", "--expand-auto")
+ require.Equal(t, 0, result4.ExitCode(), "Ipns.DelegatedPublishers --expand-auto should succeed")
+
+ var expandedPublishers []string
+ err = json.Unmarshal([]byte(result4.Stdout.String()), &expandedPublishers)
+ require.NoError(t, err)
+ assert.NotContains(t, expandedPublishers, "auto", "Publishers should be expanded")
+
+ // Call 5: config show --expand-auto (should use cache, no HTTP)
+ result5 := node.RunIPFS("config", "show", "--expand-auto")
+ require.Equal(t, 0, result5.ExitCode(), "config show --expand-auto should succeed")
+
+ expandedConfig := result5.Stdout.String()
+ assert.NotContains(t, expandedConfig, `"auto"`, "Full config should not contain 'auto' values")
+
+ // CRITICAL TEST: Verify NO HTTP requests were made for --expand-auto calls (using cache)
+ finalRequestCount := requestCount.Load()
+ assert.Equal(t, int32(0), finalRequestCount,
+ "Multiple --expand-auto calls should result in 0 HTTP requests (using cache). Got %d requests", finalRequestCount)
+
+ t.Logf("Made 5 --expand-auto calls, resulted in %d HTTP request(s) - cache is being used!", finalRequestCount)
+
+ // Now simulate a manual cache refresh (what the background updater would do)
+ t.Log("Simulating manual cache refresh...")
+
+ // Update the mock server to return different data
+ autoConfData2 := loadTestDataComprehensive(t, "updated_autoconf.json")
+ server.Config.Handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ count := requestCount.Add(1)
+ t.Logf("Manual refresh request #%d: %s %s", count, r.Method, r.URL.Path)
+ w.Header().Set("Content-Type", "application/json")
+ w.Header().Set("ETag", `"cache-test-456"`)
+ w.Header().Set("Last-Modified", "Thu, 22 Oct 2015 08:00:00 GMT")
+ _, _ = w.Write(autoConfData2)
+ })
+
+ // Note: In the actual daemon, the background updater would call MustGetConfigWithRefresh
+ // For this test, we'll verify that subsequent --expand-auto calls still use cache
+ // and don't trigger additional requests
+
+ // Reset counter before manual refresh simulation
+ beforeRefresh := requestCount.Load()
+
+ // Make another --expand-auto call - should still use cache
+ result6 := node.RunIPFS("config", "Bootstrap", "--expand-auto")
+ require.Equal(t, 0, result6.ExitCode(), "Bootstrap --expand-auto after refresh should succeed")
+
+ afterRefresh := requestCount.Load()
+ assert.Equal(t, beforeRefresh, afterRefresh,
+ "--expand-auto should continue using cache even after server update")
+
+ t.Logf("Cache continues to be used after server update - background updater pattern confirmed!")
+}
+
+// testCLIUsesCacheOnlyDaemonUpdatesBackground verifies the correct autoconf behavior:
+// daemon makes exactly one HTTP request during startup to fetch and cache data, then
+// CLI commands always use cached data without making additional HTTP requests.
+//
+// This test is essential for correctness because:
+// 1. It validates that daemon startup makes exactly one HTTP request to fetch autoconf
+// 2. It verifies that CLI --expand-auto never makes HTTP requests (uses cache only)
+// 3. It ensures CLI commands remain fast by always using cached data
+// 4. It prevents regression where CLI commands might start making HTTP requests
+// 5. It confirms the correct separation between daemon (network) and CLI (cache-only) behavior
+func testCLIUsesCacheOnlyDaemonUpdatesBackground(t *testing.T) {
+ // Test scenario: CLI with daemon and long RefreshInterval (no background updates during test)
+
+ // Create autoconf response
+ autoConfData := loadTestDataComprehensive(t, "valid_autoconf.json")
+
+ // Track HTTP requests with timestamps
+ var requestCount atomic.Int32
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ count := requestCount.Add(1)
+ t.Logf("Cache expiry test request #%d at %s: %s %s", count, time.Now().Format("15:04:05.000"), r.Method, r.URL.Path)
+
+ w.Header().Set("Content-Type", "application/json")
+ // Use different ETag for each request to ensure we can detect new fetches
+ w.Header().Set("ETag", fmt.Sprintf(`"expiry-test-%d"`, count))
+ w.Header().Set("Last-Modified", time.Now().Format(http.TimeFormat))
+ _, _ = w.Write(autoConfData)
+ }))
+ defer server.Close()
+
+ // Create IPFS node with long refresh interval
+ node := harness.NewT(t).NewNode().Init("--profile=test")
+ node.SetIPFSConfig("AutoConf.URL", server.URL)
+ node.SetIPFSConfig("AutoConf.Enabled", true)
+ // Set long RefreshInterval to avoid background updates during test
+ node.SetIPFSConfig("AutoConf.RefreshInterval", "1h")
+
+ node.SetIPFSConfig("Bootstrap", []string{"auto"})
+ node.SetIPFSConfig("DNS.Resolvers", map[string]string{"test.": "auto"})
+
+ // Start daemon and wait for autoconf fetch
+ daemon := startDaemonAndWaitForAutoConf(t, node, &requestCount)
+ defer daemon.StopDaemon()
+
+ // Confirm only one request was made during daemon startup
+ initialRequestCount := requestCount.Load()
+ assert.Equal(t, int32(1), initialRequestCount, "Expected exactly 1 HTTP request during daemon startup, got: %d", initialRequestCount)
+ t.Logf("Daemon startup made exactly 1 HTTP request")
+
+ // Test: CLI commands use cache only (no additional HTTP requests)
+ t.Log("Testing that CLI --expand-auto commands use cache only...")
+
+ // Make several CLI calls - none should trigger HTTP requests
+ result1 := node.RunIPFS("config", "Bootstrap", "--expand-auto")
+ require.Equal(t, 0, result1.ExitCode(), "Bootstrap --expand-auto should succeed")
+
+ result2 := node.RunIPFS("config", "DNS.Resolvers", "--expand-auto")
+ require.Equal(t, 0, result2.ExitCode(), "DNS.Resolvers --expand-auto should succeed")
+
+ result3 := node.RunIPFS("config", "Routing.DelegatedRouters", "--expand-auto")
+ require.Equal(t, 0, result3.ExitCode(), "Routing.DelegatedRouters --expand-auto should succeed")
+
+ // Verify the request count remains at 1 (no additional requests from CLI)
+ finalRequestCount := requestCount.Load()
+ assert.Equal(t, int32(1), finalRequestCount, "Request count should remain at 1 after CLI commands, got: %d", finalRequestCount)
+ t.Log("CLI commands use cache only - request count remains at 1")
+
+ t.Log("Test completed: Daemon makes 1 startup request, CLI commands use cache only")
+}
+
+// loadTestDataComprehensive is a helper function that loads test autoconf JSON data files.
+// It locates the test data directory relative to the test file and reads the specified file.
+// This centralized helper ensures consistent test data loading across all comprehensive tests.
+func loadTestDataComprehensive(t *testing.T, filename string) []byte {
+ t.Helper()
+
+ data, err := os.ReadFile("testdata/" + filename)
+ require.NoError(t, err, "Failed to read test data file: %s", filename)
+
+ return data
+}
+
+// startDaemonAndWaitForAutoConf starts a daemon and waits for it to fetch autoconf data.
+// It returns the node with daemon running and ensures autoconf has been cached before returning.
+// This is a DRY helper to avoid repeating daemon setup and request waiting logic in every test.
+func startDaemonAndWaitForAutoConf(t *testing.T, node *harness.Node, requestCount *atomic.Int32) *harness.Node {
+ t.Helper()
+
+ // Start daemon to fetch and cache autoconf data
+ t.Log("Starting daemon to fetch and cache autoconf data...")
+ daemon := node.StartDaemon()
+ // StartDaemon returns *Node, no error to check
+
+ // Wait for daemon to fetch autoconf (wait for HTTP request to mock server)
+ t.Log("Waiting for daemon to fetch autoconf from mock server...")
+ timeout := time.After(10 * time.Second) // Safety timeout
+ ticker := time.NewTicker(10 * time.Millisecond)
+ defer ticker.Stop()
+
+ for {
+ select {
+ case <-timeout:
+ t.Fatal("Timeout waiting for autoconf fetch")
+ case <-ticker.C:
+ if requestCount.Load() > 0 {
+ t.Logf("Daemon fetched autoconf (%d requests made)", requestCount.Load())
+ t.Log("AutoConf should now be cached by daemon")
+ return daemon
+ }
+ }
+ }
+}
diff --git a/test/cli/autoconf/expand_fallback_test.go b/test/cli/autoconf/expand_fallback_test.go
new file mode 100644
index 000000000..f6fc1e8d3
--- /dev/null
+++ b/test/cli/autoconf/expand_fallback_test.go
@@ -0,0 +1,286 @@
+package autoconf
+
+import (
+ "encoding/json"
+ "net/http"
+ "net/http/httptest"
+ "os"
+ "testing"
+ "time"
+
+ "github.com/ipfs/boxo/autoconf"
+ "github.com/ipfs/kubo/test/cli/harness"
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+)
+
+func TestExpandAutoFallbacks(t *testing.T) {
+ t.Parallel()
+
+ t.Run("expand-auto with unreachable server shows fallbacks", func(t *testing.T) {
+ t.Parallel()
+ testExpandAutoWithUnreachableServer(t)
+ })
+
+ t.Run("expand-auto with disabled autoconf shows error", func(t *testing.T) {
+ t.Parallel()
+ testExpandAutoWithDisabledAutoConf(t)
+ })
+
+ t.Run("expand-auto with malformed response shows fallbacks", func(t *testing.T) {
+ t.Parallel()
+ testExpandAutoWithMalformedResponse(t)
+ })
+
+ t.Run("expand-auto preserves static values in mixed config", func(t *testing.T) {
+ t.Parallel()
+ testExpandAutoMixedConfigPreservesStatic(t)
+ })
+
+ t.Run("daemon gracefully handles malformed autoconf and uses fallbacks", func(t *testing.T) {
+ t.Parallel()
+ testDaemonWithMalformedAutoConf(t)
+ })
+}
+
+func testExpandAutoWithUnreachableServer(t *testing.T) {
+ // Create IPFS node with unreachable AutoConf server
+ node := harness.NewT(t).NewNode().Init("--profile=test")
+ node.SetIPFSConfig("AutoConf.URL", "http://127.0.0.1:99999/nonexistent") // Unreachable
+ node.SetIPFSConfig("AutoConf.Enabled", true)
+ node.SetIPFSConfig("Bootstrap", []string{"auto"})
+ node.SetIPFSConfig("DNS.Resolvers", map[string]string{"foo.": "auto"})
+
+ // Test that --expand-auto falls back to defaults when server is unreachable
+ result := node.RunIPFS("config", "Bootstrap", "--expand-auto")
+ require.Equal(t, 0, result.ExitCode(), "config Bootstrap --expand-auto should succeed even with unreachable server")
+
+ var bootstrap []string
+ err := json.Unmarshal([]byte(result.Stdout.String()), &bootstrap)
+ require.NoError(t, err)
+
+ // Should contain fallback bootstrap peers (not "auto" and not empty)
+ assert.NotContains(t, bootstrap, "auto", "Fallback bootstrap should not contain 'auto'")
+ assert.Greater(t, len(bootstrap), 0, "Fallback bootstrap should not be empty")
+
+ // Should contain known default bootstrap peers
+ foundDefaultPeer := false
+ for _, peer := range bootstrap {
+ if peer != "" && peer != "auto" {
+ foundDefaultPeer = true
+ t.Logf("Found fallback bootstrap peer: %s", peer)
+ break
+ }
+ }
+ assert.True(t, foundDefaultPeer, "Should contain at least one fallback bootstrap peer")
+
+ // Test DNS resolvers fallback
+ result = node.RunIPFS("config", "DNS.Resolvers", "--expand-auto")
+ require.Equal(t, 0, result.ExitCode(), "config DNS.Resolvers --expand-auto should succeed with unreachable server")
+
+ var resolvers map[string]string
+ err = json.Unmarshal([]byte(result.Stdout.String()), &resolvers)
+ require.NoError(t, err)
+
+ // When autoconf server is unreachable, DNS resolvers should fall back to defaults
+ // The "foo." resolver should not exist in fallbacks (only "eth." has fallback)
+ fooResolver, fooExists := resolvers["foo."]
+
+ if !fooExists {
+ t.Log("DNS resolver for 'foo.' has no fallback - correct behavior (only eth. has fallbacks)")
+ } else {
+ assert.NotEqual(t, "auto", fooResolver, "DNS resolver should not be 'auto' after expansion")
+ t.Logf("Unexpected DNS resolver for foo.: %s", fooResolver)
+ }
+}
+
+func testExpandAutoWithDisabledAutoConf(t *testing.T) {
+ // Create IPFS node with AutoConf disabled
+ node := harness.NewT(t).NewNode().Init("--profile=test")
+ node.SetIPFSConfig("AutoConf.Enabled", false)
+ node.SetIPFSConfig("Bootstrap", []string{"auto"})
+
+ // Test that --expand-auto with disabled AutoConf returns appropriate error or fallback
+ result := node.RunIPFS("config", "Bootstrap", "--expand-auto")
+
+ // When AutoConf is disabled, expand-auto should show empty results
+ // since "auto" values are not expanded when AutoConf.Enabled=false
+ var bootstrap []string
+ err := json.Unmarshal([]byte(result.Stdout.String()), &bootstrap)
+ require.NoError(t, err)
+
+ // With AutoConf disabled, "auto" values are not expanded so we get empty result
+ assert.NotContains(t, bootstrap, "auto", "Should not contain 'auto' after expansion")
+ assert.Equal(t, 0, len(bootstrap), "Should be empty when AutoConf disabled (auto values not expanded)")
+ t.Log("Bootstrap is empty when AutoConf disabled - correct behavior")
+}
+
+func testExpandAutoWithMalformedResponse(t *testing.T) {
+ // Create server that returns malformed JSON
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.Header().Set("Content-Type", "application/json")
+ _, _ = w.Write([]byte(`{"invalid": "json", "Bootstrap": [incomplete`)) // Malformed JSON
+ }))
+ defer server.Close()
+
+ // Create IPFS node with malformed autoconf server
+ node := harness.NewT(t).NewNode().Init("--profile=test")
+ node.SetIPFSConfig("AutoConf.URL", server.URL)
+ node.SetIPFSConfig("AutoConf.Enabled", true)
+ node.SetIPFSConfig("Bootstrap", []string{"auto"})
+
+ // Test that --expand-auto handles malformed response gracefully
+ result := node.RunIPFS("config", "Bootstrap", "--expand-auto")
+ require.Equal(t, 0, result.ExitCode(), "config Bootstrap --expand-auto should succeed even with malformed response")
+
+ var bootstrap []string
+ err := json.Unmarshal([]byte(result.Stdout.String()), &bootstrap)
+ require.NoError(t, err)
+
+ // Should fall back to defaults, not contain "auto"
+ assert.NotContains(t, bootstrap, "auto", "Should not contain 'auto' after fallback")
+ assert.Greater(t, len(bootstrap), 0, "Should contain fallback peers after malformed response")
+ t.Logf("Bootstrap after malformed response: %v", bootstrap)
+}
+
+func testExpandAutoMixedConfigPreservesStatic(t *testing.T) {
+ // Load valid test autoconf data
+ autoConfData := loadTestDataForFallback(t, "valid_autoconf.json")
+
+ // Create HTTP server that serves autoconf.json
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.Header().Set("Content-Type", "application/json")
+ _, _ = w.Write(autoConfData)
+ }))
+ defer server.Close()
+
+ // Create IPFS node with mixed auto and static values
+ node := harness.NewT(t).NewNode().Init("--profile=test")
+ node.SetIPFSConfig("AutoConf.URL", server.URL)
+ node.SetIPFSConfig("AutoConf.Enabled", true)
+
+ // Set mixed configuration: static + auto + static
+ node.SetIPFSConfig("Bootstrap", []string{
+ "/ip4/127.0.0.1/tcp/4001/p2p/12D3KooWTest",
+ "auto",
+ "/ip4/127.0.0.2/tcp/4001/p2p/12D3KooWTest2",
+ })
+
+ // Test that --expand-auto only expands "auto" values, preserves static ones
+ result := node.RunIPFS("config", "Bootstrap", "--expand-auto")
+ require.Equal(t, 0, result.ExitCode(), "config Bootstrap --expand-auto should succeed")
+
+ var bootstrap []string
+ err := json.Unmarshal([]byte(result.Stdout.String()), &bootstrap)
+ require.NoError(t, err)
+
+ // Should not contain literal "auto" anymore
+ assert.NotContains(t, bootstrap, "auto", "Expanded config should not contain literal 'auto'")
+
+ // Should preserve static values at original positions
+ assert.Contains(t, bootstrap, "/ip4/127.0.0.1/tcp/4001/p2p/12D3KooWTest", "Should preserve first static peer")
+ assert.Contains(t, bootstrap, "/ip4/127.0.0.2/tcp/4001/p2p/12D3KooWTest2", "Should preserve third static peer")
+
+ // Should have more entries than just the static ones (auto got expanded)
+ assert.Greater(t, len(bootstrap), 2, "Should have more than just the 2 static peers")
+
+ t.Logf("Mixed config expansion result: %v", bootstrap)
+
+ // Verify order is preserved: static, expanded auto values, static
+ assert.Equal(t, "/ip4/127.0.0.1/tcp/4001/p2p/12D3KooWTest", bootstrap[0], "First peer should be preserved")
+ lastIndex := len(bootstrap) - 1
+ assert.Equal(t, "/ip4/127.0.0.2/tcp/4001/p2p/12D3KooWTest2", bootstrap[lastIndex], "Last peer should be preserved")
+}
+
+func testDaemonWithMalformedAutoConf(t *testing.T) {
+ // Test scenario: Daemon starts with AutoConf.URL pointing to server that returns malformed JSON
+ // This tests that daemon gracefully handles malformed responses and falls back to hardcoded defaults
+
+ // Create server that returns malformed JSON to simulate broken autoconf service
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.Header().Set("Content-Type", "application/json")
+ // Return malformed JSON that cannot be parsed
+ _, _ = w.Write([]byte(`{"Bootstrap": ["incomplete array", "missing closing bracket"`))
+ }))
+ defer server.Close()
+
+ // Create IPFS node with autoconf pointing to malformed server
+ node := harness.NewT(t).NewNode().Init("--profile=test")
+ node.SetIPFSConfig("AutoConf.URL", server.URL)
+ node.SetIPFSConfig("AutoConf.Enabled", true)
+ node.SetIPFSConfig("Bootstrap", []string{"auto"})
+ node.SetIPFSConfig("DNS.Resolvers", map[string]string{"foo.": "auto"})
+
+ // Start daemon - this will attempt to fetch autoconf from malformed server
+ t.Log("Starting daemon with malformed autoconf server...")
+ daemon := node.StartDaemon()
+ defer daemon.StopDaemon()
+
+ // Wait for daemon to attempt autoconf fetch and handle the error gracefully
+ time.Sleep(6 * time.Second) // defaultTimeout is 5s, add 1s buffer
+ t.Log("Daemon should have attempted autoconf fetch and fallen back to defaults")
+
+ // Test that daemon is still running and CLI commands work with fallback values
+ result := node.RunIPFS("config", "Bootstrap", "--expand-auto")
+ require.Equal(t, 0, result.ExitCode(), "config Bootstrap --expand-auto should succeed with daemon running")
+
+ var bootstrap []string
+ err := json.Unmarshal([]byte(result.Stdout.String()), &bootstrap)
+ require.NoError(t, err)
+
+ // Should fall back to hardcoded defaults from GetMainnetFallbackConfig()
+ // NOTE: These values may change if autoconf library updates GetMainnetFallbackConfig()
+ assert.NotContains(t, bootstrap, "auto", "Should not contain 'auto' after fallback")
+ assert.Greater(t, len(bootstrap), 0, "Should contain fallback bootstrap peers")
+
+ // Verify we got actual fallback bootstrap peers from GetMainnetFallbackConfig() AminoDHT NativeConfig
+ fallbackConfig := autoconf.GetMainnetFallbackConfig()
+ aminoDHTSystem := fallbackConfig.SystemRegistry["AminoDHT"]
+ expectedBootstrapPeers := aminoDHTSystem.NativeConfig.Bootstrap
+
+ foundFallbackPeers := 0
+ for _, expectedPeer := range expectedBootstrapPeers {
+ for _, actualPeer := range bootstrap {
+ if actualPeer == expectedPeer {
+ foundFallbackPeers++
+ break
+ }
+ }
+ }
+ assert.Greater(t, foundFallbackPeers, 0, "Should contain bootstrap peers from GetMainnetFallbackConfig() AminoDHT NativeConfig")
+ assert.Equal(t, len(expectedBootstrapPeers), foundFallbackPeers, "Should contain all bootstrap peers from GetMainnetFallbackConfig() AminoDHT NativeConfig")
+
+ t.Logf("Daemon fallback bootstrap peers after malformed response: %v", bootstrap)
+
+ // Test DNS resolvers also fall back correctly
+ result = node.RunIPFS("config", "DNS.Resolvers", "--expand-auto")
+ require.Equal(t, 0, result.ExitCode(), "config DNS.Resolvers --expand-auto should succeed with daemon running")
+
+ var resolvers map[string]string
+ err = json.Unmarshal([]byte(result.Stdout.String()), &resolvers)
+ require.NoError(t, err)
+
+ // Should not contain "auto" and should have fallback DNS resolvers
+ assert.NotEqual(t, "auto", resolvers["foo."], "DNS resolver should not be 'auto' after fallback")
+ if resolvers["foo."] != "" {
+ // If resolver is populated, it should be a valid URL from fallbacks
+ assert.Contains(t, resolvers["foo."], "https://", "Fallback DNS resolver should be HTTPS URL")
+ }
+
+ t.Logf("Daemon fallback DNS resolvers after malformed response: %v", resolvers)
+
+ // Verify daemon is still healthy and responsive
+ versionResult := node.RunIPFS("version")
+ require.Equal(t, 0, versionResult.ExitCode(), "daemon should remain healthy after handling malformed autoconf")
+ t.Log("Daemon remains healthy after gracefully handling malformed autoconf response")
+}
+
+// Helper function to load test data files for fallback tests
+func loadTestDataForFallback(t *testing.T, filename string) []byte {
+ t.Helper()
+
+ data, err := os.ReadFile("testdata/" + filename)
+ require.NoError(t, err, "Failed to read test data file: %s", filename)
+
+ return data
+}
diff --git a/test/cli/autoconf/expand_test.go b/test/cli/autoconf/expand_test.go
new file mode 100644
index 000000000..45a46560f
--- /dev/null
+++ b/test/cli/autoconf/expand_test.go
@@ -0,0 +1,732 @@
+package autoconf
+
+import (
+ "encoding/json"
+ "net/http"
+ "net/http/httptest"
+ "os"
+ "testing"
+ "time"
+
+ "github.com/ipfs/kubo/test/cli/harness"
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+)
+
+func TestAutoConfExpand(t *testing.T) {
+ t.Parallel()
+
+ t.Run("config commands show auto values", func(t *testing.T) {
+ t.Parallel()
+ testConfigCommandsShowAutoValues(t)
+ })
+
+ t.Run("mixed configuration preserves both auto and static", func(t *testing.T) {
+ t.Parallel()
+ testMixedConfigurationPreserved(t)
+ })
+
+ t.Run("config replace preserves auto values", func(t *testing.T) {
+ t.Parallel()
+ testConfigReplacePreservesAuto(t)
+ })
+
+ t.Run("expand-auto filters unsupported URL paths with delegated routing", func(t *testing.T) {
+ t.Parallel()
+ testExpandAutoFiltersUnsupportedPathsDelegated(t)
+ })
+
+ t.Run("expand-auto with auto routing uses NewRoutingSystem", func(t *testing.T) {
+ t.Parallel()
+ testExpandAutoWithAutoRouting(t)
+ })
+
+ t.Run("expand-auto with auto routing shows AminoDHT native vs IPNI delegated", func(t *testing.T) {
+ t.Parallel()
+ testExpandAutoWithMixedSystems(t)
+ })
+
+ t.Run("expand-auto filters paths with NewRoutingSystem and auto routing", func(t *testing.T) {
+ t.Parallel()
+ testExpandAutoWithFiltering(t)
+ })
+
+ t.Run("expand-auto falls back to defaults without cache (delegated)", func(t *testing.T) {
+ t.Parallel()
+ testExpandAutoWithoutCacheDelegated(t)
+ })
+
+ t.Run("expand-auto with auto routing without cache", func(t *testing.T) {
+ t.Parallel()
+ testExpandAutoWithoutCacheAuto(t)
+ })
+}
+
+func testConfigCommandsShowAutoValues(t *testing.T) {
+ // Create IPFS node
+ node := harness.NewT(t).NewNode().Init("--profile=test")
+
+ // Set all fields to "auto"
+ node.SetIPFSConfig("Bootstrap", []string{"auto"})
+ node.SetIPFSConfig("DNS.Resolvers", map[string]string{"foo.": "auto"})
+ node.SetIPFSConfig("Routing.DelegatedRouters", []string{"auto"})
+ node.SetIPFSConfig("Ipns.DelegatedPublishers", []string{"auto"})
+
+ // Test individual field queries
+ t.Run("Bootstrap shows auto", func(t *testing.T) {
+ result := node.RunIPFS("config", "Bootstrap")
+ require.Equal(t, 0, result.ExitCode())
+
+ var bootstrap []string
+ err := json.Unmarshal([]byte(result.Stdout.String()), &bootstrap)
+ require.NoError(t, err)
+ assert.Equal(t, []string{"auto"}, bootstrap)
+ })
+
+ t.Run("DNS.Resolvers shows auto", func(t *testing.T) {
+ result := node.RunIPFS("config", "DNS.Resolvers")
+ require.Equal(t, 0, result.ExitCode())
+
+ var resolvers map[string]string
+ err := json.Unmarshal([]byte(result.Stdout.String()), &resolvers)
+ require.NoError(t, err)
+ assert.Equal(t, map[string]string{"foo.": "auto"}, resolvers)
+ })
+
+ t.Run("Routing.DelegatedRouters shows auto", func(t *testing.T) {
+ result := node.RunIPFS("config", "Routing.DelegatedRouters")
+ require.Equal(t, 0, result.ExitCode())
+
+ var routers []string
+ err := json.Unmarshal([]byte(result.Stdout.String()), &routers)
+ require.NoError(t, err)
+ assert.Equal(t, []string{"auto"}, routers)
+ })
+
+ t.Run("Ipns.DelegatedPublishers shows auto", func(t *testing.T) {
+ result := node.RunIPFS("config", "Ipns.DelegatedPublishers")
+ require.Equal(t, 0, result.ExitCode())
+
+ var publishers []string
+ err := json.Unmarshal([]byte(result.Stdout.String()), &publishers)
+ require.NoError(t, err)
+ assert.Equal(t, []string{"auto"}, publishers)
+ })
+
+ t.Run("config show contains all auto values", func(t *testing.T) {
+ result := node.RunIPFS("config", "show")
+ require.Equal(t, 0, result.ExitCode())
+
+ output := result.Stdout.String()
+
+ // Check that auto values are present in the full config
+ assert.Contains(t, output, `"Bootstrap": [
+ "auto"
+ ]`, "Bootstrap should contain auto")
+
+ assert.Contains(t, output, `"DNS": {
+ "Resolvers": {
+ "foo.": "auto"
+ }
+ }`, "DNS.Resolvers should contain auto")
+
+ assert.Contains(t, output, `"DelegatedRouters": [
+ "auto"
+ ]`, "Routing.DelegatedRouters should contain auto")
+
+ assert.Contains(t, output, `"DelegatedPublishers": [
+ "auto"
+ ]`, "Ipns.DelegatedPublishers should contain auto")
+ })
+
+ // Test with autoconf server for --expand-auto functionality
+ t.Run("config with --expand-auto expands auto values", func(t *testing.T) {
+ // Load test autoconf data
+ autoConfData := loadTestDataExpand(t, "valid_autoconf.json")
+
+ // Create HTTP server that serves autoconf.json
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.Header().Set("Content-Type", "application/json")
+ _, _ = w.Write(autoConfData)
+ }))
+ defer server.Close()
+
+ // Configure autoconf for the node
+ node.SetIPFSConfig("AutoConf.URL", server.URL)
+ node.SetIPFSConfig("AutoConf.Enabled", true)
+
+ // Test Bootstrap field expansion
+ result := node.RunIPFS("config", "Bootstrap", "--expand-auto")
+ require.Equal(t, 0, result.ExitCode(), "config Bootstrap --expand-auto should succeed")
+
+ var expandedBootstrap []string
+ err := json.Unmarshal([]byte(result.Stdout.String()), &expandedBootstrap)
+ require.NoError(t, err)
+ assert.NotContains(t, expandedBootstrap, "auto", "Expanded bootstrap should not contain 'auto'")
+ assert.Greater(t, len(expandedBootstrap), 0, "Expanded bootstrap should contain expanded peers")
+
+ // Test DNS.Resolvers field expansion
+ result = node.RunIPFS("config", "DNS.Resolvers", "--expand-auto")
+ require.Equal(t, 0, result.ExitCode(), "config DNS.Resolvers --expand-auto should succeed")
+
+ var expandedResolvers map[string]string
+ err = json.Unmarshal([]byte(result.Stdout.String()), &expandedResolvers)
+ require.NoError(t, err)
+ assert.NotEqual(t, "auto", expandedResolvers["foo."], "Expanded DNS resolver should not be 'auto'")
+
+ // Test Routing.DelegatedRouters field expansion
+ result = node.RunIPFS("config", "Routing.DelegatedRouters", "--expand-auto")
+ require.Equal(t, 0, result.ExitCode(), "config Routing.DelegatedRouters --expand-auto should succeed")
+
+ var expandedRouters []string
+ err = json.Unmarshal([]byte(result.Stdout.String()), &expandedRouters)
+ require.NoError(t, err)
+ assert.NotContains(t, expandedRouters, "auto", "Expanded routers should not contain 'auto'")
+
+ // Test Ipns.DelegatedPublishers field expansion
+ result = node.RunIPFS("config", "Ipns.DelegatedPublishers", "--expand-auto")
+ require.Equal(t, 0, result.ExitCode(), "config Ipns.DelegatedPublishers --expand-auto should succeed")
+
+ var expandedPublishers []string
+ err = json.Unmarshal([]byte(result.Stdout.String()), &expandedPublishers)
+ require.NoError(t, err)
+ assert.NotContains(t, expandedPublishers, "auto", "Expanded publishers should not contain 'auto'")
+
+ // Test config show --expand-auto (full config expansion)
+ result = node.RunIPFS("config", "show", "--expand-auto")
+ require.Equal(t, 0, result.ExitCode(), "config show --expand-auto should succeed")
+
+ expandedOutput := result.Stdout.String()
+ t.Logf("Expanded config output contains: %d characters", len(expandedOutput))
+
+ // Verify that auto values are expanded in the full config
+ assert.NotContains(t, expandedOutput, `"auto"`, "Expanded config should not contain literal 'auto' values")
+ assert.Contains(t, expandedOutput, `"Bootstrap"`, "Expanded config should contain Bootstrap section")
+ assert.Contains(t, expandedOutput, `"DNS"`, "Expanded config should contain DNS section")
+ })
+}
+
+func testMixedConfigurationPreserved(t *testing.T) {
+ // Create IPFS node
+ node := harness.NewT(t).NewNode().Init("--profile=test")
+
+ // Set mixed configuration
+ node.SetIPFSConfig("Bootstrap", []string{
+ "/ip4/127.0.0.1/tcp/4001/p2p/12D3KooWTest",
+ "auto",
+ "/ip4/127.0.0.2/tcp/4001/p2p/12D3KooWTest2",
+ })
+
+ node.SetIPFSConfig("DNS.Resolvers", map[string]string{
+ "eth.": "https://eth.resolver",
+ "foo.": "auto",
+ "bar.": "https://bar.resolver",
+ })
+
+ node.SetIPFSConfig("Routing.DelegatedRouters", []string{
+ "https://static.router",
+ "auto",
+ })
+
+ // Verify Bootstrap preserves order and mixes auto with static
+ result := node.RunIPFS("config", "Bootstrap")
+ require.Equal(t, 0, result.ExitCode())
+
+ var bootstrap []string
+ err := json.Unmarshal([]byte(result.Stdout.String()), &bootstrap)
+ require.NoError(t, err)
+ assert.Equal(t, []string{
+ "/ip4/127.0.0.1/tcp/4001/p2p/12D3KooWTest",
+ "auto",
+ "/ip4/127.0.0.2/tcp/4001/p2p/12D3KooWTest2",
+ }, bootstrap)
+
+ // Verify DNS.Resolvers preserves both auto and static
+ result = node.RunIPFS("config", "DNS.Resolvers")
+ require.Equal(t, 0, result.ExitCode())
+
+ var resolvers map[string]string
+ err = json.Unmarshal([]byte(result.Stdout.String()), &resolvers)
+ require.NoError(t, err)
+ assert.Equal(t, "https://eth.resolver", resolvers["eth."])
+ assert.Equal(t, "auto", resolvers["foo."])
+ assert.Equal(t, "https://bar.resolver", resolvers["bar."])
+
+ // Verify Routing.DelegatedRouters preserves order
+ result = node.RunIPFS("config", "Routing.DelegatedRouters")
+ require.Equal(t, 0, result.ExitCode())
+
+ var routers []string
+ err = json.Unmarshal([]byte(result.Stdout.String()), &routers)
+ require.NoError(t, err)
+ assert.Equal(t, []string{
+ "https://static.router",
+ "auto",
+ }, routers)
+}
+
+func testConfigReplacePreservesAuto(t *testing.T) {
+ // Create IPFS node
+ h := harness.NewT(t)
+ node := h.NewNode().Init("--profile=test")
+
+ // Set initial auto values
+ node.SetIPFSConfig("Bootstrap", []string{"auto"})
+ node.SetIPFSConfig("DNS.Resolvers", map[string]string{"foo.": "auto"})
+
+ // Export current config
+ result := node.RunIPFS("config", "show")
+ require.Equal(t, 0, result.ExitCode())
+ originalConfig := result.Stdout.String()
+
+ // Verify auto values are in the exported config
+ assert.Contains(t, originalConfig, `"Bootstrap": [
+ "auto"
+ ]`)
+ assert.Contains(t, originalConfig, `"foo.": "auto"`)
+
+ // Modify the config string to add a new field but preserve auto values
+ var configMap map[string]interface{}
+ err := json.Unmarshal([]byte(originalConfig), &configMap)
+ require.NoError(t, err)
+
+ // Add a new field
+ configMap["NewTestField"] = "test-value"
+
+ // Marshal back to JSON
+ modifiedConfig, err := json.MarshalIndent(configMap, "", " ")
+ require.NoError(t, err)
+
+ // Write config to file and replace
+ configFile := h.WriteToTemp(string(modifiedConfig))
+ replaceResult := node.RunIPFS("config", "replace", configFile)
+ if replaceResult.ExitCode() != 0 {
+ t.Logf("Config replace failed: stdout=%s, stderr=%s", replaceResult.Stdout.String(), replaceResult.Stderr.String())
+ }
+ require.Equal(t, 0, replaceResult.ExitCode())
+
+ // Verify auto values are still present after replace
+ result = node.RunIPFS("config", "Bootstrap")
+ require.Equal(t, 0, result.ExitCode())
+
+ var bootstrap []string
+ err = json.Unmarshal([]byte(result.Stdout.String()), &bootstrap)
+ require.NoError(t, err)
+ assert.Equal(t, []string{"auto"}, bootstrap, "Bootstrap should still contain auto after config replace")
+
+ // Verify DNS resolver config is preserved after replace
+ result = node.RunIPFS("config", "DNS.Resolvers")
+ require.Equal(t, 0, result.ExitCode())
+
+ var resolvers map[string]string
+ err = json.Unmarshal([]byte(result.Stdout.String()), &resolvers)
+ require.NoError(t, err)
+ assert.Equal(t, "auto", resolvers["foo."], "DNS resolver for foo. should still be auto after config replace")
+}
+
+func testExpandAutoFiltersUnsupportedPathsDelegated(t *testing.T) {
+ // Test scenario: CLI with daemon started and autoconf cached using delegated routing
+ // This tests the production scenario where delegated routing is enabled and
+ // daemon has fetched and cached autoconf data, and CLI commands read from that cache
+
+ // Create IPFS node
+ node := harness.NewT(t).NewNode().Init("--profile=test")
+
+ // Configure delegated routing to use autoconf URLs
+ node.SetIPFSConfig("Routing.Type", "delegated")
+ node.SetIPFSConfig("Routing.DelegatedRouters", []string{"auto"})
+ node.SetIPFSConfig("Ipns.DelegatedPublishers", []string{"auto"})
+ // Disable content providing when using delegated routing
+ node.SetIPFSConfig("Provider.Enabled", false)
+ node.SetIPFSConfig("Reprovider.Interval", "0")
+
+ // Load test autoconf data with unsupported paths
+ autoConfData := loadTestDataExpand(t, "autoconf_with_unsupported_paths.json")
+
+ // Create HTTP server that serves autoconf.json with unsupported paths
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.Header().Set("Content-Type", "application/json")
+ _, _ = w.Write(autoConfData)
+ }))
+ defer server.Close()
+
+ // Configure autoconf for the node
+ node.SetIPFSConfig("AutoConf.URL", server.URL)
+ node.SetIPFSConfig("AutoConf.Enabled", true)
+
+ // Verify the autoconf URL is set correctly
+ result := node.RunIPFS("config", "AutoConf.URL")
+ require.Equal(t, 0, result.ExitCode(), "config AutoConf.URL should succeed")
+ t.Logf("AutoConf URL is set to: %s", result.Stdout.String())
+ assert.Contains(t, result.Stdout.String(), "127.0.0.1", "AutoConf URL should contain the test server address")
+
+ // Start daemon to fetch and cache autoconf data
+ t.Log("Starting daemon to fetch and cache autoconf data...")
+ daemon := node.StartDaemon()
+ defer daemon.StopDaemon()
+
+ // Wait for autoconf fetch (use autoconf default timeout + buffer)
+ time.Sleep(6 * time.Second) // defaultTimeout is 5s, add 1s buffer
+ t.Log("AutoConf should now be cached by daemon")
+
+ // Test Routing.DelegatedRouters field expansion filters unsupported paths
+ result = node.RunIPFS("config", "Routing.DelegatedRouters", "--expand-auto")
+ require.Equal(t, 0, result.ExitCode(), "config Routing.DelegatedRouters --expand-auto should succeed")
+
+ var expandedRouters []string
+ err := json.Unmarshal([]byte(result.Stdout.String()), &expandedRouters)
+ require.NoError(t, err)
+
+ // After cache prewarming, should get URLs from autoconf that have supported paths
+ assert.Contains(t, expandedRouters, "https://supported.example.com/routing/v1/providers", "Should contain supported provider URL")
+ assert.Contains(t, expandedRouters, "https://supported.example.com/routing/v1/peers", "Should contain supported peers URL")
+ assert.Contains(t, expandedRouters, "https://mixed.example.com/routing/v1/providers", "Should contain mixed provider URL")
+ assert.Contains(t, expandedRouters, "https://mixed.example.com/routing/v1/peers", "Should contain mixed peers URL")
+
+ // Verify unsupported URLs from autoconf are filtered out (not in result)
+ assert.NotContains(t, expandedRouters, "https://unsupported.example.com/example/v0/read", "Should filter out unsupported path /example/v0/read")
+ assert.NotContains(t, expandedRouters, "https://unsupported.example.com/api/v1/custom", "Should filter out unsupported path /api/v1/custom")
+ assert.NotContains(t, expandedRouters, "https://mixed.example.com/unsupported/path", "Should filter out unsupported path /unsupported/path")
+
+ t.Logf("Filtered routers: %v", expandedRouters)
+
+ // Test Ipns.DelegatedPublishers field expansion filters unsupported paths
+ result = node.RunIPFS("config", "Ipns.DelegatedPublishers", "--expand-auto")
+ require.Equal(t, 0, result.ExitCode(), "config Ipns.DelegatedPublishers --expand-auto should succeed")
+
+ var expandedPublishers []string
+ err = json.Unmarshal([]byte(result.Stdout.String()), &expandedPublishers)
+ require.NoError(t, err)
+
+ // After cache prewarming, should get URLs from autoconf that have supported paths
+ assert.Contains(t, expandedPublishers, "https://supported.example.com/routing/v1/ipns", "Should contain supported IPNS URL")
+ assert.Contains(t, expandedPublishers, "https://mixed.example.com/routing/v1/ipns", "Should contain mixed IPNS URL")
+
+ // Verify unsupported URLs from autoconf are filtered out (not in result)
+ assert.NotContains(t, expandedPublishers, "https://unsupported.example.com/example/v0/write", "Should filter out unsupported write path")
+
+ t.Logf("Filtered publishers: %v", expandedPublishers)
+}
+
+func testExpandAutoWithoutCacheDelegated(t *testing.T) {
+ // Test scenario: CLI without daemon ever starting (no cached autoconf) using delegated routing
+ // This tests the fallback scenario where delegated routing is configured but CLI commands
+ // cannot read from cache and must fall back to hardcoded defaults
+
+ // Create IPFS node but DO NOT start daemon
+ node := harness.NewT(t).NewNode().Init("--profile=test")
+
+ // Configure delegated routing to use autoconf URLs (but no daemon to fetch them)
+ node.SetIPFSConfig("Routing.Type", "delegated")
+ node.SetIPFSConfig("Routing.DelegatedRouters", []string{"auto"})
+ node.SetIPFSConfig("Ipns.DelegatedPublishers", []string{"auto"})
+ // Disable content providing when using delegated routing
+ node.SetIPFSConfig("Provider.Enabled", false)
+ node.SetIPFSConfig("Reprovider.Interval", "0")
+
+ // Load test autoconf data with unsupported paths (this won't be used since no daemon)
+ autoConfData := loadTestDataExpand(t, "autoconf_with_unsupported_paths.json")
+
+ // Create HTTP server that serves autoconf.json with unsupported paths
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.Header().Set("Content-Type", "application/json")
+ _, _ = w.Write(autoConfData)
+ }))
+ defer server.Close()
+
+ // Configure autoconf for the node (but daemon never starts to fetch it)
+ node.SetIPFSConfig("AutoConf.URL", server.URL)
+ node.SetIPFSConfig("AutoConf.Enabled", true)
+
+ // Test Routing.DelegatedRouters field expansion without cached autoconf
+ result := node.RunIPFS("config", "Routing.DelegatedRouters", "--expand-auto")
+ require.Equal(t, 0, result.ExitCode(), "config Routing.DelegatedRouters --expand-auto should succeed")
+
+ var expandedRouters []string
+ err := json.Unmarshal([]byte(result.Stdout.String()), &expandedRouters)
+ require.NoError(t, err)
+
+ // Without cached autoconf, should get fallback URLs from GetMainnetFallbackConfig()
+ // NOTE: These values may change if autoconf library updates GetMainnetFallbackConfig()
+ assert.Contains(t, expandedRouters, "https://cid.contact/routing/v1/providers", "Should contain fallback provider URL from GetMainnetFallbackConfig()")
+
+ t.Logf("Fallback routers (no cache): %v", expandedRouters)
+
+ // Test Ipns.DelegatedPublishers field expansion without cached autoconf
+ result = node.RunIPFS("config", "Ipns.DelegatedPublishers", "--expand-auto")
+ require.Equal(t, 0, result.ExitCode(), "config Ipns.DelegatedPublishers --expand-auto should succeed")
+
+ var expandedPublishers []string
+ err = json.Unmarshal([]byte(result.Stdout.String()), &expandedPublishers)
+ require.NoError(t, err)
+
+ // Without cached autoconf, should get fallback IPNS publishers from GetMainnetFallbackConfig()
+ // NOTE: These values may change if autoconf library updates GetMainnetFallbackConfig()
+ assert.Contains(t, expandedPublishers, "https://delegated-ipfs.dev/routing/v1/ipns", "Should contain fallback IPNS URL from GetMainnetFallbackConfig()")
+
+ t.Logf("Fallback publishers (no cache): %v", expandedPublishers)
+}
+
+func testExpandAutoWithAutoRouting(t *testing.T) {
+ // Test scenario: CLI with daemon started using auto routing with NewRoutingSystem
+ // This tests that non-native systems (NewRoutingSystem) ARE delegated even with auto routing
+ // Only native systems like AminoDHT are handled internally with auto routing
+
+ // Create IPFS node
+ node := harness.NewT(t).NewNode().Init("--profile=test")
+
+ // Configure auto routing with non-native system
+ node.SetIPFSConfig("Routing.Type", "auto")
+ node.SetIPFSConfig("Routing.DelegatedRouters", []string{"auto"})
+ node.SetIPFSConfig("Ipns.DelegatedPublishers", []string{"auto"})
+
+ // Load test autoconf data with NewRoutingSystem (non-native, will be delegated)
+ autoConfData := loadTestDataExpand(t, "autoconf_new_routing_system.json")
+
+ // Create HTTP server that serves autoconf.json
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.Header().Set("Content-Type", "application/json")
+ _, _ = w.Write(autoConfData)
+ }))
+ defer server.Close()
+
+ // Configure autoconf for the node
+ node.SetIPFSConfig("AutoConf.URL", server.URL)
+ node.SetIPFSConfig("AutoConf.Enabled", true)
+
+ // Start daemon to fetch and cache autoconf data
+ t.Log("Starting daemon to fetch and cache autoconf data...")
+ daemon := node.StartDaemon()
+ defer daemon.StopDaemon()
+
+ // Wait for autoconf fetch (use autoconf default timeout + buffer)
+ time.Sleep(6 * time.Second) // defaultTimeout is 5s, add 1s buffer
+ t.Log("AutoConf should now be cached by daemon")
+
+ // Test Routing.DelegatedRouters field expansion with auto routing
+ result := node.RunIPFS("config", "Routing.DelegatedRouters", "--expand-auto")
+ require.Equal(t, 0, result.ExitCode(), "config Routing.DelegatedRouters --expand-auto should succeed")
+
+ var expandedRouters []string
+ err := json.Unmarshal([]byte(result.Stdout.String()), &expandedRouters)
+ require.NoError(t, err)
+
+ // With auto routing and NewRoutingSystem (non-native), delegated endpoints should be populated
+ assert.Contains(t, expandedRouters, "https://new-routing.example.com/routing/v1/providers", "Should contain NewRoutingSystem provider URL")
+ assert.Contains(t, expandedRouters, "https://new-routing.example.com/routing/v1/peers", "Should contain NewRoutingSystem peers URL")
+
+ t.Logf("Auto routing routers (NewRoutingSystem delegated): %v", expandedRouters)
+
+ // Test Ipns.DelegatedPublishers field expansion with auto routing
+ result = node.RunIPFS("config", "Ipns.DelegatedPublishers", "--expand-auto")
+ require.Equal(t, 0, result.ExitCode(), "config Ipns.DelegatedPublishers --expand-auto should succeed")
+
+ var expandedPublishers []string
+ err = json.Unmarshal([]byte(result.Stdout.String()), &expandedPublishers)
+ require.NoError(t, err)
+
+ // With auto routing and NewRoutingSystem (non-native), delegated publishers should be populated
+ assert.Contains(t, expandedPublishers, "https://new-routing.example.com/routing/v1/ipns", "Should contain NewRoutingSystem IPNS URL")
+
+ t.Logf("Auto routing publishers (NewRoutingSystem delegated): %v", expandedPublishers)
+}
+
+func testExpandAutoWithMixedSystems(t *testing.T) {
+ // Test scenario: Auto routing with both AminoDHT (native) and IPNI (delegated) systems
+ // This explicitly confirms that AminoDHT is NOT delegated but IPNI at cid.contact IS delegated
+
+ // Create IPFS node
+ node := harness.NewT(t).NewNode().Init("--profile=test")
+
+ // Configure auto routing
+ node.SetIPFSConfig("Routing.Type", "auto")
+ node.SetIPFSConfig("Routing.DelegatedRouters", []string{"auto"})
+ node.SetIPFSConfig("Ipns.DelegatedPublishers", []string{"auto"})
+
+ // Load test autoconf data with both AminoDHT and IPNI systems
+ autoConfData := loadTestDataExpand(t, "autoconf_amino_and_ipni.json")
+
+ // Create HTTP server that serves autoconf.json
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.Header().Set("Content-Type", "application/json")
+ _, _ = w.Write(autoConfData)
+ }))
+ defer server.Close()
+
+ // Configure autoconf for the node
+ node.SetIPFSConfig("AutoConf.URL", server.URL)
+ node.SetIPFSConfig("AutoConf.Enabled", true)
+
+ // Start daemon to fetch and cache autoconf data
+ t.Log("Starting daemon to fetch and cache autoconf data...")
+ daemon := node.StartDaemon()
+ defer daemon.StopDaemon()
+
+ // Wait for autoconf fetch (use autoconf default timeout + buffer)
+ time.Sleep(6 * time.Second) // defaultTimeout is 5s, add 1s buffer
+ t.Log("AutoConf should now be cached by daemon")
+
+ // Test Routing.DelegatedRouters field expansion
+ result := node.RunIPFS("config", "Routing.DelegatedRouters", "--expand-auto")
+ require.Equal(t, 0, result.ExitCode(), "config Routing.DelegatedRouters --expand-auto should succeed")
+
+ var expandedRouters []string
+ err := json.Unmarshal([]byte(result.Stdout.String()), &expandedRouters)
+ require.NoError(t, err)
+
+ // With auto routing: AminoDHT (native) should NOT be delegated, IPNI should be delegated
+ assert.Contains(t, expandedRouters, "https://cid.contact/routing/v1/providers", "Should contain IPNI provider URL (delegated)")
+ assert.NotContains(t, expandedRouters, "https://amino-dht.example.com", "Should NOT contain AminoDHT URLs (native)")
+
+ t.Logf("Mixed systems routers (IPNI delegated, AminoDHT native): %v", expandedRouters)
+
+ // Test Ipns.DelegatedPublishers field expansion
+ result = node.RunIPFS("config", "Ipns.DelegatedPublishers", "--expand-auto")
+ require.Equal(t, 0, result.ExitCode(), "config Ipns.DelegatedPublishers --expand-auto should succeed")
+
+ var expandedPublishers []string
+ err = json.Unmarshal([]byte(result.Stdout.String()), &expandedPublishers)
+ require.NoError(t, err)
+
+ // IPNI system doesn't have write endpoints, so publishers should be empty
+ // (or contain other systems if they have write endpoints)
+ t.Logf("Mixed systems publishers (IPNI has no write endpoints): %v", expandedPublishers)
+}
+
+func testExpandAutoWithFiltering(t *testing.T) {
+ // Test scenario: Auto routing with NewRoutingSystem and path filtering
+ // This tests that path filtering works for delegated systems even with auto routing
+
+ // Create IPFS node
+ node := harness.NewT(t).NewNode().Init("--profile=test")
+
+ // Configure auto routing
+ node.SetIPFSConfig("Routing.Type", "auto")
+ node.SetIPFSConfig("Routing.DelegatedRouters", []string{"auto"})
+ node.SetIPFSConfig("Ipns.DelegatedPublishers", []string{"auto"})
+
+ // Load test autoconf data with NewRoutingSystem and mixed valid/invalid paths
+ autoConfData := loadTestDataExpand(t, "autoconf_new_routing_with_filtering.json")
+
+ // Create HTTP server that serves autoconf.json
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.Header().Set("Content-Type", "application/json")
+ _, _ = w.Write(autoConfData)
+ }))
+ defer server.Close()
+
+ // Configure autoconf for the node
+ node.SetIPFSConfig("AutoConf.URL", server.URL)
+ node.SetIPFSConfig("AutoConf.Enabled", true)
+
+ // Start daemon to fetch and cache autoconf data
+ t.Log("Starting daemon to fetch and cache autoconf data...")
+ daemon := node.StartDaemon()
+ defer daemon.StopDaemon()
+
+ // Wait for autoconf fetch (use autoconf default timeout + buffer)
+ time.Sleep(6 * time.Second) // defaultTimeout is 5s, add 1s buffer
+ t.Log("AutoConf should now be cached by daemon")
+
+ // Test Routing.DelegatedRouters field expansion with filtering
+ result := node.RunIPFS("config", "Routing.DelegatedRouters", "--expand-auto")
+ require.Equal(t, 0, result.ExitCode(), "config Routing.DelegatedRouters --expand-auto should succeed")
+
+ var expandedRouters []string
+ err := json.Unmarshal([]byte(result.Stdout.String()), &expandedRouters)
+ require.NoError(t, err)
+
+ // Should contain supported paths from NewRoutingSystem
+ assert.Contains(t, expandedRouters, "https://supported-new.example.com/routing/v1/providers", "Should contain supported provider URL")
+ assert.Contains(t, expandedRouters, "https://supported-new.example.com/routing/v1/peers", "Should contain supported peers URL")
+ assert.Contains(t, expandedRouters, "https://mixed-new.example.com/routing/v1/providers", "Should contain mixed provider URL")
+ assert.Contains(t, expandedRouters, "https://mixed-new.example.com/routing/v1/peers", "Should contain mixed peers URL")
+
+ // Should NOT contain unsupported paths
+ assert.NotContains(t, expandedRouters, "https://unsupported-new.example.com/custom/v0/read", "Should filter out unsupported path")
+ assert.NotContains(t, expandedRouters, "https://unsupported-new.example.com/api/v1/nonstandard", "Should filter out unsupported path")
+ assert.NotContains(t, expandedRouters, "https://mixed-new.example.com/invalid/path", "Should filter out invalid path from mixed endpoint")
+
+ t.Logf("Filtered routers (NewRoutingSystem with auto routing): %v", expandedRouters)
+
+ // Test Ipns.DelegatedPublishers field expansion with filtering
+ result = node.RunIPFS("config", "Ipns.DelegatedPublishers", "--expand-auto")
+ require.Equal(t, 0, result.ExitCode(), "config Ipns.DelegatedPublishers --expand-auto should succeed")
+
+ var expandedPublishers []string
+ err = json.Unmarshal([]byte(result.Stdout.String()), &expandedPublishers)
+ require.NoError(t, err)
+
+ // Should contain supported IPNS paths
+ assert.Contains(t, expandedPublishers, "https://supported-new.example.com/routing/v1/ipns", "Should contain supported IPNS URL")
+ assert.Contains(t, expandedPublishers, "https://mixed-new.example.com/routing/v1/ipns", "Should contain mixed IPNS URL")
+
+ // Should NOT contain unsupported write paths
+ assert.NotContains(t, expandedPublishers, "https://unsupported-new.example.com/custom/v0/write", "Should filter out unsupported write path")
+
+ t.Logf("Filtered publishers (NewRoutingSystem with auto routing): %v", expandedPublishers)
+}
+
+func testExpandAutoWithoutCacheAuto(t *testing.T) {
+ // Test scenario: CLI without daemon ever starting using auto routing (default)
+ // This tests the fallback scenario where auto routing is used but doesn't populate delegated config fields
+
+ // Create IPFS node but DO NOT start daemon
+ node := harness.NewT(t).NewNode().Init("--profile=test")
+
+ // Configure auto routing - delegated fields are set to "auto" but won't be populated
+ // because auto routing uses different internal mechanisms
+ node.SetIPFSConfig("Routing.Type", "auto")
+ node.SetIPFSConfig("Routing.DelegatedRouters", []string{"auto"})
+ node.SetIPFSConfig("Ipns.DelegatedPublishers", []string{"auto"})
+
+ // Load test autoconf data (this won't be used since no daemon and auto routing doesn't use these fields)
+ autoConfData := loadTestDataExpand(t, "autoconf_with_unsupported_paths.json")
+
+ // Create HTTP server (won't be contacted since no daemon)
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.Header().Set("Content-Type", "application/json")
+ _, _ = w.Write(autoConfData)
+ }))
+ defer server.Close()
+
+ // Configure autoconf for the node (but daemon never starts to fetch it)
+ node.SetIPFSConfig("AutoConf.URL", server.URL)
+ node.SetIPFSConfig("AutoConf.Enabled", true)
+
+ // Test Routing.DelegatedRouters field expansion without cached autoconf
+ result := node.RunIPFS("config", "Routing.DelegatedRouters", "--expand-auto")
+ require.Equal(t, 0, result.ExitCode(), "config Routing.DelegatedRouters --expand-auto should succeed")
+
+ var expandedRouters []string
+ err := json.Unmarshal([]byte(result.Stdout.String()), &expandedRouters)
+ require.NoError(t, err)
+
+ // With auto routing, some fallback URLs are still populated from GetMainnetFallbackConfig()
+ // NOTE: These values may change if autoconf library updates GetMainnetFallbackConfig()
+ assert.Contains(t, expandedRouters, "https://cid.contact/routing/v1/providers", "Should contain fallback provider URL from GetMainnetFallbackConfig()")
+
+ t.Logf("Auto routing fallback routers (with fallbacks): %v", expandedRouters)
+
+ // Test Ipns.DelegatedPublishers field expansion without cached autoconf
+ result = node.RunIPFS("config", "Ipns.DelegatedPublishers", "--expand-auto")
+ require.Equal(t, 0, result.ExitCode(), "config Ipns.DelegatedPublishers --expand-auto should succeed")
+
+ var expandedPublishers []string
+ err = json.Unmarshal([]byte(result.Stdout.String()), &expandedPublishers)
+ require.NoError(t, err)
+
+ // With auto routing, delegated publishers may be empty for fallback scenario
+ // This can vary based on which systems have write endpoints in the fallback config
+ t.Logf("Auto routing fallback publishers: %v", expandedPublishers)
+}
+
+// Helper function to load test data files
+func loadTestDataExpand(t *testing.T, filename string) []byte {
+ t.Helper()
+
+ data, err := os.ReadFile("testdata/" + filename)
+ require.NoError(t, err, "Failed to read test data file: %s", filename)
+
+ return data
+}
diff --git a/test/cli/autoconf/extensibility_test.go b/test/cli/autoconf/extensibility_test.go
new file mode 100644
index 000000000..87939a820
--- /dev/null
+++ b/test/cli/autoconf/extensibility_test.go
@@ -0,0 +1,255 @@
+package autoconf
+
+import (
+ "encoding/json"
+ "net/http"
+ "net/http/httptest"
+ "strings"
+ "testing"
+ "time"
+
+ "github.com/ipfs/kubo/config"
+ "github.com/ipfs/kubo/test/cli/harness"
+ "github.com/stretchr/testify/require"
+)
+
+// TestAutoConfExtensibility_NewSystem verifies that the AutoConf system can be extended
+// with new routing systems beyond the default AminoDHT and IPNI.
+//
+// The test verifies that:
+// 1. New systems can be added via AutoConf's SystemRegistry
+// 2. Native vs delegated system filtering works correctly:
+// - Native systems (AminoDHT) provide bootstrap peers and are used for P2P routing
+// - Delegated systems (IPNI, NewSystem) provide HTTP endpoints for delegated routing
+//
+// 3. The system correctly filters endpoints based on routing type
+//
+// Note: Only native systems contribute bootstrap peers. Delegated systems like "NewSystem"
+// only provide HTTP routing endpoints, not P2P bootstrap peers.
+func TestAutoConfExtensibility_NewSystem(t *testing.T) {
+ if testing.Short() {
+ t.Skip("skipping test in short mode")
+ }
+
+ // Setup mock autoconf server with NewSystem
+ var mockServer *httptest.Server
+ mockServer = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ // Create autoconf.json with NewSystem
+ autoconfData := map[string]interface{}{
+ "AutoConfVersion": 2025072901,
+ "AutoConfSchema": 1,
+ "AutoConfTTL": 86400,
+ "SystemRegistry": map[string]interface{}{
+ "AminoDHT": map[string]interface{}{
+ "URL": "https://github.com/ipfs/specs/pull/497",
+ "Description": "Public DHT swarm",
+ "NativeConfig": map[string]interface{}{
+ "Bootstrap": []string{
+ "/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN",
+ },
+ },
+ "DelegatedConfig": map[string]interface{}{
+ "Read": []string{"/routing/v1/providers", "/routing/v1/peers", "/routing/v1/ipns"},
+ "Write": []string{"/routing/v1/ipns"},
+ },
+ },
+ "IPNI": map[string]interface{}{
+ "URL": "https://ipni.example.com",
+ "Description": "Network Indexer",
+ "DelegatedConfig": map[string]interface{}{
+ "Read": []string{"/routing/v1/providers"},
+ "Write": []string{},
+ },
+ },
+ "NewSystem": map[string]interface{}{
+ "URL": "https://example.com/newsystem",
+ "Description": "Test system for extensibility verification",
+ "NativeConfig": map[string]interface{}{
+ "Bootstrap": []string{
+ "/ip4/127.0.0.1/tcp/9999/p2p/12D3KooWPeQ4r3v6CmVmKXoFGtqEqcr3L8P6La9yH5oEWKtoLVVa",
+ },
+ },
+ "DelegatedConfig": map[string]interface{}{
+ "Read": []string{"/routing/v1/providers"},
+ "Write": []string{},
+ },
+ },
+ },
+ "DNSResolvers": map[string]interface{}{
+ "eth.": []string{"https://dns.eth.limo/dns-query"},
+ },
+ "DelegatedEndpoints": map[string]interface{}{
+ "https://ipni.example.com": map[string]interface{}{
+ "Systems": []string{"IPNI"},
+ "Read": []string{"/routing/v1/providers"},
+ "Write": []string{},
+ },
+ mockServer.URL + "/newsystem": map[string]interface{}{
+ "Systems": []string{"NewSystem"},
+ "Read": []string{"/routing/v1/providers"},
+ "Write": []string{},
+ },
+ },
+ }
+
+ w.Header().Set("Content-Type", "application/json")
+ w.Header().Set("Cache-Control", "max-age=300")
+ _ = json.NewEncoder(w).Encode(autoconfData)
+ }))
+ defer mockServer.Close()
+
+ // NewSystem mock server URL will be dynamically assigned
+ newSystemServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ // Simple mock server for NewSystem endpoint
+ response := map[string]interface{}{"Providers": []interface{}{}}
+ w.Header().Set("Content-Type", "application/json")
+ _ = json.NewEncoder(w).Encode(response)
+ }))
+ defer newSystemServer.Close()
+
+ // Update the autoconf to point to the correct NewSystem endpoint
+ mockServer.Close()
+ mockServer = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ autoconfData := map[string]interface{}{
+ "AutoConfVersion": 2025072901,
+ "AutoConfSchema": 1,
+ "AutoConfTTL": 86400,
+ "SystemRegistry": map[string]interface{}{
+ "AminoDHT": map[string]interface{}{
+ "URL": "https://github.com/ipfs/specs/pull/497",
+ "Description": "Public DHT swarm",
+ "NativeConfig": map[string]interface{}{
+ "Bootstrap": []string{
+ "/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN",
+ },
+ },
+ "DelegatedConfig": map[string]interface{}{
+ "Read": []string{"/routing/v1/providers", "/routing/v1/peers", "/routing/v1/ipns"},
+ "Write": []string{"/routing/v1/ipns"},
+ },
+ },
+ "IPNI": map[string]interface{}{
+ "URL": "https://ipni.example.com",
+ "Description": "Network Indexer",
+ "DelegatedConfig": map[string]interface{}{
+ "Read": []string{"/routing/v1/providers"},
+ "Write": []string{},
+ },
+ },
+ "NewSystem": map[string]interface{}{
+ "URL": "https://example.com/newsystem",
+ "Description": "Test system for extensibility verification",
+ "NativeConfig": map[string]interface{}{
+ "Bootstrap": []string{
+ "/ip4/127.0.0.1/tcp/9999/p2p/12D3KooWPeQ4r3v6CmVmKXoFGtqEqcr3L8P6La9yH5oEWKtoLVVa",
+ },
+ },
+ "DelegatedConfig": map[string]interface{}{
+ "Read": []string{"/routing/v1/providers"},
+ "Write": []string{},
+ },
+ },
+ },
+ "DNSResolvers": map[string]interface{}{
+ "eth.": []string{"https://dns.eth.limo/dns-query"},
+ },
+ "DelegatedEndpoints": map[string]interface{}{
+ "https://ipni.example.com": map[string]interface{}{
+ "Systems": []string{"IPNI"},
+ "Read": []string{"/routing/v1/providers"},
+ "Write": []string{},
+ },
+ newSystemServer.URL: map[string]interface{}{
+ "Systems": []string{"NewSystem"},
+ "Read": []string{"/routing/v1/providers"},
+ "Write": []string{},
+ },
+ },
+ }
+
+ w.Header().Set("Content-Type", "application/json")
+ w.Header().Set("Cache-Control", "max-age=300")
+ _ = json.NewEncoder(w).Encode(autoconfData)
+ }))
+ defer mockServer.Close()
+
+ // Create Kubo node with autoconf pointing to mock server
+ h := harness.NewT(t)
+ node := h.NewNode().Init()
+
+ // Update config to use mock autoconf server
+ node.UpdateConfig(func(cfg *config.Config) {
+ cfg.AutoConf.URL = config.NewOptionalString(mockServer.URL)
+ cfg.AutoConf.Enabled = config.True
+ cfg.AutoConf.RefreshInterval = config.NewOptionalDuration(1 * time.Second)
+ cfg.Routing.Type = config.NewOptionalString("auto") // Should enable native AminoDHT + delegated others
+ cfg.Bootstrap = []string{"auto"}
+ cfg.Routing.DelegatedRouters = []string{"auto"}
+ })
+
+ // Start the daemon
+ daemon := node.StartDaemon()
+ defer daemon.StopDaemon()
+
+ // Give the daemon some time to initialize and make requests
+ time.Sleep(3 * time.Second)
+
+ // Test 1: Verify bootstrap includes both AminoDHT and NewSystem peers (deduplicated)
+ bootstrapResult := daemon.IPFS("bootstrap", "list", "--expand-auto")
+ bootstrapOutput := bootstrapResult.Stdout.String()
+ t.Logf("Bootstrap output: %s", bootstrapOutput)
+
+ // Should contain original DHT bootstrap peer (AminoDHT is a native system)
+ require.Contains(t, bootstrapOutput, "QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN", "Should contain AminoDHT bootstrap peer")
+
+ // Note: NewSystem bootstrap peers are NOT included because only native systems
+ // (AminoDHT for Routing.Type="auto") contribute bootstrap peers.
+ // Delegated systems like NewSystem only provide HTTP routing endpoints.
+
+ // Test 2: Verify delegated endpoints are filtered correctly
+ // For Routing.Type=auto, native systems=[AminoDHT], so:
+ // - AminoDHT endpoints should be filtered out
+ // - IPNI and NewSystem endpoints should be included
+
+ // Get the expanded delegated routers using --expand-auto
+ routerResult := daemon.IPFS("config", "Routing.DelegatedRouters", "--expand-auto")
+ var expandedRouters []string
+ require.NoError(t, json.Unmarshal([]byte(routerResult.Stdout.String()), &expandedRouters))
+
+ t.Logf("Expanded delegated routers: %v", expandedRouters)
+
+ // Verify we got exactly 2 delegated routers: IPNI and NewSystem
+ require.Equal(t, 2, len(expandedRouters), "Should have exactly 2 delegated routers (IPNI and NewSystem). Got %d: %v", len(expandedRouters), expandedRouters)
+
+ // Convert to URLs for checking
+ routerURLs := expandedRouters
+
+ // Should contain NewSystem endpoint (not native) - now with routing path
+ foundNewSystem := false
+ expectedNewSystemURL := newSystemServer.URL + "/routing/v1/providers" // Full URL with path, as returned by DelegatedRoutersWithAutoConf
+ for _, url := range routerURLs {
+ if url == expectedNewSystemURL {
+ foundNewSystem = true
+ break
+ }
+ }
+ require.True(t, foundNewSystem, "Should contain NewSystem endpoint (%s) for delegated routing, got: %v", expectedNewSystemURL, routerURLs)
+
+ // Should contain ipni.example.com (IPNI is not native)
+ foundIPNI := false
+ for _, url := range routerURLs {
+ if strings.Contains(url, "ipni.example.com") {
+ foundIPNI = true
+ break
+ }
+ }
+ require.True(t, foundIPNI, "Should contain ipni.example.com endpoint for IPNI")
+
+ // Test passes - we've verified that:
+ // 1. Bootstrap peers are correctly resolved from native systems only
+ // 2. Delegated routers include both IPNI and NewSystem endpoints
+ // 3. URL format is correct (base URLs with paths)
+ // 4. AutoConf extensibility works for unknown systems
+
+ t.Log("NewSystem extensibility test passed - Kubo successfully discovered and used unknown routing system")
+}
diff --git a/test/cli/autoconf/fuzz_test.go b/test/cli/autoconf/fuzz_test.go
new file mode 100644
index 000000000..440bc3a25
--- /dev/null
+++ b/test/cli/autoconf/fuzz_test.go
@@ -0,0 +1,654 @@
+package autoconf
+
+import (
+ "context"
+ "encoding/json"
+ "fmt"
+ "net/http"
+ "net/http/httptest"
+ "strings"
+ "testing"
+ "time"
+
+ "github.com/ipfs/boxo/autoconf"
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+)
+
+// testAutoConfWithFallback is a helper function that tests autoconf parsing with fallback detection
+func testAutoConfWithFallback(t *testing.T, serverURL string, expectError bool, expectErrorMsg string) (*autoconf.Config, bool) {
+ return testAutoConfWithFallbackAndTimeout(t, serverURL, expectError, expectErrorMsg, 10*time.Second)
+}
+
+// testAutoConfWithFallbackAndTimeout is a helper function that tests autoconf parsing with fallback detection and custom timeout
+func testAutoConfWithFallbackAndTimeout(t *testing.T, serverURL string, expectError bool, expectErrorMsg string, timeout time.Duration) (*autoconf.Config, bool) {
+ // Use fallback detection to test error conditions with MustGetConfigWithRefresh
+ fallbackUsed := false
+ fallbackConfig := &autoconf.Config{
+ AutoConfVersion: -999, // Special marker to detect fallback usage
+ AutoConfSchema: -999,
+ }
+
+ client, err := autoconf.NewClient(
+ autoconf.WithUserAgent("test-agent"),
+ autoconf.WithURL(serverURL),
+ autoconf.WithRefreshInterval(autoconf.DefaultRefreshInterval),
+ autoconf.WithFallback(func() *autoconf.Config {
+ fallbackUsed = true
+ return fallbackConfig
+ }),
+ )
+ require.NoError(t, err)
+
+ ctx, cancel := context.WithTimeout(context.Background(), timeout)
+ defer cancel()
+ result := client.GetCachedOrRefresh(ctx)
+
+ if expectError {
+ require.True(t, fallbackUsed, expectErrorMsg)
+ require.Equal(t, int64(-999), result.AutoConfVersion, "Should return fallback config for error case")
+ } else {
+ require.False(t, fallbackUsed, "Expected no fallback to be used")
+ require.NotEqual(t, int64(-999), result.AutoConfVersion, "Should return fetched config for success case")
+ }
+
+ return result, fallbackUsed
+}
+
+func TestAutoConfFuzz(t *testing.T) {
+ t.Parallel()
+
+ t.Run("fuzz autoconf version", testFuzzAutoConfVersion)
+ t.Run("fuzz bootstrap arrays", testFuzzBootstrapArrays)
+ t.Run("fuzz dns resolvers", testFuzzDNSResolvers)
+ t.Run("fuzz delegated routers", testFuzzDelegatedRouters)
+ t.Run("fuzz delegated publishers", testFuzzDelegatedPublishers)
+ t.Run("fuzz malformed json", testFuzzMalformedJSON)
+ t.Run("fuzz large payloads", testFuzzLargePayloads)
+}
+
+func testFuzzAutoConfVersion(t *testing.T) {
+ testCases := []struct {
+ name string
+ version interface{}
+ expectError bool
+ }{
+ {"valid version", 2025071801, false},
+ {"zero version", 0, true}, // Should be invalid
+ {"negative version", -1, false}, // Parser accepts negative versions
+ {"string version", "2025071801", true}, // Should be number
+ {"float version", 2025071801.5, true},
+ {"very large version", 9999999999999999, false}, // Large but valid int64
+ {"null version", nil, true},
+ }
+
+ for _, tc := range testCases {
+ t.Run(tc.name, func(t *testing.T) {
+ config := map[string]interface{}{
+ "AutoConfVersion": tc.version,
+ "AutoConfSchema": 1,
+ "AutoConfTTL": 86400,
+ "SystemRegistry": map[string]interface{}{
+ "AminoDHT": map[string]interface{}{
+ "Description": "Test AminoDHT system",
+ "NativeConfig": map[string]interface{}{
+ "Bootstrap": []string{
+ "/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN",
+ },
+ },
+ },
+ },
+ "DNSResolvers": map[string]interface{}{},
+ "DelegatedEndpoints": map[string]interface{}{},
+ }
+
+ jsonData, err := json.Marshal(config)
+ require.NoError(t, err)
+
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.Header().Set("Content-Type", "application/json")
+ _, _ = w.Write(jsonData)
+ }))
+ defer server.Close()
+
+ // Test that our autoconf parser handles this gracefully
+ _, _ = testAutoConfWithFallback(t, server.URL, tc.expectError, fmt.Sprintf("Expected fallback to be used for %s", tc.name))
+ })
+ }
+}
+
+func testFuzzBootstrapArrays(t *testing.T) {
+ type testCase struct {
+ name string
+ bootstrap interface{}
+ expectError bool
+ validate func(*testing.T, *autoconf.Response)
+ }
+
+ testCases := []testCase{
+ {
+ name: "valid bootstrap",
+ bootstrap: []string{"/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN"},
+ validate: func(t *testing.T, resp *autoconf.Response) {
+ expected := []string{"/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN"}
+ bootstrapPeers := resp.Config.GetBootstrapPeers("AminoDHT")
+ assert.Equal(t, expected, bootstrapPeers, "Bootstrap peers should match configured values")
+ },
+ },
+ {
+ name: "empty bootstrap",
+ bootstrap: []string{},
+ validate: func(t *testing.T, resp *autoconf.Response) {
+ bootstrapPeers := resp.Config.GetBootstrapPeers("AminoDHT")
+ assert.Empty(t, bootstrapPeers, "Empty bootstrap should result in empty peers")
+ },
+ },
+ {
+ name: "null bootstrap",
+ bootstrap: nil,
+ validate: func(t *testing.T, resp *autoconf.Response) {
+ bootstrapPeers := resp.Config.GetBootstrapPeers("AminoDHT")
+ assert.Empty(t, bootstrapPeers, "Null bootstrap should result in empty peers")
+ },
+ },
+ {
+ name: "invalid multiaddr",
+ bootstrap: []string{"invalid-multiaddr"},
+ expectError: true,
+ },
+ {
+ name: "very long multiaddr",
+ bootstrap: []string{"/dnsaddr/" + strings.Repeat("a", 100) + ".com/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN"},
+ validate: func(t *testing.T, resp *autoconf.Response) {
+ expected := []string{"/dnsaddr/" + strings.Repeat("a", 100) + ".com/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN"}
+ bootstrapPeers := resp.Config.GetBootstrapPeers("AminoDHT")
+ assert.Equal(t, expected, bootstrapPeers, "Very long multiaddr should be preserved")
+ },
+ },
+ {
+ name: "bootstrap as string",
+ bootstrap: "/dnsaddr/test",
+ expectError: true,
+ },
+ {
+ name: "bootstrap as number",
+ bootstrap: 123,
+ expectError: true,
+ },
+ {
+ name: "mixed types in array",
+ bootstrap: []interface{}{"/dnsaddr/test", 123, nil},
+ expectError: true,
+ },
+ {
+ name: "extremely large array",
+ bootstrap: make([]string, 1000),
+ validate: func(t *testing.T, resp *autoconf.Response) {
+ // Array will be filled in the loop below
+ bootstrapPeers := resp.Config.GetBootstrapPeers("AminoDHT")
+ assert.Len(t, bootstrapPeers, 1000, "Large bootstrap array should be preserved")
+ },
+ },
+ }
+
+ // Fill the large array with valid multiaddrs
+ largeArray := testCases[len(testCases)-1].bootstrap.([]string)
+ for i := range largeArray {
+ largeArray[i] = fmt.Sprintf("/dnsaddr/bootstrap%d.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN", i)
+ }
+
+ for _, tc := range testCases {
+ t.Run(tc.name, func(t *testing.T) {
+ config := map[string]interface{}{
+ "AutoConfVersion": 2025072301,
+ "AutoConfSchema": 1,
+ "AutoConfTTL": 86400,
+ "SystemRegistry": map[string]interface{}{
+ "AminoDHT": map[string]interface{}{
+ "Description": "Test AminoDHT system",
+ "NativeConfig": map[string]interface{}{
+ "Bootstrap": tc.bootstrap,
+ },
+ },
+ },
+ "DNSResolvers": map[string]interface{}{},
+ "DelegatedEndpoints": map[string]interface{}{},
+ }
+
+ jsonData, err := json.Marshal(config)
+ require.NoError(t, err)
+
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.Header().Set("Content-Type", "application/json")
+ _, _ = w.Write(jsonData)
+ }))
+ defer server.Close()
+
+ autoConf, fallbackUsed := testAutoConfWithFallback(t, server.URL, tc.expectError, fmt.Sprintf("Expected fallback to be used for %s", tc.name))
+
+ if !tc.expectError {
+ require.NotNil(t, autoConf, "AutoConf should not be nil for successful parsing")
+
+ // Verify structure is reasonable
+ bootstrapPeers := autoConf.GetBootstrapPeers("AminoDHT")
+ require.IsType(t, []string{}, bootstrapPeers, "Bootstrap should be []string")
+
+ // Run test-specific validation if provided (only for non-fallback cases)
+ if tc.validate != nil && !fallbackUsed {
+ // Create a mock Response for compatibility with validation functions
+ mockResponse := &autoconf.Response{Config: autoConf}
+ tc.validate(t, mockResponse)
+ }
+ }
+ })
+ }
+}
+
+func testFuzzDNSResolvers(t *testing.T) {
+ type testCase struct {
+ name string
+ resolvers interface{}
+ expectError bool
+ validate func(*testing.T, *autoconf.Response)
+ }
+
+ testCases := []testCase{
+ {
+ name: "valid resolvers",
+ resolvers: map[string][]string{".": {"https://dns.google/dns-query"}},
+ validate: func(t *testing.T, resp *autoconf.Response) {
+ expected := map[string][]string{".": {"https://dns.google/dns-query"}}
+ assert.Equal(t, expected, resp.Config.DNSResolvers, "DNS resolvers should match configured values")
+ },
+ },
+ {
+ name: "empty resolvers",
+ resolvers: map[string][]string{},
+ validate: func(t *testing.T, resp *autoconf.Response) {
+ assert.Empty(t, resp.Config.DNSResolvers, "Empty resolvers should result in empty map")
+ },
+ },
+ {
+ name: "null resolvers",
+ resolvers: nil,
+ validate: func(t *testing.T, resp *autoconf.Response) {
+ assert.Empty(t, resp.Config.DNSResolvers, "Null resolvers should result in empty map")
+ },
+ },
+ {
+ name: "relative URL (missing scheme)",
+ resolvers: map[string][]string{".": {"not-a-url"}},
+ expectError: true, // Should error due to strict HTTP/HTTPS validation
+ },
+ {
+ name: "invalid URL format",
+ resolvers: map[string][]string{".": {"://invalid-missing-scheme"}},
+ expectError: true, // Should error because url.Parse() fails
+ },
+ {
+ name: "non-HTTP scheme",
+ resolvers: map[string][]string{".": {"ftp://example.com/dns-query"}},
+ expectError: true, // Should error due to non-HTTP/HTTPS scheme
+ },
+ {
+ name: "very long domain",
+ resolvers: map[string][]string{strings.Repeat("a", 1000) + ".com": {"https://dns.google/dns-query"}},
+ validate: func(t *testing.T, resp *autoconf.Response) {
+ expected := map[string][]string{strings.Repeat("a", 1000) + ".com": {"https://dns.google/dns-query"}}
+ assert.Equal(t, expected, resp.Config.DNSResolvers, "Very long domain should be preserved")
+ },
+ },
+ {
+ name: "many resolvers",
+ resolvers: generateManyResolvers(100),
+ validate: func(t *testing.T, resp *autoconf.Response) {
+ expected := generateManyResolvers(100)
+ assert.Equal(t, expected, resp.Config.DNSResolvers, "Many resolvers should be preserved")
+ assert.Equal(t, 100, len(resp.Config.DNSResolvers), "Should have 100 resolvers")
+ },
+ },
+ {
+ name: "resolvers as array",
+ resolvers: []string{"https://dns.google/dns-query"},
+ expectError: true,
+ },
+ {
+ name: "nested invalid structure",
+ resolvers: map[string]interface{}{".": map[string]string{"invalid": "structure"}},
+ expectError: true,
+ },
+ }
+
+ for _, tc := range testCases {
+ t.Run(tc.name, func(t *testing.T) {
+ config := map[string]interface{}{
+ "AutoConfVersion": 2025072301,
+ "AutoConfSchema": 1,
+ "AutoConfTTL": 86400,
+ "SystemRegistry": map[string]interface{}{
+ "AminoDHT": map[string]interface{}{
+ "Description": "Test AminoDHT system",
+ "NativeConfig": map[string]interface{}{
+ "Bootstrap": []string{"/dnsaddr/test"},
+ },
+ },
+ },
+ "DNSResolvers": tc.resolvers,
+ "DelegatedEndpoints": map[string]interface{}{},
+ }
+
+ jsonData, err := json.Marshal(config)
+ require.NoError(t, err)
+
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.Header().Set("Content-Type", "application/json")
+ _, _ = w.Write(jsonData)
+ }))
+ defer server.Close()
+
+ autoConf, fallbackUsed := testAutoConfWithFallback(t, server.URL, tc.expectError, fmt.Sprintf("Expected fallback to be used for %s", tc.name))
+
+ if !tc.expectError {
+ require.NotNil(t, autoConf, "AutoConf should not be nil for successful parsing")
+
+ // Run test-specific validation if provided (only for non-fallback cases)
+ if tc.validate != nil && !fallbackUsed {
+ // Create a mock Response for compatibility with validation functions
+ mockResponse := &autoconf.Response{Config: autoConf}
+ tc.validate(t, mockResponse)
+ }
+ }
+ })
+ }
+}
+
+func testFuzzDelegatedRouters(t *testing.T) {
+ // Test various malformed delegated router configurations
+ type testCase struct {
+ name string
+ routers interface{}
+ expectError bool
+ validate func(*testing.T, *autoconf.Response)
+ }
+
+ testCases := []testCase{
+ {
+ name: "valid endpoints",
+ routers: map[string]interface{}{
+ "https://ipni.example.com": map[string]interface{}{
+ "Systems": []string{"IPNI"},
+ "Read": []string{"/routing/v1/providers"},
+ "Write": []string{},
+ },
+ },
+ validate: func(t *testing.T, resp *autoconf.Response) {
+ assert.Len(t, resp.Config.DelegatedEndpoints, 1, "Should have 1 delegated endpoint")
+ for url, config := range resp.Config.DelegatedEndpoints {
+ assert.Contains(t, url, "ipni.example.com", "Endpoint URL should contain expected domain")
+ assert.Contains(t, config.Systems, "IPNI", "Endpoint should have IPNI system")
+ assert.Contains(t, config.Read, "/routing/v1/providers", "Endpoint should have providers read path")
+ }
+ },
+ },
+ {
+ name: "empty routers",
+ routers: map[string]interface{}{},
+ validate: func(t *testing.T, resp *autoconf.Response) {
+ assert.Empty(t, resp.Config.DelegatedEndpoints, "Empty routers should result in empty endpoints")
+ },
+ },
+ {
+ name: "null routers",
+ routers: nil,
+ validate: func(t *testing.T, resp *autoconf.Response) {
+ assert.Empty(t, resp.Config.DelegatedEndpoints, "Null routers should result in empty endpoints")
+ },
+ },
+ {
+ name: "invalid nested structure",
+ routers: map[string]string{"invalid": "structure"},
+ expectError: true,
+ },
+ {
+ name: "invalid endpoint URLs",
+ routers: map[string]interface{}{
+ "not-a-url": map[string]interface{}{
+ "Systems": []string{"IPNI"},
+ "Read": []string{"/routing/v1/providers"},
+ "Write": []string{},
+ },
+ },
+ expectError: true, // Should error due to URL validation
+ },
+ }
+
+ for _, tc := range testCases {
+ t.Run(tc.name, func(t *testing.T) {
+ config := map[string]interface{}{
+ "AutoConfVersion": 2025072301,
+ "AutoConfSchema": 1,
+ "AutoConfTTL": 86400,
+ "SystemRegistry": map[string]interface{}{
+ "AminoDHT": map[string]interface{}{
+ "Description": "Test AminoDHT system",
+ "NativeConfig": map[string]interface{}{
+ "Bootstrap": []string{"/dnsaddr/test"},
+ },
+ },
+ },
+ "DNSResolvers": map[string]interface{}{},
+ "DelegatedEndpoints": tc.routers,
+ }
+
+ jsonData, err := json.Marshal(config)
+ require.NoError(t, err)
+
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.Header().Set("Content-Type", "application/json")
+ _, _ = w.Write(jsonData)
+ }))
+ defer server.Close()
+
+ autoConf, fallbackUsed := testAutoConfWithFallback(t, server.URL, tc.expectError, fmt.Sprintf("Expected fallback to be used for %s", tc.name))
+
+ if !tc.expectError {
+ require.NotNil(t, autoConf, "AutoConf should not be nil for successful parsing")
+
+ // Run test-specific validation if provided (only for non-fallback cases)
+ if tc.validate != nil && !fallbackUsed {
+ // Create a mock Response for compatibility with validation functions
+ mockResponse := &autoconf.Response{Config: autoConf}
+ tc.validate(t, mockResponse)
+ }
+ }
+ })
+ }
+}
+
+func testFuzzDelegatedPublishers(t *testing.T) {
+ // DelegatedPublishers use the same autoclient library validation as DelegatedRouters
+ // Test that URL validation works for delegated publishers
+ type testCase struct {
+ name string
+ urls []string
+ expectErr bool
+ validate func(*testing.T, *autoconf.Response)
+ }
+
+ testCases := []testCase{
+ {
+ name: "valid HTTPS URLs",
+ urls: []string{"https://delegated-ipfs.dev", "https://another-publisher.com"},
+ validate: func(t *testing.T, resp *autoconf.Response) {
+ assert.Len(t, resp.Config.DelegatedEndpoints, 2, "Should have 2 delegated endpoints")
+ foundURLs := make([]string, 0, len(resp.Config.DelegatedEndpoints))
+ for url := range resp.Config.DelegatedEndpoints {
+ foundURLs = append(foundURLs, url)
+ }
+ expectedURLs := []string{"https://delegated-ipfs.dev", "https://another-publisher.com"}
+ for _, expectedURL := range expectedURLs {
+ assert.Contains(t, foundURLs, expectedURL, "Should contain configured URL: %s", expectedURL)
+ }
+ },
+ },
+ {
+ name: "invalid URL",
+ urls: []string{"not-a-url"},
+ expectErr: true,
+ },
+ {
+ name: "HTTP URL (accepted during parsing)",
+ urls: []string{"http://insecure-publisher.com"},
+ validate: func(t *testing.T, resp *autoconf.Response) {
+ assert.Len(t, resp.Config.DelegatedEndpoints, 1, "Should have 1 delegated endpoint")
+ for url := range resp.Config.DelegatedEndpoints {
+ assert.Equal(t, "http://insecure-publisher.com", url, "HTTP URL should be preserved during parsing")
+ }
+ },
+ },
+ }
+
+ for _, tc := range testCases {
+ t.Run(tc.name, func(t *testing.T) {
+ autoConfData := map[string]interface{}{
+ "AutoConfVersion": 2025072301,
+ "AutoConfSchema": 1,
+ "AutoConfTTL": 86400,
+ "SystemRegistry": map[string]interface{}{
+ "TestSystem": map[string]interface{}{
+ "Description": "Test system for fuzz testing",
+ "DelegatedConfig": map[string]interface{}{
+ "Read": []string{"/routing/v1/ipns"},
+ "Write": []string{"/routing/v1/ipns"},
+ },
+ },
+ },
+ "DNSResolvers": map[string]interface{}{},
+ "DelegatedEndpoints": map[string]interface{}{},
+ }
+
+ // Add test URLs as delegated endpoints
+ for _, url := range tc.urls {
+ autoConfData["DelegatedEndpoints"].(map[string]interface{})[url] = map[string]interface{}{
+ "Systems": []string{"TestSystem"},
+ "Read": []string{"/routing/v1/ipns"},
+ "Write": []string{"/routing/v1/ipns"},
+ }
+ }
+
+ jsonData, err := json.Marshal(autoConfData)
+ require.NoError(t, err)
+
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.Header().Set("Content-Type", "application/json")
+ _, _ = w.Write(jsonData)
+ }))
+ defer server.Close()
+
+ // Test that our autoconf parser handles this gracefully
+ autoConf, fallbackUsed := testAutoConfWithFallback(t, server.URL, tc.expectErr, fmt.Sprintf("Expected fallback to be used for %s", tc.name))
+
+ if !tc.expectErr {
+ require.NotNil(t, autoConf, "AutoConf should not be nil for successful parsing")
+
+ // Run test-specific validation if provided (only for non-fallback cases)
+ if tc.validate != nil && !fallbackUsed {
+ // Create a mock Response for compatibility with validation functions
+ mockResponse := &autoconf.Response{Config: autoConf}
+ tc.validate(t, mockResponse)
+ }
+ }
+ })
+ }
+}
+
+func testFuzzMalformedJSON(t *testing.T) {
+ malformedJSONs := []string{
+ `{`, // Incomplete JSON
+ `{"AutoConfVersion": }`, // Missing value
+ `{"AutoConfVersion": 123,}`, // Trailing comma
+ `{AutoConfVersion: 123}`, // Unquoted key
+ `{"Bootstrap": [}`, // Incomplete array
+ `{"Bootstrap": ["/test",]}`, // Trailing comma in array
+ `invalid json`, // Not JSON at all
+ `null`, // Just null
+ `[]`, // Array instead of object
+ `""`, // String instead of object
+ }
+
+ for i, malformedJSON := range malformedJSONs {
+ t.Run(fmt.Sprintf("malformed_%d", i), func(t *testing.T) {
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.Header().Set("Content-Type", "application/json")
+ _, _ = w.Write([]byte(malformedJSON))
+ }))
+ defer server.Close()
+
+ // All malformed JSON should result in fallback usage
+ _, _ = testAutoConfWithFallback(t, server.URL, true, fmt.Sprintf("Expected fallback to be used for malformed JSON: %s", malformedJSON))
+ })
+ }
+}
+
+func testFuzzLargePayloads(t *testing.T) {
+ // Test with very large but valid JSON payloads
+ largeBootstrap := make([]string, 10000)
+ for i := range largeBootstrap {
+ largeBootstrap[i] = fmt.Sprintf("/dnsaddr/bootstrap%d.example.com/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN", i)
+ }
+
+ largeDNSResolvers := make(map[string][]string)
+ for i := 0; i < 1000; i++ {
+ domain := fmt.Sprintf("domain%d.example.com", i)
+ largeDNSResolvers[domain] = []string{
+ fmt.Sprintf("https://resolver%d.example.com/dns-query", i),
+ }
+ }
+
+ config := map[string]interface{}{
+ "AutoConfVersion": 2025072301,
+ "AutoConfSchema": 1,
+ "AutoConfTTL": 86400,
+ "SystemRegistry": map[string]interface{}{
+ "AminoDHT": map[string]interface{}{
+ "Description": "Test AminoDHT system",
+ "NativeConfig": map[string]interface{}{
+ "Bootstrap": largeBootstrap,
+ },
+ },
+ },
+ "DNSResolvers": largeDNSResolvers,
+ "DelegatedEndpoints": map[string]interface{}{},
+ }
+
+ jsonData, err := json.Marshal(config)
+ require.NoError(t, err)
+
+ t.Logf("Large payload size: %d bytes", len(jsonData))
+
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.Header().Set("Content-Type", "application/json")
+ _, _ = w.Write(jsonData)
+ }))
+ defer server.Close()
+
+ // Should handle large payloads gracefully (up to reasonable limits)
+ autoConf, _ := testAutoConfWithFallbackAndTimeout(t, server.URL, false, "Large payload should not trigger fallback", 30*time.Second)
+ require.NotNil(t, autoConf, "Should return valid config")
+
+ // Verify bootstrap entries were preserved
+ bootstrapPeers := autoConf.GetBootstrapPeers("AminoDHT")
+ require.Len(t, bootstrapPeers, 10000, "Should preserve all bootstrap entries")
+}
+
+// Helper function to generate many DNS resolvers for testing
+func generateManyResolvers(count int) map[string][]string {
+ resolvers := make(map[string][]string)
+ for i := 0; i < count; i++ {
+ domain := fmt.Sprintf("domain%d.example.com", i)
+ resolvers[domain] = []string{
+ fmt.Sprintf("https://resolver%d.example.com/dns-query", i),
+ }
+ }
+ return resolvers
+}
diff --git a/test/cli/autoconf/ipns_test.go b/test/cli/autoconf/ipns_test.go
new file mode 100644
index 000000000..ce5b20bd4
--- /dev/null
+++ b/test/cli/autoconf/ipns_test.go
@@ -0,0 +1,352 @@
+package autoconf
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "net/http"
+ "net/http/httptest"
+ "strings"
+ "sync"
+ "testing"
+ "time"
+
+ "github.com/ipfs/boxo/autoconf"
+ "github.com/ipfs/kubo/test/cli/harness"
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+)
+
+// TestAutoConfIPNS tests IPNS publishing with autoconf-resolved delegated publishers
+func TestAutoConfIPNS(t *testing.T) {
+ t.Parallel()
+
+ t.Run("PublishingWithWorkingEndpoint", func(t *testing.T) {
+ t.Parallel()
+ testIPNSPublishingWithWorkingEndpoint(t)
+ })
+
+ t.Run("PublishingResilience", func(t *testing.T) {
+ t.Parallel()
+ testIPNSPublishingResilience(t)
+ })
+}
+
+// testIPNSPublishingWithWorkingEndpoint verifies that IPNS delegated publishing works
+// correctly when the HTTP endpoint is functioning normally and accepts requests.
+// It also verifies that the PUT payload matches what can be retrieved via routing get.
+func testIPNSPublishingWithWorkingEndpoint(t *testing.T) {
+ // Create mock IPNS publisher that accepts requests
+ publisher := newMockIPNSPublisher(t)
+ defer publisher.close()
+
+ // Create node with delegated publisher
+ node := setupNodeWithAutoconf(t, publisher.server.URL, "auto")
+ defer node.StopDaemon()
+
+ // Wait for daemon to be ready
+ time.Sleep(5 * time.Second)
+
+ // Get node's peer ID
+ idResult := node.RunIPFS("id", "-f", "")
+ require.Equal(t, 0, idResult.ExitCode())
+ peerID := strings.TrimSpace(idResult.Stdout.String())
+
+ // Get peer ID in base36 format (used for IPNS keys)
+ idBase36Result := node.RunIPFS("id", "--peerid-base", "base36", "-f", "")
+ require.Equal(t, 0, idBase36Result.ExitCode())
+ peerIDBase36 := strings.TrimSpace(idBase36Result.Stdout.String())
+
+ // Verify autoconf resolved "auto" correctly
+ result := node.RunIPFS("config", "Ipns.DelegatedPublishers", "--expand-auto")
+ var resolvedPublishers []string
+ err := json.Unmarshal([]byte(result.Stdout.String()), &resolvedPublishers)
+ require.NoError(t, err)
+ expectedURL := publisher.server.URL + "/routing/v1/ipns"
+ assert.Contains(t, resolvedPublishers, expectedURL, "AutoConf should resolve 'auto' to mock publisher")
+
+ // Test publishing with --allow-delegated
+ testCID := "bafkqablimvwgy3y"
+ result = node.RunIPFS("name", "publish", "--allow-delegated", "/ipfs/"+testCID)
+ require.Equal(t, 0, result.ExitCode(), "Publishing should succeed")
+ assert.Contains(t, result.Stdout.String(), "Published to")
+
+ // Wait for async HTTP request to delegated publisher
+ time.Sleep(2 * time.Second)
+
+ // Verify HTTP PUT was made to delegated publisher
+ publishedKeys := publisher.getPublishedKeys()
+ assert.NotEmpty(t, publishedKeys, "HTTP PUT request should have been made to delegated publisher")
+
+ // Get the PUT payload that was sent to the delegated publisher
+ putPayload := publisher.getRecordPayload(peerIDBase36)
+ require.NotNil(t, putPayload, "Should have captured PUT payload")
+ require.Greater(t, len(putPayload), 0, "PUT payload should not be empty")
+
+ // Retrieve the IPNS record using routing get
+ getResult := node.RunIPFS("routing", "get", "/ipns/"+peerID)
+ require.Equal(t, 0, getResult.ExitCode(), "Should be able to retrieve IPNS record")
+ getPayload := getResult.Stdout.Bytes()
+
+ // Compare the payloads
+ assert.Equal(t, putPayload, getPayload,
+ "PUT payload sent to delegated publisher should match what routing get returns")
+
+ // Also verify the record points to the expected content
+ assert.Contains(t, getResult.Stdout.String(), testCID,
+ "Retrieved IPNS record should reference the published CID")
+
+ // Use ipfs name inspect to verify the IPNS record's value matches the published CID
+ // First write the routing get result to a file for inspection
+ node.WriteBytes("ipns-record", getPayload)
+ inspectResult := node.RunIPFS("name", "inspect", "ipns-record")
+ require.Equal(t, 0, inspectResult.ExitCode(), "Should be able to inspect IPNS record")
+
+ // The inspect output should show the path we published
+ inspectOutput := inspectResult.Stdout.String()
+ assert.Contains(t, inspectOutput, "/ipfs/"+testCID,
+ "IPNS record value should match the published path")
+
+ // Also verify it's a valid record with proper fields
+ assert.Contains(t, inspectOutput, "Value:", "Should have Value field")
+ assert.Contains(t, inspectOutput, "Validity:", "Should have Validity field")
+ assert.Contains(t, inspectOutput, "Sequence:", "Should have Sequence field")
+
+ t.Log("Verified: PUT payload to delegated publisher matches routing get result and name inspect confirms correct path")
+}
+
+// testIPNSPublishingResilience verifies that IPNS publishing is resilient by design.
+// Publishing succeeds as long as local storage works, even when all delegated endpoints fail.
+// This test documents the intentional resilient behavior, not bugs.
+func testIPNSPublishingResilience(t *testing.T) {
+ testCases := []struct {
+ name string
+ routingType string // "auto" or "delegated"
+ description string
+ }{
+ {
+ name: "AutoRouting",
+ routingType: "auto",
+ description: "auto mode uses DHT + HTTP, tolerates HTTP failures",
+ },
+ {
+ name: "DelegatedRouting",
+ routingType: "delegated",
+ description: "delegated mode uses HTTP only, tolerates HTTP failures",
+ },
+ }
+
+ for _, tc := range testCases {
+ t.Run(tc.name, func(t *testing.T) {
+ // Create publisher that always fails
+ publisher := newMockIPNSPublisher(t)
+ defer publisher.close()
+ publisher.responseFunc = func(peerID string, record []byte) int {
+ return http.StatusInternalServerError
+ }
+
+ // Create node with failing endpoint
+ node := setupNodeWithAutoconf(t, publisher.server.URL, tc.routingType)
+ defer node.StopDaemon()
+
+ // Test different publishing modes - all should succeed due to resilient design
+ testCID := "/ipfs/bafkqablimvwgy3y"
+
+ // Normal publishing (should succeed despite endpoint failures)
+ result := node.RunIPFS("name", "publish", testCID)
+ assert.Equal(t, 0, result.ExitCode(),
+ "%s: Normal publishing should succeed (local storage works)", tc.description)
+
+ // Publishing with --allow-offline (local only, no network)
+ result = node.RunIPFS("name", "publish", "--allow-offline", testCID)
+ assert.Equal(t, 0, result.ExitCode(),
+ "--allow-offline should succeed (local only)")
+
+ // Publishing with --allow-delegated (if using auto routing)
+ if tc.routingType == "auto" {
+ result = node.RunIPFS("name", "publish", "--allow-delegated", testCID)
+ assert.Equal(t, 0, result.ExitCode(),
+ "--allow-delegated should succeed (no DHT required)")
+ }
+
+ t.Logf("%s: All publishing modes succeeded despite endpoint failures (resilient design)", tc.name)
+ })
+ }
+}
+
+// ============================================================================
+// Helper Functions
+// ============================================================================
+
+// setupNodeWithAutoconf creates an IPFS node with autoconf-configured delegated publishers
+func setupNodeWithAutoconf(t *testing.T, publisherURL string, routingType string) *harness.Node {
+ // Create autoconf server with the publisher endpoint
+ autoconfData := createAutoconfJSON(publisherURL)
+ autoconfServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.Header().Set("Content-Type", "application/json")
+ fmt.Fprint(w, autoconfData)
+ }))
+ t.Cleanup(func() { autoconfServer.Close() })
+
+ // Create and configure node
+ h := harness.NewT(t)
+ node := h.NewNode().Init("--profile=test")
+
+ // Configure autoconf
+ node.SetIPFSConfig("AutoConf.URL", autoconfServer.URL)
+ node.SetIPFSConfig("AutoConf.Enabled", true)
+ node.SetIPFSConfig("Ipns.DelegatedPublishers", []string{"auto"})
+ node.SetIPFSConfig("Routing.Type", routingType)
+
+ // Additional config for delegated routing mode
+ if routingType == "delegated" {
+ node.SetIPFSConfig("Provider.Enabled", false)
+ node.SetIPFSConfig("Reprovider.Interval", "0s")
+ }
+
+ // Add bootstrap peers for connectivity
+ node.SetIPFSConfig("Bootstrap", autoconf.FallbackBootstrapPeers)
+
+ // Start daemon
+ node.StartDaemon()
+
+ return node
+}
+
+// createAutoconfJSON generates autoconf configuration with a delegated IPNS publisher
+func createAutoconfJSON(publisherURL string) string {
+ // Use bootstrap peers from autoconf fallbacks for consistency
+ bootstrapPeers, _ := json.Marshal(autoconf.FallbackBootstrapPeers)
+
+ return fmt.Sprintf(`{
+ "AutoConfVersion": 2025072302,
+ "AutoConfSchema": 1,
+ "AutoConfTTL": 86400,
+ "SystemRegistry": {
+ "TestSystem": {
+ "Description": "Test system for IPNS publishing",
+ "NativeConfig": {
+ "Bootstrap": %s
+ }
+ }
+ },
+ "DNSResolvers": {},
+ "DelegatedEndpoints": {
+ "%s": {
+ "Systems": ["TestSystem"],
+ "Read": ["/routing/v1/ipns"],
+ "Write": ["/routing/v1/ipns"]
+ }
+ }
+ }`, string(bootstrapPeers), publisherURL)
+}
+
+// ============================================================================
+// Mock IPNS Publisher
+// ============================================================================
+
+// mockIPNSPublisher implements a simple IPNS publishing HTTP API server
+type mockIPNSPublisher struct {
+ t *testing.T
+ server *httptest.Server
+ mu sync.Mutex
+ publishedKeys map[string]string // peerID -> published CID
+ recordPayloads map[string][]byte // peerID -> actual HTTP PUT record payload
+ responseFunc func(peerID string, record []byte) int // returns HTTP status code
+}
+
+func newMockIPNSPublisher(t *testing.T) *mockIPNSPublisher {
+ m := &mockIPNSPublisher{
+ t: t,
+ publishedKeys: make(map[string]string),
+ recordPayloads: make(map[string][]byte),
+ }
+
+ // Default response function accepts all publishes
+ m.responseFunc = func(peerID string, record []byte) int {
+ return http.StatusOK
+ }
+
+ mux := http.NewServeMux()
+ mux.HandleFunc("/routing/v1/ipns/", m.handleIPNS)
+
+ m.server = httptest.NewServer(mux)
+ return m
+}
+
+func (m *mockIPNSPublisher) handleIPNS(w http.ResponseWriter, r *http.Request) {
+ m.mu.Lock()
+ defer m.mu.Unlock()
+
+ // Extract peer ID from path
+ parts := strings.Split(r.URL.Path, "/")
+ if len(parts) < 5 {
+ http.Error(w, "invalid path", http.StatusBadRequest)
+ return
+ }
+
+ peerID := parts[4]
+
+ if r.Method == "PUT" {
+ // Handle IPNS record publication
+ body, err := io.ReadAll(r.Body)
+ if err != nil {
+ http.Error(w, "failed to read body", http.StatusBadRequest)
+ return
+ }
+
+ // Get response status from response function
+ status := m.responseFunc(peerID, body)
+
+ if status == http.StatusOK {
+ if len(body) > 0 {
+ // Store the actual record payload
+ m.recordPayloads[peerID] = make([]byte, len(body))
+ copy(m.recordPayloads[peerID], body)
+ }
+
+ // Mark as published
+ m.publishedKeys[peerID] = fmt.Sprintf("published-%d", time.Now().Unix())
+ }
+
+ w.WriteHeader(status)
+ if status != http.StatusOK {
+ fmt.Fprint(w, `{"error": "publish failed"}`)
+ }
+ } else if r.Method == "GET" {
+ // Handle IPNS record retrieval
+ if record, exists := m.publishedKeys[peerID]; exists {
+ w.Header().Set("Content-Type", "application/vnd.ipfs.ipns-record")
+ fmt.Fprint(w, record)
+ } else {
+ http.Error(w, "record not found", http.StatusNotFound)
+ }
+ } else {
+ http.Error(w, "method not allowed", http.StatusMethodNotAllowed)
+ }
+}
+
+func (m *mockIPNSPublisher) getPublishedKeys() map[string]string {
+ m.mu.Lock()
+ defer m.mu.Unlock()
+ result := make(map[string]string)
+ for k, v := range m.publishedKeys {
+ result[k] = v
+ }
+ return result
+}
+
+func (m *mockIPNSPublisher) getRecordPayload(peerID string) []byte {
+ m.mu.Lock()
+ defer m.mu.Unlock()
+ if payload, exists := m.recordPayloads[peerID]; exists {
+ result := make([]byte, len(payload))
+ copy(result, payload)
+ return result
+ }
+ return nil
+}
+
+func (m *mockIPNSPublisher) close() {
+ m.server.Close()
+}
diff --git a/test/cli/autoconf/routing_test.go b/test/cli/autoconf/routing_test.go
new file mode 100644
index 000000000..57022e390
--- /dev/null
+++ b/test/cli/autoconf/routing_test.go
@@ -0,0 +1,236 @@
+package autoconf
+
+import (
+ "encoding/json"
+ "fmt"
+ "net/http"
+ "net/http/httptest"
+ "strings"
+ "sync"
+ "testing"
+
+ "github.com/ipfs/kubo/test/cli/harness"
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+)
+
+func TestAutoConfDelegatedRouting(t *testing.T) {
+ t.Parallel()
+
+ t.Run("delegated routing with auto router", func(t *testing.T) {
+ t.Parallel()
+ testDelegatedRoutingWithAuto(t)
+ })
+
+ t.Run("routing errors are handled properly", func(t *testing.T) {
+ t.Parallel()
+ testRoutingErrorHandling(t)
+ })
+}
+
+// mockRoutingServer implements a simple Delegated Routing HTTP API server
+type mockRoutingServer struct {
+ t *testing.T
+ server *httptest.Server
+ mu sync.Mutex
+ requests []string
+ providerFunc func(cid string) []map[string]interface{}
+}
+
+func newMockRoutingServer(t *testing.T) *mockRoutingServer {
+ m := &mockRoutingServer{
+ t: t,
+ requests: []string{},
+ }
+
+ // Default provider function returns mock provider records
+ m.providerFunc = func(cid string) []map[string]interface{} {
+ return []map[string]interface{}{
+ {
+ "Protocol": "transport-bitswap",
+ "Schema": "bitswap",
+ "ID": "12D3KooWMockProvider1",
+ "Addrs": []string{"/ip4/192.168.1.100/tcp/4001"},
+ },
+ {
+ "Protocol": "transport-bitswap",
+ "Schema": "bitswap",
+ "ID": "12D3KooWMockProvider2",
+ "Addrs": []string{"/ip4/192.168.1.101/tcp/4001"},
+ },
+ }
+ }
+
+ mux := http.NewServeMux()
+ mux.HandleFunc("/routing/v1/providers/", m.handleProviders)
+
+ m.server = httptest.NewServer(mux)
+ return m
+}
+
+func (m *mockRoutingServer) handleProviders(w http.ResponseWriter, r *http.Request) {
+ m.mu.Lock()
+ defer m.mu.Unlock()
+
+ // Extract CID from path
+ parts := strings.Split(r.URL.Path, "/")
+ if len(parts) < 5 {
+ http.Error(w, "invalid path", http.StatusBadRequest)
+ return
+ }
+
+ cid := parts[4]
+ m.requests = append(m.requests, cid)
+ m.t.Logf("Routing server received providers request for CID: %s", cid)
+
+ // Get provider records
+ providers := m.providerFunc(cid)
+
+ // Return NDJSON response as per IPIP-378
+ w.Header().Set("Content-Type", "application/x-ndjson")
+ encoder := json.NewEncoder(w)
+
+ for _, provider := range providers {
+ if err := encoder.Encode(provider); err != nil {
+ m.t.Logf("Failed to encode provider: %v", err)
+ return
+ }
+ }
+}
+
+func (m *mockRoutingServer) close() {
+ m.server.Close()
+}
+
+func testDelegatedRoutingWithAuto(t *testing.T) {
+ // Create mock routing server
+ routingServer := newMockRoutingServer(t)
+ defer routingServer.close()
+
+ // Create autoconf data with delegated router
+ autoConfData := fmt.Sprintf(`{
+ "AutoConfVersion": 2025072302,
+ "AutoConfSchema": 1,
+ "AutoConfTTL": 86400,
+ "SystemRegistry": {
+ "AminoDHT": {
+ "Description": "Test AminoDHT system",
+ "NativeConfig": {
+ "Bootstrap": []
+ }
+ }
+ },
+ "DNSResolvers": {},
+ "DelegatedEndpoints": {
+ "%s": {
+ "Systems": ["AminoDHT", "IPNI"],
+ "Read": ["/routing/v1/providers", "/routing/v1/peers", "/routing/v1/ipns"],
+ "Write": []
+ }
+ }
+ }`, routingServer.server.URL)
+
+ // Create autoconf server
+ autoConfServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.Header().Set("Content-Type", "application/json")
+ _, _ = w.Write([]byte(autoConfData))
+ }))
+ defer autoConfServer.Close()
+
+ // Create IPFS node with auto delegated router
+ node := harness.NewT(t).NewNode().Init("--profile=test")
+ node.SetIPFSConfig("AutoConf.URL", autoConfServer.URL)
+ node.SetIPFSConfig("AutoConf.Enabled", true)
+ node.SetIPFSConfig("Routing.DelegatedRouters", []string{"auto"})
+
+ // Test that daemon starts successfully with auto routing configuration
+ // The actual routing functionality requires online mode, but we can test
+ // that the configuration is expanded and daemon starts properly
+ node.StartDaemon("--offline")
+ defer node.StopDaemon()
+
+ // Verify config still shows "auto" (this tests that auto values are preserved in user-facing config)
+ result := node.RunIPFS("config", "Routing.DelegatedRouters")
+ require.Equal(t, 0, result.ExitCode())
+
+ var routers []string
+ err := json.Unmarshal([]byte(result.Stdout.String()), &routers)
+ require.NoError(t, err)
+ assert.Equal(t, []string{"auto"}, routers, "Delegated routers config should show 'auto'")
+
+ // Test that daemon is running and accepting commands
+ result = node.RunIPFS("version")
+ require.Equal(t, 0, result.ExitCode(), "Daemon should be running and accepting commands")
+
+ // Test that autoconf server was contacted (indicating successful resolution)
+ // We can't test actual routing in offline mode, but we can verify that
+ // the AutoConf system expanded the "auto" placeholder successfully
+ // by checking that the daemon started without errors
+ t.Log("AutoConf successfully expanded delegated router configuration and daemon started")
+}
+
+func testRoutingErrorHandling(t *testing.T) {
+ // Create routing server that returns no providers
+ routingServer := newMockRoutingServer(t)
+ defer routingServer.close()
+
+ // Configure to return no providers (empty response)
+ routingServer.providerFunc = func(cid string) []map[string]interface{} {
+ return []map[string]interface{}{}
+ }
+
+ // Create autoconf data
+ autoConfData := fmt.Sprintf(`{
+ "AutoConfVersion": 2025072302,
+ "AutoConfSchema": 1,
+ "AutoConfTTL": 86400,
+ "SystemRegistry": {
+ "AminoDHT": {
+ "Description": "Test AminoDHT system",
+ "NativeConfig": {
+ "Bootstrap": []
+ }
+ }
+ },
+ "DNSResolvers": {},
+ "DelegatedEndpoints": {
+ "%s": {
+ "Systems": ["AminoDHT", "IPNI"],
+ "Read": ["/routing/v1/providers", "/routing/v1/peers", "/routing/v1/ipns"],
+ "Write": []
+ }
+ }
+ }`, routingServer.server.URL)
+
+ // Create autoconf server
+ autoConfServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.Header().Set("Content-Type", "application/json")
+ _, _ = w.Write([]byte(autoConfData))
+ }))
+ defer autoConfServer.Close()
+
+ // Create IPFS node
+ node := harness.NewT(t).NewNode().Init("--profile=test")
+ node.SetIPFSConfig("AutoConf.URL", autoConfServer.URL)
+ node.SetIPFSConfig("AutoConf.Enabled", true)
+ node.SetIPFSConfig("Routing.DelegatedRouters", []string{"auto"})
+
+ // Test that daemon starts successfully even when no providers are available
+ node.StartDaemon("--offline")
+ defer node.StopDaemon()
+
+ // Verify config shows "auto"
+ result := node.RunIPFS("config", "Routing.DelegatedRouters")
+ require.Equal(t, 0, result.ExitCode())
+
+ var routers []string
+ err := json.Unmarshal([]byte(result.Stdout.String()), &routers)
+ require.NoError(t, err)
+ assert.Equal(t, []string{"auto"}, routers, "Delegated routers config should show 'auto'")
+
+ // Test that daemon is running and accepting commands
+ result = node.RunIPFS("version")
+ require.Equal(t, 0, result.ExitCode(), "Daemon should be running even with empty routing config")
+
+ t.Log("AutoConf successfully handled routing configuration with empty providers")
+}
diff --git a/test/cli/autoconf/swarm_connect_test.go b/test/cli/autoconf/swarm_connect_test.go
new file mode 100644
index 000000000..95c75d953
--- /dev/null
+++ b/test/cli/autoconf/swarm_connect_test.go
@@ -0,0 +1,90 @@
+package autoconf
+
+import (
+ "testing"
+ "time"
+
+ "github.com/ipfs/kubo/test/cli/harness"
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+)
+
+// TestSwarmConnectWithAutoConf tests that ipfs swarm connect works properly
+// when AutoConf is enabled and a daemon is running.
+//
+// This is a regression test for the issue where:
+// - AutoConf disabled: ipfs swarm connect works
+// - AutoConf enabled: ipfs swarm connect fails with "Error: connect"
+//
+// The issue affects CLI command fallback behavior when the HTTP API connection fails.
+func TestSwarmConnectWithAutoConf(t *testing.T) {
+ t.Parallel()
+
+ t.Run("AutoConf disabled - should work", func(t *testing.T) {
+ testSwarmConnectWithAutoConfSetting(t, false, true) // expect success
+ })
+
+ t.Run("AutoConf enabled - should work", func(t *testing.T) {
+ testSwarmConnectWithAutoConfSetting(t, true, true) // expect success (fix the bug!)
+ })
+}
+
+func testSwarmConnectWithAutoConfSetting(t *testing.T, autoConfEnabled bool, expectSuccess bool) {
+ // Create IPFS node with test profile
+ node := harness.NewT(t).NewNode().Init("--profile=test")
+
+ // Configure AutoConf
+ node.SetIPFSConfig("AutoConf.Enabled", autoConfEnabled)
+
+ // Set up bootstrap peers so the node has something to connect to
+ // Use the same bootstrap peers from boxo/autoconf fallbacks
+ node.SetIPFSConfig("Bootstrap", []string{
+ "/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN",
+ "/dnsaddr/bootstrap.libp2p.io/p2p/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa",
+ "/dnsaddr/bootstrap.libp2p.io/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb",
+ })
+
+ // CRITICAL: Start the daemon first - this is the key requirement
+ // The daemon must be running and working properly
+ node.StartDaemon()
+ defer node.StopDaemon()
+
+ // Give daemon time to start up completely
+ time.Sleep(3 * time.Second)
+
+ // Verify daemon is responsive
+ result := node.RunIPFS("id")
+ require.Equal(t, 0, result.ExitCode(), "Daemon should be responsive before testing swarm connect")
+ t.Logf("Daemon is running and responsive. AutoConf enabled: %v", autoConfEnabled)
+
+ // Now test swarm connect to a bootstrap peer
+ // This should work because:
+ // 1. The daemon is running
+ // 2. The CLI should connect to the daemon via API
+ // 3. The daemon should handle the swarm connect request
+ result = node.RunIPFS("swarm", "connect", "/dnsaddr/bootstrap.libp2p.io")
+
+ // swarm connect should work regardless of AutoConf setting
+ assert.Equal(t, 0, result.ExitCode(),
+ "swarm connect should succeed with AutoConf=%v. stderr: %s",
+ autoConfEnabled, result.Stderr.String())
+
+ // Should contain success message
+ output := result.Stdout.String()
+ assert.Contains(t, output, "success",
+ "swarm connect output should contain 'success' with AutoConf=%v. output: %s",
+ autoConfEnabled, output)
+
+ // Additional diagnostic: Check if ipfs id shows addresses
+ // Both AutoConf enabled and disabled should show proper addresses
+ result = node.RunIPFS("id")
+ require.Equal(t, 0, result.ExitCode(), "ipfs id should work with AutoConf=%v", autoConfEnabled)
+
+ idOutput := result.Stdout.String()
+ t.Logf("ipfs id output with AutoConf=%v: %s", autoConfEnabled, idOutput)
+
+ // Addresses should not be null regardless of AutoConf setting
+ assert.Contains(t, idOutput, `"Addresses"`, "ipfs id should show Addresses field")
+ assert.NotContains(t, idOutput, `"Addresses": null`,
+ "ipfs id should not show null addresses with AutoConf=%v", autoConfEnabled)
+}
diff --git a/test/cli/autoconf/testdata/autoconf_amino_and_ipni.json b/test/cli/autoconf/testdata/autoconf_amino_and_ipni.json
new file mode 100644
index 000000000..add246cc3
--- /dev/null
+++ b/test/cli/autoconf/testdata/autoconf_amino_and_ipni.json
@@ -0,0 +1,60 @@
+{
+ "AutoConfVersion": 2025072901,
+ "AutoConfSchema": 1,
+ "AutoConfTTL": 86400,
+ "SystemRegistry": {
+ "AminoDHT": {
+ "URL": "https://github.com/ipfs/specs/pull/497",
+ "Description": "Public DHT swarm that implements the IPFS Kademlia DHT specification under protocol identifier /ipfs/kad/1.0.0",
+ "NativeConfig": {
+ "Bootstrap": [
+ "/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN"
+ ]
+ },
+ "DelegatedConfig": {
+ "Read": [
+ "/routing/v1/providers",
+ "/routing/v1/peers",
+ "/routing/v1/ipns"
+ ],
+ "Write": [
+ "/routing/v1/ipns"
+ ]
+ }
+ },
+ "IPNI": {
+ "URL": "https://cid.contact",
+ "Description": "Network Indexer - content routing database for large storage providers",
+ "DelegatedConfig": {
+ "Read": [
+ "/routing/v1/providers"
+ ],
+ "Write": []
+ }
+ }
+ },
+ "DNSResolvers": {
+ "eth.": [
+ "https://dns.eth.limo/dns-query"
+ ]
+ },
+ "DelegatedEndpoints": {
+ "https://amino-dht.example.com": {
+ "Systems": ["AminoDHT"],
+ "Read": [
+ "/routing/v1/providers",
+ "/routing/v1/peers"
+ ],
+ "Write": [
+ "/routing/v1/ipns"
+ ]
+ },
+ "https://cid.contact": {
+ "Systems": ["IPNI"],
+ "Read": [
+ "/routing/v1/providers"
+ ],
+ "Write": []
+ }
+ }
+}
\ No newline at end of file
diff --git a/test/cli/autoconf/testdata/autoconf_new_routing_system.json b/test/cli/autoconf/testdata/autoconf_new_routing_system.json
new file mode 100644
index 000000000..697e5cc8f
--- /dev/null
+++ b/test/cli/autoconf/testdata/autoconf_new_routing_system.json
@@ -0,0 +1,38 @@
+{
+ "AutoConfVersion": 2025072901,
+ "AutoConfSchema": 1,
+ "AutoConfTTL": 86400,
+ "SystemRegistry": {
+ "NewRoutingSystem": {
+ "URL": "https://new-routing.example.com",
+ "Description": "New routing system for testing delegation with auto routing",
+ "DelegatedConfig": {
+ "Read": [
+ "/routing/v1/providers",
+ "/routing/v1/peers",
+ "/routing/v1/ipns"
+ ],
+ "Write": [
+ "/routing/v1/ipns"
+ ]
+ }
+ }
+ },
+ "DNSResolvers": {
+ "eth.": [
+ "https://dns.eth.limo/dns-query"
+ ]
+ },
+ "DelegatedEndpoints": {
+ "https://new-routing.example.com": {
+ "Systems": ["NewRoutingSystem"],
+ "Read": [
+ "/routing/v1/providers",
+ "/routing/v1/peers"
+ ],
+ "Write": [
+ "/routing/v1/ipns"
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/test/cli/autoconf/testdata/autoconf_new_routing_with_filtering.json b/test/cli/autoconf/testdata/autoconf_new_routing_with_filtering.json
new file mode 100644
index 000000000..982f545aa
--- /dev/null
+++ b/test/cli/autoconf/testdata/autoconf_new_routing_with_filtering.json
@@ -0,0 +1,59 @@
+{
+ "AutoConfVersion": 2025072901,
+ "AutoConfSchema": 1,
+ "AutoConfTTL": 86400,
+ "SystemRegistry": {
+ "NewRoutingSystem": {
+ "URL": "https://new-routing.example.com",
+ "Description": "New routing system for testing path filtering with auto routing",
+ "DelegatedConfig": {
+ "Read": [
+ "/routing/v1/providers",
+ "/routing/v1/peers",
+ "/routing/v1/ipns"
+ ],
+ "Write": [
+ "/routing/v1/ipns"
+ ]
+ }
+ }
+ },
+ "DNSResolvers": {
+ "eth.": [
+ "https://dns.eth.limo/dns-query"
+ ]
+ },
+ "DelegatedEndpoints": {
+ "https://supported-new.example.com": {
+ "Systems": ["NewRoutingSystem"],
+ "Read": [
+ "/routing/v1/providers",
+ "/routing/v1/peers"
+ ],
+ "Write": [
+ "/routing/v1/ipns"
+ ]
+ },
+ "https://unsupported-new.example.com": {
+ "Systems": ["NewRoutingSystem"],
+ "Read": [
+ "/custom/v0/read",
+ "/api/v1/nonstandard"
+ ],
+ "Write": [
+ "/custom/v0/write"
+ ]
+ },
+ "https://mixed-new.example.com": {
+ "Systems": ["NewRoutingSystem"],
+ "Read": [
+ "/routing/v1/providers",
+ "/invalid/path",
+ "/routing/v1/peers"
+ ],
+ "Write": [
+ "/routing/v1/ipns"
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/test/cli/autoconf/testdata/autoconf_with_unsupported_paths.json b/test/cli/autoconf/testdata/autoconf_with_unsupported_paths.json
new file mode 100644
index 000000000..e7a45a1da
--- /dev/null
+++ b/test/cli/autoconf/testdata/autoconf_with_unsupported_paths.json
@@ -0,0 +1,64 @@
+{
+ "AutoConfVersion": 2025072901,
+ "AutoConfSchema": 1,
+ "AutoConfTTL": 86400,
+ "SystemRegistry": {
+ "AminoDHT": {
+ "URL": "https://github.com/ipfs/specs/pull/497",
+ "Description": "Public DHT swarm that implements the IPFS Kademlia DHT specification under protocol identifier /ipfs/kad/1.0.0",
+ "NativeConfig": {
+ "Bootstrap": [
+ "/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN"
+ ]
+ },
+ "DelegatedConfig": {
+ "Read": [
+ "/routing/v1/providers",
+ "/routing/v1/peers",
+ "/routing/v1/ipns"
+ ],
+ "Write": [
+ "/routing/v1/ipns"
+ ]
+ }
+ }
+ },
+ "DNSResolvers": {
+ "eth.": [
+ "https://dns.eth.limo/dns-query"
+ ]
+ },
+ "DelegatedEndpoints": {
+ "https://supported.example.com": {
+ "Systems": ["AminoDHT"],
+ "Read": [
+ "/routing/v1/providers",
+ "/routing/v1/peers"
+ ],
+ "Write": [
+ "/routing/v1/ipns"
+ ]
+ },
+ "https://unsupported.example.com": {
+ "Systems": ["AminoDHT"],
+ "Read": [
+ "/example/v0/read",
+ "/api/v1/custom"
+ ],
+ "Write": [
+ "/example/v0/write"
+ ]
+ },
+ "https://mixed.example.com": {
+ "Systems": ["AminoDHT"],
+ "Read": [
+ "/routing/v1/providers",
+ "/unsupported/path",
+ "/routing/v1/peers"
+ ],
+ "Write": [
+ "/routing/v1/ipns"
+ ]
+ }
+ }
+}
diff --git a/test/cli/autoconf/testdata/updated_autoconf.json b/test/cli/autoconf/testdata/updated_autoconf.json
new file mode 100644
index 000000000..44b7f1ed9
--- /dev/null
+++ b/test/cli/autoconf/testdata/updated_autoconf.json
@@ -0,0 +1,87 @@
+{
+ "AutoConfVersion": 2025072902,
+ "AutoConfSchema": 1,
+ "AutoConfTTL": 86400,
+ "SystemRegistry": {
+ "AminoDHT": {
+ "URL": "https://github.com/ipfs/specs/pull/497",
+ "Description": "Public DHT swarm that implements the IPFS Kademlia DHT specification under protocol identifier /ipfs/kad/1.0.0",
+ "NativeConfig": {
+ "Bootstrap": [
+ "/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN",
+ "/dnsaddr/bootstrap.libp2p.io/p2p/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa",
+ "/dnsaddr/bootstrap.libp2p.io/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb",
+ "/dnsaddr/bootstrap.libp2p.io/p2p/QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt",
+ "/dnsaddr/va1.bootstrap.libp2p.io/p2p/12D3KooWKnDdG3iXw9eTFijk3EWSunZcFi54Zka4wmtqtt6rPxc8",
+ "/ip4/104.131.131.82/tcp/4001/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ",
+ "/ip4/104.131.131.82/udp/4001/quic-v1/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ"
+ ]
+ },
+ "DelegatedConfig": {
+ "Read": [
+ "/routing/v1/providers",
+ "/routing/v1/peers",
+ "/routing/v1/ipns"
+ ],
+ "Write": [
+ "/routing/v1/ipns"
+ ]
+ }
+ },
+ "IPNI": {
+ "URL": "https://ipni.example.com",
+ "Description": "Network Indexer - content routing database for large storage providers",
+ "DelegatedConfig": {
+ "Read": [
+ "/routing/v1/providers"
+ ],
+ "Write": []
+ }
+ }
+ },
+ "DNSResolvers": {
+ "eth.": [
+ "https://dns.eth.limo/dns-query",
+ "https://dns.eth.link/dns-query"
+ ],
+ "test.": [
+ "https://test.resolver/dns-query"
+ ]
+ },
+ "DelegatedEndpoints": {
+ "https://ipni.example.com": {
+ "Systems": ["IPNI"],
+ "Read": [
+ "/routing/v1/providers"
+ ],
+ "Write": []
+ },
+ "https://routing.example.com": {
+ "Systems": ["IPNI"],
+ "Read": [
+ "/routing/v1/providers"
+ ],
+ "Write": []
+ },
+ "https://delegated-ipfs.dev": {
+ "Systems": ["AminoDHT", "IPNI"],
+ "Read": [
+ "/routing/v1/providers",
+ "/routing/v1/peers",
+ "/routing/v1/ipns"
+ ],
+ "Write": [
+ "/routing/v1/ipns"
+ ]
+ },
+ "https://ipns.example.com": {
+ "Systems": ["AminoDHT"],
+ "Read": [
+ "/routing/v1/ipns"
+ ],
+ "Write": [
+ "/routing/v1/ipns"
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/test/cli/autoconf/testdata/valid_autoconf.json b/test/cli/autoconf/testdata/valid_autoconf.json
new file mode 100644
index 000000000..4469c33c2
--- /dev/null
+++ b/test/cli/autoconf/testdata/valid_autoconf.json
@@ -0,0 +1,68 @@
+{
+ "AutoConfVersion": 2025072901,
+ "AutoConfSchema": 1,
+ "AutoConfTTL": 86400,
+ "SystemRegistry": {
+ "AminoDHT": {
+ "URL": "https://github.com/ipfs/specs/pull/497",
+ "Description": "Public DHT swarm that implements the IPFS Kademlia DHT specification under protocol identifier /ipfs/kad/1.0.0",
+ "NativeConfig": {
+ "Bootstrap": [
+ "/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN",
+ "/dnsaddr/bootstrap.libp2p.io/p2p/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa",
+ "/dnsaddr/bootstrap.libp2p.io/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb",
+ "/dnsaddr/bootstrap.libp2p.io/p2p/QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt",
+ "/dnsaddr/va1.bootstrap.libp2p.io/p2p/12D3KooWKnDdG3iXw9eTFijk3EWSunZcFi54Zka4wmtqtt6rPxc8",
+ "/ip4/104.131.131.82/tcp/4001/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ",
+ "/ip4/104.131.131.82/udp/4001/quic-v1/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ"
+ ]
+ },
+ "DelegatedConfig": {
+ "Read": [
+ "/routing/v1/providers",
+ "/routing/v1/peers",
+ "/routing/v1/ipns"
+ ],
+ "Write": [
+ "/routing/v1/ipns"
+ ]
+ }
+ },
+ "IPNI": {
+ "URL": "https://ipni.example.com",
+ "Description": "Network Indexer - content routing database for large storage providers",
+ "DelegatedConfig": {
+ "Read": [
+ "/routing/v1/providers"
+ ],
+ "Write": []
+ }
+ }
+ },
+ "DNSResolvers": {
+ "eth.": [
+ "https://dns.eth.limo/dns-query",
+ "https://dns.eth.link/dns-query"
+ ]
+ },
+ "DelegatedEndpoints": {
+ "https://ipni.example.com": {
+ "Systems": ["IPNI"],
+ "Read": [
+ "/routing/v1/providers"
+ ],
+ "Write": []
+ },
+ "https://delegated-ipfs.dev": {
+ "Systems": ["AminoDHT", "IPNI"],
+ "Read": [
+ "/routing/v1/providers",
+ "/routing/v1/peers",
+ "/routing/v1/ipns"
+ ],
+ "Write": [
+ "/routing/v1/ipns"
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/test/cli/autoconf/validation_test.go b/test/cli/autoconf/validation_test.go
new file mode 100644
index 000000000..e906fe175
--- /dev/null
+++ b/test/cli/autoconf/validation_test.go
@@ -0,0 +1,144 @@
+package autoconf
+
+import (
+ "net/http"
+ "net/http/httptest"
+ "testing"
+
+ "github.com/ipfs/kubo/test/cli/harness"
+ "github.com/stretchr/testify/assert"
+)
+
+func TestAutoConfValidation(t *testing.T) {
+ t.Parallel()
+
+ t.Run("invalid autoconf JSON prevents caching", func(t *testing.T) {
+ t.Parallel()
+ testInvalidAutoConfJSONPreventsCaching(t)
+ })
+
+ t.Run("malformed multiaddr in autoconf", func(t *testing.T) {
+ t.Parallel()
+ testMalformedMultiaddrInAutoConf(t)
+ })
+
+ t.Run("malformed URL in autoconf", func(t *testing.T) {
+ t.Parallel()
+ testMalformedURLInAutoConf(t)
+ })
+}
+
+func testInvalidAutoConfJSONPreventsCaching(t *testing.T) {
+ // Create server that serves invalid autoconf JSON
+ invalidAutoConfData := `{
+ "AutoConfVersion": 123,
+ "AutoConfSchema": 1,
+ "SystemRegistry": {
+ "AminoDHT": {
+ "NativeConfig": {
+ "Bootstrap": [
+ "invalid-multiaddr-that-should-fail"
+ ]
+ }
+ }
+ }
+ }`
+
+ requestCount := 0
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ requestCount++
+ t.Logf("Invalid autoconf server request #%d: %s %s", requestCount, r.Method, r.URL.Path)
+ w.Header().Set("Content-Type", "application/json")
+ w.Header().Set("ETag", `"invalid-config-123"`)
+ _, _ = w.Write([]byte(invalidAutoConfData))
+ }))
+ defer server.Close()
+
+ // Create IPFS node and try to start daemon with invalid autoconf
+ node := harness.NewT(t).NewNode().Init("--profile=test")
+ node.SetIPFSConfig("AutoConf.URL", server.URL)
+ node.SetIPFSConfig("AutoConf.Enabled", true)
+ node.SetIPFSConfig("Bootstrap", []string{"auto"})
+
+ // Start daemon to trigger autoconf fetch - this should start but log validation errors
+ node.StartDaemon()
+ defer node.StopDaemon()
+
+ // Give autoconf some time to attempt fetch and fail validation
+ // The daemon should still start but autoconf should fail
+ result := node.RunIPFS("version")
+ assert.Equal(t, 0, result.ExitCode(), "Daemon should start even with invalid autoconf")
+
+ // Verify server was called (autoconf was attempted even though validation failed)
+ assert.Greater(t, requestCount, 0, "Invalid autoconf server should have been called")
+}
+
+func testMalformedMultiaddrInAutoConf(t *testing.T) {
+ // Create server that serves autoconf with malformed multiaddr
+ invalidAutoConfData := `{
+ "AutoConfVersion": 456,
+ "AutoConfSchema": 1,
+ "SystemRegistry": {
+ "AminoDHT": {
+ "NativeConfig": {
+ "Bootstrap": [
+ "/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN",
+ "not-a-valid-multiaddr"
+ ]
+ }
+ }
+ }
+ }`
+
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.Header().Set("Content-Type", "application/json")
+ _, _ = w.Write([]byte(invalidAutoConfData))
+ }))
+ defer server.Close()
+
+ // Create IPFS node
+ node := harness.NewT(t).NewNode().Init("--profile=test")
+ node.SetIPFSConfig("AutoConf.URL", server.URL)
+ node.SetIPFSConfig("AutoConf.Enabled", true)
+ node.SetIPFSConfig("Bootstrap", []string{"auto"})
+
+ // Start daemon to trigger autoconf fetch - daemon should start but autoconf validation should fail
+ node.StartDaemon()
+ defer node.StopDaemon()
+
+ // Daemon should still be functional even with invalid autoconf
+ result := node.RunIPFS("version")
+ assert.Equal(t, 0, result.ExitCode(), "Daemon should start even with invalid autoconf")
+}
+
+func testMalformedURLInAutoConf(t *testing.T) {
+ // Create server that serves autoconf with malformed URL
+ invalidAutoConfData := `{
+ "AutoConfVersion": 789,
+ "AutoConfSchema": 1,
+ "DNSResolvers": {
+ "eth.": ["https://valid.example.com"],
+ "bad.": ["://malformed-url-missing-scheme"]
+ }
+ }`
+
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.Header().Set("Content-Type", "application/json")
+ _, _ = w.Write([]byte(invalidAutoConfData))
+ }))
+ defer server.Close()
+
+ // Create IPFS node
+ node := harness.NewT(t).NewNode().Init("--profile=test")
+ node.SetIPFSConfig("AutoConf.URL", server.URL)
+ node.SetIPFSConfig("AutoConf.Enabled", true)
+ node.SetIPFSConfig("DNS.Resolvers", map[string]string{"foo.": "auto"})
+
+ // Start daemon to trigger autoconf fetch - daemon should start but autoconf validation should fail
+ node.StartDaemon()
+ defer node.StopDaemon()
+
+ // Daemon should still be functional even with invalid autoconf
+ result := node.RunIPFS("version")
+ assert.Equal(t, 0, result.ExitCode(), "Daemon should start even with invalid autoconf")
+}
diff --git a/test/cli/basic_commands_test.go b/test/cli/basic_commands_test.go
index 62733d00b..d9d66d1c3 100644
--- a/test/cli/basic_commands_test.go
+++ b/test/cli/basic_commands_test.go
@@ -70,6 +70,10 @@ func TestIPFSVersionDeps(t *testing.T) {
splitModVers := strings.Split(moduleVersion, "@")
modPath := splitModVers[0]
modVers := splitModVers[1]
+ // Skip local replace paths (starting with "./")
+ if strings.HasPrefix(modPath, "./") {
+ continue
+ }
assert.NoError(t, gomod.Check(modPath, modVers), "path: %s, version: %s", modPath, modVers)
}
}
diff --git a/test/cli/bootstrap_auto_test.go b/test/cli/bootstrap_auto_test.go
new file mode 100644
index 000000000..e3959ece7
--- /dev/null
+++ b/test/cli/bootstrap_auto_test.go
@@ -0,0 +1,202 @@
+package cli
+
+import (
+ "testing"
+
+ "github.com/ipfs/kubo/test/cli/harness"
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+)
+
+func TestBootstrapCommandsWithAutoPlaceholder(t *testing.T) {
+ t.Parallel()
+
+ t.Run("bootstrap add default", func(t *testing.T) {
+ t.Parallel()
+ // Test that 'ipfs bootstrap add default' works correctly
+ node := harness.NewT(t).NewNode().Init("--profile=test")
+ node.SetIPFSConfig("AutoConf.Enabled", true)
+ node.SetIPFSConfig("Bootstrap", []string{}) // Start with empty bootstrap
+
+ // Add default bootstrap peers via "auto" placeholder
+ result := node.RunIPFS("bootstrap", "add", "default")
+ require.Equal(t, 0, result.ExitCode(), "bootstrap add default should succeed")
+
+ output := result.Stdout.String()
+ t.Logf("Bootstrap add default output: %s", output)
+ assert.Contains(t, output, "added auto", "bootstrap add default should report adding 'auto'")
+
+ // Verify bootstrap list shows "auto"
+ listResult := node.RunIPFS("bootstrap", "list")
+ require.Equal(t, 0, listResult.ExitCode(), "bootstrap list should succeed")
+
+ listOutput := listResult.Stdout.String()
+ t.Logf("Bootstrap list after add default: %s", listOutput)
+ assert.Contains(t, listOutput, "auto", "bootstrap list should show 'auto' placeholder")
+ })
+
+ t.Run("bootstrap add auto explicitly", func(t *testing.T) {
+ t.Parallel()
+ // Test that 'ipfs bootstrap add auto' works correctly
+ node := harness.NewT(t).NewNode().Init("--profile=test")
+ node.SetIPFSConfig("AutoConf.Enabled", true)
+ node.SetIPFSConfig("Bootstrap", []string{}) // Start with empty bootstrap
+
+ // Add "auto" placeholder explicitly
+ result := node.RunIPFS("bootstrap", "add", "auto")
+ require.Equal(t, 0, result.ExitCode(), "bootstrap add auto should succeed")
+
+ output := result.Stdout.String()
+ t.Logf("Bootstrap add auto output: %s", output)
+ assert.Contains(t, output, "added auto", "bootstrap add auto should report adding 'auto'")
+
+ // Verify bootstrap list shows "auto"
+ listResult := node.RunIPFS("bootstrap", "list")
+ require.Equal(t, 0, listResult.ExitCode(), "bootstrap list should succeed")
+
+ listOutput := listResult.Stdout.String()
+ t.Logf("Bootstrap list after add auto: %s", listOutput)
+ assert.Contains(t, listOutput, "auto", "bootstrap list should show 'auto' placeholder")
+ })
+
+ t.Run("bootstrap add default converts to auto", func(t *testing.T) {
+ t.Parallel()
+ // Test that 'ipfs bootstrap add default' adds "auto" to the bootstrap list
+ node := harness.NewT(t).NewNode().Init("--profile=test")
+ node.SetIPFSConfig("Bootstrap", []string{}) // Start with empty bootstrap
+ node.SetIPFSConfig("AutoConf.Enabled", true) // Enable AutoConf to allow adding "auto"
+
+ // Add default bootstrap peers
+ result := node.RunIPFS("bootstrap", "add", "default")
+ require.Equal(t, 0, result.ExitCode(), "bootstrap add default should succeed")
+ assert.Contains(t, result.Stdout.String(), "added auto", "should report adding 'auto'")
+
+ // Verify bootstrap list shows "auto"
+ var bootstrap []string
+ node.GetIPFSConfig("Bootstrap", &bootstrap)
+ require.Equal(t, []string{"auto"}, bootstrap, "Bootstrap should contain ['auto']")
+ })
+
+ t.Run("bootstrap add default fails when AutoConf disabled", func(t *testing.T) {
+ t.Parallel()
+ // Test that adding default/auto fails when AutoConf is disabled
+ node := harness.NewT(t).NewNode().Init("--profile=test")
+ node.SetIPFSConfig("Bootstrap", []string{}) // Start with empty bootstrap
+ node.SetIPFSConfig("AutoConf.Enabled", false) // Disable AutoConf
+
+ // Try to add default - should fail
+ result := node.RunIPFS("bootstrap", "add", "default")
+ require.NotEqual(t, 0, result.ExitCode(), "bootstrap add default should fail when AutoConf disabled")
+ assert.Contains(t, result.Stderr.String(), "AutoConf is disabled", "should mention AutoConf is disabled")
+
+ // Try to add auto - should also fail
+ result = node.RunIPFS("bootstrap", "add", "auto")
+ require.NotEqual(t, 0, result.ExitCode(), "bootstrap add auto should fail when AutoConf disabled")
+ assert.Contains(t, result.Stderr.String(), "AutoConf is disabled", "should mention AutoConf is disabled")
+ })
+
+ t.Run("bootstrap rm with auto placeholder", func(t *testing.T) {
+ t.Parallel()
+ // Test that selective removal fails properly when "auto" is present
+ node := harness.NewT(t).NewNode().Init("--profile=test")
+ node.SetIPFSConfig("AutoConf.Enabled", true)
+ node.SetIPFSConfig("Bootstrap", []string{"auto"}) // Start with auto
+
+ // Try to remove a specific peer - should fail with helpful error
+ result := node.RunIPFS("bootstrap", "rm", "/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN")
+ require.NotEqual(t, 0, result.ExitCode(), "bootstrap rm of specific peer should fail when 'auto' is present")
+
+ output := result.Stderr.String()
+ t.Logf("Bootstrap rm error output: %s", output)
+ assert.Contains(t, output, "cannot remove individual bootstrap peers when using 'auto' placeholder",
+ "should provide helpful error message about auto placeholder")
+ assert.Contains(t, output, "disable AutoConf",
+ "should suggest disabling AutoConf as solution")
+ assert.Contains(t, output, "ipfs bootstrap rm --all",
+ "should suggest using rm --all as alternative")
+ })
+
+ t.Run("bootstrap rm --all with auto placeholder", func(t *testing.T) {
+ t.Parallel()
+ // Test that 'ipfs bootstrap rm --all' works with "auto" placeholder
+ node := harness.NewT(t).NewNode().Init("--profile=test")
+ node.SetIPFSConfig("AutoConf.Enabled", true)
+ node.SetIPFSConfig("Bootstrap", []string{"auto"}) // Start with auto
+
+ // Remove all bootstrap peers
+ result := node.RunIPFS("bootstrap", "rm", "--all")
+ require.Equal(t, 0, result.ExitCode(), "bootstrap rm --all should succeed with auto placeholder")
+
+ output := result.Stdout.String()
+ t.Logf("Bootstrap rm --all output: %s", output)
+ assert.Contains(t, output, "removed auto", "bootstrap rm --all should report removing 'auto'")
+
+ // Verify bootstrap list is now empty
+ listResult := node.RunIPFS("bootstrap", "list")
+ require.Equal(t, 0, listResult.ExitCode(), "bootstrap list should succeed")
+
+ listOutput := listResult.Stdout.String()
+ t.Logf("Bootstrap list after rm --all: %s", listOutput)
+ assert.Empty(t, listOutput, "bootstrap list should be empty after rm --all")
+
+ // Test the rm all subcommand too
+ node.SetIPFSConfig("Bootstrap", []string{"auto"}) // Reset to auto
+
+ result = node.RunIPFS("bootstrap", "rm", "all")
+ require.Equal(t, 0, result.ExitCode(), "bootstrap rm all should succeed with auto placeholder")
+
+ output = result.Stdout.String()
+ t.Logf("Bootstrap rm all output: %s", output)
+ assert.Contains(t, output, "removed auto", "bootstrap rm all should report removing 'auto'")
+ })
+
+ t.Run("bootstrap mixed auto and specific peers", func(t *testing.T) {
+ t.Parallel()
+ // Test that bootstrap commands work when mixing "auto" with specific peers
+ node := harness.NewT(t).NewNode().Init("--profile=test")
+ node.SetIPFSConfig("AutoConf.Enabled", true)
+ node.SetIPFSConfig("Bootstrap", []string{}) // Start with empty bootstrap
+
+ // Add a specific peer first
+ specificPeer := "/ip4/127.0.0.1/tcp/4001/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ"
+ result := node.RunIPFS("bootstrap", "add", specificPeer)
+ require.Equal(t, 0, result.ExitCode(), "bootstrap add specific peer should succeed")
+
+ // Add auto placeholder
+ result = node.RunIPFS("bootstrap", "add", "auto")
+ require.Equal(t, 0, result.ExitCode(), "bootstrap add auto should succeed")
+
+ // Verify bootstrap list shows both
+ listResult := node.RunIPFS("bootstrap", "list")
+ require.Equal(t, 0, listResult.ExitCode(), "bootstrap list should succeed")
+
+ listOutput := listResult.Stdout.String()
+ t.Logf("Bootstrap list with mixed peers: %s", listOutput)
+ assert.Contains(t, listOutput, "auto", "bootstrap list should contain 'auto' placeholder")
+ assert.Contains(t, listOutput, specificPeer, "bootstrap list should contain specific peer")
+
+ // Try to remove the specific peer - should fail because auto is present
+ result = node.RunIPFS("bootstrap", "rm", specificPeer)
+ require.NotEqual(t, 0, result.ExitCode(), "bootstrap rm of specific peer should fail when 'auto' is present")
+
+ output := result.Stderr.String()
+ assert.Contains(t, output, "cannot remove individual bootstrap peers when using 'auto' placeholder",
+ "should provide helpful error message about auto placeholder")
+
+ // Remove all should work and remove both auto and specific peer
+ result = node.RunIPFS("bootstrap", "rm", "--all")
+ require.Equal(t, 0, result.ExitCode(), "bootstrap rm --all should succeed")
+
+ output = result.Stdout.String()
+ t.Logf("Bootstrap rm --all output with mixed peers: %s", output)
+ // Should report removing both the specific peer and auto
+ assert.Contains(t, output, "removed", "should report removing peers")
+
+ // Verify bootstrap list is now empty
+ listResult = node.RunIPFS("bootstrap", "list")
+ require.Equal(t, 0, listResult.ExitCode(), "bootstrap list should succeed")
+
+ listOutput = listResult.Stdout.String()
+ assert.Empty(t, listOutput, "bootstrap list should be empty after rm --all")
+ })
+}
diff --git a/test/cli/harness/node.go b/test/cli/harness/node.go
index 49a551535..6403a2f1a 100644
--- a/test/cli/harness/node.go
+++ b/test/cli/harness/node.go
@@ -54,6 +54,42 @@ func BuildNode(ipfsBin, baseDir string, id int) *Node {
env := environToMap(os.Environ())
env["IPFS_PATH"] = dir
+ // If using "ipfs" binary name, provide helpful binary information
+ if ipfsBin == "ipfs" {
+ // Check if cmd/ipfs/ipfs exists (simple relative path check)
+ localBinary := "cmd/ipfs/ipfs"
+ localExists := false
+ if _, err := os.Stat(localBinary); err == nil {
+ localExists = true
+ if abs, err := filepath.Abs(localBinary); err == nil {
+ localBinary = abs
+ }
+ }
+
+ // Check if ipfs is available in PATH
+ pathBinary, pathErr := exec.LookPath("ipfs")
+
+ // Handle different scenarios
+ if pathErr != nil {
+ // No ipfs in PATH
+ if localExists {
+ fmt.Printf("WARNING: No 'ipfs' found in PATH, but local binary exists at %s\n", localBinary)
+ fmt.Printf("Consider adding it to PATH or run: export PATH=\"$(pwd)/cmd/ipfs:$PATH\"\n")
+ } else {
+ fmt.Printf("ERROR: No 'ipfs' binary found in PATH and no local build at cmd/ipfs/ipfs\n")
+ fmt.Printf("Run 'make build' first or install ipfs and add it to PATH\n")
+ panic("ipfs binary not available")
+ }
+ } else {
+ // ipfs found in PATH
+ if localExists && localBinary != pathBinary {
+ fmt.Printf("NOTE: Local binary at %s differs from PATH binary at %s\n", localBinary, pathBinary)
+ fmt.Printf("Consider adding the local binary to PATH if you want to use the version built by 'make build'\n")
+ }
+ // If they match or no local binary, no message needed
+ }
+ }
+
return &Node{
ID: id,
Dir: dir,
@@ -457,28 +493,60 @@ func (n *Node) IsAlive() bool {
}
func (n *Node) SwarmAddrs() []multiaddr.Multiaddr {
- res := n.Runner.MustRun(RunRequest{
+ res := n.Runner.Run(RunRequest{
Path: n.IPFSBin,
Args: []string{"swarm", "addrs", "local"},
})
+ if res.ExitCode() != 0 {
+ // If swarm command fails (e.g., daemon not online), return empty slice
+ log.Debugf("Node %d: swarm addrs local failed (exit %d): %s", n.ID, res.ExitCode(), res.Stderr.String())
+ return []multiaddr.Multiaddr{}
+ }
out := strings.TrimSpace(res.Stdout.String())
+ if out == "" {
+ log.Debugf("Node %d: swarm addrs local returned empty output", n.ID)
+ return []multiaddr.Multiaddr{}
+ }
+ log.Debugf("Node %d: swarm addrs local output: %s", n.ID, out)
outLines := strings.Split(out, "\n")
var addrs []multiaddr.Multiaddr
for _, addrStr := range outLines {
+ addrStr = strings.TrimSpace(addrStr)
+ if addrStr == "" {
+ continue
+ }
ma, err := multiaddr.NewMultiaddr(addrStr)
if err != nil {
panic(err)
}
addrs = append(addrs, ma)
}
+ log.Debugf("Node %d: parsed %d swarm addresses", n.ID, len(addrs))
return addrs
}
+// SwarmAddrsWithTimeout waits for swarm addresses to be available
+func (n *Node) SwarmAddrsWithTimeout(timeout time.Duration) []multiaddr.Multiaddr {
+ start := time.Now()
+ for time.Since(start) < timeout {
+ addrs := n.SwarmAddrs()
+ if len(addrs) > 0 {
+ return addrs
+ }
+ time.Sleep(100 * time.Millisecond)
+ }
+ return []multiaddr.Multiaddr{}
+}
+
func (n *Node) SwarmAddrsWithPeerIDs() []multiaddr.Multiaddr {
+ return n.SwarmAddrsWithPeerIDsTimeout(5 * time.Second)
+}
+
+func (n *Node) SwarmAddrsWithPeerIDsTimeout(timeout time.Duration) []multiaddr.Multiaddr {
ipfsProtocol := multiaddr.ProtocolWithCode(multiaddr.P_IPFS).Name
peerID := n.PeerID()
var addrs []multiaddr.Multiaddr
- for _, ma := range n.SwarmAddrs() {
+ for _, ma := range n.SwarmAddrsWithTimeout(timeout) {
// add the peer ID to the multiaddr if it doesn't have it
_, err := ma.ValueForProtocol(multiaddr.P_IPFS)
if errors.Is(err, multiaddr.ErrProtocolNotFound) {
@@ -513,18 +581,80 @@ func (n *Node) SwarmAddrsWithoutPeerIDs() []multiaddr.Multiaddr {
}
func (n *Node) Connect(other *Node) *Node {
- n.Runner.MustRun(RunRequest{
+ // Get the peer addresses to connect to
+ addrs := other.SwarmAddrsWithPeerIDs()
+ if len(addrs) == 0 {
+ // If no addresses available, skip connection
+ log.Debugf("No swarm addresses available for connection")
+ return n
+ }
+ // Use Run instead of MustRun to avoid panics on connection failures
+ res := n.Runner.Run(RunRequest{
Path: n.IPFSBin,
- Args: []string{"swarm", "connect", other.SwarmAddrsWithPeerIDs()[0].String()},
+ Args: []string{"swarm", "connect", addrs[0].String()},
})
+ if res.ExitCode() != 0 {
+ log.Debugf("swarm connect failed: %s", res.Stderr.String())
+ }
return n
}
+// ConnectAndWait connects to another node and waits for the connection to be established
+func (n *Node) ConnectAndWait(other *Node, timeout time.Duration) error {
+ // Get the peer addresses to connect to - wait up to half the timeout for addresses
+ addrs := other.SwarmAddrsWithPeerIDsTimeout(timeout / 2)
+ if len(addrs) == 0 {
+ return fmt.Errorf("no swarm addresses available for node %d after waiting %v", other.ID, timeout/2)
+ }
+
+ otherPeerID := other.PeerID()
+
+ // Try to connect
+ res := n.Runner.Run(RunRequest{
+ Path: n.IPFSBin,
+ Args: []string{"swarm", "connect", addrs[0].String()},
+ })
+ if res.ExitCode() != 0 {
+ return fmt.Errorf("swarm connect failed: %s", res.Stderr.String())
+ }
+
+ // Wait for connection to be established
+ start := time.Now()
+ for time.Since(start) < timeout {
+ peers := n.Peers()
+ for _, peerAddr := range peers {
+ if peerID, err := peerAddr.ValueForProtocol(multiaddr.P_P2P); err == nil {
+ if peerID == otherPeerID.String() {
+ return nil // Connection established
+ }
+ }
+ }
+ time.Sleep(100 * time.Millisecond)
+ }
+
+ return fmt.Errorf("timeout waiting for connection to node %d (peer %s)", other.ID, otherPeerID)
+}
+
func (n *Node) Peers() []multiaddr.Multiaddr {
- res := n.Runner.MustRun(RunRequest{
+ // Wait for daemon to be ready if it's supposed to be running
+ if n.Daemon != nil && n.Daemon.Cmd != nil && n.Daemon.Cmd.Process != nil {
+ // Give daemon a short time to become ready
+ for i := 0; i < 10; i++ {
+ if n.IsAlive() {
+ break
+ }
+ time.Sleep(100 * time.Millisecond)
+ }
+ }
+ res := n.Runner.Run(RunRequest{
Path: n.IPFSBin,
Args: []string{"swarm", "peers"},
})
+ if res.ExitCode() != 0 {
+ // If swarm peers fails (e.g., daemon not online), return empty slice
+ log.Debugf("swarm peers failed: %s", res.Stderr.String())
+ return []multiaddr.Multiaddr{}
+ }
var addrs []multiaddr.Multiaddr
for _, line := range res.Stdout.Lines() {
ma, err := multiaddr.NewMultiaddr(line)
diff --git a/test/cli/migrations/migration_16_to_17_test.go b/test/cli/migrations/migration_16_to_17_test.go
new file mode 100644
index 000000000..e4d75bffd
--- /dev/null
+++ b/test/cli/migrations/migration_16_to_17_test.go
@@ -0,0 +1,684 @@
+package migrations
+
+// NOTE: These migration tests require the local Kubo binary (built with 'make build') to be in PATH.
+// The tests migrate from repo version 16 to 17, which requires Kubo version 0.37.0+ (expects repo v17).
+// If using system ipfs binary v0.36.0 or older (expects repo v16), no migration will be triggered.
+//
+// To run these tests successfully:
+// export PATH="$(pwd)/cmd/ipfs:$PATH"
+// go test ./test/cli/migrations/
+
+import (
+ "bufio"
+ "context"
+ "encoding/json"
+ "io"
+ "os"
+ "os/exec"
+ "path/filepath"
+ "strings"
+ "testing"
+ "time"
+
+ "github.com/ipfs/kubo/test/cli/harness"
+ "github.com/stretchr/testify/require"
+)
+
+func TestMigration16To17(t *testing.T) {
+ t.Parallel()
+
+ // Primary tests using 'ipfs daemon --migrate' command (default in Docker)
+ t.Run("daemon migrate: forward migration with auto values", testDaemonMigrationWithAuto)
+ t.Run("daemon migrate: forward migration without auto values", testDaemonMigrationWithoutAuto)
+ t.Run("daemon migrate: corrupted config handling", testDaemonCorruptedConfigHandling)
+ t.Run("daemon migrate: missing fields handling", testDaemonMissingFieldsHandling)
+
+ // Comparison tests using 'ipfs repo migrate' command
+ t.Run("repo migrate: forward migration with auto values", testRepoMigrationWithAuto)
+ t.Run("repo migrate: backward migration", testRepoBackwardMigration)
+}
+
+// =============================================================================
+// PRIMARY TESTS: 'ipfs daemon --migrate' command (default in Docker)
+//
+// These tests exercise the primary migration path used in production Docker
+// containers where --migrate is enabled by default. This covers:
+// - Normal forward migration scenarios
+// - Error handling with corrupted configs
+// - Migration with minimal/missing config fields
+// =============================================================================
+
+func testDaemonMigrationWithAuto(t *testing.T) {
+ // TEST: Forward migration using 'ipfs daemon --migrate' command (PRIMARY)
+ // Use static v16 repo fixture from real Kubo 0.36 `ipfs init`
+ // NOTE: This test may need to be revised/updated once repo version 18 is released,
+ // at that point only keep tests that use 'ipfs repo migrate'
+ node := setupStaticV16Repo(t)
+
+ configPath := filepath.Join(node.Dir, "config")
+ versionPath := filepath.Join(node.Dir, "version")
+
+ // Static fixture already uses port 0 for random port assignment - no config update needed
+
+ // Run migration using daemon --migrate (automatic during daemon startup)
+ // This is the primary method used in Docker containers
+ // Monitor output until daemon is ready, then shut it down gracefully
+ stdoutOutput, migrationSuccess := runDaemonMigrationWithMonitoring(t, node)
+
+ // Debug: Print the actual output
+ t.Logf("Daemon output:\n%s", stdoutOutput)
+
+ // Verify migration was successful based on monitoring
+ require.True(t, migrationSuccess, "Migration should have been successful")
+ require.Contains(t, stdoutOutput, "applying 16-to-17 repo migration", "Migration should have been triggered")
+ require.Contains(t, stdoutOutput, "Migration 16 to 17 succeeded", "Migration should have completed successfully")
+
+ // Verify version was updated to 17
+ versionData, err := os.ReadFile(versionPath)
+ require.NoError(t, err)
+ require.Equal(t, "17", strings.TrimSpace(string(versionData)), "Version should be updated to 17")
+
+ // Verify migration results using DRY helper
+ helper := NewMigrationTestHelper(t, configPath)
+ helper.RequireAutoConfDefaults().
+ RequireArrayContains("Bootstrap", "auto").
+ RequireArrayLength("Bootstrap", 1). // Should only contain "auto" when all peers were defaults
+ RequireArrayContains("Routing.DelegatedRouters", "auto").
+ RequireArrayContains("Ipns.DelegatedPublishers", "auto")
+
+ // DNS resolver in static fixture should be empty, so "." should be set to "auto"
+ helper.RequireFieldEquals("DNS.Resolvers[.]", "auto")
+}
+
+func testDaemonMigrationWithoutAuto(t *testing.T) {
+ // TEST: Forward migration using 'ipfs daemon --migrate' command (PRIMARY)
+ // Test migration of a config that already has some custom values
+ // NOTE: This test may need to be revised/updated once repo version 18 is released,
+ // at that point only keep tests that use 'ipfs repo migrate'
+ // Should preserve existing settings and only add missing ones
+ node := setupStaticV16Repo(t)
+
+ // Modify the static fixture to add some custom values for testing mixed scenarios
+ configPath := filepath.Join(node.Dir, "config")
+
+ // Read existing config from static fixture
+ var v16Config map[string]interface{}
+ configData, err := os.ReadFile(configPath)
+ require.NoError(t, err)
+ require.NoError(t, json.Unmarshal(configData, &v16Config))
+
+ // Add custom DNS resolver that should be preserved
+ if v16Config["DNS"] == nil {
+ v16Config["DNS"] = map[string]interface{}{}
+ }
+ dnsSection := v16Config["DNS"].(map[string]interface{})
+ dnsSection["Resolvers"] = map[string]string{
+ ".": "https://custom-dns.example.com/dns-query",
+ "eth.": "https://dns.eth.limo/dns-query", // This is a default that will be replaced with "auto"
+ }
+
+ // Write modified config back
+ modifiedConfigData, err := json.MarshalIndent(v16Config, "", " ")
+ require.NoError(t, err)
+ require.NoError(t, os.WriteFile(configPath, modifiedConfigData, 0644))
+
+ // Static fixture already uses port 0 for random port assignment - no config update needed
+
+ // Run migration using daemon --migrate command (this is a daemon test)
+ // Monitor output until daemon is ready, then shut it down gracefully
+ stdoutOutput, migrationSuccess := runDaemonMigrationWithMonitoring(t, node)
+
+ // Verify migration was successful based on monitoring
+ require.True(t, migrationSuccess, "Migration should have been successful")
+ require.Contains(t, stdoutOutput, "applying 16-to-17 repo migration", "Migration should have been triggered")
+ require.Contains(t, stdoutOutput, "Migration 16 to 17 succeeded", "Migration should have completed successfully")
+
+ // Verify migration results: custom values preserved alongside "auto"
+ helper := NewMigrationTestHelper(t, configPath)
+ helper.RequireAutoConfDefaults().
+ RequireArrayContains("Bootstrap", "auto").
+ RequireFieldEquals("DNS.Resolvers[.]", "https://custom-dns.example.com/dns-query")
+
+ // Check that eth. resolver was replaced with "auto" since it uses a default URL
+ helper.RequireFieldEquals("DNS.Resolvers[eth.]", "auto").
+ RequireFieldEquals("DNS.Resolvers[.]", "https://custom-dns.example.com/dns-query")
+}
+
+// =============================================================================
+// Tests using 'ipfs daemon --migrate' command
+// =============================================================================
+
+// Test helper structs and functions for cleaner, more DRY tests
+
+type ConfigField struct {
+ Path string
+ Expected interface{}
+ Message string
+}
+
+type MigrationTestHelper struct {
+ t *testing.T
+ config map[string]interface{}
+}
+
+func NewMigrationTestHelper(t *testing.T, configPath string) *MigrationTestHelper {
+ var config map[string]interface{}
+ configData, err := os.ReadFile(configPath)
+ require.NoError(t, err)
+ require.NoError(t, json.Unmarshal(configData, &config))
+
+ return &MigrationTestHelper{t: t, config: config}
+}
+
+func (h *MigrationTestHelper) RequireFieldExists(path string) *MigrationTestHelper {
+ value := h.getNestedValue(path)
+ require.NotNil(h.t, value, "Field %s should exist", path)
+ return h
+}
+
+func (h *MigrationTestHelper) RequireFieldEquals(path string, expected interface{}) *MigrationTestHelper {
+ value := h.getNestedValue(path)
+ require.Equal(h.t, expected, value, "Field %s should equal %v", path, expected)
+ return h
+}
+
+func (h *MigrationTestHelper) RequireArrayContains(path string, expected interface{}) *MigrationTestHelper {
+ value := h.getNestedValue(path)
+ require.IsType(h.t, []interface{}{}, value, "Field %s should be an array", path)
+ array := value.([]interface{})
+ require.Contains(h.t, array, expected, "Array %s should contain %v", path, expected)
+ return h
+}
+
+func (h *MigrationTestHelper) RequireArrayLength(path string, expectedLen int) *MigrationTestHelper {
+ value := h.getNestedValue(path)
+ require.IsType(h.t, []interface{}{}, value, "Field %s should be an array", path)
+ array := value.([]interface{})
+ require.Len(h.t, array, expectedLen, "Array %s should have length %d", path, expectedLen)
+ return h
+}
+
+func (h *MigrationTestHelper) RequireArrayDoesNotContain(path string, notExpected interface{}) *MigrationTestHelper {
+ value := h.getNestedValue(path)
+ require.IsType(h.t, []interface{}{}, value, "Field %s should be an array", path)
+ array := value.([]interface{})
+ require.NotContains(h.t, array, notExpected, "Array %s should not contain %v", path, notExpected)
+ return h
+}
+
+func (h *MigrationTestHelper) RequireFieldAbsent(path string) *MigrationTestHelper {
+ value := h.getNestedValue(path)
+ require.Nil(h.t, value, "Field %s should not exist", path)
+ return h
+}
+
+func (h *MigrationTestHelper) RequireAutoConfDefaults() *MigrationTestHelper {
+ // AutoConf section should exist but be empty (using implicit defaults)
+ return h.RequireFieldExists("AutoConf").
+ RequireFieldAbsent("AutoConf.Enabled"). // Should use implicit default (true)
+ RequireFieldAbsent("AutoConf.URL"). // Should use implicit default (mainnet URL)
+ RequireFieldAbsent("AutoConf.RefreshInterval"). // Should use implicit default (24h)
+ RequireFieldAbsent("AutoConf.TLSInsecureSkipVerify") // Should use implicit default (false)
+}
+
+func (h *MigrationTestHelper) RequireAutoFieldsSetToAuto() *MigrationTestHelper {
+ return h.RequireArrayContains("Bootstrap", "auto").
+ RequireFieldEquals("DNS.Resolvers[.]", "auto").
+ RequireArrayContains("Routing.DelegatedRouters", "auto").
+ RequireArrayContains("Ipns.DelegatedPublishers", "auto")
+}
+
+func (h *MigrationTestHelper) RequireNoAutoValues() *MigrationTestHelper {
+ // Check Bootstrap if it exists
+ if h.getNestedValue("Bootstrap") != nil {
+ h.RequireArrayDoesNotContain("Bootstrap", "auto")
+ }
+
+ // Check DNS.Resolvers if it exists
+ if h.getNestedValue("DNS.Resolvers") != nil {
+ h.RequireMapDoesNotContainValue("DNS.Resolvers", "auto")
+ }
+
+ // Check Routing.DelegatedRouters if it exists
+ if h.getNestedValue("Routing.DelegatedRouters") != nil {
+ h.RequireArrayDoesNotContain("Routing.DelegatedRouters", "auto")
+ }
+
+ // Check Ipns.DelegatedPublishers if it exists
+ if h.getNestedValue("Ipns.DelegatedPublishers") != nil {
+ h.RequireArrayDoesNotContain("Ipns.DelegatedPublishers", "auto")
+ }
+
+ return h
+}
+
+func (h *MigrationTestHelper) RequireMapDoesNotContainValue(path string, notExpected interface{}) *MigrationTestHelper {
+ value := h.getNestedValue(path)
+ require.IsType(h.t, map[string]interface{}{}, value, "Field %s should be a map", path)
+ mapValue := value.(map[string]interface{})
+ for k, v := range mapValue {
+ require.NotEqual(h.t, notExpected, v, "Map %s[%s] should not equal %v", path, k, notExpected)
+ }
+ return h
+}
+
+func (h *MigrationTestHelper) getNestedValue(path string) interface{} {
+ segments := h.parseKuboConfigPath(path)
+ current := interface{}(h.config)
+
+ for _, segment := range segments {
+ switch segment.Type {
+ case "field":
+ switch v := current.(type) {
+ case map[string]interface{}:
+ current = v[segment.Key]
+ default:
+ return nil
+ }
+ case "mapKey":
+ switch v := current.(type) {
+ case map[string]interface{}:
+ current = v[segment.Key]
+ default:
+ return nil
+ }
+ default:
+ return nil
+ }
+
+ if current == nil {
+ return nil
+ }
+ }
+
+ return current
+}
+
+type PathSegment struct {
+ Type string // "field" or "mapKey"
+ Key string
+}
+
+func (h *MigrationTestHelper) parseKuboConfigPath(path string) []PathSegment {
+ var segments []PathSegment
+
+ // Split path into parts, respecting bracket boundaries
+ parts := h.splitKuboConfigPath(path)
+
+ for _, part := range parts {
+ if strings.Contains(part, "[") && strings.HasSuffix(part, "]") {
+ // Handle field[key] notation
+ bracketStart := strings.Index(part, "[")
+ fieldName := part[:bracketStart]
+ mapKey := part[bracketStart+1 : len(part)-1] // Remove [ and ]
+
+ // Add field segment if present
+ if fieldName != "" {
+ segments = append(segments, PathSegment{Type: "field", Key: fieldName})
+ }
+ // Add map key segment
+ segments = append(segments, PathSegment{Type: "mapKey", Key: mapKey})
+ } else {
+ // Regular field access
+ if part != "" {
+ segments = append(segments, PathSegment{Type: "field", Key: part})
+ }
+ }
+ }
+
+ return segments
+}
+
+// splitKuboConfigPath splits a path on dots, but preserves bracket sections intact
+func (h *MigrationTestHelper) splitKuboConfigPath(path string) []string {
+ var parts []string
+ var current strings.Builder
+ inBrackets := false
+
+ for _, r := range path {
+ switch r {
+ case '[':
+ inBrackets = true
+ current.WriteRune(r)
+ case ']':
+ inBrackets = false
+ current.WriteRune(r)
+ case '.':
+ if inBrackets {
+ // Inside brackets, preserve the dot
+ current.WriteRune(r)
+ } else {
+ // Outside brackets, split here
+ if current.Len() > 0 {
+ parts = append(parts, current.String())
+ current.Reset()
+ }
+ }
+ default:
+ current.WriteRune(r)
+ }
+ }
+
+ // Add final part if any
+ if current.Len() > 0 {
+ parts = append(parts, current.String())
+ }
+
+ return parts
+}
+
+// setupStaticV16Repo creates a test node using static v16 repo fixture from real Kubo 0.36 `ipfs init`
+// This ensures tests remain stable regardless of future changes to the IPFS binary
+// Each test gets its own copy in a temporary directory to allow modifications
+func setupStaticV16Repo(t *testing.T) *harness.Node {
+ // Get absolute path to static v16 repo fixture
+ v16FixturePath := "testdata/v16-repo"
+
+ // Create a temporary test directory - each test gets its own copy
+ // Use ./tmp.DELETEME/ as requested by user instead of /tmp/
+ tmpDir := filepath.Join("tmp.DELETEME", "migration-test-"+t.Name())
+ require.NoError(t, os.MkdirAll(tmpDir, 0755))
+ t.Cleanup(func() { os.RemoveAll(tmpDir) })
+
+ // Convert to absolute path for harness
+ absTmpDir, err := filepath.Abs(tmpDir)
+ require.NoError(t, err)
+
+ // Use the built binary (should be in PATH)
+ node := harness.BuildNode("ipfs", absTmpDir, 0)
+
+ // Replace IPFS_PATH with static fixture files to test directory (creates independent copy per test)
+ cloneStaticRepoFixture(t, v16FixturePath, node.Dir)
+
+ return node
+}
+
+// cloneStaticRepoFixture recursively copies the v16 repo fixture to the target directory
+// It completely removes the target directory contents before copying to ensure no extra files remain
+func cloneStaticRepoFixture(t *testing.T, srcPath, dstPath string) {
+ srcInfo, err := os.Stat(srcPath)
+ require.NoError(t, err)
+
+ if srcInfo.IsDir() {
+ // Completely remove destination directory and all contents
+ require.NoError(t, os.RemoveAll(dstPath))
+ // Create fresh destination directory
+ require.NoError(t, os.MkdirAll(dstPath, srcInfo.Mode()))
+
+ // Read source directory
+ entries, err := os.ReadDir(srcPath)
+ require.NoError(t, err)
+
+ // Copy each entry recursively
+ for _, entry := range entries {
+ srcEntryPath := filepath.Join(srcPath, entry.Name())
+ dstEntryPath := filepath.Join(dstPath, entry.Name())
+ cloneStaticRepoFixture(t, srcEntryPath, dstEntryPath)
+ }
+ } else {
+ // Copy file (destination directory should already be clean from parent call)
+ srcFile, err := os.Open(srcPath)
+ require.NoError(t, err)
+ defer srcFile.Close()
+
+ dstFile, err := os.Create(dstPath)
+ require.NoError(t, err)
+ defer dstFile.Close()
+
+ _, err = io.Copy(dstFile, srcFile)
+ require.NoError(t, err)
+
+ // Copy file permissions
+ require.NoError(t, dstFile.Chmod(srcInfo.Mode()))
+ }
+}
+
+// Placeholder stubs for new test functions - to be implemented
+func testDaemonCorruptedConfigHandling(t *testing.T) {
+ // TEST: Error handling using 'ipfs daemon --migrate' command with corrupted config (PRIMARY)
+ // Test what happens when config file is corrupted during migration
+ // NOTE: This test may need to be revised/updated once repo version 18 is released,
+ // at that point only keep tests that use 'ipfs repo migrate'
+ node := setupStaticV16Repo(t)
+
+ // Create corrupted config
+ configPath := filepath.Join(node.Dir, "config")
+ corruptedJson := `{"Bootstrap": [invalid json}`
+ require.NoError(t, os.WriteFile(configPath, []byte(corruptedJson), 0644))
+
+ // Write version file indicating v16
+ versionPath := filepath.Join(node.Dir, "version")
+ require.NoError(t, os.WriteFile(versionPath, []byte("16"), 0644))
+
+ // Run daemon with --migrate flag - this should fail gracefully
+ result := node.RunIPFS("daemon", "--migrate")
+
+ // Verify graceful failure handling
+ // The daemon should fail but migration error should be clear
+ errorOutput := result.Stderr.String() + result.Stdout.String()
+ require.True(t, strings.Contains(errorOutput, "json") || strings.Contains(errorOutput, "invalid character"), "Error should mention JSON parsing issue")
+
+ // Verify atomic failure: version and config should remain unchanged
+ versionData, err := os.ReadFile(versionPath)
+ require.NoError(t, err)
+ require.Equal(t, "16", strings.TrimSpace(string(versionData)), "Version should remain unchanged after failed migration")
+
+ originalContent, err := os.ReadFile(configPath)
+ require.NoError(t, err)
+ require.Equal(t, corruptedJson, string(originalContent), "Original config should be unchanged after failed migration")
+}
+
+func testDaemonMissingFieldsHandling(t *testing.T) {
+ // TEST: Migration using 'ipfs daemon --migrate' command with minimal config (PRIMARY)
+ // Test migration when config is missing expected fields
+ // NOTE: This test may need to be revised/updated once repo version 18 is released,
+ // at that point only keep tests that use 'ipfs repo migrate'
+ node := setupStaticV16Repo(t)
+
+ // The static fixture already has all required fields, use it as-is
+ configPath := filepath.Join(node.Dir, "config")
+ versionPath := filepath.Join(node.Dir, "version")
+
+ // Static fixture already uses port 0 for random port assignment - no config update needed
+
+ // Run daemon migration
+ stdoutOutput, migrationSuccess := runDaemonMigrationWithMonitoring(t, node)
+
+ // Verify migration was successful
+ require.True(t, migrationSuccess, "Migration should have been successful")
+ require.Contains(t, stdoutOutput, "applying 16-to-17 repo migration", "Migration should have been triggered")
+ require.Contains(t, stdoutOutput, "Migration 16 to 17 succeeded", "Migration should have completed successfully")
+
+ // Verify version was updated
+ versionData, err := os.ReadFile(versionPath)
+ require.NoError(t, err)
+ require.Equal(t, "17", strings.TrimSpace(string(versionData)), "Version should be updated to 17")
+
+ // Verify migration adds all required fields to minimal config
+ NewMigrationTestHelper(t, configPath).
+ RequireAutoConfDefaults().
+ RequireAutoFieldsSetToAuto().
+ RequireFieldExists("Identity.PeerID") // Original identity preserved from static fixture
+}
+
+// =============================================================================
+// COMPARISON TESTS: 'ipfs repo migrate' command
+//
+// These tests verify that repo migrate produces equivalent results to
+// daemon migrate, and test scenarios specific to repo migrate like
+// backward migration (which daemon doesn't support).
+// =============================================================================
+
+func testRepoMigrationWithAuto(t *testing.T) {
+ // TEST: Forward migration using 'ipfs repo migrate' command (COMPARISON)
+ // Simple comparison test to verify repo migrate produces same results as daemon migrate
+ node := setupStaticV16Repo(t)
+
+ // Use static fixture as-is
+ configPath := filepath.Join(node.Dir, "config")
+
+ // Run migration using 'ipfs repo migrate' command
+ result := node.RunIPFS("repo", "migrate")
+ require.Empty(t, result.Stderr.String(), "Migration should succeed without errors")
+
+ // Verify same results as daemon migrate
+ helper := NewMigrationTestHelper(t, configPath)
+ helper.RequireAutoConfDefaults().
+ RequireArrayContains("Bootstrap", "auto").
+ RequireArrayContains("Routing.DelegatedRouters", "auto").
+ RequireArrayContains("Ipns.DelegatedPublishers", "auto").
+ RequireFieldEquals("DNS.Resolvers[.]", "auto")
+}
+
+func testRepoBackwardMigration(t *testing.T) {
+ // TEST: Backward migration using 'ipfs repo migrate --to=16 --allow-downgrade' command
+ // This is kept as repo migrate since daemon doesn't support backward migration
+ node := setupStaticV16Repo(t)
+
+ // Use static fixture as-is
+ configPath := filepath.Join(node.Dir, "config")
+ versionPath := filepath.Join(node.Dir, "version")
+
+ // First run forward migration to get to v17
+ result := node.RunIPFS("repo", "migrate")
+ require.Empty(t, result.Stderr.String(), "Forward migration should succeed")
+
+ // Verify we're at v17
+ versionData, err := os.ReadFile(versionPath)
+ require.NoError(t, err)
+ require.Equal(t, "17", strings.TrimSpace(string(versionData)), "Should be at version 17 after forward migration")
+
+ // Now run reverse migration back to v16
+ result = node.RunIPFS("repo", "migrate", "--to=16", "--allow-downgrade")
+ require.Empty(t, result.Stderr.String(), "Reverse migration should succeed")
+
+ // Verify version was downgraded to 16
+ versionData, err = os.ReadFile(versionPath)
+ require.NoError(t, err)
+ require.Equal(t, "16", strings.TrimSpace(string(versionData)), "Version should be downgraded to 16")
+
+ // Verify backward migration results: AutoConf removed and no "auto" values remain
+ NewMigrationTestHelper(t, configPath).
+ RequireFieldAbsent("AutoConf").
+ RequireNoAutoValues()
+}
+
+// runDaemonMigrationWithMonitoring starts daemon --migrate, monitors output until "Daemon is ready",
+// then gracefully shuts down the daemon and returns the captured output and success status.
+// This is a generic helper that can monitor for any migration patterns.
+func runDaemonMigrationWithMonitoring(t *testing.T, node *harness.Node) (string, bool) {
+ // Use specific patterns for 16-to-17 migration
+ return runDaemonWithMigrationMonitoring(t, node, "applying 16-to-17 repo migration", "Migration 16 to 17 succeeded")
+}
+
+// runDaemonWithMigrationMonitoring is a generic helper for running daemon --migrate and monitoring output.
+// It waits for the daemon to be ready, then shuts it down gracefully.
+// migrationPattern: pattern to detect migration started (e.g., "applying X-to-Y repo migration")
+// successPattern: pattern to detect migration succeeded (e.g., "Migration X to Y succeeded")
+// Returns the stdout output and whether both patterns were detected.
+func runDaemonWithMigrationMonitoring(t *testing.T, node *harness.Node, migrationPattern, successPattern string) (string, bool) {
+ // Create context with timeout as safety net
+ ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)
+ defer cancel()
+
+ // Set up daemon command with output monitoring
+ cmd := exec.CommandContext(ctx, node.IPFSBin, "daemon", "--migrate")
+ cmd.Dir = node.Dir
+
+ // Set environment (especially IPFS_PATH)
+ for k, v := range node.Runner.Env {
+ cmd.Env = append(cmd.Env, k+"="+v)
+ }
+
+ // Set up pipes for output monitoring
+ stdout, err := cmd.StdoutPipe()
+ require.NoError(t, err)
+ stderr, err := cmd.StderrPipe()
+ require.NoError(t, err)
+
+ // Start the daemon
+ err = cmd.Start()
+ require.NoError(t, err)
+
+ var allOutput strings.Builder
+ var migrationDetected, migrationSucceeded, daemonReady bool
+
+ // Monitor stdout for completion signals
+ scanner := bufio.NewScanner(stdout)
+ go func() {
+ for scanner.Scan() {
+ line := scanner.Text()
+ allOutput.WriteString(line + "\n")
+
+ // Check for migration messages
+ if migrationPattern != "" && strings.Contains(line, migrationPattern) {
+ migrationDetected = true
+ }
+ if successPattern != "" && strings.Contains(line, successPattern) {
+ migrationSucceeded = true
+ }
+ if strings.Contains(line, "Daemon is ready") {
+ daemonReady = true
+ break // Exit monitoring loop
+ }
+ }
+ }()
+
+ // Also monitor stderr (but don't use it for completion detection)
+ go func() {
+ stderrScanner := bufio.NewScanner(stderr)
+ for stderrScanner.Scan() {
+ line := stderrScanner.Text()
+ allOutput.WriteString("STDERR: " + line + "\n")
+ }
+ }()
+
+ // Wait for daemon ready signal or timeout
+ ticker := time.NewTicker(100 * time.Millisecond)
+ defer ticker.Stop()
+
+ for {
+ select {
+ case <-ctx.Done():
+ // Timeout - kill the process
+ if cmd.Process != nil {
+ _ = cmd.Process.Kill()
+ }
+ t.Logf("Daemon migration timed out after 60 seconds")
+ return allOutput.String(), false
+
+ case <-ticker.C:
+ if daemonReady {
+ // Daemon is ready - shut it down gracefully
+ shutdownCmd := exec.Command(node.IPFSBin, "shutdown")
+ shutdownCmd.Dir = node.Dir
+ for k, v := range node.Runner.Env {
+ shutdownCmd.Env = append(shutdownCmd.Env, k+"="+v)
+ }
+
+ if err := shutdownCmd.Run(); err != nil {
+ t.Logf("Warning: ipfs shutdown failed: %v", err)
+ // Force kill if graceful shutdown fails
+ if cmd.Process != nil {
+ _ = cmd.Process.Kill()
+ }
+ }
+
+ // Wait for process to exit
+ _ = cmd.Wait()
+
+ // Return success if we detected migration
+ success := migrationDetected && migrationSucceeded
+ return allOutput.String(), success
+ }
+
+ // Check if process has exited (e.g., due to startup failure after migration)
+ if cmd.ProcessState != nil && cmd.ProcessState.Exited() {
+ // Process exited - migration may have completed but daemon failed to start
+ // This is expected for corrupted config tests
+ success := migrationDetected && migrationSucceeded
+ return allOutput.String(), success
+ }
+ }
+ }
+}
diff --git a/test/cli/migrations/migration_legacy_15_to_17_test.go b/test/cli/migrations/migration_legacy_15_to_17_test.go
new file mode 100644
index 000000000..1471cab1f
--- /dev/null
+++ b/test/cli/migrations/migration_legacy_15_to_17_test.go
@@ -0,0 +1,451 @@
+package migrations
+
+// NOTE: These legacy migration tests require the local Kubo binary (built with 'make build') to be in PATH.
+// The tests migrate from repo version 15 to 17, which requires both external (15โ16) and embedded (16โ17) migrations.
+// This validates the transition from legacy external binaries to modern embedded migrations.
+//
+// To run these tests successfully:
+// export PATH="$(pwd)/cmd/ipfs:$PATH"
+// go test ./test/cli/migrations/
+
+import (
+ "bufio"
+ "context"
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "os/exec"
+ "path/filepath"
+ "strings"
+ "syscall"
+ "testing"
+ "time"
+
+ "github.com/ipfs/kubo/test/cli/harness"
+ "github.com/stretchr/testify/require"
+)
+
+func TestMigration15To17(t *testing.T) {
+ t.Parallel()
+
+ // Test legacy migration from v15 to v17 (combines external 15โ16 + embedded 16โ17)
+ t.Run("daemon migrate: legacy 15 to 17", testDaemonMigration15To17)
+ t.Run("repo migrate: legacy 15 to 17", testRepoMigration15To17)
+}
+
+func TestMigration17To15Downgrade(t *testing.T) {
+ t.Parallel()
+
+ // Test reverse hybrid migration from v17 to v15 (embedded 17โ16 + external 16โ15)
+ t.Run("repo migrate: reverse hybrid 17 to 15", testRepoReverseHybridMigration17To15)
+}
+
+func testDaemonMigration15To17(t *testing.T) {
+ // TEST: Migration from v15 to v17 using 'ipfs daemon --migrate'
+ // This tests the dual migration path: external binary (15โ16) + embedded (16โ17)
+ // NOTE: This test may need to be revised/updated once repo version 18 is released,
+ // at that point only keep tests that use 'ipfs repo migrate'
+ node := setupStaticV15Repo(t)
+
+ // Create mock migration binary for 15โ16 (16โ17 will use embedded migration)
+ createMockMigrationBinary(t, "15", "16")
+
+ configPath := filepath.Join(node.Dir, "config")
+ versionPath := filepath.Join(node.Dir, "version")
+
+ // Verify starting conditions
+ versionData, err := os.ReadFile(versionPath)
+ require.NoError(t, err)
+ require.Equal(t, "15", strings.TrimSpace(string(versionData)), "Should start at version 15")
+
+ // Read original config to verify preservation of key fields
+ var originalConfig map[string]interface{}
+ configData, err := os.ReadFile(configPath)
+ require.NoError(t, err)
+ require.NoError(t, json.Unmarshal(configData, &originalConfig))
+
+ originalPeerID := getNestedValue(originalConfig, "Identity.PeerID")
+
+ // Run dual migration using daemon --migrate
+ stdoutOutput, migrationSuccess := runDaemonWithLegacyMigrationMonitoring(t, node)
+
+ // Debug output
+ t.Logf("Daemon output:\n%s", stdoutOutput)
+
+ // Verify hybrid migration was successful
+ require.True(t, migrationSuccess, "Hybrid migration should have been successful")
+ require.Contains(t, stdoutOutput, "Phase 1: External migration from v15 to v16", "Should detect external migration phase")
+ require.Contains(t, stdoutOutput, "Phase 2: Embedded migration from v16 to v17", "Should detect embedded migration phase")
+ require.Contains(t, stdoutOutput, "Hybrid migration completed successfully", "Should confirm hybrid migration completion")
+
+ // Verify final version is 17
+ versionData, err = os.ReadFile(versionPath)
+ require.NoError(t, err)
+ require.Equal(t, "17", strings.TrimSpace(string(versionData)), "Version should be updated to 17")
+
+ // Verify config is still valid JSON and key fields preserved
+ var finalConfig map[string]interface{}
+ configData, err = os.ReadFile(configPath)
+ require.NoError(t, err)
+ require.NoError(t, json.Unmarshal(configData, &finalConfig), "Config should remain valid JSON")
+
+ // Verify essential fields preserved
+ finalPeerID := getNestedValue(finalConfig, "Identity.PeerID")
+ require.Equal(t, originalPeerID, finalPeerID, "Identity.PeerID should be preserved")
+
+ // Verify bootstrap exists (may be modified by 16โ17 migration)
+ finalBootstrap := getNestedValue(finalConfig, "Bootstrap")
+ require.NotNil(t, finalBootstrap, "Bootstrap should exist after migration")
+
+ // Verify AutoConf was added by 16โ17 migration
+ autoConf := getNestedValue(finalConfig, "AutoConf")
+ require.NotNil(t, autoConf, "AutoConf should be added by 16โ17 migration")
+}
+
+func testRepoMigration15To17(t *testing.T) {
+ // TEST: Migration from v15 to v17 using 'ipfs repo migrate'
+ // Comparison test to verify repo migrate produces same results as daemon migrate
+ node := setupStaticV15Repo(t)
+
+ // Create mock migration binary for 15โ16 (16โ17 will use embedded migration)
+ createMockMigrationBinary(t, "15", "16")
+
+ configPath := filepath.Join(node.Dir, "config")
+ versionPath := filepath.Join(node.Dir, "version")
+
+ // Verify starting version
+ versionData, err := os.ReadFile(versionPath)
+ require.NoError(t, err)
+ require.Equal(t, "15", strings.TrimSpace(string(versionData)), "Should start at version 15")
+
+ // Run migration using 'ipfs repo migrate' with custom PATH
+ result := node.Runner.Run(harness.RunRequest{
+ Path: node.IPFSBin,
+ Args: []string{"repo", "migrate"},
+ CmdOpts: []harness.CmdOpt{
+ func(cmd *exec.Cmd) {
+ // Ensure the command inherits our modified PATH with mock binaries
+ cmd.Env = append(cmd.Env, "PATH="+os.Getenv("PATH"))
+ },
+ },
+ })
+ require.Empty(t, result.Stderr.String(), "Migration should succeed without errors")
+
+ // Verify final version is 17
+ versionData, err = os.ReadFile(versionPath)
+ require.NoError(t, err)
+ require.Equal(t, "17", strings.TrimSpace(string(versionData)), "Version should be updated to 17")
+
+ // Verify config is valid JSON
+ var finalConfig map[string]interface{}
+ configData, err := os.ReadFile(configPath)
+ require.NoError(t, err)
+ require.NoError(t, json.Unmarshal(configData, &finalConfig), "Config should remain valid JSON")
+
+ // Verify essential fields exist
+ require.NotNil(t, getNestedValue(finalConfig, "Identity.PeerID"), "Identity.PeerID should exist")
+ require.NotNil(t, getNestedValue(finalConfig, "Bootstrap"), "Bootstrap should exist")
+ require.NotNil(t, getNestedValue(finalConfig, "AutoConf"), "AutoConf should be added")
+}
+
+// setupStaticV15Repo creates a test node using static v15 repo fixture
+// This ensures tests remain stable and validates migration from very old repos
+func setupStaticV15Repo(t *testing.T) *harness.Node {
+ // Get path to static v15 repo fixture
+ v15FixturePath := "testdata/v15-repo"
+
+ // Create temporary test directory using Go's testing temp dir
+ tmpDir := t.TempDir()
+
+ // Use the built binary (should be in PATH)
+ node := harness.BuildNode("ipfs", tmpDir, 0)
+
+ // Copy static fixture to test directory
+ cloneStaticRepoFixture(t, v15FixturePath, node.Dir)
+
+ return node
+}
+
+// runDaemonWithLegacyMigrationMonitoring monitors for hybrid migration patterns
+func runDaemonWithLegacyMigrationMonitoring(t *testing.T, node *harness.Node) (string, bool) {
+ // Monitor for hybrid migration completion - use "Hybrid migration completed successfully" as success pattern
+ stdoutOutput, daemonStarted := runDaemonWithMigrationMonitoringCustomEnv(t, node, "Using hybrid migration strategy", "Hybrid migration completed successfully", map[string]string{
+ "PATH": os.Getenv("PATH"), // Pass current PATH which includes our mock binaries
+ })
+
+ // Check for hybrid migration patterns in output
+ hasHybridStart := strings.Contains(stdoutOutput, "Using hybrid migration strategy")
+ hasPhase1 := strings.Contains(stdoutOutput, "Phase 1: External migration from v15 to v16")
+ hasPhase2 := strings.Contains(stdoutOutput, "Phase 2: Embedded migration from v16 to v17")
+ hasHybridSuccess := strings.Contains(stdoutOutput, "Hybrid migration completed successfully")
+
+ // Success requires daemon to start and hybrid migration patterns to be detected
+ hybridMigrationSuccess := daemonStarted && hasHybridStart && hasPhase1 && hasPhase2 && hasHybridSuccess
+
+ return stdoutOutput, hybridMigrationSuccess
+}
+
+// runDaemonWithMigrationMonitoringCustomEnv is like runDaemonWithMigrationMonitoring but allows custom environment
+func runDaemonWithMigrationMonitoringCustomEnv(t *testing.T, node *harness.Node, migrationPattern, successPattern string, extraEnv map[string]string) (string, bool) {
+ // Create context with timeout as safety net
+ ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)
+ defer cancel()
+
+ // Set up daemon command with output monitoring
+ cmd := exec.CommandContext(ctx, node.IPFSBin, "daemon", "--migrate")
+ cmd.Dir = node.Dir
+
+ // Set environment (especially IPFS_PATH)
+ for k, v := range node.Runner.Env {
+ cmd.Env = append(cmd.Env, k+"="+v)
+ }
+
+ // Add extra environment variables (like PATH with mock binaries)
+ for k, v := range extraEnv {
+ cmd.Env = append(cmd.Env, k+"="+v)
+ }
+
+ // Set up pipes for output monitoring
+ stdout, err := cmd.StdoutPipe()
+ require.NoError(t, err)
+ stderr, err := cmd.StderrPipe()
+ require.NoError(t, err)
+
+ // Start the daemon
+ require.NoError(t, cmd.Start())
+
+ // Monitor output from both streams
+ var outputBuffer strings.Builder
+ done := make(chan bool)
+ migrationStarted := false
+ migrationCompleted := false
+
+ go func() {
+ scanner := bufio.NewScanner(io.MultiReader(stdout, stderr))
+ for scanner.Scan() {
+ line := scanner.Text()
+ outputBuffer.WriteString(line + "\n")
+
+ // Check for migration start
+ if strings.Contains(line, migrationPattern) {
+ migrationStarted = true
+ }
+
+ // Check for migration completion
+ if strings.Contains(line, successPattern) {
+ migrationCompleted = true
+ }
+
+ // Check for daemon ready
+ if strings.Contains(line, "Daemon is ready") {
+ done <- true
+ return
+ }
+ }
+ done <- false
+ }()
+
+ // Wait for daemon to be ready or timeout
+ daemonReady := false
+ select {
+ case ready := <-done:
+ daemonReady = ready
+ case <-ctx.Done():
+ t.Log("Daemon startup timed out")
+ }
+
+ // Stop the daemon
+ if cmd.Process != nil {
+ _ = cmd.Process.Signal(syscall.SIGTERM)
+ _ = cmd.Wait()
+ }
+
+ return outputBuffer.String(), daemonReady && migrationStarted && migrationCompleted
+}
+
+// createMockMigrationBinary creates a platform-agnostic Go binary for migration on PATH
+func createMockMigrationBinary(t *testing.T, fromVer, toVer string) {
+ // Create bin directory for migration binaries
+ binDir := t.TempDir()
+
+ // Create Go source for mock migration binary
+ scriptName := fmt.Sprintf("fs-repo-%s-to-%s", fromVer, toVer)
+ sourceFile := filepath.Join(binDir, scriptName+".go")
+ binaryPath := filepath.Join(binDir, scriptName)
+
+ goSource := fmt.Sprintf(`package main
+
+import (
+ "fmt"
+ "os"
+ "path/filepath"
+ "strings"
+)
+
+func main() {
+ // Parse command line arguments - real migration binaries expect -path=
+ var repoPath string
+ var revert bool
+ for _, arg := range os.Args[1:] {
+ if strings.HasPrefix(arg, "-path=") {
+ repoPath = strings.TrimPrefix(arg, "-path=")
+ } else if arg == "-revert" {
+ revert = true
+ }
+ }
+
+ if repoPath == "" {
+ fmt.Fprintf(os.Stderr, "Usage: %%s -path= [-verbose=true] [-revert]\n", os.Args[0])
+ os.Exit(1)
+ }
+
+ // Determine source and target versions based on revert flag
+ var sourceVer, targetVer string
+ if revert {
+ // When reverting, we go backwards: fs-repo-15-to-16 with -revert goes 16โ15
+ sourceVer = "%s"
+ targetVer = "%s"
+ } else {
+ // Normal forward migration: fs-repo-15-to-16 goes 15โ16
+ sourceVer = "%s"
+ targetVer = "%s"
+ }
+
+ // Print migration message (same format as real migrations)
+ fmt.Printf("fake applying %%s-to-%%s repo migration\n", sourceVer, targetVer)
+
+ // Update version file
+ versionFile := filepath.Join(repoPath, "version")
+ err := os.WriteFile(versionFile, []byte(targetVer), 0644)
+ if err != nil {
+ fmt.Fprintf(os.Stderr, "Error updating version: %%v\n", err)
+ os.Exit(1)
+ }
+}
+`, toVer, fromVer, fromVer, toVer)
+
+ require.NoError(t, os.WriteFile(sourceFile, []byte(goSource), 0644))
+
+ // Compile the Go binary
+ require.NoError(t, os.Setenv("CGO_ENABLED", "0")) // Ensure static binary
+ require.NoError(t, exec.Command("go", "build", "-o", binaryPath, sourceFile).Run())
+
+ // Add bin directory to PATH for this test
+ currentPath := os.Getenv("PATH")
+ newPath := binDir + string(filepath.ListSeparator) + currentPath
+ require.NoError(t, os.Setenv("PATH", newPath))
+ t.Cleanup(func() { os.Setenv("PATH", currentPath) })
+
+ // Verify the binary exists and is executable
+ _, err := os.Stat(binaryPath)
+ require.NoError(t, err, "Mock binary should exist")
+}
+
+// getNestedValue retrieves a nested value from a config map using dot notation
+func getNestedValue(config map[string]interface{}, path string) interface{} {
+ parts := strings.Split(path, ".")
+ current := interface{}(config)
+
+ for _, part := range parts {
+ switch v := current.(type) {
+ case map[string]interface{}:
+ current = v[part]
+ default:
+ return nil
+ }
+ if current == nil {
+ return nil
+ }
+ }
+
+ return current
+}
+
+func testRepoReverseHybridMigration17To15(t *testing.T) {
+ // TEST: Reverse hybrid migration from v17 to v15 using 'ipfs repo migrate --to=15 --allow-downgrade'
+ // This tests reverse hybrid migration: embedded (17โ16) + external (16โ15)
+
+ // Start with v15 fixture and migrate forward to v17 to create proper backup files
+ node := setupStaticV15Repo(t)
+
+ // Create mock migration binary for 15โ16 (needed for forward migration)
+ createMockMigrationBinary(t, "15", "16")
+ // Create mock migration binary for 16โ15 (needed for downgrade)
+ createMockMigrationBinary(t, "16", "15")
+
+ configPath := filepath.Join(node.Dir, "config")
+ versionPath := filepath.Join(node.Dir, "version")
+
+ // Step 1: Forward migration from v15 to v17 to create backup files
+ t.Log("Step 1: Forward migration v15 โ v17")
+ result := node.Runner.Run(harness.RunRequest{
+ Path: node.IPFSBin,
+ Args: []string{"repo", "migrate"},
+ CmdOpts: []harness.CmdOpt{
+ func(cmd *exec.Cmd) {
+ // Ensure the command inherits our modified PATH with mock binaries
+ cmd.Env = append(cmd.Env, "PATH="+os.Getenv("PATH"))
+ },
+ },
+ })
+
+ // Debug: print the output to see what happened
+ t.Logf("Forward migration stdout:\n%s", result.Stdout.String())
+ t.Logf("Forward migration stderr:\n%s", result.Stderr.String())
+
+ require.Empty(t, result.Stderr.String(), "Forward migration should succeed without errors")
+
+ // Verify we're at v17 after forward migration
+ versionData, err := os.ReadFile(versionPath)
+ require.NoError(t, err)
+ require.Equal(t, "17", strings.TrimSpace(string(versionData)), "Should be at version 17 after forward migration")
+
+ // Read config after forward migration to use as baseline for downgrade
+ var v17Config map[string]interface{}
+ configData, err := os.ReadFile(configPath)
+ require.NoError(t, err)
+ require.NoError(t, json.Unmarshal(configData, &v17Config))
+
+ originalPeerID := getNestedValue(v17Config, "Identity.PeerID")
+
+ // Step 2: Reverse hybrid migration from v17 to v15
+ t.Log("Step 2: Reverse hybrid migration v17 โ v15")
+ result = node.Runner.Run(harness.RunRequest{
+ Path: node.IPFSBin,
+ Args: []string{"repo", "migrate", "--to=15", "--allow-downgrade"},
+ CmdOpts: []harness.CmdOpt{
+ func(cmd *exec.Cmd) {
+ // Ensure the command inherits our modified PATH with mock binaries
+ cmd.Env = append(cmd.Env, "PATH="+os.Getenv("PATH"))
+ },
+ },
+ })
+ require.Empty(t, result.Stderr.String(), "Reverse hybrid migration should succeed without errors")
+
+ // Debug output
+ t.Logf("Downgrade migration output:\n%s", result.Stdout.String())
+
+ // Verify final version is 15
+ versionData, err = os.ReadFile(versionPath)
+ require.NoError(t, err)
+ require.Equal(t, "15", strings.TrimSpace(string(versionData)), "Version should be updated to 15")
+
+ // Verify config is still valid JSON and key fields preserved
+ var finalConfig map[string]interface{}
+ configData, err = os.ReadFile(configPath)
+ require.NoError(t, err)
+ require.NoError(t, json.Unmarshal(configData, &finalConfig), "Config should remain valid JSON")
+
+ // Verify essential fields preserved
+ finalPeerID := getNestedValue(finalConfig, "Identity.PeerID")
+ require.Equal(t, originalPeerID, finalPeerID, "Identity.PeerID should be preserved")
+
+ // Verify bootstrap exists (may be modified by migrations)
+ finalBootstrap := getNestedValue(finalConfig, "Bootstrap")
+ require.NotNil(t, finalBootstrap, "Bootstrap should exist after migration")
+
+ // AutoConf should be removed by the downgrade (was added in 16โ17)
+ autoConf := getNestedValue(finalConfig, "AutoConf")
+ require.Nil(t, autoConf, "AutoConf should be removed by downgrade to v15")
+}
diff --git a/test/cli/migrations/testdata/v15-repo/blocks/SHARDING b/test/cli/migrations/testdata/v15-repo/blocks/SHARDING
new file mode 100644
index 0000000000000000000000000000000000000000..a153331dacd3d8f279317140c1aae70078dc4e2d
GIT binary patch
literal 37
scmdNdN-fCOPs>RxNh{Vb&PXgu(JwR9&r7W+(Jjf>%}FdS(Kq4(006%X_5c6?
literal 0
HcmV?d00001
diff --git a/test/cli/migrations/testdata/v15-repo/blocks/X3/CIQFTFEEHEDF6KLBT32BFAGLXEZL4UWFNWM4LFTLMXQBCERZ6CMLX3Y.data b/test/cli/migrations/testdata/v15-repo/blocks/X3/CIQFTFEEHEDF6KLBT32BFAGLXEZL4UWFNWM4LFTLMXQBCERZ6CMLX3Y.data
new file mode 100644
index 0000000000000000000000000000000000000000..9553a942db2fd84174a40c28c83fddb9a9e2a122
GIT binary patch
literal 4
Lcmd;L;$Q>-07C#4
literal 0
HcmV?d00001
diff --git a/test/cli/migrations/testdata/v15-repo/blocks/_README b/test/cli/migrations/testdata/v15-repo/blocks/_README
new file mode 100644
index 0000000000000000000000000000000000000000..572e7e4d010db2b587abbebed3f5a8cafc1d64dc
GIT binary patch
literal 1123
zcmbVMO>fgc5WVlO81<4?B#!ESkqVH~d_af`A#SN!#9?i(5c>@S4z4nY{}#?sxzq*55=T`Q-+g(UkR7sHPWp`PXPUhMyxwG{jLOg&qhUm&s5olesU}Z!uHv#LH
zr9Z1j_5&d)*y*a|sjq_5IwJ&)lSzZTXd{Jf1L0<%kqwqtDs>WHF{WuYfU7OT)DB(Q
zf*a3_l}lN215PsvZ|L5_KN80{)AMSuU;r~C9;B{p`PhcFfC|gAdJJj@Pn2HMsc%7v
zjq5nwDY?a=*BVkR&Qm9h4HyG_sA>3wVOKiBp#7S8+!$DAaDNBz)5if2Rvi=x1?O)e
zY%X-3TjA)W6zUn^06H&nI&j#e7~v|TsKmEF*+>n+yxJ-A-N*l8Y^)844PUNMX~2dR6>mzPOLG
zO)s&F%Tr7%P+Bz_DtH&|qCcL_N0WXSj-$!&r2jFTUY}jh-yfe{4x{sb=rhJuhOMH;lC7e+tGkQ`-Tz1Srecg#4Xt?4LVU6usfjjD
zn^ETmG6UmNivm$e2OTY`5LaozX^K`{x
IAB2GY1}*t-oB#j-
literal 0
HcmV?d00001
diff --git a/test/cli/migrations/testdata/v15-repo/blocks/diskUsage.cache b/test/cli/migrations/testdata/v15-repo/blocks/diskUsage.cache
new file mode 100644
index 0000000000000000000000000000000000000000..15876dc11172ff902e3f67b10e87f47851cc6a49
GIT binary patch
literal 47
zcmbb+
zeC?Ws9XB>SX+9*=xb;+ZxmEX{-0I7weY>b#x30GLosBhlX3c4$C%4Ce-SR#1*sYLt
zC0_QT)BWfl4ZOVxms$^T6mk~eA`=Tf(GJhhNoG?S=Fut5u)9Va2L}{9!HHHy#Xjts
zI3UcGxAs{^mXDp>HaI-6i1H95zh%Y(yA(n38|a-q@q~%85X3&>dtuo2nDZ1W01x+ZKz9)9#?gWPy8omKRrlSuYEA^EbsCl!f7_SY5wdBY_!y#
z051C@0n9$qynIF|moa=2r{)KEOC+eNu?sf`zwA`YTplnABdAR7v*fW1&sUf^>;Nvq
zkT5D@qKxAAd1tVG9tj|u#p2-@du~|7q8jL{{LdVfGEeQ;-%nkE@Nb4x9+_;YG%kgY
zc7wwGEnQ$F8flBXP!(0{c#Ite#Dng&$cw0J1?iF1Q8M+L9erWEGX5eWUxWxkK8`r-TVSTvL%2?^F)et*FtPUsGlDl#F!foLTfd7dK38RmNiGn5MR
z%OfA+EN)^yvON;+3o=!;))v@dfjcEz%*jELQlSZ%7vnB+_E3TIEKL>XSw>P`S
zt}}aF;+J82Y-EA_53}>`s@8XA$M$hJFMuHTyt;_x`1MsYOGqZQ;+JvaMdq|?%U%RID+9P!d9sxH1+
zF3lTY(X^9aik
z1qM>1DfgBJ2F6kh-OX|~?FRvSKToC@6h{$AHdboZ`X`@-Sj}b1M8a@B5~=8mJo8i8
z0#N6~ib%J|J8vq`4x(;CT)u}%4~QcUon@S+V<2tFktKp~3)2WR3Or*_1d(O%|fH7HFO+2UK;gq9I}2;W-PEDAD<>}blI5{cZRcut=&
zst{zT=cmdXEu#Yxl&4+`Zk~}{fOz@_QqlBSLOq6DOJ*ai=1XpZv0zE9SUP6FVge&j
zBx3=Ua=eo}t2np7e(7You%HVejRO=EdBuHbAuQkA#ZD==!7A|npq)yVh7d41$bDEs
zPxZc8^KUr!A@Gxkv20s~PMkEWk9Ti<*exXF*$J^`$_75@$IK2*#=H;jDbtH~q`cV*
z!Pz95gsKk6dIcXC$Ex9FZx_WJ9pvLD@2f6x@1WvobxX{#qU1EN7ATow6w4>w2W593
e(I;8fl1jWB#s4Ezznld+qR_%LE#%u@Z~p;6#O1UA
literal 0
HcmV?d00001
diff --git a/test/cli/migrations/testdata/v15-repo/datastore/000001.log b/test/cli/migrations/testdata/v15-repo/datastore/000001.log
new file mode 100644
index 0000000000000000000000000000000000000000..9591b22ef40454795c04d8553082a73d056e6822
GIT binary patch
literal 1303
zcmd<}USgxjz{tn|0U(-DP`@BEuUNmhB(Wq_KP9uMq>_=bsXk|A1_L7#vN|n@I-p|x
zB-4~+BePT!!&IXr6ALpV3!`KMGha
z5QJ6gn&}jk;~8k`lw(m48D(zZn(yLM8se=RS{zoAn;agVXcUp|8suqe;gxA_Uansn
znH82DS>e2BV{6uw$U3XRxb_dz7O~u!ok}bA;<>CN2}8F=@s6fw`f6K0d_(j?T_i
zhGjk#fnnJZg@ry5ra^`g#wMnPg=rp1#c5{d8D);fetAL;a`UdGZM@kgXMQ4czx-#n
zZjT>{Wlqk!zaM{Yb)QrG+y7S`3qqHyX5Y8AGyR>+#;VvJ%_#F@!S#ks7u{ELuiMBb
z!Js5(WME{fYha;kU>ag%Y-M6@Wo)cxVq$1+Xkck#9Hqfv&~V^U>*EY32Z84|{Xgt#
z==i!gN>n|0_ts_Xb6Zy}%TV23RyxPkaK(X>v%2k2C`Vvzx(=1q`WSi8-aI5oGy2BRI9NG&L_dl_3LYN@hxC
zNo529ujIfKhEx`$GME^s?)}5a$c7x59{O&kp%IS8At7!ij?SLWj!w>=fxgDBj{cse
z5dp?V0b!AD!NG36VJ?wAkpX6orryrs=HVf3L7tI5Ud}##Zl>-o5x(9gflHXVbRY?X
zL4|`+Na5@RKKH!8FTWm4Rob-p(1-ubt3>x_PSZGaNp;I!gLg-ZghrD9>B*nsBme+@
CNw)L=
literal 0
HcmV?d00001
diff --git a/test/cli/migrations/testdata/v15-repo/datastore/CURRENT b/test/cli/migrations/testdata/v15-repo/datastore/CURRENT
new file mode 100644
index 0000000000000000000000000000000000000000..feda7d6b2481efc683caa30e9d8dfc8553b524a9
GIT binary patch
literal 16
TcmeZu^z(Fc4Gz&Y00S-nBbx)S
literal 0
HcmV?d00001
diff --git a/test/cli/migrations/testdata/v15-repo/datastore/LOCK b/test/cli/migrations/testdata/v15-repo/datastore/LOCK
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/test/cli/migrations/testdata/v15-repo/datastore/LOG b/test/cli/migrations/testdata/v15-repo/datastore/LOG
new file mode 100644
index 0000000000000000000000000000000000000000..74e0f5f6b71d66d677e8190941f62b5e2cf21f87
GIT binary patch
literal 437
zcmY+AO=`n15QXN)MC`o1qo)0Z}Pv8*8hlf>Ol#eh2l4L>br57$;*Kz|AI|P_$Q-&?_1~y9W58Z|`
zghENv3;KhwS2E|*aDtVRS=C(T>^x^o)L*bgCAWCWhd~UmR&qUvzQ-%LQ*wt#WbmqF
zf#2EyN+nC$Va}?4#O5wh3EuV;6>vzDAfP;Z`%ltCZg?HBo6H;=*AoC1;lsHf;AH(f~m8N
S8n`-MfSa0c>0R|ZF8%<8g^d^h
literal 0
HcmV?d00001
diff --git a/test/cli/migrations/testdata/v15-repo/datastore/MANIFEST-000000 b/test/cli/migrations/testdata/v15-repo/datastore/MANIFEST-000000
new file mode 100644
index 0000000000000000000000000000000000000000..9d54f6733b1364dc8d53dd15ca59a6ec36a1c29d
GIT binary patch
literal 54
zcmdmC5aOo9z{n_-lUkOVlai$8R9TW*o>`pgoS$2eSd>_jU&O?~%*ev9Y~pbaHU>r}
JMrI}!1^~s!4paaD
literal 0
HcmV?d00001
diff --git a/test/cli/migrations/testdata/v15-repo/datastore_spec b/test/cli/migrations/testdata/v15-repo/datastore_spec
new file mode 100644
index 0000000000000000000000000000000000000000..7bf9626c24e82cf86892ca78dde3361e9effc3bc
GIT binary patch
literal 190
zcmZ9GK?=e^3`OsfbxY7?58x%lMeL+hjFVxK7NyMH9b0I@U6TL)|5@OrQ*?vwx@=?8
zM|9`_@1p(Fpn*g_*2BKrNI6`l*#D@^NpTSJ!EhCDK4Ijyx2~;_Ii72Te-c-ERxNh{Vb&PXgu(JwR9&r7W+(Jjf>%}FdS(Kq4(006%X_5c6?
literal 0
HcmV?d00001
diff --git a/test/cli/migrations/testdata/v16-repo/blocks/X3/CIQFTFEEHEDF6KLBT32BFAGLXEZL4UWFNWM4LFTLMXQBCERZ6CMLX3Y.data b/test/cli/migrations/testdata/v16-repo/blocks/X3/CIQFTFEEHEDF6KLBT32BFAGLXEZL4UWFNWM4LFTLMXQBCERZ6CMLX3Y.data
new file mode 100644
index 0000000000000000000000000000000000000000..9553a942db2fd84174a40c28c83fddb9a9e2a122
GIT binary patch
literal 4
Lcmd;L;$Q>-07C#4
literal 0
HcmV?d00001
diff --git a/test/cli/migrations/testdata/v16-repo/blocks/_README b/test/cli/migrations/testdata/v16-repo/blocks/_README
new file mode 100644
index 0000000000000000000000000000000000000000..572e7e4d010db2b587abbebed3f5a8cafc1d64dc
GIT binary patch
literal 1123
zcmbVMO>fgc5WVlO81<4?B#!ESkqVH~d_af`A#SN!#9?i(5c>@S4z4nY{}#?sxzq*55=T`Q-+g(UkR7sHPWp`PXPUhMyxwG{jLOg&qhUm&s5olesU}Z!uHv#LH
zr9Z1j_5&d)*y*a|sjq_5IwJ&)lSzZTXd{Jf1L0<%kqwqtDs>WHF{WuYfU7OT)DB(Q
zf*a3_l}lN215PsvZ|L5_KN80{)AMSuU;r~C9;B{p`PhcFfC|gAdJJj@Pn2HMsc%7v
zjq5nwDY?a=*BVkR&Qm9h4HyG_sA>3wVOKiBp#7S8+!$DAaDNBz)5if2Rvi=x1?O)e
zY%X-3TjA)W6zUn^06H&nI&j#e7~v|TsKmEF*+>n+yxJ-A-N*l8Y^)844PUNMX~2dR6>mzPOLG
zO)s&F%Tr7%P+Bz_DtH&|qCcL_N0WXSj-$!&r2jFTUY}jh-yfe{4x{sb=rhJuhOMH;lC7e+tGkQ`-Tz1Srecg#4Xt?4LVU6usfjjD
zn^ETmG6UmNivm$e2OTY`5LaozX^K`{x
IAB2GY1}*t-oB#j-
literal 0
HcmV?d00001
diff --git a/test/cli/migrations/testdata/v16-repo/blocks/diskUsage.cache b/test/cli/migrations/testdata/v16-repo/blocks/diskUsage.cache
new file mode 100644
index 0000000000000000000000000000000000000000..15876dc11172ff902e3f67b10e87f47851cc6a49
GIT binary patch
literal 47
zcmb34w8ww7c6*
zC*horQV{@lk?^9W#p{a
zouIYdb^!V^fz1_3UgFL%0xoG~%jGlcJHw}%HS5vlD0Uj=B&O5WI$AV0Lpyu!?UL<&
zQV(&rzWz(&)_w?+S`RRgGD6`w5{G|+H8j9MMsq#v6y7P$u)6>Z(iqSUm$<)Hz7M+=
zq=*FaRam}BpkM0d24j+8mU7B>8L_}FM^OA$@DqYC6MA$nBK{^-%9Ka~SSXn9@+e#(
z>G&!FY?WRGWq`SxN=F(38VoWleA9Fa6Qbu2bji_oH66nP`^w1Ihy$e8FI`BF^5qId
zDZJ3jj){O$%asY7^FI>p{MU4`)%t&F1yl4gvuW6cwX7&DjGQ^UtDyG#w>3`t_Ckt1~~*uXDeY(^?y2
zUUa^&`@N(k3B>*G7BOuiG~u4&vJt-h3zOJ`)@3Sl&g`zm$rH+^~ny>%A_)SQgcy;S|0;1
zf+A;(W>6;lNBQ0+8AEu@nXh?5#tC<)%!Lh;%!^POo?Bm4sAfZ-&|rpEkfB)i#F>+l
zXa}n~uhs8LlN~}>$|y*^opqEXfzi=|V^arSUv)q82eayCu-BRn|-<1YL
zAJwjJu4;{%{C8KE6@GJlT~jE7ZqhS`yT^KGID*f8d)~+PLwgS!=ACo$=6vAByL9_7
z%XZo1S8B5$(WTmLhWxL5*yc(6U+RBf8zv^Cm$kgri!~tb^7&wxv&H;ja-@%Y<}KIF
zb;o#d;c3{Om|}FuAyMgP)u$uZwMKlpK`J{y_5EIM`M8nZs7M0!zSTcQ(vHHCzS
z6<+_4kQAzB&S%->n3d!0gE-61EGDm#6SFy=>OWaij&=YJ_9$SX0U1TU5W0vs561+|
zB9s}j->ZBZM&Q_u5Wlqe%Y6I@xCPmPbcf_bFX=7?n8QZpaglq-rA^58MBXWdASXJ|
zcIR2Dha$RdW42p)?3^0?I+;@mF5*jS4JTPWh5q$Hz0EXXBJ?Tit#?Uu5dAhWG
z23k|V^7})1(<6Hv5fC^sJfXGRn^OqIT-HRJvp
g!4|Cdj>|K2s&dDecOkA8Xa})$FGmy4!jDh?01{>ZYXATM
literal 0
HcmV?d00001
diff --git a/test/cli/migrations/testdata/v16-repo/datastore/000001.log b/test/cli/migrations/testdata/v16-repo/datastore/000001.log
new file mode 100644
index 0000000000000000000000000000000000000000..51686e36c6748fd7bc020ee18b5a1b0dac3b8f78
GIT binary patch
literal 1299
zcmd<}USgxjz{tn|0U(-DP`@BEuUNmhB(Wq_KP9uMq>_;nU|7Up${}I
z2*N6L&2);&@eDL|%CRVjj50TH&3ExB4e{0uEeS-f4e~U#@X9ndFV`>i
zGxE!c%!=@|i8SLs5%rv59G6VVXx$ahjQVMwz3rU!IVI>t;zE_sMrxOj|v#i~C6C
zi+sNn-r2V~E{JLW-1*`FYm3F_Ow|yj-7~e9teiYM^%mc$qKc=Nwsje|K3(zX(soN0
z2?ixuBLgE-T?2DnBhwH=b1Op&D?>9q3j;F)a}!ImC=CXKh7XfY-{o*}@G4sqwPFwd
zABL}v@ysp~UnCay&RW#$78lz&HT=>|zr@%C8Q#MyZdUHT`nOK;FJs7m%jn8~I?X)Q
zvMZ;`pUq|Q>SA1)91`Lq4Gccln<+aOQo|B+N>d}q@_I&aYGG+=UUDi!2GEqul+2RK
z2>d?DfvF3rEJ$To6Q9TZi;~oak_Ceb
z2cwWe(nTT3T7Mm@pK>YNO=hmv-k};jlg;fJ^S)Ud)HBk#GlWJH0Lf{e(gXkiqu#HU
literal 0
HcmV?d00001
diff --git a/test/cli/migrations/testdata/v16-repo/datastore/CURRENT b/test/cli/migrations/testdata/v16-repo/datastore/CURRENT
new file mode 100644
index 0000000000000000000000000000000000000000..feda7d6b2481efc683caa30e9d8dfc8553b524a9
GIT binary patch
literal 16
TcmeZu^z(Fc4Gz&Y00S-nBbx)S
literal 0
HcmV?d00001
diff --git a/test/cli/migrations/testdata/v16-repo/datastore/LOCK b/test/cli/migrations/testdata/v16-repo/datastore/LOCK
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/test/cli/migrations/testdata/v16-repo/datastore/LOG b/test/cli/migrations/testdata/v16-repo/datastore/LOG
new file mode 100644
index 0000000000000000000000000000000000000000..c19fc88e42c8602e05d0e86af5b4506a2a247c12
GIT binary patch
literal 438
zcmY+AQEP)R5P;wNEADZFQB2gR1wm}>U@e8AZ(|Qm4{?i$Q(Nf%*T{Q**-Tej&BNV=
ze0TSeFq|EDIdY)(6Htq~@UTwO>=9-}7%oV#BL0f7rALWNEa0+=I94c1*lKk+Hrtvb
zq*|Gr);|abtr9VGXIN_$=jDGLU+S34;tO`D)eg@|*U1hxT5USnws-~iTJ7wM+q==VVv`GV
zopdnUu>v#kGZ*zR>Ww^w=MkSn%)hNIr9h*2`66n&wCV4xZxhd9hAp`45loypj)2d|
P9k@*+){+H|{_Pik0OE~p
literal 0
HcmV?d00001
diff --git a/test/cli/migrations/testdata/v16-repo/datastore/MANIFEST-000000 b/test/cli/migrations/testdata/v16-repo/datastore/MANIFEST-000000
new file mode 100644
index 0000000000000000000000000000000000000000..9d54f6733b1364dc8d53dd15ca59a6ec36a1c29d
GIT binary patch
literal 54
zcmdmC5aOo9z{n_-lUkOVlai$8R9TW*o>`pgoS$2eSd>_jU&O?~%*ev9Y~pbaHU>r}
JMrI}!1^~s!4paaD
literal 0
HcmV?d00001
diff --git a/test/cli/migrations/testdata/v16-repo/datastore_spec b/test/cli/migrations/testdata/v16-repo/datastore_spec
new file mode 100644
index 0000000000000000000000000000000000000000..7bf9626c24e82cf86892ca78dde3361e9effc3bc
GIT binary patch
literal 190
zcmZ9GK?=e^3`OsfbxY7?58x%lMeL+hjFVxK7NyMH9b0I@U6TL)|5@OrQ*?vwx@=?8
zM|9`_@1p(Fpn*g_*2BKrNI6`l*#D@^NpTSJ!EhCDK4Ijyx2~;_Ii72Te-c-E/dev/null 2>&1
+
MIGRATION_START=7
IPFS_REPO_VER=$(<.ipfs/version)
@@ -22,6 +26,12 @@ gen_mock_migrations() {
j=$((i+1))
echo "#!/bin/bash" > bin/fs-repo-${i}-to-${j}
echo "echo fake applying ${i}-to-${j} repo migration" >> bin/fs-repo-${i}-to-${j}
+ # Update version file to the target version for hybrid migration system
+ echo "if [ \"\$1\" = \"-path\" ] && [ -n \"\$2\" ]; then" >> bin/fs-repo-${i}-to-${j}
+ echo " echo $j > \"\$2/version\"" >> bin/fs-repo-${i}-to-${j}
+ echo "elif [ -n \"\$IPFS_PATH\" ]; then" >> bin/fs-repo-${i}-to-${j}
+ echo " echo $j > \"\$IPFS_PATH/version\"" >> bin/fs-repo-${i}-to-${j}
+ echo "fi" >> bin/fs-repo-${i}-to-${j}
chmod +x bin/fs-repo-${i}-to-${j}
((i++))
done
@@ -54,34 +64,42 @@ test_expect_success "manually reset repo version to $MIGRATION_START" '
'
test_expect_success "ipfs daemon --migrate=false fails" '
- test_expect_code 1 ipfs daemon --migrate=false > false_out
+ test_expect_code 1 ipfs daemon --migrate=false > false_out 2>&1
'
test_expect_success "output looks good" '
- grep "Please get fs-repo-migrations from https://dist.ipfs.tech" false_out
+ grep "Kubo repository at .* has version .* and needs to be migrated to version" false_out &&
+ grep "Error: fs-repo requires migration" false_out
'
-# The migrations will succeed, but the daemon will still exit with 1 because
-# the fake migrations do not update the repo version number.
-#
-# If run with real migrations, the daemon continues running and must be killed.
+# The migrations will succeed and the daemon will continue running
+# since the mock migrations now properly update the repo version number.
test_expect_success "ipfs daemon --migrate=true runs migration" '
- test_expect_code 1 ipfs daemon --migrate=true > true_out
+ ipfs daemon --migrate=true > true_out 2>&1 &
+ DAEMON_PID=$!
+ # Wait for daemon to be ready then shutdown gracefully
+ sleep 3 && ipfs shutdown 2>/dev/null || kill $DAEMON_PID 2>/dev/null || true
+ wait $DAEMON_PID 2>/dev/null || true
'
test_expect_success "output looks good" '
check_migration_output true_out &&
- grep "Success: fs-repo migrated to version $IPFS_REPO_VER" true_out > /dev/null
+ (grep "Success: fs-repo migrated to version $IPFS_REPO_VER" true_out > /dev/null ||
+ grep "Hybrid migration completed successfully: v$MIGRATION_START โ v$IPFS_REPO_VER" true_out > /dev/null)
+'
+
+test_expect_success "reset repo version for auto-migration test" '
+ echo "$MIGRATION_START" > "$IPFS_PATH"/version
'
test_expect_success "'ipfs daemon' prompts to auto migrate" '
- test_expect_code 1 ipfs daemon > daemon_out 2> daemon_err
+ test_expect_code 1 ipfs daemon > daemon_out 2>&1
'
test_expect_success "output looks good" '
- grep "Found outdated fs-repo" daemon_out > /dev/null &&
+ grep "Kubo repository at .* has version .* and needs to be migrated to version" daemon_out > /dev/null &&
grep "Run migrations now?" daemon_out > /dev/null &&
- grep "Please get fs-repo-migrations from https://dist.ipfs.tech" daemon_out > /dev/null
+ grep "Error: fs-repo requires migration" daemon_out > /dev/null
'
test_expect_success "ipfs repo migrate succeed" '
@@ -89,8 +107,9 @@ test_expect_success "ipfs repo migrate succeed" '
'
test_expect_success "output looks good" '
- grep "Found outdated fs-repo, starting migration." migrate_out > /dev/null &&
- grep "Success: fs-repo migrated to version $IPFS_REPO_VER" true_out > /dev/null
+ grep "Migrating repository from version" migrate_out > /dev/null &&
+ (grep "Success: fs-repo migrated to version $IPFS_REPO_VER" migrate_out > /dev/null ||
+ grep "Hybrid migration completed successfully: v$MIGRATION_START โ v$IPFS_REPO_VER" migrate_out > /dev/null)
'
test_expect_success "manually reset repo version to latest" '
@@ -102,7 +121,7 @@ test_expect_success "detect repo does not need migration" '
'
test_expect_success "output looks good" '
- grep "Repo does not require migration" migrate_out > /dev/null
+ grep "Repository is already at version" migrate_out > /dev/null
'
# ensure that we get a lock error if we need to migrate and the daemon is running
diff --git a/test/sharness/t0120-bootstrap.sh b/test/sharness/t0120-bootstrap.sh
index 00141da1f..e4bbde78a 100755
--- a/test/sharness/t0120-bootstrap.sh
+++ b/test/sharness/t0120-bootstrap.sh
@@ -13,7 +13,10 @@ BP5="/dnsaddr/va1.bootstrap.libp2p.io/p2p/12D3KooWKnDdG3iXw9eTFijk3EWSunZcFi54Zk
BP6="/ip4/104.131.131.82/tcp/4001/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ"
BP7="/ip4/104.131.131.82/udp/4001/quic-v1/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ"
-test_description="Test ipfs repo operations"
+test_description="Test ipfs bootstrap operations"
+
+# NOTE: For AutoConf bootstrap functionality (add default, --expand-auto, etc.)
+# see test/cli/bootstrap_auto_test.go and test/cli/autoconf/expand_test.go
. lib/test-lib.sh
@@ -83,35 +86,12 @@ test_bootstrap_cmd() {
test_bootstrap_list_cmd $BP2
- test_expect_success "'ipfs bootstrap add --default' succeeds" '
- ipfs bootstrap add --default >add2_actual
- '
-
- test_expect_success "'ipfs bootstrap add --default' output has default BP" '
- echo "added $BP1" >add2_expected &&
- echo "added $BP2" >>add2_expected &&
- echo "added $BP3" >>add2_expected &&
- echo "added $BP4" >>add2_expected &&
- echo "added $BP5" >>add2_expected &&
- echo "added $BP6" >>add2_expected &&
- echo "added $BP7" >>add2_expected &&
- test_cmp add2_expected add2_actual
- '
-
- test_bootstrap_list_cmd $BP1 $BP2 $BP3 $BP4 $BP5 $BP6 $BP7
-
test_expect_success "'ipfs bootstrap rm --all' succeeds" '
ipfs bootstrap rm --all >rm2_actual
'
test_expect_success "'ipfs bootstrap rm' output looks good" '
- echo "removed $BP1" >rm2_expected &&
- echo "removed $BP2" >>rm2_expected &&
- echo "removed $BP3" >>rm2_expected &&
- echo "removed $BP4" >>rm2_expected &&
- echo "removed $BP5" >>rm2_expected &&
- echo "removed $BP6" >>rm2_expected &&
- echo "removed $BP7" >>rm2_expected &&
+ echo "removed $BP2" >rm2_expected &&
test_cmp rm2_expected rm2_actual
'
diff --git a/test/sharness/t0181-private-network.sh b/test/sharness/t0181-private-network.sh
index 5e566d317..efae18b15 100755
--- a/test/sharness/t0181-private-network.sh
+++ b/test/sharness/t0181-private-network.sh
@@ -10,6 +10,10 @@ test_description="Test private network feature"
test_init_ipfs
+test_expect_success "disable AutoConf for private network tests" '
+ ipfs config --json AutoConf.Enabled false
+'
+
export LIBP2P_FORCE_PNET=1
test_expect_success "daemon won't start with force pnet env but with no key" '
@@ -37,7 +41,8 @@ test_expect_success "set up iptb testbed" '
iptb testbed create -type localipfs -count 5 -force -init &&
iptb run -- ipfs config --json "Routing.LoopbackAddressesOnLanDHT" true &&
iptb run -- ipfs config --json "Swarm.Transports.Network.Websocket" false &&
- iptb run -- ipfs config --json Addresses.Swarm '"'"'["/ip4/127.0.0.1/tcp/0"]'"'"'
+ iptb run -- ipfs config --json Addresses.Swarm '"'"'["/ip4/127.0.0.1/tcp/0"]'"'"' &&
+ iptb run -- ipfs config --json AutoConf.Enabled false
'
set_key() {
@@ -136,4 +141,23 @@ test_expect_success "stop testbed" '
test_kill_ipfs_daemon
+# Test that AutoConf with default mainnet URL fails on private networks
+test_expect_success "setup test repo with AutoConf enabled and private network" '
+ export IPFS_PATH="$(pwd)/.ipfs-autoconf-test" &&
+ ipfs init --profile=test > /dev/null &&
+ ipfs config --json AutoConf.Enabled true &&
+ pnet_key > "${IPFS_PATH}/swarm.key"
+'
+
+test_expect_success "daemon fails with AutoConf + private network error" '
+ export IPFS_PATH="$(pwd)/.ipfs-autoconf-test" &&
+ test_expect_code 1 ipfs daemon > autoconf_stdout 2> autoconf_stderr
+'
+
+test_expect_success "error message mentions AutoConf and private network conflict" '
+ grep "AutoConf cannot use the default mainnet URL" autoconf_stderr > /dev/null &&
+ grep "private network.*swarm.key" autoconf_stderr > /dev/null &&
+ grep "AutoConf.Enabled=false" autoconf_stderr > /dev/null
+'
+
test_done
diff --git a/version.go b/version.go
index 9c9bafa03..20606a43c 100644
--- a/version.go
+++ b/version.go
@@ -3,8 +3,6 @@ package ipfs
import (
"fmt"
"runtime"
-
- "github.com/ipfs/kubo/repo/fsrepo"
)
// CurrentCommit is the current git commit, this is set as a ldflag in the Makefile.
@@ -15,6 +13,9 @@ const CurrentVersionNumber = "0.37.0-dev"
const ApiVersion = "/kubo/" + CurrentVersionNumber + "/" //nolint
+// RepoVersion is the version number that we are currently expecting to see.
+const RepoVersion = 17
+
// GetUserAgentVersion is the libp2p user agent used by go-ipfs.
//
// Note: This will end in `/` when no commit is available. This is expected.
@@ -47,7 +48,7 @@ func GetVersionInfo() *VersionInfo {
return &VersionInfo{
Version: CurrentVersionNumber,
Commit: CurrentCommit,
- Repo: fmt.Sprint(fsrepo.RepoVersion),
+ Repo: fmt.Sprint(RepoVersion),
System: runtime.GOARCH + "/" + runtime.GOOS, // TODO: Precise version here
Golang: runtime.Version(),
}
From c12d24949c4acfcfe53a2984cf6d67968f609132 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Thu, 21 Aug 2025 14:44:19 +0200
Subject: [PATCH 336/499] feat: optimize docker builds (#10925)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* feat(docker): optimize Dockerfile for faster builds
- add BuildKit syntax directive for advanced caching features
- implement cache mounts for Go modules and build cache
- reduce layers by combining RUN commands (5โ2 in final stage)
- optimize apt-get with --no-install-recommends flag
- use COPY --chmod to avoid separate permission fixing
Performance improvements:
- incremental builds after code changes: ~8.6x faster (1m51s โ 13s)
- go module/build cache persists between builds
- reduced layer count improves cache efficiency
* ci: optimize Docker builds with BuildKit caching
- enable BuildKit with GitHub Actions cache backend
- add Docker Hub registry cache for cross-workflow sharing
- move Docker login earlier to enable registry cache writes
- use dual cache strategy (gha + registry) for faster builds
expected improvements:
- PR builds can reuse main branch cache from Docker Hub
- rebuild after code changes ~5-10x faster with persistent cache
- cross-PR cache sharing reduces redundant builds
---
.github/workflows/docker-build.yml | 21 ++++++--
.github/workflows/docker-image.yml | 49 ++++++++----------
Dockerfile | 80 +++++++++++++-----------------
3 files changed, 74 insertions(+), 76 deletions(-)
diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml
index bd1a5cf41..24ece3fa4 100644
--- a/.github/workflows/docker-build.yml
+++ b/.github/workflows/docker-build.yml
@@ -27,8 +27,21 @@ jobs:
shell: bash
steps:
- uses: actions/checkout@v5
- - uses: actions/setup-go@v5
+
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v3
+
+ - name: Build Docker image with BuildKit
+ uses: docker/build-push-action@v6
with:
- go-version: 1.25.x
- - run: docker build -t $IMAGE_NAME:$WIP_IMAGE_TAG .
- - run: docker run --rm $IMAGE_NAME:$WIP_IMAGE_TAG --version
+ context: .
+ push: false
+ load: true
+ tags: ${{ env.IMAGE_NAME }}:${{ env.WIP_IMAGE_TAG }}
+ cache-from: |
+ type=gha
+ type=registry,ref=${{ env.IMAGE_NAME }}:buildcache
+ cache-to: type=gha,mode=max
+
+ - name: Test Docker image
+ run: docker run --rm $IMAGE_NAME:$WIP_IMAGE_TAG --version
diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml
index 8aa0dd77b..6d89c2980 100644
--- a/.github/workflows/docker-image.yml
+++ b/.github/workflows/docker-image.yml
@@ -46,13 +46,11 @@ jobs:
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- - name: Cache Docker layers
- uses: actions/cache@v4
+ - name: Log in to Docker Hub
+ uses: docker/login-action@v3
with:
- path: /tmp/.buildx-cache
- key: ${{ runner.os }}-buildx-${{ github.sha }}
- restore-keys: |
- ${{ runner.os }}-buildx-
+ username: ${{ vars.DOCKER_USERNAME }}
+ password: ${{ secrets.DOCKER_PASSWORD }}
- name: Get tags
id: tags
@@ -63,12 +61,6 @@ jobs:
echo "EOF" >> $GITHUB_OUTPUT
shell: bash
- - name: Log in to Docker Hub
- uses: docker/login-action@v3
- with:
- username: ${{ vars.DOCKER_USERNAME }}
- password: ${{ secrets.DOCKER_PASSWORD }}
-
# We have to build each platform separately because when using multi-arch
# builds, only one platform is being loaded into the cache. This would
# prevent us from testing the other platforms.
@@ -81,8 +73,10 @@ jobs:
load: true
file: ./Dockerfile
tags: ${{ env.IMAGE_NAME }}:linux-amd64
- cache-from: type=local,src=/tmp/.buildx-cache
- cache-to: type=local,dest=/tmp/.buildx-cache-new
+ cache-from: |
+ type=gha
+ type=registry,ref=${{ env.IMAGE_NAME }}:buildcache
+ cache-to: type=gha,mode=max
- name: Build Docker image (linux/arm/v7)
uses: docker/build-push-action@v6
@@ -93,8 +87,10 @@ jobs:
load: true
file: ./Dockerfile
tags: ${{ env.IMAGE_NAME }}:linux-arm-v7
- cache-from: type=local,src=/tmp/.buildx-cache
- cache-to: type=local,dest=/tmp/.buildx-cache-new
+ cache-from: |
+ type=gha
+ type=registry,ref=${{ env.IMAGE_NAME }}:buildcache
+ cache-to: type=gha,mode=max
- name: Build Docker image (linux/arm64/v8)
uses: docker/build-push-action@v6
@@ -105,8 +101,10 @@ jobs:
load: true
file: ./Dockerfile
tags: ${{ env.IMAGE_NAME }}:linux-arm64-v8
- cache-from: type=local,src=/tmp/.buildx-cache
- cache-to: type=local,dest=/tmp/.buildx-cache-new
+ cache-from: |
+ type=gha
+ type=registry,ref=${{ env.IMAGE_NAME }}:buildcache
+ cache-to: type=gha,mode=max
# We test all the images on amd64 host here. This uses QEMU to emulate
# the other platforms.
@@ -132,12 +130,9 @@ jobs:
push: true
file: ./Dockerfile
tags: "${{ github.event.inputs.tags || steps.tags.outputs.value }}"
- cache-from: type=local,src=/tmp/.buildx-cache-new
- cache-to: type=local,dest=/tmp/.buildx-cache-new
-
- # https://github.com/docker/build-push-action/issues/252
- # https://github.com/moby/buildkit/issues/1896
- - name: Move cache to limit growth
- run: |
- rm -rf /tmp/.buildx-cache
- mv /tmp/.buildx-cache-new /tmp/.buildx-cache
+ cache-from: |
+ type=gha
+ type=registry,ref=${{ env.IMAGE_NAME }}:buildcache
+ cache-to: |
+ type=gha,mode=max
+ type=registry,ref=${{ env.IMAGE_NAME }}:buildcache,mode=max
diff --git a/Dockerfile b/Dockerfile
index de66c7867..0db5f33b4 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,12 +1,15 @@
+# syntax=docker/dockerfile:1
+# Enables BuildKit with cache mounts for faster builds
FROM --platform=${BUILDPLATFORM:-linux/amd64} golang:1.25 AS builder
ARG TARGETOS TARGETARCH
ENV SRC_DIR=/kubo
-# Download packages first so they can be cached.
+# Cache go module downloads between builds for faster rebuilds
COPY go.mod go.sum $SRC_DIR/
-RUN cd $SRC_DIR \
+RUN --mount=type=cache,target=/go/pkg/mod \
+ cd $SRC_DIR \
&& go mod download
COPY . $SRC_DIR
@@ -18,92 +21,79 @@ ARG IPFS_PLUGINS
# Allow for other targets to be built, e.g.: docker build --build-arg MAKE_TARGET="nofuse"
ARG MAKE_TARGET=build
-# Build the thing.
-# Also: fix getting HEAD commit hash via git rev-parse.
-RUN cd $SRC_DIR \
+# Build ipfs binary with cached go modules and build cache.
+# mkdir .git/objects allows git rev-parse to read commit hash for version info
+RUN --mount=type=cache,target=/go/pkg/mod \
+ --mount=type=cache,target=/root/.cache/go-build \
+ cd $SRC_DIR \
&& mkdir -p .git/objects \
&& GOOS=$TARGETOS GOARCH=$TARGETARCH GOFLAGS=-buildvcs=false make ${MAKE_TARGET} IPFS_PLUGINS=$IPFS_PLUGINS
-# Using Debian Buster because the version of busybox we're using is based on it
-# and we want to make sure the libraries we're using are compatible. That's also
-# why we're running this for the target platform.
+# Extract required runtime tools from Debian.
+# We use Debian instead of Alpine because we need glibc compatibility
+# for the busybox base image we're using.
FROM debian:bookworm-slim AS utilities
RUN set -eux; \
apt-get update; \
- apt-get install -y \
+ apt-get install -y --no-install-recommends \
tini \
# Using gosu (~2MB) instead of su-exec (~20KB) because it's easier to
# install on Debian. Useful links:
# - https://github.com/ncopa/su-exec#why-reinvent-gosu
# - https://github.com/tianon/gosu/issues/52#issuecomment-441946745
gosu \
- # This installs fusermount which we later copy over to the target image.
+ # fusermount enables IPFS mount commands
fuse \
ca-certificates \
; \
- rm -rf /var/lib/apt/lists/*
+ apt-get clean; \
+ rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
-# Now comes the actual target image, which aims to be as small as possible.
+# Final minimal image with shell for debugging (busybox provides sh)
FROM busybox:stable-glibc
-# Get the ipfs binary, entrypoint script, and TLS CAs from the build container.
+# Copy ipfs binary, startup scripts, and runtime dependencies
ENV SRC_DIR=/kubo
COPY --from=utilities /usr/sbin/gosu /sbin/gosu
COPY --from=utilities /usr/bin/tini /sbin/tini
COPY --from=utilities /bin/fusermount /usr/local/bin/fusermount
COPY --from=utilities /etc/ssl/certs /etc/ssl/certs
COPY --from=builder $SRC_DIR/cmd/ipfs/ipfs /usr/local/bin/ipfs
-COPY --from=builder $SRC_DIR/bin/container_daemon /usr/local/bin/start_ipfs
+COPY --from=builder --chmod=755 $SRC_DIR/bin/container_daemon /usr/local/bin/start_ipfs
COPY --from=builder $SRC_DIR/bin/container_init_run /usr/local/bin/container_init_run
-# Add suid bit on fusermount so it will run properly
+# Set SUID for fusermount to enable FUSE mounting by non-root user
RUN chmod 4755 /usr/local/bin/fusermount
-# Fix permissions on start_ipfs (ignore the build machine's permissions)
-RUN chmod 0755 /usr/local/bin/start_ipfs
-
-# Swarm TCP; should be exposed to the public
-EXPOSE 4001
-# Swarm UDP; should be exposed to the public
-EXPOSE 4001/udp
-# Daemon API; must not be exposed publicly but to client services under you control
+# Swarm P2P port (TCP/UDP) - expose publicly for peer connections
+EXPOSE 4001 4001/udp
+# API port - keep private, only for trusted clients
EXPOSE 5001
-# Web Gateway; can be exposed publicly with a proxy, e.g. as https://ipfs.example.org
+# Gateway port - can be exposed publicly via reverse proxy
EXPOSE 8080
-# Swarm Websockets; must be exposed publicly when the node is listening using the websocket transport (/ipX/.../tcp/8081/ws).
+# Swarm WebSockets - expose publicly for browser-based peers
EXPOSE 8081
-# Create the fs-repo directory and switch to a non-privileged user.
+# Create ipfs user (uid 1000) and required directories with proper ownership
ENV IPFS_PATH=/data/ipfs
-RUN mkdir -p $IPFS_PATH \
+RUN mkdir -p $IPFS_PATH /ipfs /ipns /mfs /container-init.d \
&& adduser -D -h $IPFS_PATH -u 1000 -G users ipfs \
- && chown ipfs:users $IPFS_PATH
+ && chown ipfs:users $IPFS_PATH /ipfs /ipns /mfs /container-init.d
-# Create mount points for `ipfs mount` command
-RUN mkdir /ipfs /ipns /mfs \
- && chown ipfs:users /ipfs /ipns /mfs
-
-# Create the init scripts directory
-RUN mkdir /container-init.d \
- && chown ipfs:users /container-init.d
-
-# Expose the fs-repo as a volume.
-# start_ipfs initializes an fs-repo if none is mounted.
-# Important this happens after the USER directive so permissions are correct.
+# Volume for IPFS repository data persistence
VOLUME $IPFS_PATH
# The default logging level
ENV GOLOG_LOG_LEVEL=""
-# This just makes sure that:
-# 1. There's an fs-repo, and initializes one if there isn't.
-# 2. The API and Gateway are accessible from outside the container.
+# Entrypoint initializes IPFS repo if needed and configures networking.
+# tini ensures proper signal handling and zombie process cleanup
ENTRYPOINT ["/sbin/tini", "--", "/usr/local/bin/start_ipfs"]
-# Healthcheck for the container
-# QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn is the CID of empty folder
+# Health check verifies IPFS daemon is responsive.
+# Uses empty directory CID (QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn) as test
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD ipfs --api=/ip4/127.0.0.1/tcp/5001 dag stat /ipfs/QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn || exit 1
-# Execute the daemon subcommand by default
+# Default: run IPFS daemon with auto-migration enabled
CMD ["daemon", "--migrate=true", "--agent-version-suffix=docker"]
From 426477ef781e35491892a06050e287d0e76370ea Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Thu, 21 Aug 2025 14:57:30 +0200
Subject: [PATCH 337/499] docs: improve `ipfs add --help` (#10926)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* fix(cmds): improve ipfs add --help clarity and organization
- clarify --raw-leaves behavior with CIDv0/v1 defaults
- add Import.* config references to all relevant options
- replace deprecated 'ipfs object links' with 'ipfs ls' in examples
- add section headers for better navigation (BASIC EXAMPLES, MFS INTEGRATION, etc.)
- group related options logically (output control, CID & hashing, experimental features)
- standardize experimental warnings format
- add MerkleDAG docs link and clarify chunking behavior
- fix incorrect Import.UnixFSHAMTThreshold reference
addresses confusion from #10918 where --raw-leaves appeared to have no effect
because CIDv1 automatically enables it by default
* docs: fix typos in Import.* configuration documentation
- fix 'chilcren' โ 'children'
- fix 'HAMT directory have' โ 'HAMT directories have'
- fix 'A HAMT is an structure' โ 'A HAMT is a structure'
* Update core/commands/add.go
Co-authored-by: Daniel Norman <1992255+2color@users.noreply.github.com>
---------
Co-authored-by: Daniel Norman <1992255+2color@users.noreply.github.com>
---
core/commands/add.go | 69 ++++++++++++++++++++++++++++----------------
docs/config.md | 6 ++--
2 files changed, 47 insertions(+), 28 deletions(-)
diff --git a/core/commands/add.go b/core/commands/add.go
index f9e374b80..b24eab083 100644
--- a/core/commands/add.go
+++ b/core/commands/add.go
@@ -76,13 +76,15 @@ Adds the content of to IPFS. Use -r to add directories (recursively).
`,
LongDescription: `
Adds the content of to IPFS. Use -r to add directories.
-Note that directories are added recursively, to form the IPFS
-MerkleDAG.
+Note that directories are added recursively, and big files are chunked,
+to form the IPFS MerkleDAG. Learn more: https://docs.ipfs.tech/concepts/merkle-dag/
-If the daemon is not running, it will just add locally.
+If the daemon is not running, it will just add locally to the repo at $IPFS_PATH.
If the daemon is started later, it will be advertised after a few
seconds when the reprovider runs.
+BASIC EXAMPLES:
+
The wrap option, '-w', wraps the file (or files, if using the
recursive option) in a directory. This directory contains only
the files which have been added, and means that the file retains
@@ -101,6 +103,12 @@ You can now refer to the added file in a gateway, like so:
Files imported with 'ipfs add' are protected from GC (implicit '--pin=true'),
but it is up to you to remember the returned CID to get the data back later.
+If you need to back up or transport content-addressed data using a non-IPFS
+medium, CID can be preserved with CAR files.
+See 'dag export' and 'dag import' for more information.
+
+MFS INTEGRATION:
+
Passing '--to-files' creates a reference in Files API (MFS), making it easier
to find it in the future:
@@ -112,6 +120,8 @@ to find it in the future:
See 'ipfs files --help' to learn more about using MFS
for keeping track of added files and directories.
+CHUNKING EXAMPLES:
+
The chunker option, '-s', specifies the chunking strategy that dictates
how to break files into blocks. Blocks with same content can
be deduplicated. Different chunking strategies will produce different
@@ -132,14 +142,16 @@ want to use a 1024 times larger chunk sizes for most files.
You can now check what blocks have been created by:
- > ipfs object links QmafrLBfzRLV4XSH1XcaMMeaXEUhDJjmtDfsYU95TrWG87
+ > ipfs ls QmafrLBfzRLV4XSH1XcaMMeaXEUhDJjmtDfsYU95TrWG87
QmY6yj1GsermExDXoosVE3aSPxdMNYr6aKuw3nA8LoWPRS 2059
Qmf7ZQeSxq2fJVJbCmgTrLLVN9tDR9Wy5k75DxQKuz5Gyt 1195
- > ipfs object links Qmf1hDN65tR55Ubh2RN1FPxr69xq3giVBz1KApsresY8Gn
+ > ipfs ls Qmf1hDN65tR55Ubh2RN1FPxr69xq3giVBz1KApsresY8Gn
QmY6yj1GsermExDXoosVE3aSPxdMNYr6aKuw3nA8LoWPRS 2059
QmerURi9k4XzKCaaPbsK6BL5pMEjF7PGphjDvkkjDtsVf3 868
QmQB28iwSriSUSMqG2nXDTLtdPHgWb4rebBrU7Q1j4vxPv 338
+ADVANCED CONFIGURATION:
+
Finally, a note on hash (CID) determinism and 'ipfs add' command.
Almost all the flags provided by this command will change the final CID, and
@@ -147,12 +159,11 @@ new flags may be added in the future. It is not guaranteed for the implicit
defaults of 'ipfs add' to remain the same in future Kubo releases, or for other
IPFS software to use the same import parameters as Kubo.
+Note: CIDv1 is automatically used when using non-default options like custom
+hash functions or when raw-leaves is explicitly enabled.
+
Use Import.* configuration options to override global implicit defaults:
https://github.com/ipfs/kubo/blob/master/docs/config.md#import
-
-If you need to back up or transport content-addressed data using a non-IPFS
-medium, CID can be preserved with CAR files.
-See 'dag export' and 'dag import' for more information.
`,
},
@@ -160,37 +171,45 @@ See 'dag export' and 'dag import' for more information.
cmds.FileArg("path", true, true, "The path to a file to be added to IPFS.").EnableRecursive().EnableStdin(),
},
Options: []cmds.Option{
+ // Input Processing
cmds.OptionRecursivePath, // a builtin option that allows recursive paths (-r, --recursive)
cmds.OptionDerefArgs, // a builtin option that resolves passed in filesystem links (--dereference-args)
cmds.OptionStdinName, // a builtin option that optionally allows wrapping stdin into a named file
cmds.OptionHidden,
cmds.OptionIgnore,
cmds.OptionIgnoreRules,
+ // Output Control
cmds.BoolOption(quietOptionName, "q", "Write minimal output."),
cmds.BoolOption(quieterOptionName, "Q", "Write only final hash."),
cmds.BoolOption(silentOptionName, "Write no output."),
cmds.BoolOption(progressOptionName, "p", "Stream progress data."),
- cmds.BoolOption(trickleOptionName, "t", "Use trickle-dag format for dag generation."),
+ // Basic Add Behavior
cmds.BoolOption(onlyHashOptionName, "n", "Only chunk and hash - do not write to disk."),
cmds.BoolOption(wrapOptionName, "w", "Wrap files with a directory object."),
- cmds.StringOption(chunkerOptionName, "s", "Chunking algorithm, size-[bytes], rabin-[min]-[avg]-[max] or buzhash. Default: Import.UnixFSChunker"),
- cmds.BoolOption(rawLeavesOptionName, "Use raw blocks for leaf nodes. Default: Import.UnixFSRawLeaves"),
- cmds.IntOption(maxFileLinksOptionName, "Limit the maximum number of links in UnixFS file nodes to this value. (experimental) Default: Import.UnixFSFileMaxLinks"),
- cmds.IntOption(maxDirectoryLinksOptionName, "Limit the maximum number of links in UnixFS basic directory nodes to this value. Default: Import.UnixFSDirectoryMaxLinks. WARNING: experimental, Import.UnixFSHAMTThreshold is a safer alternative."),
- cmds.IntOption(maxHAMTFanoutOptionName, "Limit the maximum number of links of a UnixFS HAMT directory node to this (power of 2, multiple of 8). Default: Import.UnixFSHAMTDirectoryMaxFanout WARNING: experimental, see Import.UnixFSHAMTDirectorySizeThreshold as well."),
- cmds.BoolOption(noCopyOptionName, "Add the file using filestore. Implies raw-leaves. (experimental)"),
- cmds.BoolOption(fstoreCacheOptionName, "Check the filestore for pre-existing blocks. (experimental)"),
- cmds.IntOption(cidVersionOptionName, "CID version. Defaults to 0 unless an option that depends on CIDv1 is passed. Passing version 1 will cause the raw-leaves option to default to true. Default: Import.CidVersion"),
- cmds.StringOption(hashOptionName, "Hash function to use. Implies CIDv1 if not sha2-256. Default: Import.HashFunction"),
- cmds.BoolOption(inlineOptionName, "Inline small blocks into CIDs. (experimental)"),
- cmds.IntOption(inlineLimitOptionName, "Maximum block size to inline. (experimental)").WithDefault(32),
cmds.BoolOption(pinOptionName, "Pin locally to protect added files from garbage collection.").WithDefault(true),
cmds.StringOption(pinNameOptionName, "Name to use for the pin. Requires explicit value (e.g., --pin-name=myname)."),
+ // MFS Integration
cmds.StringOption(toFilesOptionName, "Add reference to Files API (MFS) at the provided path."),
- cmds.BoolOption(preserveModeOptionName, "Apply existing POSIX permissions to created UnixFS entries. Disables raw-leaves. (experimental)"),
- cmds.BoolOption(preserveMtimeOptionName, "Apply existing POSIX modification time to created UnixFS entries. Disables raw-leaves. (experimental)"),
- cmds.UintOption(modeOptionName, "Custom POSIX file mode to store in created UnixFS entries. Disables raw-leaves. (experimental)"),
- cmds.Int64Option(mtimeOptionName, "Custom POSIX modification time to store in created UnixFS entries (seconds before or after the Unix Epoch). Disables raw-leaves. (experimental)"),
+ // CID & Hashing
+ cmds.IntOption(cidVersionOptionName, "CID version (0 or 1). CIDv1 automatically enables raw-leaves and is required for non-sha2-256 hashes. Default: Import.CidVersion"),
+ cmds.StringOption(hashOptionName, "Hash function to use. Implies CIDv1 if not sha2-256. Default: Import.HashFunction"),
+ cmds.BoolOption(rawLeavesOptionName, "Use raw blocks for leaf nodes. Note: CIDv1 automatically enables raw-leaves. Default: false for CIDv0, true for CIDv1 (Import.UnixFSRawLeaves)"),
+ // Chunking & DAG Structure
+ cmds.StringOption(chunkerOptionName, "s", "Chunking algorithm, size-[bytes], rabin-[min]-[avg]-[max] or buzhash. Files larger than chunk size are split into multiple blocks. Default: Import.UnixFSChunker"),
+ cmds.BoolOption(trickleOptionName, "t", "Use trickle-dag format for dag generation."),
+ // Advanced UnixFS Limits
+ cmds.IntOption(maxFileLinksOptionName, "Limit the maximum number of links in UnixFS file nodes to this value. WARNING: experimental. Default: Import.UnixFSFileMaxLinks"),
+ cmds.IntOption(maxDirectoryLinksOptionName, "Limit the maximum number of links in UnixFS basic directory nodes to this value. WARNING: experimental, Import.UnixFSHAMTDirectorySizeThreshold is safer. Default: Import.UnixFSDirectoryMaxLinks"),
+ cmds.IntOption(maxHAMTFanoutOptionName, "Limit the maximum number of links of a UnixFS HAMT directory node to this (power of 2, multiple of 8). WARNING: experimental, Import.UnixFSHAMTDirectorySizeThreshold is safer. Default: Import.UnixFSHAMTDirectoryMaxFanout"),
+ // Experimental Features
+ cmds.BoolOption(inlineOptionName, "Inline small blocks into CIDs. WARNING: experimental"),
+ cmds.IntOption(inlineLimitOptionName, "Maximum block size to inline. WARNING: experimental").WithDefault(32),
+ cmds.BoolOption(noCopyOptionName, "Add the file using filestore. Implies raw-leaves. WARNING: experimental"),
+ cmds.BoolOption(fstoreCacheOptionName, "Check the filestore for pre-existing blocks. WARNING: experimental"),
+ cmds.BoolOption(preserveModeOptionName, "Apply existing POSIX permissions to created UnixFS entries. WARNING: experimental, forces dag-pb for root block, disables raw-leaves"),
+ cmds.BoolOption(preserveMtimeOptionName, "Apply existing POSIX modification time to created UnixFS entries. WARNING: experimental, forces dag-pb for root block, disables raw-leaves"),
+ cmds.UintOption(modeOptionName, "Custom POSIX file mode to store in created UnixFS entries. WARNING: experimental, forces dag-pb for root block, disables raw-leaves"),
+ cmds.Int64Option(mtimeOptionName, "Custom POSIX modification time to store in created UnixFS entries (seconds before or after the Unix Epoch). WARNING: experimental, forces dag-pb for root block, disables raw-leaves"),
cmds.UintOption(mtimeNsecsOptionName, "Custom POSIX modification time (optional time fraction in nanoseconds)"),
},
PreRun: func(req *cmds.Request, env cmds.Environment) error {
diff --git a/docs/config.md b/docs/config.md
index 73ac30c72..16a70b036 100644
--- a/docs/config.md
+++ b/docs/config.md
@@ -3194,7 +3194,7 @@ have when building the DAG while importing.
This setting controls both the fanout for basic, non-HAMT folder nodes. It
sets a limit after which directories are converted to a HAMT-based structure.
-When unset (0), no limit exists for chilcren. Directories will be converted to
+When unset (0), no limit exists for children. Directories will be converted to
HAMTs based on their estimated size only.
This setting will cause basic directories to be converted to HAMTs when they
@@ -3212,8 +3212,8 @@ Type: `optionalInteger`
The maximum number of children that a node part of a Unixfs HAMT directory
(aka sharded directory) can have.
-HAMT directory have unlimited children and are used when basic directories
-become too big or reach `MaxLinks`. A HAMT is an structure made of unixfs
+HAMT directories have unlimited children and are used when basic directories
+become too big or reach `MaxLinks`. A HAMT is a structure made of unixfs
nodes that store the list of elements in the folder. This option controls the
maximum number of children that the HAMT nodes can have.
From 846e219eadc8996cb3488a1dd64c531a1efe7642 Mon Sep 17 00:00:00 2001
From: Hector Sanjuan
Date: Thu, 21 Aug 2025 19:02:29 +0200
Subject: [PATCH 338/499] feat: Reprovider.Strategy: rename "flat" to "all"
(#10928)
* Reprovider strategy: rename "flat" to "all".
Value "flat" now parses to "all". Behaviour from "all" removed.
Fixes #10864 which has detailed explanation.
* core/node/provider.go: remove unused function mfsRootProvider
It was used in the "all" strategy.
* docs: improve reprovider.strategy=all changelog framing
- highlight memory efficiency improvements
- clarify this removes v0.28 workaround
- update config.md memory requirements
- fix announce-on profile typo
* feat: deprecate Reprovider.Strategy=flat
- add deprecation warning in daemon.go when flat strategy is detected
- document that flat is deprecated in ParseReproviderStrategy comment
- add explicit test case for flat -> all mapping
- flat continues to work but users are warned to migrate to all
---------
Co-authored-by: Marcin Rataj
---
cmd/ipfs/kubo/daemon.go | 4 ++++
config/reprovider.go | 13 +++++--------
config/reprovider_test.go | 27 +++++++++++++++++++++++++++
core/coreapi/unixfs.go | 2 +-
core/node/provider.go | 35 ++---------------------------------
core/node/storage.go | 5 ++---
docs/changelogs/v0.37.md | 12 +++++++++++-
docs/config.md | 7 ++-----
test/cli/provider_test.go | 30 ------------------------------
9 files changed, 54 insertions(+), 81 deletions(-)
create mode 100644 config/reprovider_test.go
diff --git a/cmd/ipfs/kubo/daemon.go b/cmd/ipfs/kubo/daemon.go
index 916735840..6c594912d 100644
--- a/cmd/ipfs/kubo/daemon.go
+++ b/cmd/ipfs/kubo/daemon.go
@@ -479,6 +479,10 @@ func daemonFunc(req *cmds.Request, re cmds.ResponseEmitter, env cmds.Environment
if cfg.Provider.Strategy.WithDefault("") != "" && cfg.Reprovider.Strategy.IsDefault() {
log.Fatal("Invalid config. Remove unused Provider.Strategy and set Reprovider.Strategy instead. Documentation: https://github.com/ipfs/kubo/blob/master/docs/config.md#reproviderstrategy")
}
+ // Check for deprecated "flat" strategy
+ if cfg.Reprovider.Strategy.WithDefault("") == "flat" {
+ log.Error("Reprovider.Strategy='flat' is deprecated and will be removed in the next release. Please update your config to use 'all' instead.")
+ }
if cfg.Experimental.StrategicProviding {
log.Error("Experimental.StrategicProviding was removed. Remove it from your config and set Provider.Enabled=false to remove this message. Documentation: https://github.com/ipfs/kubo/blob/master/docs/experimental-features.md#strategic-providing")
cfg.Experimental.StrategicProviding = false
diff --git a/config/reprovider.go b/config/reprovider.go
index c02b64e85..e7d687360 100644
--- a/config/reprovider.go
+++ b/config/reprovider.go
@@ -13,11 +13,10 @@ const (
type ReproviderStrategy int
const (
- ReproviderStrategyAll ReproviderStrategy = 1 << iota // 1 (0b00001)
- ReproviderStrategyFlat // 2 (0b00010)
- ReproviderStrategyPinned // 4 (0b00100)
- ReproviderStrategyRoots // 8 (0b01000)
- ReproviderStrategyMFS // 16 (0b10000)
+ ReproviderStrategyAll ReproviderStrategy = 1 << iota
+ ReproviderStrategyPinned
+ ReproviderStrategyRoots
+ ReproviderStrategyMFS
)
// Reprovider configuration describes how CID from local datastore are periodically re-announced to routing systems.
@@ -31,10 +30,8 @@ func ParseReproviderStrategy(s string) ReproviderStrategy {
var strategy ReproviderStrategy
for _, part := range strings.Split(s, "+") {
switch part {
- case "all", "": // special case, does not mix with others
+ case "all", "flat", "": // special case, does not mix with others ("flat" is deprecated, maps to "all")
return ReproviderStrategyAll
- case "flat":
- strategy |= ReproviderStrategyFlat
case "pinned":
strategy |= ReproviderStrategyPinned
case "roots":
diff --git a/config/reprovider_test.go b/config/reprovider_test.go
new file mode 100644
index 000000000..20b338eb0
--- /dev/null
+++ b/config/reprovider_test.go
@@ -0,0 +1,27 @@
+package config
+
+import "testing"
+
+func TestParseReproviderStrategy(t *testing.T) {
+ tests := []struct {
+ input string
+ expect ReproviderStrategy
+ }{
+ {"all", ReproviderStrategyAll},
+ {"pinned", ReproviderStrategyPinned},
+ {"mfs", ReproviderStrategyMFS},
+ {"pinned+mfs", ReproviderStrategyPinned | ReproviderStrategyMFS},
+ {"invalid", 0},
+ {"all+invalid", ReproviderStrategyAll},
+ {"", ReproviderStrategyAll},
+ {"flat", ReproviderStrategyAll}, // deprecated, maps to "all"
+ {"flat+all", ReproviderStrategyAll},
+ }
+
+ for _, tt := range tests {
+ result := ParseReproviderStrategy(tt.input)
+ if result != tt.expect {
+ t.Errorf("ParseReproviderStrategy(%q) = %d, want %d", tt.input, result, tt.expect)
+ }
+ }
+}
diff --git a/core/coreapi/unixfs.go b/core/coreapi/unixfs.go
index b0206e7b9..de03b6099 100644
--- a/core/coreapi/unixfs.go
+++ b/core/coreapi/unixfs.go
@@ -108,7 +108,7 @@ func (api *UnixfsAPI) Add(ctx context.Context, files files.Node, opts ...options
// wrap the DAGService in a providingDAG service which provides every block written.
// note about strategies:
- // - "all"/"flat" gets handled directly at the blockstore so no need to provide
+ // - "all" gets handled directly at the blockstore so no need to provide
// - "roots" gets handled in the pinner
// - "mfs" gets handled in mfs
// We need to provide the "pinned" cases only. Added blocks are not
diff --git a/core/node/provider.go b/core/node/provider.go
index 5858c11dc..17a312f98 100644
--- a/core/node/provider.go
+++ b/core/node/provider.go
@@ -184,19 +184,6 @@ func mfsProvider(mfsRoot *mfs.Root, fetcher fetcher.Factory) provider.KeyChanFun
}
}
-func mfsRootProvider(mfsRoot *mfs.Root) provider.KeyChanFunc {
- return func(ctx context.Context) (<-chan cid.Cid, error) {
- rootNode, err := mfsRoot.GetDirectory().GetNode()
- if err != nil {
- return nil, fmt.Errorf("error loading mfs root, cannot provide MFS: %w", err)
- }
- ch := make(chan cid.Cid, 1)
- ch <- rootNode.Cid()
- close(ch)
- return ch, nil
- }
-}
-
type provStrategyIn struct {
fx.In
Pinner pin.Pinner
@@ -219,8 +206,7 @@ type provStrategyOut struct {
// - "roots": Only root CIDs of pinned content
// - "pinned": All pinned content (roots + children)
// - "mfs": Only MFS content
-// - "flat": All blocks, no prioritization
-// - "all": Prioritized: pins first, then MFS roots, then all blocks
+// - "all": all blocks
func createKeyProvider(strategyFlag config.ReproviderStrategy, in provStrategyIn) provider.KeyChanFunc {
switch strategyFlag {
case config.ReproviderStrategyRoots:
@@ -234,28 +220,11 @@ func createKeyProvider(strategyFlag config.ReproviderStrategy, in provStrategyIn
)
case config.ReproviderStrategyMFS:
return mfsProvider(in.MFSRoot, in.OfflineUnixFSFetcher)
- case config.ReproviderStrategyFlat:
+ default: // "all", "", "flat" (compat)
return in.Blockstore.AllKeysChan
- default: // "all", ""
- return createAllStrategyProvider(in)
}
}
-// createAllStrategyProvider creates the complex "all" strategy provider.
-// This implements a three-tier priority system:
-// 1. Root blocks of direct and recursive pins (highest priority)
-// 2. MFS root (medium priority)
-// 3. All other blocks in blockstore (lowest priority)
-func createAllStrategyProvider(in provStrategyIn) provider.KeyChanFunc {
- return provider.NewPrioritizedProvider(
- provider.NewPrioritizedProvider(
- provider.NewBufferedProvider(dspinner.NewPinnedProvider(true, in.Pinner, in.OfflineIPLDFetcher)),
- mfsRootProvider(in.MFSRoot),
- ),
- in.Blockstore.AllKeysChan,
- )
-}
-
// detectStrategyChange checks if the reproviding strategy has changed from what's persisted.
// Returns: (previousStrategy, hasChanged, error)
func detectStrategyChange(ctx context.Context, strategy string, ds datastore.Datastore) (string, bool, error) {
diff --git a/core/node/storage.go b/core/node/storage.go
index d31ab15dc..b4ffb2587 100644
--- a/core/node/storage.go
+++ b/core/node/storage.go
@@ -39,13 +39,12 @@ func BaseBlockstoreCtor(
opts := []blockstore.Option{blockstore.WriteThrough(writeThrough)}
// Blockstore providing integration:
- // When strategy includes "all" or "flat", the blockstore directly provides blocks as they're Put.
+ // When strategy includes "all" the blockstore directly provides blocks as they're Put.
// Important: Provide calls from blockstore are intentionally BLOCKING.
// The Provider implementation (not the blockstore) should handle concurrency/queuing.
// This avoids spawning unbounded goroutines for concurrent block additions.
strategyFlag := config.ParseReproviderStrategy(providingStrategy)
- shouldProvide := config.ReproviderStrategyAll | config.ReproviderStrategyFlat
- if strategyFlag&shouldProvide != 0 {
+ if strategyFlag&config.ReproviderStrategyAll != 0 {
opts = append(opts, blockstore.Provider(prov))
}
diff --git a/docs/changelogs/v0.37.md b/docs/changelogs/v0.37.md
index 196d9b646..e79b9e564 100644
--- a/docs/changelogs/v0.37.md
+++ b/docs/changelogs/v0.37.md
@@ -19,6 +19,7 @@ This release was brought to you by the [Shipyard](https://ipshipyard.com/) team.
- [๐ Named pins in `ipfs add` command](#-named-pins-in-ipfs-add-command)
- [Custom sequence numbers in `ipfs name publish`](#custom-sequence-numbers-in-ipfs-name-publish)
- [โ๏ธ `Reprovider.Strategy` is now consistently respected](#-reprovider-strategy-is-now-consistently-respected)
+ - [โ๏ธ `Reprovider.Strategy=all`: improved memory efficiency](#-reproviderstrategyall-improved-memory-efficiency)
- [Removed unnecessary dependencies](#removed-unnecessary-dependencies)
- [Improved `ipfs cid`](#improved-ipfs-cid)
- [Deprecated `ipfs stats reprovide`](#deprecated-ipfs-stats-reprovide)
@@ -151,7 +152,7 @@ $ ipfs pin ls --names
bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi recursive testname
```
-#### โ๏ธ `Reprovider.Strategy` is now consistently respected
+#### โ๏ธ `Reprovider.Strategy` is now consistently respected.
Prior to this version, files added, blocks received etc. were "provided" to the network (announced on the DHT) regardless of the ["reproviding strategy" setting](https://github.com/ipfs/kubo/blob/master/docs/config.md#reproviderstrategy). For example:
@@ -165,6 +166,15 @@ This was inefficient as content that should not be provided was getting provided
> [!NOTE]
> **Behavior change:** The `--offline` flag no longer affects providing behavior. Both `ipfs add` and `ipfs --offline add` now provide blocks according to the reproviding strategy when run against an online daemon (previously `--offline add` did not provide). Since `ipfs add` has been nearly as fast as offline mode [since v0.35](https://github.com/ipfs/kubo/blob/master/docs/changelogs/v0.35.md#fast-ipfs-add-in-online-mode), `--offline` is rarely needed. To run truly offline operations, use `ipfs --offline daemon`.
+#### โ๏ธ `Reprovider.Strategy=all`: improved memory efficiency
+
+The memory cost of `Reprovider.Strategy=all` no longer grows with the number of pins. The strategy now processes blocks directly from the datastore in undefined order, eliminating the memory pressure tied to the number of pins.
+
+As part of this improvement, the `flat` reprovider strategy has been renamed to `all` (the default). This cleanup removes the workaround introduced in v0.28 for pin root prioritization. With the introduction of more granular strategies like [`pinned+mfs`](https://github.com/ipfs/kubo/blob/master/docs/config.md#reproviderstrategy), we can now optimize the default `all` strategy for lower memory usage without compromising users who need pin root prioritization ([rationale](https://github.com/ipfs/kubo/pull/10928#issuecomment-3211040182)).
+
+> [!NOTE]
+> **Migration guidance:** If you experience undesired announcement delays of root CIDs with the new `all` strategy, switch to `pinned+mfs` for root prioritization.
+
#### Removed unnecessary dependencies
Kubo has been cleaned up by removing unnecessary dependencies and packages:
diff --git a/docs/config.md b/docs/config.md
index 16a70b036..6c3106b81 100644
--- a/docs/config.md
+++ b/docs/config.md
@@ -2063,7 +2063,6 @@ Type: `optionalDuration` (unset for the default)
Tells reprovider what should be announced. Valid strategies are:
- `"all"` - announce all CIDs of stored blocks
- - Order: root blocks of direct and recursive pins and MFS root are announced first, then the rest of blockstore
- `"pinned"` - only announce recursively pinned CIDs (`ipfs pin add -r`, both roots and child blocks)
- Order: root blocks of direct and recursive pins are announced first, then the child blocks of recursive pins
- `"roots"` - only announce the root block of explicitly pinned CIDs (`ipfs pin add`)
@@ -2079,15 +2078,13 @@ Tells reprovider what should be announced. Valid strategies are:
- `"pinned+mfs"` - a combination of the `pinned` and `mfs` strategies.
- **โน๏ธ NOTE:** This is the suggested strategy for users who run without GC and don't want to provide everything in cache.
- Order: first `pinned` and then the locally available part of `mfs`.
-- `"flat"` - same as `all`, announce all CIDs of stored blocks, but without prioritizing anything.
**Strategy changes automatically clear the provide queue.** When you change `Reprovider.Strategy` and restart Kubo, the provide queue is automatically cleared to ensure only content matching your new strategy is announced. You can also manually clear the queue using `ipfs provide clear`.
**Memory requirements:**
-- Reproviding larger pinsets using the `all`, `mfs`, `pinned`, `pinned+mfs` or `roots` strategies requires additional memory, with an estimated ~1 GiB of RAM per 20 million items for reproviding to the Amino DHT.
+- Reproviding larger pinsets using the `mfs`, `pinned`, `pinned+mfs` or `roots` strategies requires additional memory, with an estimated ~1 GiB of RAM per 20 million items for reproviding to the Amino DHT.
- This is due to the use of a buffered provider, which avoids holding a lock on the entire pinset during the reprovide cycle.
-- The `flat` strategy can be used to lower memory requirements, but only recommended if memory utilization is too high, prioritization of pins is not necessary, and it is acceptable to announce every block cached in the local repository.
Default: `"all"`
@@ -3446,7 +3443,7 @@ Disables [Reprovider](#reprovider) system (and announcing to Amino DHT).
### `announce-on` profile
-(Re-)enables [Reprovider](#reprovider) system (reverts [`announce-off` profile](#annouce-off-profile).
+(Re-)enables [Reprovider](#reprovider) system (reverts [`announce-off` profile](#announce-off-profile)).
### `legacy-cid-v0` profile
diff --git a/test/cli/provider_test.go b/test/cli/provider_test.go
index 7820fb356..f0d04e1d2 100644
--- a/test/cli/provider_test.go
+++ b/test/cli/provider_test.go
@@ -187,18 +187,6 @@ func TestProvider(t *testing.T) {
expectProviders(t, cid, nodes[0].PeerID().String(), nodes[1:]...)
})
- t.Run("Provide with 'flat' strategy", func(t *testing.T) {
- t.Parallel()
-
- nodes := initNodes(t, 2, func(n *harness.Node) {
- n.SetIPFSConfig("Reprovider.Strategy", "flat")
- })
- defer nodes.StopDaemons()
-
- cid := nodes[0].IPFSAddStr("flat strategy")
- expectProviders(t, cid, nodes[0].PeerID().String(), nodes[1:]...)
- })
-
t.Run("Provide with 'pinned' strategy", func(t *testing.T) {
t.Parallel()
@@ -308,24 +296,6 @@ func TestProvider(t *testing.T) {
expectProviders(t, cid, nodes[0].PeerID().String(), nodes[1:]...)
})
- t.Run("Reprovides with 'flat' strategy", func(t *testing.T) {
- t.Parallel()
-
- nodes := initNodesWithoutStart(t, 2, func(n *harness.Node) {
- n.SetIPFSConfig("Reprovider.Strategy", "flat")
- })
-
- cid := nodes[0].IPFSAddStr(time.Now().String())
-
- nodes = nodes.StartDaemons().Connect()
- defer nodes.StopDaemons()
- expectNoProviders(t, cid, nodes[1:]...)
-
- nodes[0].IPFS("routing", "reprovide")
-
- expectProviders(t, cid, nodes[0].PeerID().String(), nodes[1:]...)
- })
-
t.Run("Reprovides with 'pinned' strategy", func(t *testing.T) {
t.Parallel()
From 255bc882cdd61243accadd0fc69bc410384ebda9 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Thu, 21 Aug 2025 19:50:48 +0200
Subject: [PATCH 339/499] chore: v0.37.0-rc1
---
version.go | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/version.go b/version.go
index 20606a43c..c0f842805 100644
--- a/version.go
+++ b/version.go
@@ -9,7 +9,7 @@ import (
var CurrentCommit string
// CurrentVersionNumber is the current application's version literal.
-const CurrentVersionNumber = "0.37.0-dev"
+const CurrentVersionNumber = "0.37.0-rc1"
const ApiVersion = "/kubo/" + CurrentVersionNumber + "/" //nolint
From dd3f59db5a6a4f2039b5d25306407dae84f4a735 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Thu, 21 Aug 2025 19:51:25 +0200
Subject: [PATCH 340/499] chore: 0.38.0-dev
---
version.go | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/version.go b/version.go
index 20606a43c..5fa695f59 100644
--- a/version.go
+++ b/version.go
@@ -9,7 +9,7 @@ import (
var CurrentCommit string
// CurrentVersionNumber is the current application's version literal.
-const CurrentVersionNumber = "0.37.0-dev"
+const CurrentVersionNumber = "0.38.0-dev"
const ApiVersion = "/kubo/" + CurrentVersionNumber + "/" //nolint
From ae068a806181dc09d4d679ba8d3c6e5f3547afac Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Fri, 22 Aug 2025 13:57:35 -0700
Subject: [PATCH 341/499] fix: harness tests random panic (#10933)
* fix: harness tests random panic
Connecting nodes in parallel can cause TLS handshake failures. For each node, connect to the other nodes serially. It is not necessary to connect in parallel as it does not save any significant time.
Closes #10932
---
test/cli/harness/nodes.go | 26 ++++++++------------------
1 file changed, 8 insertions(+), 18 deletions(-)
diff --git a/test/cli/harness/nodes.go b/test/cli/harness/nodes.go
index 113289e3c..8a5451e03 100644
--- a/test/cli/harness/nodes.go
+++ b/test/cli/harness/nodes.go
@@ -5,7 +5,6 @@ import (
. "github.com/ipfs/kubo/test/cli/testutils"
"github.com/multiformats/go-multiaddr"
- "golang.org/x/sync/errgroup"
)
// Nodes is a collection of Kubo nodes along with operations on groups of nodes.
@@ -17,37 +16,28 @@ func (n Nodes) Init(args ...string) Nodes {
}
func (n Nodes) ForEachPar(f func(*Node)) {
- group := &errgroup.Group{}
+ var wg sync.WaitGroup
for _, node := range n {
+ wg.Add(1)
node := node
- group.Go(func() error {
+ go func() {
+ defer wg.Done()
f(node)
- return nil
- })
- }
- err := group.Wait()
- if err != nil {
- panic(err)
+ }()
}
+ wg.Wait()
}
func (n Nodes) Connect() Nodes {
- wg := sync.WaitGroup{}
for i, node := range n {
for j, otherNode := range n {
if i == j {
continue
}
- node := node
- otherNode := otherNode
- wg.Add(1)
- go func() {
- defer wg.Done()
- node.Connect(otherNode)
- }()
+ // Do not connect in parallel, because that can cause TLS handshake problems on some platforms.
+ node.Connect(otherNode)
}
}
- wg.Wait()
for _, node := range n {
firstPeer := node.Peers()[0]
if _, err := firstPeer.ValueForProtocol(multiaddr.P_P2P); err != nil {
From 15f723a15e7c79f12857f52e652ffecb6d043e4d Mon Sep 17 00:00:00 2001
From: Hector Sanjuan
Date: Sun, 24 Aug 2025 14:30:35 +0200
Subject: [PATCH 342/499] fix: disable telemetry in test profile (#10931)
* Tests: disable telemetry in tests by default
Disable the plugin in cli tests and sharness by default. Enable only in
telemetry tests.
There are cases when tests get stuck or get killed and leave daemons hanging around. We don't want to be getting telemetry from those.
* sharness: attempt to fix
* sharness: add missing --bool flag
* fix(ci): add omitempty to Plugin.Config field
The sharness problem is that when the telemetry plugin is configured
initially with 'ipfs config --bool', it creates a structure without
the 'Config: null' field, but when the config is copied and replaced,
it expects the structure to be preserved.
Adding omitempty ensures the Config field is omitted from JSON when
nil, making the config structure consistent between initial creation
and replacement operations.
---------
Co-authored-by: Marcin Rataj
---
config/plugins.go | 2 +-
test/cli/harness/node.go | 8 ++++++++
test/cli/telemetry_test.go | 5 +++++
test/sharness/lib/test-lib.sh | 8 ++++++++
4 files changed, 22 insertions(+), 1 deletion(-)
diff --git a/config/plugins.go b/config/plugins.go
index 08a1acb34..0c438cbd7 100644
--- a/config/plugins.go
+++ b/config/plugins.go
@@ -7,5 +7,5 @@ type Plugins struct {
type Plugin struct {
Disabled bool
- Config interface{}
+ Config interface{} `json:",omitempty"`
}
diff --git a/test/cli/harness/node.go b/test/cli/harness/node.go
index 6403a2f1a..0315e81df 100644
--- a/test/cli/harness/node.go
+++ b/test/cli/harness/node.go
@@ -245,6 +245,14 @@ func (n *Node) Init(ipfsArgs ...string) *Node {
cfg.Swarm.DisableNatPortMap = true
cfg.Discovery.MDNS.Enabled = n.EnableMDNS
cfg.Routing.LoopbackAddressesOnLanDHT = config.True
+ // Telemetry disabled by default in tests.
+ cfg.Plugins = config.Plugins{
+ Plugins: map[string]config.Plugin{
+ "telemetry": config.Plugin{
+ Disabled: true,
+ },
+ },
+ }
})
return n
}
diff --git a/test/cli/telemetry_test.go b/test/cli/telemetry_test.go
index 455ea7df1..69b87e80d 100644
--- a/test/cli/telemetry_test.go
+++ b/test/cli/telemetry_test.go
@@ -25,6 +25,7 @@ func TestTelemetry(t *testing.T) {
// Create a new node
node := harness.NewT(t).NewNode().Init()
+ node.SetIPFSConfig("Plugins.Plugins.telemetry.Disabled", false)
// Set the opt-out environment variable
node.Runner.Env["IPFS_TELEMETRY"] = "off"
@@ -64,6 +65,7 @@ func TestTelemetry(t *testing.T) {
// Create a new node
node := harness.NewT(t).NewNode().Init()
+ node.SetIPFSConfig("Plugins.Plugins.telemetry.Disabled", false)
// Set opt-out via config
node.IPFS("config", "Plugins.Plugins.telemetry.Config.Mode", "off")
@@ -106,6 +108,7 @@ func TestTelemetry(t *testing.T) {
// Create a new node
node := harness.NewT(t).NewNode().Init()
+ node.SetIPFSConfig("Plugins.Plugins.telemetry.Disabled", false)
// Create a UUID file manually to simulate previous telemetry run
uuidPath := filepath.Join(node.Dir, "telemetry_uuid")
@@ -154,6 +157,7 @@ func TestTelemetry(t *testing.T) {
// Create a new node
node := harness.NewT(t).NewNode().Init()
+ node.SetIPFSConfig("Plugins.Plugins.telemetry.Disabled", false)
// Capture daemon output
stdout := &harness.Buffer{}
@@ -255,6 +259,7 @@ func TestTelemetry(t *testing.T) {
// Create a new node
node := harness.NewT(t).NewNode().Init()
+ node.SetIPFSConfig("Plugins.Plugins.telemetry.Disabled", false)
// Configure telemetry with a very short delay for testing
node.IPFS("config", "Plugins.Plugins.telemetry.Config.Delay", "100ms")
diff --git a/test/sharness/lib/test-lib.sh b/test/sharness/lib/test-lib.sh
index e8030dcc4..413d0e92f 100644
--- a/test/sharness/lib/test-lib.sh
+++ b/test/sharness/lib/test-lib.sh
@@ -205,6 +205,10 @@ test_init_ipfs() {
ipfs init "${args[@]}" --profile=test > /dev/null
'
+ test_expect_success "disable telemetry" '
+ test_config_set --bool Plugins.Plugins.telemetry.Disabled "true"
+ '
+
test_expect_success "prepare config -- mounting" '
mkdir mountdir ipfs ipns mfs &&
test_config_set Mounts.IPFS "$(pwd)/ipfs" &&
@@ -227,6 +231,10 @@ test_init_ipfs_measure() {
ipfs init "${args[@]}" --profile=test,flatfs-measure > /dev/null
'
+ test_expect_success "disable telemetry" '
+ test_config_set --bool Plugins.Plugins.telemetry.Disabled "true"
+ '
+
test_expect_success "prepare config -- mounting" '
mkdir mountdir ipfs ipns &&
test_config_set Mounts.IPFS "$(pwd)/ipfs" &&
From 82fef0c04569701f34f769f9f8cc29f0f6ec0621 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Tue, 26 Aug 2025 17:01:06 +0200
Subject: [PATCH 343/499] feat(ci): docker linting (#10927)
* feat(ci): docker linting
adds hadolint to validate dockerfile best practices
configures project-specific rules in .hadolint.yaml
* fix(ci): enable hadolint console output
adds verbose and tty format to see linting results in CI logs
* test: trigger hadolint warning
remove --no-install-recommends to test CI output
* fix(ci): fail hadolint on warnings
stricter linting to catch all best practice violations
* fix: add --no-install-recommends to apt-get
reduces image size by avoiding unnecessary packages
* refactor: use WORKDIR instead of cd in dockerfile
replaces cd commands with WORKDIR for cleaner dockerfile
removes unnecessary hadolint ignore rules DL3003 and DL3009
* chore: simplify hadolint config
removes unnecessary override rules for cleaner config
---
.../{docker-build.yml => docker-check.yml} | 21 ++++++++++++++++---
.github/workflows/docker-image.yml | 4 ++++
.hadolint.yaml | 13 ++++++++++++
Dockerfile | 7 +++----
4 files changed, 38 insertions(+), 7 deletions(-)
rename .github/workflows/{docker-build.yml => docker-check.yml} (63%)
create mode 100644 .hadolint.yaml
diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-check.yml
similarity index 63%
rename from .github/workflows/docker-build.yml
rename to .github/workflows/docker-check.yml
index 24ece3fa4..e11f9830d 100644
--- a/.github/workflows/docker-build.yml
+++ b/.github/workflows/docker-check.yml
@@ -1,5 +1,7 @@
-# If we decide to run build-image.yml on every PR, we could deprecate this workflow.
-name: Docker Build
+# This workflow performs a quick Docker build check on PRs and pushes to master.
+# It builds the Docker image and runs a basic smoke test to ensure the image works.
+# This is a lightweight check - for full multi-platform builds and publishing, see docker-image.yml
+name: Docker Check
on:
workflow_dispatch:
@@ -15,7 +17,20 @@ concurrency:
cancel-in-progress: true
jobs:
- docker-build:
+ lint:
+ if: github.repository == 'ipfs/kubo' || github.event_name == 'workflow_dispatch'
+ runs-on: ubuntu-latest
+ timeout-minutes: 5
+ steps:
+ - uses: actions/checkout@v5
+ - uses: hadolint/hadolint-action@v3.1.0
+ with:
+ dockerfile: Dockerfile
+ failure-threshold: warning
+ verbose: true
+ format: tty
+
+ build:
if: github.repository == 'ipfs/kubo' || github.event_name == 'workflow_dispatch'
runs-on: ubuntu-latest
timeout-minutes: 10
diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml
index 6d89c2980..4564c060e 100644
--- a/.github/workflows/docker-image.yml
+++ b/.github/workflows/docker-image.yml
@@ -1,3 +1,7 @@
+# This workflow builds and publishes official Docker images to Docker Hub.
+# It handles multi-platform builds (amd64, arm/v7, arm64/v8) and pushes tagged releases.
+# This workflow is triggered on tags, specific branches, and can be manually dispatched.
+# For quick build checks during development, see docker-check.yml
name: Docker Push
on:
diff --git a/.hadolint.yaml b/.hadolint.yaml
new file mode 100644
index 000000000..78b3d23bf
--- /dev/null
+++ b/.hadolint.yaml
@@ -0,0 +1,13 @@
+# Hadolint configuration for Kubo Docker image
+# https://github.com/hadolint/hadolint
+
+# Ignore specific rules
+ignored:
+ # DL3008: Pin versions in apt-get install
+ # We use stable base images and prefer smaller layers over version pinning
+ - DL3008
+
+# Trust base images from these registries
+trustedRegistries:
+ - docker.io
+ - gcr.io
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
index 0db5f33b4..6d43beefa 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -8,9 +8,9 @@ ENV SRC_DIR=/kubo
# Cache go module downloads between builds for faster rebuilds
COPY go.mod go.sum $SRC_DIR/
+WORKDIR $SRC_DIR
RUN --mount=type=cache,target=/go/pkg/mod \
- cd $SRC_DIR \
- && go mod download
+ go mod download
COPY . $SRC_DIR
@@ -25,8 +25,7 @@ ARG MAKE_TARGET=build
# mkdir .git/objects allows git rev-parse to read commit hash for version info
RUN --mount=type=cache,target=/go/pkg/mod \
--mount=type=cache,target=/root/.cache/go-build \
- cd $SRC_DIR \
- && mkdir -p .git/objects \
+ mkdir -p .git/objects \
&& GOOS=$TARGETOS GOARCH=$TARGETARCH GOFLAGS=-buildvcs=false make ${MAKE_TARGET} IPFS_PLUGINS=$IPFS_PLUGINS
# Extract required runtime tools from Debian.
From fae08d66335f185d4016fa3f162a5aa178839253 Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Fri, 22 Aug 2025 13:57:35 -0700
Subject: [PATCH 344/499] fix: harness tests random panic (#10933)
* fix: harness tests random panic
Connecting nodes in parallel can cause TLS handshake failures. For each node, connect to the other nodes serially. It is not necessary to connect in parallel as it does not save any significant time.
Closes #10932
(cherry picked from commit ae068a806181dc09d4d679ba8d3c6e5f3547afac)
---
test/cli/harness/nodes.go | 26 ++++++++------------------
1 file changed, 8 insertions(+), 18 deletions(-)
diff --git a/test/cli/harness/nodes.go b/test/cli/harness/nodes.go
index 113289e3c..8a5451e03 100644
--- a/test/cli/harness/nodes.go
+++ b/test/cli/harness/nodes.go
@@ -5,7 +5,6 @@ import (
. "github.com/ipfs/kubo/test/cli/testutils"
"github.com/multiformats/go-multiaddr"
- "golang.org/x/sync/errgroup"
)
// Nodes is a collection of Kubo nodes along with operations on groups of nodes.
@@ -17,37 +16,28 @@ func (n Nodes) Init(args ...string) Nodes {
}
func (n Nodes) ForEachPar(f func(*Node)) {
- group := &errgroup.Group{}
+ var wg sync.WaitGroup
for _, node := range n {
+ wg.Add(1)
node := node
- group.Go(func() error {
+ go func() {
+ defer wg.Done()
f(node)
- return nil
- })
- }
- err := group.Wait()
- if err != nil {
- panic(err)
+ }()
}
+ wg.Wait()
}
func (n Nodes) Connect() Nodes {
- wg := sync.WaitGroup{}
for i, node := range n {
for j, otherNode := range n {
if i == j {
continue
}
- node := node
- otherNode := otherNode
- wg.Add(1)
- go func() {
- defer wg.Done()
- node.Connect(otherNode)
- }()
+ // Do not connect in parallel, because that can cause TLS handshake problems on some platforms.
+ node.Connect(otherNode)
}
}
- wg.Wait()
for _, node := range n {
firstPeer := node.Peers()[0]
if _, err := firstPeer.ValueForProtocol(multiaddr.P_P2P); err != nil {
From 46324f085d52a34b28717c1178248feb5a3561d6 Mon Sep 17 00:00:00 2001
From: Hector Sanjuan
Date: Sun, 24 Aug 2025 14:30:35 +0200
Subject: [PATCH 345/499] fix: disable telemetry in test profile (#10931)
* Tests: disable telemetry in tests by default
Disable the plugin in cli tests and sharness by default. Enable only in
telemetry tests.
There are cases when tests get stuck or get killed and leave daemons hanging around. We don't want to be getting telemetry from those.
* sharness: attempt to fix
* sharness: add missing --bool flag
* fix(ci): add omitempty to Plugin.Config field
The sharness problem is that when the telemetry plugin is configured
initially with 'ipfs config --bool', it creates a structure without
the 'Config: null' field, but when the config is copied and replaced,
it expects the structure to be preserved.
Adding omitempty ensures the Config field is omitted from JSON when
nil, making the config structure consistent between initial creation
and replacement operations.
---------
Co-authored-by: Marcin Rataj
(cherry picked from commit 15f723a15e7c79f12857f52e652ffecb6d043e4d)
---
config/plugins.go | 2 +-
test/cli/harness/node.go | 8 ++++++++
test/cli/telemetry_test.go | 5 +++++
test/sharness/lib/test-lib.sh | 8 ++++++++
4 files changed, 22 insertions(+), 1 deletion(-)
diff --git a/config/plugins.go b/config/plugins.go
index 08a1acb34..0c438cbd7 100644
--- a/config/plugins.go
+++ b/config/plugins.go
@@ -7,5 +7,5 @@ type Plugins struct {
type Plugin struct {
Disabled bool
- Config interface{}
+ Config interface{} `json:",omitempty"`
}
diff --git a/test/cli/harness/node.go b/test/cli/harness/node.go
index 6403a2f1a..0315e81df 100644
--- a/test/cli/harness/node.go
+++ b/test/cli/harness/node.go
@@ -245,6 +245,14 @@ func (n *Node) Init(ipfsArgs ...string) *Node {
cfg.Swarm.DisableNatPortMap = true
cfg.Discovery.MDNS.Enabled = n.EnableMDNS
cfg.Routing.LoopbackAddressesOnLanDHT = config.True
+ // Telemetry disabled by default in tests.
+ cfg.Plugins = config.Plugins{
+ Plugins: map[string]config.Plugin{
+ "telemetry": config.Plugin{
+ Disabled: true,
+ },
+ },
+ }
})
return n
}
diff --git a/test/cli/telemetry_test.go b/test/cli/telemetry_test.go
index 455ea7df1..69b87e80d 100644
--- a/test/cli/telemetry_test.go
+++ b/test/cli/telemetry_test.go
@@ -25,6 +25,7 @@ func TestTelemetry(t *testing.T) {
// Create a new node
node := harness.NewT(t).NewNode().Init()
+ node.SetIPFSConfig("Plugins.Plugins.telemetry.Disabled", false)
// Set the opt-out environment variable
node.Runner.Env["IPFS_TELEMETRY"] = "off"
@@ -64,6 +65,7 @@ func TestTelemetry(t *testing.T) {
// Create a new node
node := harness.NewT(t).NewNode().Init()
+ node.SetIPFSConfig("Plugins.Plugins.telemetry.Disabled", false)
// Set opt-out via config
node.IPFS("config", "Plugins.Plugins.telemetry.Config.Mode", "off")
@@ -106,6 +108,7 @@ func TestTelemetry(t *testing.T) {
// Create a new node
node := harness.NewT(t).NewNode().Init()
+ node.SetIPFSConfig("Plugins.Plugins.telemetry.Disabled", false)
// Create a UUID file manually to simulate previous telemetry run
uuidPath := filepath.Join(node.Dir, "telemetry_uuid")
@@ -154,6 +157,7 @@ func TestTelemetry(t *testing.T) {
// Create a new node
node := harness.NewT(t).NewNode().Init()
+ node.SetIPFSConfig("Plugins.Plugins.telemetry.Disabled", false)
// Capture daemon output
stdout := &harness.Buffer{}
@@ -255,6 +259,7 @@ func TestTelemetry(t *testing.T) {
// Create a new node
node := harness.NewT(t).NewNode().Init()
+ node.SetIPFSConfig("Plugins.Plugins.telemetry.Disabled", false)
// Configure telemetry with a very short delay for testing
node.IPFS("config", "Plugins.Plugins.telemetry.Config.Delay", "100ms")
diff --git a/test/sharness/lib/test-lib.sh b/test/sharness/lib/test-lib.sh
index e8030dcc4..413d0e92f 100644
--- a/test/sharness/lib/test-lib.sh
+++ b/test/sharness/lib/test-lib.sh
@@ -205,6 +205,10 @@ test_init_ipfs() {
ipfs init "${args[@]}" --profile=test > /dev/null
'
+ test_expect_success "disable telemetry" '
+ test_config_set --bool Plugins.Plugins.telemetry.Disabled "true"
+ '
+
test_expect_success "prepare config -- mounting" '
mkdir mountdir ipfs ipns mfs &&
test_config_set Mounts.IPFS "$(pwd)/ipfs" &&
@@ -227,6 +231,10 @@ test_init_ipfs_measure() {
ipfs init "${args[@]}" --profile=test,flatfs-measure > /dev/null
'
+ test_expect_success "disable telemetry" '
+ test_config_set --bool Plugins.Plugins.telemetry.Disabled "true"
+ '
+
test_expect_success "prepare config -- mounting" '
mkdir mountdir ipfs ipns &&
test_config_set Mounts.IPFS "$(pwd)/ipfs" &&
From 21e9f27c9087536d0b1d641bf2d87b9d7a6bb841 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Tue, 26 Aug 2025 17:01:06 +0200
Subject: [PATCH 346/499] feat(ci): docker linting (#10927)
* feat(ci): docker linting
adds hadolint to validate dockerfile best practices
configures project-specific rules in .hadolint.yaml
* fix(ci): enable hadolint console output
adds verbose and tty format to see linting results in CI logs
* test: trigger hadolint warning
remove --no-install-recommends to test CI output
* fix(ci): fail hadolint on warnings
stricter linting to catch all best practice violations
* fix: add --no-install-recommends to apt-get
reduces image size by avoiding unnecessary packages
* refactor: use WORKDIR instead of cd in dockerfile
replaces cd commands with WORKDIR for cleaner dockerfile
removes unnecessary hadolint ignore rules DL3003 and DL3009
* chore: simplify hadolint config
removes unnecessary override rules for cleaner config
(cherry picked from commit 82fef0c04569701f34f769f9f8cc29f0f6ec0621)
---
.../{docker-build.yml => docker-check.yml} | 21 ++++++++++++++++---
.github/workflows/docker-image.yml | 4 ++++
.hadolint.yaml | 13 ++++++++++++
Dockerfile | 7 +++----
4 files changed, 38 insertions(+), 7 deletions(-)
rename .github/workflows/{docker-build.yml => docker-check.yml} (63%)
create mode 100644 .hadolint.yaml
diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-check.yml
similarity index 63%
rename from .github/workflows/docker-build.yml
rename to .github/workflows/docker-check.yml
index 24ece3fa4..e11f9830d 100644
--- a/.github/workflows/docker-build.yml
+++ b/.github/workflows/docker-check.yml
@@ -1,5 +1,7 @@
-# If we decide to run build-image.yml on every PR, we could deprecate this workflow.
-name: Docker Build
+# This workflow performs a quick Docker build check on PRs and pushes to master.
+# It builds the Docker image and runs a basic smoke test to ensure the image works.
+# This is a lightweight check - for full multi-platform builds and publishing, see docker-image.yml
+name: Docker Check
on:
workflow_dispatch:
@@ -15,7 +17,20 @@ concurrency:
cancel-in-progress: true
jobs:
- docker-build:
+ lint:
+ if: github.repository == 'ipfs/kubo' || github.event_name == 'workflow_dispatch'
+ runs-on: ubuntu-latest
+ timeout-minutes: 5
+ steps:
+ - uses: actions/checkout@v5
+ - uses: hadolint/hadolint-action@v3.1.0
+ with:
+ dockerfile: Dockerfile
+ failure-threshold: warning
+ verbose: true
+ format: tty
+
+ build:
if: github.repository == 'ipfs/kubo' || github.event_name == 'workflow_dispatch'
runs-on: ubuntu-latest
timeout-minutes: 10
diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml
index 6d89c2980..4564c060e 100644
--- a/.github/workflows/docker-image.yml
+++ b/.github/workflows/docker-image.yml
@@ -1,3 +1,7 @@
+# This workflow builds and publishes official Docker images to Docker Hub.
+# It handles multi-platform builds (amd64, arm/v7, arm64/v8) and pushes tagged releases.
+# This workflow is triggered on tags, specific branches, and can be manually dispatched.
+# For quick build checks during development, see docker-check.yml
name: Docker Push
on:
diff --git a/.hadolint.yaml b/.hadolint.yaml
new file mode 100644
index 000000000..78b3d23bf
--- /dev/null
+++ b/.hadolint.yaml
@@ -0,0 +1,13 @@
+# Hadolint configuration for Kubo Docker image
+# https://github.com/hadolint/hadolint
+
+# Ignore specific rules
+ignored:
+ # DL3008: Pin versions in apt-get install
+ # We use stable base images and prefer smaller layers over version pinning
+ - DL3008
+
+# Trust base images from these registries
+trustedRegistries:
+ - docker.io
+ - gcr.io
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
index 0db5f33b4..6d43beefa 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -8,9 +8,9 @@ ENV SRC_DIR=/kubo
# Cache go module downloads between builds for faster rebuilds
COPY go.mod go.sum $SRC_DIR/
+WORKDIR $SRC_DIR
RUN --mount=type=cache,target=/go/pkg/mod \
- cd $SRC_DIR \
- && go mod download
+ go mod download
COPY . $SRC_DIR
@@ -25,8 +25,7 @@ ARG MAKE_TARGET=build
# mkdir .git/objects allows git rev-parse to read commit hash for version info
RUN --mount=type=cache,target=/go/pkg/mod \
--mount=type=cache,target=/root/.cache/go-build \
- cd $SRC_DIR \
- && mkdir -p .git/objects \
+ mkdir -p .git/objects \
&& GOOS=$TARGETOS GOARCH=$TARGETARCH GOFLAGS=-buildvcs=false make ${MAKE_TARGET} IPFS_PLUGINS=$IPFS_PLUGINS
# Extract required runtime tools from Debian.
From 53702e4ba27fd8761e716f8073bab51ba83dac57 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Wed, 27 Aug 2025 18:58:41 +0200
Subject: [PATCH 347/499] chore: set version to v0.37.0
---
version.go | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/version.go b/version.go
index c0f842805..244fe6726 100644
--- a/version.go
+++ b/version.go
@@ -9,7 +9,7 @@ import (
var CurrentCommit string
// CurrentVersionNumber is the current application's version literal.
-const CurrentVersionNumber = "0.37.0-rc1"
+const CurrentVersionNumber = "0.37.0"
const ApiVersion = "/kubo/" + CurrentVersionNumber + "/" //nolint
From 67f7129b3c00a2ccf2989de6d0c882b21a967526 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Wed, 27 Aug 2025 19:15:05 +0200
Subject: [PATCH 348/499] chore: update v0.37.0 changelog
- updated changelog and contributors with mkreleaselog output
- improved mkreleaselog to work with kubo from any directory
---
bin/mkreleaselog | 28 +++++--
docs/changelogs/v0.37.md | 165 +++++++++++++++++++++++++++++++++++++++
2 files changed, 185 insertions(+), 8 deletions(-)
diff --git a/bin/mkreleaselog b/bin/mkreleaselog
index 2ff6c0e89..101881e90 100755
--- a/bin/mkreleaselog
+++ b/bin/mkreleaselog
@@ -79,7 +79,12 @@ msg() {
statlog() {
local module="$1"
- local rpath="$GOPATH/src/$(strip_version "$module")"
+ local rpath
+ if [[ "$module" == "github.com/ipfs/kubo" ]]; then
+ rpath="$ROOT_DIR"
+ else
+ rpath="$GOPATH/src/$(strip_version "$module")"
+ fi
local start="${2:-}"
local end="${3:-HEAD}"
local mailmap_file="$rpath/.mailmap"
@@ -166,7 +171,12 @@ release_log() {
local start="$2"
local end="${3:-HEAD}"
local repo="$(strip_version "$1")"
- local dir="$GOPATH/src/$repo"
+ local dir
+ if [[ "$module" == "github.com/ipfs/kubo" ]]; then
+ dir="$ROOT_DIR"
+ else
+ dir="$GOPATH/src/$repo"
+ fi
local commit pr
git -C "$dir" log \
@@ -203,8 +213,13 @@ mod_deps() {
ensure() {
local repo="$(strip_version "$1")"
local commit="$2"
- local rpath="$GOPATH/src/$repo"
- if [[ ! -d "$rpath" ]]; then
+ local rpath
+ if [[ "$1" == "github.com/ipfs/kubo" ]]; then
+ rpath="$ROOT_DIR"
+ else
+ rpath="$GOPATH/src/$repo"
+ fi
+ if [[ "$1" != "github.com/ipfs/kubo" ]] && [[ ! -d "$rpath" ]]; then
msg "Cloning $repo..."
git clone "http://$repo" "$rpath" >&2
fi
@@ -237,10 +252,7 @@ recursive_release_log() {
local module="$(go list -m)"
local dir="$(go list -m -f '{{.Dir}}')"
- if [[ "${GOPATH}/${module}" -ef "${dir}" ]]; then
- echo "This script requires the target module and all dependencies to live in a GOPATH."
- return 1
- fi
+ # Kubo can be run from any directory, dependencies still use GOPATH
(
local result=0
diff --git a/docs/changelogs/v0.37.md b/docs/changelogs/v0.37.md
index e79b9e564..5d21fcc4f 100644
--- a/docs/changelogs/v0.37.md
+++ b/docs/changelogs/v0.37.md
@@ -266,4 +266,169 @@ Learn more: [`/kubo/docs/telemetry.md`](https://github.com/ipfs/kubo/blob/master
### ๐ Changelog
+Full Changelog
+
+- github.com/ipfs/kubo:
+ - chore: set version to v0.37.0
+ - feat(ci): docker linting (#10927) ([ipfs/kubo#10927](https://github.com/ipfs/kubo/pull/10927))
+ - fix: disable telemetry in test profile (#10931) ([ipfs/kubo#10931](https://github.com/ipfs/kubo/pull/10931))
+ - fix: harness tests random panic (#10933) ([ipfs/kubo#10933](https://github.com/ipfs/kubo/pull/10933))
+ - chore: v0.37.0-rc1
+ - feat: Reprovider.Strategy: rename "flat" to "all" (#10928) ([ipfs/kubo#10928](https://github.com/ipfs/kubo/pull/10928))
+ - docs: improve `ipfs add --help` (#10926) ([ipfs/kubo#10926](https://github.com/ipfs/kubo/pull/10926))
+ - feat: optimize docker builds (#10925) ([ipfs/kubo#10925](https://github.com/ipfs/kubo/pull/10925))
+ - feat(config): AutoConf with "auto" placeholders (#10883) ([ipfs/kubo#10883](https://github.com/ipfs/kubo/pull/10883))
+ - fix(ci): make NewRandPort thread-safe (#10921) ([ipfs/kubo#10921](https://github.com/ipfs/kubo/pull/10921))
+ - fix: resolve TestAddMultipleGCLive race condition (#10916) ([ipfs/kubo#10916](https://github.com/ipfs/kubo/pull/10916))
+ - feat: telemetry plugin (#10866) ([ipfs/kubo#10866](https://github.com/ipfs/kubo/pull/10866))
+ - fix typos in docs and comments (#10920) ([ipfs/kubo#10920](https://github.com/ipfs/kubo/pull/10920))
+ - Upgrade to Boxo v0.34.0 (#10917) ([ipfs/kubo#10917](https://github.com/ipfs/kubo/pull/10917))
+ - test: fix flaky repo verify (#10743) ([ipfs/kubo#10743](https://github.com/ipfs/kubo/pull/10743))
+ - feat(config): `Gateway.RetrievalTimeout|MaxConcurrentRequests` (#10905) ([ipfs/kubo#10905](https://github.com/ipfs/kubo/pull/10905))
+ - chore: replace random test utils with equivalents in go-test/random (#10915) ([ipfs/kubo#10915](https://github.com/ipfs/kubo/pull/10915))
+ - feat: require go1.25 for building kubo (#10913) ([ipfs/kubo#10913](https://github.com/ipfs/kubo/pull/10913))
+ - feat(ci): reusable spellcheck from unified CI (#10873) ([ipfs/kubo#10873](https://github.com/ipfs/kubo/pull/10873))
+ - fix(ci): docker build (#10914) ([ipfs/kubo#10914](https://github.com/ipfs/kubo/pull/10914))
+ - Replace `uber-go/multierr` with `errors.Join` (#10912) ([ipfs/kubo#10912](https://github.com/ipfs/kubo/pull/10912))
+ - feat(ipns): support passing custom sequence number during publishing (#10851) ([ipfs/kubo#10851](https://github.com/ipfs/kubo/pull/10851))
+ - fix(relay): feed connected peers to AutoRelay discovery (#10901) ([ipfs/kubo#10901](https://github.com/ipfs/kubo/pull/10901))
+ - fix(sharness): no blocking on unclean FUSE unmount (#10906) ([ipfs/kubo#10906](https://github.com/ipfs/kubo/pull/10906))
+ - feat: add query functionality to log level command (#10885) ([ipfs/kubo#10885](https://github.com/ipfs/kubo/pull/10885))
+ - fix(ci): switch to debian:bookworm-slim
+ - Fix failing FUSE test (#10904) ([ipfs/kubo#10904](https://github.com/ipfs/kubo/pull/10904))
+ - fix(cmd): exit 1 on error (#10903) ([ipfs/kubo#10903](https://github.com/ipfs/kubo/pull/10903))
+ - feat: go-libp2p v0.43.0 (#10892) ([ipfs/kubo#10892](https://github.com/ipfs/kubo/pull/10892))
+ - fix: `ipfs cid` without repo (#10897) ([ipfs/kubo#10897](https://github.com/ipfs/kubo/pull/10897))
+ - client/rpc: re-enable tests on windows. (#10895) ([ipfs/kubo#10895](https://github.com/ipfs/kubo/pull/10895))
+ - fix: Provide according to Reprovider.Strategy (#10886) ([ipfs/kubo#10886](https://github.com/ipfs/kubo/pull/10886))
+ - feat: ipfs-webui v4.8.0 (#10902) ([ipfs/kubo#10902](https://github.com/ipfs/kubo/pull/10902))
+ - refactor: move `ipfs stat provide/reprovide` to `ipfs provide stat` (#10896) ([ipfs/kubo#10896](https://github.com/ipfs/kubo/pull/10896))
+ - Bitswap: use a single ConnectEventManager. ([ipfs/kubo#10889](https://github.com/ipfs/kubo/pull/10889))
+ - feat(add): add support for naming pinned CIDs (#10877) ([ipfs/kubo#10877](https://github.com/ipfs/kubo/pull/10877))
+ - refactor: remove goprocess (#10872) ([ipfs/kubo#10872](https://github.com/ipfs/kubo/pull/10872))
+ - feat(daemon): accelerated client startup note (#10859) ([ipfs/kubo#10859](https://github.com/ipfs/kubo/pull/10859))
+ - docs:added GOLOG_LOG_LEVEL to debug-guide for logging more info (#10894) ([ipfs/kubo#10894](https://github.com/ipfs/kubo/pull/10894))
+ - core: Add a ContentDiscovery field ([ipfs/kubo#10890](https://github.com/ipfs/kubo/pull/10890))
+ - chore: update go-libp2p and p2p-forge (#10887) ([ipfs/kubo#10887](https://github.com/ipfs/kubo/pull/10887))
+ - Upgrade to Boxo v0.33.1 (#10888) ([ipfs/kubo#10888](https://github.com/ipfs/kubo/pull/10888))
+ - remove unneeded thirdparty packages (#10871) ([ipfs/kubo#10871](https://github.com/ipfs/kubo/pull/10871))
+ - provider: clear provide queue when reprovide strategy changes (#10863) ([ipfs/kubo#10863](https://github.com/ipfs/kubo/pull/10863))
+ - chore: merge release v0.36.0 ([ipfs/kubo#10868](https://github.com/ipfs/kubo/pull/10868))
+ - docs: release checklist fixes from 0.36 (#10861) ([ipfs/kubo#10861](https://github.com/ipfs/kubo/pull/10861))
+ - docs(config): add network exposure considerations (#10856) ([ipfs/kubo#10856](https://github.com/ipfs/kubo/pull/10856))
+ - fix: handling of EDITOR env var (#10855) ([ipfs/kubo#10855](https://github.com/ipfs/kubo/pull/10855))
+ - refactor: use slices.Sort where appropriate (#10858) ([ipfs/kubo#10858](https://github.com/ipfs/kubo/pull/10858))
+ - Upgrade to Boxo v0.33.0 (#10857) ([ipfs/kubo#10857](https://github.com/ipfs/kubo/pull/10857))
+ - chore: Upgrade github.com/cockroachdb/pebble/v2 to v2.0.6 for Go 1.25 support (#10850) ([ipfs/kubo#10850](https://github.com/ipfs/kubo/pull/10850))
+ - core:constructor: add a log line about http retrieval ([ipfs/kubo#10852](https://github.com/ipfs/kubo/pull/10852))
+ - chore: p2p-forge v0.6.0 + go-libp2p 0.42.0 (#10840) ([ipfs/kubo#10840](https://github.com/ipfs/kubo/pull/10840))
+ - docs: fix minor typos (#10849) ([ipfs/kubo#10849](https://github.com/ipfs/kubo/pull/10849))
+ - Replace use of go-car v1 with go-car/v2 (#10845) ([ipfs/kubo#10845](https://github.com/ipfs/kubo/pull/10845))
+ - chore: 0.37.0-dev
+- github.com/ipfs/boxo (v0.33.0 -> v0.34.0):
+ - Release v0.34.0 ([ipfs/boxo#1003](https://github.com/ipfs/boxo/pull/1003))
+ - blockstore: remove HashOnRead ([ipfs/boxo#1001](https://github.com/ipfs/boxo/pull/1001))
+ - Update go-log to v2.8.1 ([ipfs/boxo#998](https://github.com/ipfs/boxo/pull/998))
+ - feat: autoconf client library (#997) ([ipfs/boxo#997](https://github.com/ipfs/boxo/pull/997))
+ - feat(gateway): concurrency and retrieval timeout limits (#994) ([ipfs/boxo#994](https://github.com/ipfs/boxo/pull/994))
+ - update dependencies ([ipfs/boxo#999](https://github.com/ipfs/boxo/pull/999))
+ - fix: cidqueue gc must iterate all elements in queue ([ipfs/boxo#1000](https://github.com/ipfs/boxo/pull/1000))
+ - Replace `uber-go/multierr` with `errors.Join` ([ipfs/boxo#996](https://github.com/ipfs/boxo/pull/996))
+ - feat(namesys/IPNSPublisher): expose ability to set Sequence (#962) ([ipfs/boxo#962](https://github.com/ipfs/boxo/pull/962))
+ - upgrade to go-libp2p v0.43.0 ([ipfs/boxo#993](https://github.com/ipfs/boxo/pull/993))
+ - Remove providing Exchange. Call Provide() from relevant places. ([ipfs/boxo#976](https://github.com/ipfs/boxo/pull/976))
+ - reprovider: s/inital/initial ([ipfs/boxo#992](https://github.com/ipfs/boxo/pull/992))
+ - Release v0.33.1 ([ipfs/boxo#991](https://github.com/ipfs/boxo/pull/991))
+ - fix(bootstrap): filter-out peers behind relays (#987) ([ipfs/boxo#987](https://github.com/ipfs/boxo/pull/987))
+ - Bitswap: fix double-worker in connectEventManager. Logging improvements. ([ipfs/boxo#986](https://github.com/ipfs/boxo/pull/986))
+ - upgrade to go-libp2p v0.42.1 (#988) ([ipfs/boxo#988](https://github.com/ipfs/boxo/pull/988))
+ - bitswap/httpnet: fix sudden stop of http retrieval requests (#984) ([ipfs/boxo#984](https://github.com/ipfs/boxo/pull/984))
+ - bitswap/client: disable use of traceability block by default (#956) ([ipfs/boxo#956](https://github.com/ipfs/boxo/pull/956))
+ - test(gateway): fix race in TestCarBackendTar (#985) ([ipfs/boxo#985](https://github.com/ipfs/boxo/pull/985))
+ - Shutdown the sessionWantSender changes queue when session is shutdown (#983) ([ipfs/boxo#983](https://github.com/ipfs/boxo/pull/983))
+ - bitswap/httpnet: start pinging before signaling Connected ([ipfs/boxo#982](https://github.com/ipfs/boxo/pull/982))
+ - Queue all changes in order using non-blocking async queue ([ipfs/boxo#981](https://github.com/ipfs/boxo/pull/981))
+ - bitswap/httpnet: fix peers silently stopping from doing http requests ([ipfs/boxo#980](https://github.com/ipfs/boxo/pull/980))
+ - provider: clear provide queue (#978) ([ipfs/boxo#978](https://github.com/ipfs/boxo/pull/978))
+ - update dependencies ([ipfs/boxo#977](https://github.com/ipfs/boxo/pull/977))
+- github.com/ipfs/go-datastore (v0.8.2 -> v0.8.3):
+ - new version (#245) ([ipfs/go-datastore#245](https://github.com/ipfs/go-datastore/pull/245))
+ - sort using slices.Sort (#243) ([ipfs/go-datastore#243](https://github.com/ipfs/go-datastore/pull/243))
+ - Replace `uber-go/multierr` with `errors.Join` (#242) ([ipfs/go-datastore#242](https://github.com/ipfs/go-datastore/pull/242))
+ - replace gopkg.in/check.v1 with github.com/stretchr/testify (#241) ([ipfs/go-datastore#241](https://github.com/ipfs/go-datastore/pull/241))
+- github.com/ipfs/go-ipld-cbor (v0.2.0 -> v0.2.1):
+ - new version ([ipfs/go-ipld-cbor#111](https://github.com/ipfs/go-ipld-cbor/pull/111))
+ - update dependencies ([ipfs/go-ipld-cbor#110](https://github.com/ipfs/go-ipld-cbor/pull/110))
+- github.com/ipfs/go-log/v2 (v2.6.0 -> v2.8.1):
+ - new version (#171) ([ipfs/go-log#171](https://github.com/ipfs/go-log/pull/171))
+ - feat: add LevelEnabled function to check if log level enabled (#170) ([ipfs/go-log#170](https://github.com/ipfs/go-log/pull/170))
+ - Replace `uber-go/multierr` with `errors.Join` (#168) ([ipfs/go-log#168](https://github.com/ipfs/go-log/pull/168))
+ - new version (#167) ([ipfs/go-log#167](https://github.com/ipfs/go-log/pull/167))
+ - Test using testify package (#166) ([ipfs/go-log#166](https://github.com/ipfs/go-log/pull/166))
+ - Revise the loglevel API to be more golang idiomatic (#165) ([ipfs/go-log#165](https://github.com/ipfs/go-log/pull/165))
+ - new version (#164) ([ipfs/go-log#164](https://github.com/ipfs/go-log/pull/164))
+ - feat: add GetLogLevel and GetAllLogLevels (#160) ([ipfs/go-log#160](https://github.com/ipfs/go-log/pull/160))
+- github.com/ipfs/go-test (v0.2.2 -> v0.2.3):
+ - new version (#30) ([ipfs/go-test#30](https://github.com/ipfs/go-test/pull/30))
+ - fix: multihash random generation (#28) ([ipfs/go-test#28](https://github.com/ipfs/go-test/pull/28))
+ - Add RandomName function to generate random filename (#26) ([ipfs/go-test#26](https://github.com/ipfs/go-test/pull/26))
+- github.com/libp2p/go-libp2p (v0.42.0 -> v0.43.0):
+ - Release v0.43 (#3353) ([libp2p/go-libp2p#3353](https://github.com/libp2p/go-libp2p/pull/3353))
+ - basichost: fix deadlock with addrs_manager (#3348) ([libp2p/go-libp2p#3348](https://github.com/libp2p/go-libp2p/pull/3348))
+ - basichost: fix Addrs docstring (#3341) ([libp2p/go-libp2p#3341](https://github.com/libp2p/go-libp2p/pull/3341))
+ - quic: upgrade quic-go to v0.53 (#3323) ([libp2p/go-libp2p#3323](https://github.com/libp2p/go-libp2p/pull/3323))
+- github.com/libp2p/go-libp2p-kad-dht (v0.33.1 -> v0.34.0):
+ - chore: release v0.34.0 (#1130) ([libp2p/go-libp2p-kad-dht#1130](https://github.com/libp2p/go-libp2p-kad-dht/pull/1130))
+ - make crawler protocol messenger configurable (#1128) ([libp2p/go-libp2p-kad-dht#1128](https://github.com/libp2p/go-libp2p-kad-dht/pull/1128))
+ - fix: move non-error log to warning level (#1119) ([libp2p/go-libp2p-kad-dht#1119](https://github.com/libp2p/go-libp2p-kad-dht/pull/1119))
+ - migrate providers package (#1094) ([libp2p/go-libp2p-kad-dht#1094](https://github.com/libp2p/go-libp2p-kad-dht/pull/1094))
+- github.com/libp2p/go-libp2p-pubsub (v0.13.1 -> v0.14.2):
+ - Release v0.14.2 (#629) ([libp2p/go-libp2p-pubsub#629](https://github.com/libp2p/go-libp2p-pubsub/pull/629))
+ - Fix test races and enable race tests in CI (#626) ([libp2p/go-libp2p-pubsub#626](https://github.com/libp2p/go-libp2p-pubsub/pull/626))
+ - Fix race when calling Preprocess and msg ID generator(#627) ([libp2p/go-libp2p-pubsub#627](https://github.com/libp2p/go-libp2p-pubsub/pull/627))
+ - Release v0.14.1 (#623) ([libp2p/go-libp2p-pubsub#623](https://github.com/libp2p/go-libp2p-pubsub/pull/623))
+ - fix(BatchPublishing): Make topic.AddToBatch threadsafe (#622) ([libp2p/go-libp2p-pubsub#622](https://github.com/libp2p/go-libp2p-pubsub/pull/622))
+ - Release v0.14.0 (#614) ([libp2p/go-libp2p-pubsub#614](https://github.com/libp2p/go-libp2p-pubsub/pull/614))
+ - refactor: 10x faster RPC splitting (#615) ([libp2p/go-libp2p-pubsub#615](https://github.com/libp2p/go-libp2p-pubsub/pull/615))
+ - test: Fix flaky TestMessageBatchPublish (#616) ([libp2p/go-libp2p-pubsub#616](https://github.com/libp2p/go-libp2p-pubsub/pull/616))
+ - Send IDONTWANT before first publish (#612) ([libp2p/go-libp2p-pubsub#612](https://github.com/libp2p/go-libp2p-pubsub/pull/612))
+ - feat(gossipsub): Add MessageBatch (#607) ([libp2p/go-libp2p-pubsub#607](https://github.com/libp2p/go-libp2p-pubsub/pull/607))
+ - fix(IDONTWANT)!: Do not IDONTWANT your sender (#609) ([libp2p/go-libp2p-pubsub#609](https://github.com/libp2p/go-libp2p-pubsub/pull/609))
+- github.com/multiformats/go-multiaddr (v0.16.0 -> v0.16.1):
+ - Release v0.16.1 (#281) ([multiformats/go-multiaddr#281](https://github.com/multiformats/go-multiaddr/pull/281))
+ - reduce allocations in Bytes() and manet methods (#280) ([multiformats/go-multiaddr#280](https://github.com/multiformats/go-multiaddr/pull/280))
+- github.com/whyrusleeping/cbor-gen (v0.1.2 -> v0.3.1):
+ - fix: capture field count early for "optional" length check (#112) ([whyrusleeping/cbor-gen#112](https://github.com/whyrusleeping/cbor-gen/pull/112))
+ - doc: basic cbor-gen documentation (#110) ([whyrusleeping/cbor-gen#110](https://github.com/whyrusleeping/cbor-gen/pull/110))
+ - feat: add support for optional fields at the end of tuple structs (#109) ([whyrusleeping/cbor-gen#109](https://github.com/whyrusleeping/cbor-gen/pull/109))
+ - Regenerate test files ([whyrusleeping/cbor-gen#107](https://github.com/whyrusleeping/cbor-gen/pull/107))
+ - improve allocations in map serialization ([whyrusleeping/cbor-gen#105](https://github.com/whyrusleeping/cbor-gen/pull/105))
+ - fixed array in struct instead of heap slice ([whyrusleeping/cbor-gen#104](https://github.com/whyrusleeping/cbor-gen/pull/104))
+ - optionally sort type names in generated code file ([whyrusleeping/cbor-gen#102](https://github.com/whyrusleeping/cbor-gen/pull/102))
+ - fix handling of an []*string field ([whyrusleeping/cbor-gen#101](https://github.com/whyrusleeping/cbor-gen/pull/101))
+ - fix: reject negative big integers ([whyrusleeping/cbor-gen#100](https://github.com/whyrusleeping/cbor-gen/pull/100))
+
+
+
### ๐จโ๐ฉโ๐งโ๐ฆ Contributors
+
+| Contributor | Commits | Lines ยฑ | Files Changed |
+|-------------|---------|---------|---------------|
+| Marcin Rataj | 26 | +16033/-755 | 176 |
+| Andrew Gillis | 35 | +2656/-1911 | 142 |
+| Hector Sanjuan | 30 | +2638/-760 | 114 |
+| Marco Munizaga | 11 | +1244/-362 | 41 |
+| Russell Dempsey | 2 | +1031/-33 | 7 |
+| Guillaume Michel | 4 | +899/-65 | 15 |
+| whyrusleeping | 4 | +448/-177 | 15 |
+| sukun | 9 | +312/-191 | 31 |
+| gammazero | 23 | +239/-216 | 45 |
+| Brian Olson | 5 | +343/-16 | 11 |
+| Steven Allen | 3 | +294/-7 | 9 |
+| Sergey Gorbunov | 2 | +247/-11 | 9 |
+| Kapil Sareen | 1 | +86/-13 | 10 |
+| Masih H. Derkani | 1 | +72/-24 | 1 |
+| Piotr Galar | 1 | +40/-55 | 23 |
+| Rod Vagg | 1 | +13/-11 | 3 |
+| Ankita Sahu | 1 | +2/-0 | 1 |
+| ล tefan Baebler | 1 | +1/-0 | 1 |
From 20092c5e3c9e82aad9dcd790ee11f461c6e77a16 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Wed, 27 Aug 2025 19:25:47 +0200
Subject: [PATCH 349/499] docs: update v0.37.0 dependency versions
---
docs/changelogs/v0.37.md | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/docs/changelogs/v0.37.md b/docs/changelogs/v0.37.md
index 5d21fcc4f..97f62a8c0 100644
--- a/docs/changelogs/v0.37.md
+++ b/docs/changelogs/v0.37.md
@@ -258,9 +258,10 @@ Learn more: [`/kubo/docs/telemetry.md`](https://github.com/ipfs/kubo/blob/master
### ๐ฆ๏ธ Important dependency updates
-- update `go-libp2p` to [v0.43.0](https://github.com/libp2p/go-libp2p/releases/tag/v0.43.0) (incl. [v0.42.1](https://github.com/libp2p/go-libp2p/releases/tag/v0.42.1))
-- update `p2p-forge/client` to [v0.6.1](https://github.com/ipshipyard/p2p-forge/releases/tag/v0.6.1)
-- update `boxo` to [v0.33.1](https://github.com/ipfs/boxo/releases/tag/v0.33.1)
+- update `boxo` to [v0.34.0](https://github.com/ipfs/boxo/releases/tag/v0.34.0) (incl. [v0.33.1](https://github.com/ipfs/boxo/releases/tag/v0.33.1))
+- update `go-libp2p` to [v0.43.0](https://github.com/libp2p/go-libp2p/releases/tag/v0.43.0)
+- update `go-libp2p-kad-dht` to [v0.34.0](https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.34.0)
+- update `go-libp2p-pubsub` to [v0.14.2](https://github.com/libp2p/go-libp2p-pubsub/releases/tag/v0.14.2) (incl. [v0.14.1](https://github.com/libp2p/go-libp2p-pubsub/releases/tag/v0.14.1), [v0.14.0](https://github.com/libp2p/go-libp2p-pubsub/releases/tag/v0.14.0))
- update `ipfs-webui` to [v4.8.0](https://github.com/ipfs/ipfs-webui/releases/tag/v4.8.0)
- update to [Go 1.25](https://go.dev/doc/go1.25)
From 5661dfd387b34860447a5b7143c4661661a171f1 Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Wed, 27 Aug 2025 20:05:00 +0200
Subject: [PATCH 350/499] docs: improve v0.37 changelog
- add emojis to all headers
- add overview section
- group IPNS features together
- fix IPNS flags to match actual implementation
---
docs/changelogs/v0.37.md | 75 +++++++++++++++++++++-------------------
1 file changed, 39 insertions(+), 36 deletions(-)
diff --git a/docs/changelogs/v0.37.md b/docs/changelogs/v0.37.md
index 97f62a8c0..f0f1800af 100644
--- a/docs/changelogs/v0.37.md
+++ b/docs/changelogs/v0.37.md
@@ -1,4 +1,4 @@
-# Kubo changelog v0.37
+[#](#) Kubo changelog v0.37
@@ -13,16 +13,16 @@ This release was brought to you by the [Shipyard](https://ipshipyard.com/) team.
- [๐ Repository migration from v16 to v17 with embedded tooling](#-repository-migration-from-v16-to-v17-with-embedded-tooling)
- [๐ฆ Gateway concurrent request limits and retrieval timeouts](#-gateway-concurrent-request-limits-and-retrieval-timeouts)
- [๐ง AutoConf: Complete control over network defaults](#-autoconf-complete-control-over-network-defaults)
- - [New IPNS publishing options](#new-ipns-publishing-options)
- - [Clear provide queue when reprovide strategy changes](#clear-provide-queue-when-reprovide-strategy-changes)
+ - [๐๏ธ Clear provide queue when reprovide strategy changes](#-clear-provide-queue-when-reprovide-strategy-changes)
- [๐ชต Revamped `ipfs log level` command](#-revamped-ipfs-log-level-command)
- [๐ Named pins in `ipfs add` command](#-named-pins-in-ipfs-add-command)
- - [Custom sequence numbers in `ipfs name publish`](#custom-sequence-numbers-in-ipfs-name-publish)
+ - [๐ New IPNS publishing options](#-new-ipns-publishing-options)
+ - [๐ข Custom sequence numbers in `ipfs name publish`](#-custom-sequence-numbers-in-ipfs-name-publish)
- [โ๏ธ `Reprovider.Strategy` is now consistently respected](#-reprovider-strategy-is-now-consistently-respected)
- [โ๏ธ `Reprovider.Strategy=all`: improved memory efficiency](#-reproviderstrategyall-improved-memory-efficiency)
- - [Removed unnecessary dependencies](#removed-unnecessary-dependencies)
- - [Improved `ipfs cid`](#improved-ipfs-cid)
- - [Deprecated `ipfs stats reprovide`](#deprecated-ipfs-stats-reprovide)
+ - [๐งน Removed unnecessary dependencies](#-removed-unnecessary-dependencies)
+ - [๐ Improved `ipfs cid`](#-improved-ipfs-cid)
+ - [โ ๏ธ Deprecated `ipfs stats reprovide`](#-deprecated-ipfs-stats-reprovide)
- [๐ AutoRelay now uses all connected peers for relay discovery](#-autorelay-now-uses-all-connected-peers-for-relay-discovery)
- [๐ Anonymous telemetry for better feature prioritization](#-anonymous-telemetry-for-better-feature-prioritization)
- [๐ฆ๏ธ Important dependency updates](#-important-dependency-updates)
@@ -31,6 +31,8 @@ This release was brought to you by the [Shipyard](https://ipshipyard.com/) team.
### Overview
+Kubo 0.37.0 introduces embedded repository migrations, gateway resource protection, complete AutoConf control, improved reprovider strategies, and anonymous telemetry for better feature prioritization. This release significantly improves memory efficiency, network configuration flexibility, and operational reliability while maintaining full backward compatibility.
+
### ๐ฆ Highlights
#### ๐ Repository migration from v16 to v17 with embedded tooling
@@ -89,27 +91,7 @@ ipfs config --json DNS.Resolvers '{".": ["https://dns.example.com/dns-query"], "
Organizations can host custom AutoConf manifests for private networks. See [AutoConf documentation](https://github.com/ipfs/kubo/blob/master/docs/config.md#autoconf) and format spec at https://conf.ipfs-mainnet.org/
-#### New IPNS publishing options
-
-Added support for controlling IPNS record publishing strategies.
-
-**Delegated publishers configuration:**
-
-[`Ipns.DelegatedPublishers`](https://github.com/ipfs/kubo/blob/master/docs/config.md#ipnsdelegatedpublishers) configures HTTP endpoints for IPNS publishing. Supports `"auto"` for network defaults or custom HTTP endpoints.
-
-**New command flags:**
-```bash
-# Publish only to HTTP services defined in Ipns.DelegatedPublishers (skip DHT entirely)
-ipfs name publish --delegated-only /ipfs/QmHash
-
-# Publish only locally (no network requests)
-ipfs name publish --allow-offline /ipfs/QmHash
-```
-
-These flags enable HTTP-only publishing or offline-only operations for testing.
-
-
-#### Clear provide queue when reprovide strategy changes
+#### ๐๏ธ Clear provide queue when reprovide strategy changes
Changing [`Reprovider.Strategy`](https://github.com/ipfs/kubo/blob/master/docs/config.md#reproviderstrategy) and restarting Kubo now automatically clears the provide queue. Only content matching the new strategy will be announced.
@@ -152,7 +134,28 @@ $ ipfs pin ls --names
bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi recursive testname
```
-#### โ๏ธ `Reprovider.Strategy` is now consistently respected.
+#### ๐ New IPNS publishing options
+
+Added support for controlling IPNS record publishing strategies with new command flags and configuration.
+
+**New command flags:**
+```bash
+# Publish without network connectivity (local datastore only)
+ipfs name publish --allow-offline /ipfs/QmHash
+
+# Publish without DHT connectivity (uses local datastore and HTTP delegated publishers)
+ipfs name publish --allow-delegated /ipfs/QmHash
+```
+
+**Delegated publishers configuration:**
+
+[`Ipns.DelegatedPublishers`](https://github.com/ipfs/kubo/blob/master/docs/config.md#ipnsdelegatedpublishers) configures HTTP endpoints for IPNS publishing. Supports `"auto"` for network defaults or custom HTTP endpoints. The `--allow-delegated` flag enables publishing through these endpoints without requiring DHT connectivity, useful for nodes behind restrictive networks or during testing.
+
+#### ๐ข Custom sequence numbers in `ipfs name publish`
+
+Added `--sequence` flag to `ipfs name publish` for setting custom sequence numbers in IPNS records. This enables advanced use cases like manually coordinating updates across multiple nodes. See `ipfs name publish --help` for details.
+
+#### โ๏ธ `Reprovider.Strategy` is now consistently respected
Prior to this version, files added, blocks received etc. were "provided" to the network (announced on the DHT) regardless of the ["reproviding strategy" setting](https://github.com/ipfs/kubo/blob/master/docs/config.md#reproviderstrategy). For example:
@@ -175,7 +178,7 @@ As part of this improvement, the `flat` reprovider strategy has been renamed to
> [!NOTE]
> **Migration guidance:** If you experience undesired announcement delays of root CIDs with the new `all` strategy, switch to `pinned+mfs` for root prioritization.
-#### Removed unnecessary dependencies
+#### ๐งน Removed unnecessary dependencies
Kubo has been cleaned up by removing unnecessary dependencies and packages:
@@ -186,17 +189,13 @@ Kubo has been cleaned up by removing unnecessary dependencies and packages:
These changes reduce the dependency footprint while improving code maintainability and following Go best practices.
-#### Custom sequence numbers in `ipfs name publish`
-
-Added `--sequence` flag to `ipfs name publish` for setting custom sequence numbers in IPNS records. This enables advanced use cases like manually coordinating updates across multiple nodes. See `ipfs name publish --help` for details.
-
-#### Improved `ipfs cid`
+#### ๐ Improved `ipfs cid`
Certain `ipfs cid` commands can now be run without a daemon or repository, and return correct exit code 1 on error, making it easier to perform CID conversion in scripts and CI/CD pipelines.
While at it, we also fixed unicode support in `ipfs cid bases --prefix` to correctly show `base256emoji` ๐ :-)
-#### Deprecated `ipfs stats reprovide`
+#### โ ๏ธ Deprecated `ipfs stats reprovide`
The `ipfs stats reprovide` command has moved to `ipfs provide stat`. This was done to organize provider commands in one location.
@@ -217,6 +216,8 @@ Per a suggestion from the IPFS Foundation, Kubo now sends optional anonymized te
**What**: Currently, we send the following anonymous metrics:
+Click to see telemetry metrics example
+
```
"uuid": "",
"agent_version": "kubo/0.37.0-dev",
@@ -245,6 +246,8 @@ Per a suggestion from the IPFS Foundation, Kubo now sends optional anonymized te
"platform_vm": false
```
+
+
The exact data sent for your node can be inspected by setting `GOLOG_LOG_LEVEL="telemetry=debug"`. Users will see an informative message the first time they launch a telemetry-enabled daemon, with time to opt-out before any data is collected. Telemetry data is sent every 24h, with the first collection starting 15 minutes after daemon launch.
**User control**: You can opt-out at any time:
From 6971f9f5577ea5e802e335bc5452f54e971358ee Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Wed, 27 Aug 2025 20:13:02 +0200
Subject: [PATCH 351/499] docs(config): clarify Ipns.DelegatedPublishers auto
behavior
- explain how 'auto' resolution depends on Routing.Type
- add command to inspect effective publishers
- simplify publishing behavior explanation
---
docs/config.md | 19 +++++++++----------
1 file changed, 9 insertions(+), 10 deletions(-)
diff --git a/docs/config.md b/docs/config.md
index 6c3106b81..6e25814ca 100644
--- a/docs/config.md
+++ b/docs/config.md
@@ -1646,22 +1646,21 @@ Type: `flag`
### `Ipns.DelegatedPublishers`
-A list of IPNS publishers to delegate publishing operations to. When configured, IPNS publish operations are sent to these remote HTTP services in addition to or instead of local DHT publishing, depending on [`Routing.Type`](#routingtype) configuration.
+HTTP endpoints for delegated IPNS publishing operations. These endpoints must support the [IPNS API](https://specs.ipfs.tech/routing/http-routing-v1/#ipns-api) from the Delegated Routing V1 HTTP specification.
-These endpoints must support the [IPNS API](https://specs.ipfs.tech/routing/http-routing-v1/#ipns-api) from the Delegated Routing V1 HTTP specification.
-
-The special value `"auto"` uses delegated publishers from [AutoConf](#autoconf) when enabled.
+The special value `"auto"` loads delegated publishers from [AutoConf](#autoconf) when enabled.
**Publishing behavior depends on routing configuration:**
-- `Routing.Type=auto` (default): Uses both DHT and HTTP delegated publishers
-- `Routing.Type=delegated`: Uses only HTTP delegated publishers (DHT disabled)
+- `Routing.Type=auto` (default): Uses DHT for publishing, `"auto"` resolves to empty list
+- `Routing.Type=delegated`: Uses HTTP delegated publishers only, `"auto"` resolves to configured endpoints
-**Command flags control publishing method:**
+When using `"auto"`, inspect the effective publishers with: `ipfs config Ipns.DelegatedPublishers --expand-auto`
-- `ipfs name publish /ipfs/QmHash` - Uses configured routing (default behavior)
-- `ipfs name publish --allow-offline /ipfs/QmHash` - Local datastore only, no network requests
-- `ipfs name publish --delegated-only /ipfs/QmHash` - HTTP delegated publishers only, requires configuration
+**Command flags override publishing behavior:**
+
+- `--allow-offline` - Publishes to local datastore without requiring network connectivity
+- `--allow-delegated` - Uses local datastore and HTTP delegated publishers only (no DHT connectivity required)
For self-hosting, you can run your own `/routing/v1/ipns` endpoint using [someguy](https://github.com/ipfs/someguy/).
From b2f50ec2b2e3ed088fa35483ee3f2f02ca8a22fc Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Wed, 27 Aug 2025 20:20:58 +0200
Subject: [PATCH 352/499] docs: fix typo in v0.37 changelog
---
docs/changelogs/v0.37.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/docs/changelogs/v0.37.md b/docs/changelogs/v0.37.md
index f0f1800af..595076131 100644
--- a/docs/changelogs/v0.37.md
+++ b/docs/changelogs/v0.37.md
@@ -1,4 +1,4 @@
-[#](#) Kubo changelog v0.37
+# Kubo changelog v0.37
@@ -341,7 +341,7 @@ Learn more: [`/kubo/docs/telemetry.md`](https://github.com/ipfs/kubo/blob/master
- feat(namesys/IPNSPublisher): expose ability to set Sequence (#962) ([ipfs/boxo#962](https://github.com/ipfs/boxo/pull/962))
- upgrade to go-libp2p v0.43.0 ([ipfs/boxo#993](https://github.com/ipfs/boxo/pull/993))
- Remove providing Exchange. Call Provide() from relevant places. ([ipfs/boxo#976](https://github.com/ipfs/boxo/pull/976))
- - reprovider: s/inital/initial ([ipfs/boxo#992](https://github.com/ipfs/boxo/pull/992))
+ - reprovider: s/initial/initial ([ipfs/boxo#992](https://github.com/ipfs/boxo/pull/992))
- Release v0.33.1 ([ipfs/boxo#991](https://github.com/ipfs/boxo/pull/991))
- fix(bootstrap): filter-out peers behind relays (#987) ([ipfs/boxo#987](https://github.com/ipfs/boxo/pull/987))
- Bitswap: fix double-worker in connectEventManager. Logging improvements. ([ipfs/boxo#986](https://github.com/ipfs/boxo/pull/986))
From 9cb1d1043d19e4819afe1afb75f96ada921b588a Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Wed, 27 Aug 2025 20:36:43 +0200
Subject: [PATCH 353/499] docs: add v0.38 changelog template
---
docs/changelogs/v0.38.md | 29 +++++++++++++++++++++++++++++
1 file changed, 29 insertions(+)
create mode 100644 docs/changelogs/v0.38.md
diff --git a/docs/changelogs/v0.38.md b/docs/changelogs/v0.38.md
new file mode 100644
index 000000000..3d2de2f9b
--- /dev/null
+++ b/docs/changelogs/v0.38.md
@@ -0,0 +1,29 @@
+# Kubo changelog v0.38
+
+
+
+This release was brought to you by the [Shipyard](https://ipshipyard.com/) team.
+
+- [v0.38.0](#v0380)
+
+## v0.38.0
+
+- [Overview](#overview)
+- [๐ฆ Highlights](#-highlights)
+- [๐ฆ๏ธ Important dependency updates](#-important-dependency-updates)
+- [๐ Changelog](#-changelog)
+- [๐จโ๐ฉโ๐งโ๐ฆ Contributors](#-contributors)
+
+### Overview
+
+### ๐ฆ Highlights
+
+### ๐ฆ๏ธ Important dependency updates
+
+### ๐ Changelog
+
+Full Changelog
+
+
+
+### ๐จโ๐ฉโ๐งโ๐ฆ Contributors
\ No newline at end of file
From 1905aef24bb9410c210127941c8fac302f3a334b Mon Sep 17 00:00:00 2001
From: Marcin Rataj
Date: Fri, 29 Aug 2025 23:53:52 +0200
Subject: [PATCH 354/499] docs: simplify release process (#10870)
* chore: simplify and update
* docs: streamline release checklist
- reduce from 128 to 113 lines while preserving all information
- add clarity on command execution context (which branch/directory)
- improve dangerous operation warnings (point of no return)
- consolidate prerequisites into checklist format
- clarify cherry-pick -x rationale (traceability and deduplication)
- explain why release branches are kept (patch releases)
- add fetch step to prevent stale branch issues
- simplify social media into single optional item
- add STOP checkpoint after tag push for docker verification
* docs: update release checklist last updated reference
* docs: remove GOPATH requirement from release checklist
mkreleaselog now works from any directory where kubo is checked out
* docs: clarify merge process in release checklist
add step to merge master into merge-release branch first
and specify "Create a merge commit" option explicitly
* docs: address PR #10870 feedback
- update forum example to v0.37.0
- add social media post examples from v0.36.0
- add example for creating next release issue
* docs: update blog example to kubo v0.36.0 commit
---
docs/RELEASE_CHECKLIST.md | 217 +++++++++++++++++---------------------
1 file changed, 97 insertions(+), 120 deletions(-)
diff --git a/docs/RELEASE_CHECKLIST.md b/docs/RELEASE_CHECKLIST.md
index 0bf36a2de..8dbb771bf 100644
--- a/docs/RELEASE_CHECKLIST.md
+++ b/docs/RELEASE_CHECKLIST.md
@@ -1,136 +1,113 @@
-
+
# โ
Release Checklist (vX.Y.Z[-rcN])
-## Labels
+**Release types:** RC (Release Candidate) | FINAL | PATCH
-If an item should be executed only for a specific release type, it is labeled with:
+## Prerequisites
--  execute **ONLY** when releasing a Release Candidate
--  execute **ONLY** when releasing a Final Release
--  do **NOT** execute when releasing a Patch Release
+- [ ] [GPG signature](https://docs.github.com/en/authentication/managing-commit-signature-verification) configured in local git and GitHub
+- [ ] [Docker](https://docs.docker.com/get-docker/) installed on your system
+- [ ] [npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) installed on your system
+- [ ] kubo repository cloned locally
+- [ ] **non-PATCH:** Upgrade Go in CI to latest patch from
-Otherwise, it means a step should be executed for **ALL** release types.
+## 1. Prepare Release Branch
-## Before the release
+- [ ] Fetch latest changes: `git fetch origin master release`
+- [ ] Create branch `release-vX.Y.Z` (base from: `master` if Z=0 for new minor/major, `release` if Z>0 for patch)
+- [ ] **RC1 only:** Switch to `master` branch and prepare for next release cycle:
+ - [ ] Update [version.go](https://github.com/ipfs/kubo/blob/master/version.go) to `vX.Y+1.0-dev` (โ ๏ธ double-check Y+1 is correct) ([example PR](https://github.com/ipfs/kubo/pull/9305))
+ - [ ] Create `./docs/changelogs/vX.Y+1.md` and add link in [CHANGELOG.md](https://github.com/ipfs/kubo/blob/master/CHANGELOG.md)
+- [ ] Switch to `release-vX.Y.Z` branch and update [version.go](https://github.com/ipfs/kubo/blob/master/version.go) to `vX.Y.Z(-rcN)` (โ ๏ธ double-check Y matches release) ([example](https://github.com/ipfs/kubo/pull/9394))
+- [ ] Create draft PR: `release-vX.Y.Z` โ `release` ([example](https://github.com/ipfs/kubo/pull/9306))
+- [ ] In `release-vX.Y.Z` branch, cherry-pick commits from `master`: `git cherry-pick -x ` ([example](https://github.com/ipfs/kubo/pull/10636/commits/033de22e3bc6191dbb024ad6472f5b96b34e3ccf))
+ - โ ๏ธ **NOTE:** `-x` flag records original commit SHA for traceability and ensures cleaner merges with deduplicated commits in history
+- [ ] Verify all CI checks on the PR are passing
+- [ ] **FINAL only:** In `release-vX.Y.Z` branch, replace `Changelog` and `Contributors` sections with `./bin/mkreleaselog` stdout (do **NOT** copy stderr)
+- [ ] **FINAL only:** Merge PR (`release-vX.Y.Z` โ `release`) using `Create a merge commit`
+ - โ ๏ธ do **NOT** use `Squash and merge` nor `Rebase and merge` because we need to be able to sign the merge commit
+ - โ ๏ธ do **NOT** delete the `release-vX.Y.Z` branch (needed for future patch releases and git history)
-This section covers tasks to be done ahead of the release.
+## 2. Tag & Publish
-- [ ] Verify you have access to all the services and tools required for the release
- - [ ] [GPG signature](https://docs.github.com/en/authentication/managing-commit-signature-verification) configured in local git and in GitHub
- - [ ] [docker](https://docs.docker.com/get-docker/) installed on your system
- - [ ] [npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) installed on your system
- - [ ] [kubo](https://github.com/ipfs/kubo) checked out under `$(go env GOPATH)/src/github.com/ipfs/kubo`
- - you can also symlink your clone to the expected location by running `mkdir -p $(go env GOPATH)/src/github.com/ipfs && ln -s $(pwd) $(go env GOPATH)/src/github.com/ipfs/kubo`
--  Upgrade Go used in CI to the latest patch release available at
+### Create Tag
+โ ๏ธ **POINT OF NO RETURN:** Once pushed, tags trigger automatic Docker/NPM publishing that cannot be reversed!
+If you're making a release for the first time, do pair programming and have the release reviewer verify all commands.
-## The release
+- [ ] **RC:** From `release-vX.Y.Z` branch: `git tag -s vX.Y.Z-rcN -m 'Prerelease X.Y.Z-rcN'`
+- [ ] **FINAL:** After PR merge, from `release` branch: `git tag -s vX.Y.Z -m 'Release X.Y.Z'`
+- [ ] โ ๏ธ Verify tag is signed and correct: `git show vX.Y.Z(-rcN)`
+- [ ] Push tag: `git push origin vX.Y.Z(-rcN)`
+ - โ ๏ธ do **NOT** use `git push --tags` because it pushes all your local tags
+- [ ] **STOP:** Wait for [Docker build](https://github.com/ipfs/kubo/actions/workflows/docker-image.yml) to complete before proceeding
-This section covers tasks to be done during each release.
+### Publish Artifacts
-### 1. Prepare release branch
+- [ ] **Docker:** Publish to [DockerHub](https://hub.docker.com/r/ipfs/kubo/tags)
+ - [ ] Wait for [Publish docker image](https://github.com/ipfs/kubo/actions/workflows/docker-image.yml) workflow triggered by tag push
+ - [ ] Verify image is available on [Docker Hub โ tags](https://hub.docker.com/r/ipfs/kubo/tags)
+- [ ] **dist.ipfs.tech:** Publish to [dist.ipfs.tech](https://dist.ipfs.tech)
+ - [ ] Check out [ipfs/distributions](https://github.com/ipfs/distributions)
+ - [ ] Create branch: `git checkout -b release-kubo-X.Y.Z(-rcN)`
+ - [ ] Verify `.tool-versions` golang matches [Kubo's CI](https://github.com/ipfs/kubo/blob/master/.github/workflows/gotest.yml) `go-version:` (update if needed)
+ - [ ] Run: `./dist.sh add-version kubo vX.Y.Z(-rcN)` ([usage](https://github.com/ipfs/distributions#usage))
+ - [ ] Create and merge PR (updates `dists/kubo/versions`, **FINAL** also updates `dists/kubo/current` - [example](https://github.com/ipfs/distributions/pull/1125))
+ - [ ] Wait for [CI workflow](https://github.com/ipfs/distributions/actions/workflows/main.yml) triggered by merge
+ - [ ] Verify release on [dist.ipfs.tech](https://dist.ipfs.tech/#kubo)
+- [ ] **NPM:** Publish to [NPM](https://www.npmjs.com/package/kubo?activeTab=versions)
+ - [ ] Manually dispatch [Release to npm](https://github.com/ipfs/npm-kubo/actions/workflows/main.yml) workflow if not auto-triggered
+ - [ ] Verify release on [NPM](https://www.npmjs.com/package/kubo?activeTab=versions)
+- [ ] **GitHub Release:** Publish to [GitHub](https://github.com/ipfs/kubo/releases)
+ - [ ] [Create release](https://docs.github.com/en/repositories/releasing-projects-on-github/managing-releases-in-a-repository#creating-a-release) ([RC example](https://github.com/ipfs/kubo/releases/tag/v0.36.0-rc1), [FINAL example](https://github.com/ipfs/kubo/releases/tag/v0.35.0))
+ - [ ] Use tag `vX.Y.Z(-rcN)`
+ - [ ] Link to release issue
+ - [ ] **RC:** Link to changelog, check `This is a pre-release`
+ - [ ] **FINAL:** Copy changelog content (without header), do **NOT** check pre-release
+ - [ ] Run [sync-release-assets](https://github.com/ipfs/kubo/actions/workflows/sync-release-assets.yml) workflow
+ - [ ] Verify assets are attached to the GitHub release
-- [ ] Prepare the release branch and update version numbers accordingly
- - [ ] create a new branch `release-vX.Y.Z`
- - use `master` as base if `Z == 0`
- - use `release` as base if `Z > 0`
- - [ ]  update the `CurrentVersionNumber` in [version.go](version.go) in the `master` branch to `vX.Y+1.0-dev` ([example](https://github.com/ipfs/kubo/pull/9305))
- - [ ] update the `CurrentVersionNumber` in [version.go](version.go) in the `release-vX.Y.Z` branch to `vX.Y.Z(-rcN)` ([example](https://github.com/ipfs/kubo/pull/9394))
- - [ ] create a draft PR from `release-vX.Y.Z` to `release` ([example](https://github.com/ipfs/kubo/pull/9306))
- - [ ] Cherry-pick commits from `master` to the `release-vX.Y.Z` using `git cherry-pick -x ` ([example](https://github.com/ipfs/kubo/pull/10636/commits/033de22e3bc6191dbb024ad6472f5b96b34e3ccf))
- - **NOTE:** cherry-picking with `-x` is important
- - [ ] verify all CI checks on the PR from `release-vX.Y.Z` to `release` are passing
- - [ ]  Replace the `Changelog` and `Contributors` sections of the [changelog](docs/changelogs/vX.Y.md) with the stdout (do **NOT** copy the stderr) of `./bin/mkreleaselog`.
- - **NOTE:** `mkreleaselog` expects your `$GOPATH/src/github.com/ipfs/kubo` to include latest commits from `release-vX.Y.Z`
- - [ ]  Merge the PR from `release-vX.Y.Z` to `release` using the `Create a merge commit`
- - do **NOT** use `Squash and merge` nor `Rebase and merge` because we need to be able to sign the merge commit
- - do **NOT** delete the `release-vX.Y.Z` branch
+## 3. Post-Release
-### 2. Tag release
+### Technical Tasks
-- [ ] Create the release tag
- - โ ๏ธ **NOTE:** This is a dangerous operation! Go and Docker publishing are difficult to reverse! Have the release reviewer verify all the commands marked with !
- - [ ]  tag the HEAD commit using `git tag -s vX.Y.Z(-rcN) -m 'Prerelease X.Y.Z(-rcN)'`
- - [ ]  tag the HEAD commit of the `release` branch using `git tag -s vX.Y.Z -m 'Release X.Y.Z'`
- - [ ] โ ๏ธ verify the tag is signed and tied to the correct commit using `git show vX.Y.Z(-rcN)`
- - [ ] push the tag to GitHub using `git push origin vX.Y.Z(-rcN)`
- - โ ๏ธ do **NOT** use `git push --tags` because it pushes all your local tags
-
-### 3. Publish
-
-- [ ] Publish Docker image to [DockerHub](https://hub.docker.com/r/ipfs/kubo/tags)
- - [ ] Wait for [Publish docker image](https://github.com/ipfs/kubo/actions/workflows/docker-image.yml) workflow run initiated by the tag push to finish
- - [ ] verify the image is available on [Docker Hub โ tags](https://hub.docker.com/r/ipfs/kubo/tags)
-- [ ] Publish the release to [dist.ipfs.tech](https://dist.ipfs.tech)
- - [ ] check out [ipfs/distributions](https://github.com/ipfs/distributions)
- - [ ] create new branch: run `git checkout -b release-kubo-X.Y.Z(-rcN)`
- - [ ] Verify [ipfs/distributions](https://github.com/ipfs/distributions)'s `.tool-versions`'s `golang` entry is set to the [latest go release](https://go.dev/doc/devel/release) on the major go branch [Kubo is being tested on](https://github.com/ipfs/kubo/blob/master/.github/workflows/gotest.yml) (see `go-version:`). If not, update `.tool-versions` to match the latest golang.
- - [ ] run `./dist.sh add-version kubo vX.Y.Z(-rcN)` to add the new version to the `versions` file ([usage](https://github.com/ipfs/distributions#usage))
- - [ ] create and merge the PR which updates `dists/kubo/versions` (**NOTE:**  will also have `dists/kubo/current` โ [example](https://github.com/ipfs/distributions/pull/1125))
- - [ ] wait for the [CI](https://github.com/ipfs/distributions/actions/workflows/main.yml) workflow run initiated by the merge to master to finish
- - [ ] verify the release is available on [dist.ipfs.tech](https://dist.ipfs.tech/#kubo)
-- [ ] Publish the release to [NPM](https://www.npmjs.com/package/kubo?activeTab=versions)
- - [ ] manually dispatch the [Release to npm](https://github.com/ipfs/npm-kubo/actions/workflows/main.yml) workflow if it was not executed already and verify it discovered the new release
- - [ ] verify the release is available on [NPM](https://www.npmjs.com/package/kubo?activeTab=versions)
-- [ ] Publish the release to [GitHub kubo/releases](https://github.com/ipfs/kubo/releases)
- - [ ] [create](https://docs.github.com/en/repositories/releasing-projects-on-github/managing-releases-in-a-repository#creating-a-release) a new release
- - [RC example](https://github.com/ipfs/kubo/releases/tag/v0.36.0-rc1)
- - [FINAL example](https://github.com/ipfs/kubo/releases/tag/v0.35.0)
- - [ ] use the `vX.Y.Z(-rcN)` tag
- - [ ] link to the release issue
- - [ ]  link to the changelog in the description
- - [ ]  check the `This is a pre-release` checkbox
- - [ ]  copy the changelog (without the header) in the description
- - [ ]  do **NOT** check the `This is a pre-release` checkbox
- - [ ] run the [sync-release-assets](https://github.com/ipfs/kubo/actions/workflows/sync-release-assets.yml) workflow and verify the release assets are attached to the GitHub release
-
-### 4. After Publishing
-
-- [ ]  Merge the [release](https://github.com/ipfs/kubo/tree/release) branch back into [master](https://github.com/ipfs/kubo/tree/master)
- - [ ] Create a new branch `merge-release-vX.Y.Z` from `release`
- - [ ] Create the next [`./docs/changelogs/vA.B.md`](https://github.com/ipfs/kubo/blob/master/docs/changelogs/) and link to the new changelog from the [`./CHANGELOG.md`](https://github.com/ipfs/kubo/blob/master/CHANGELOG.md) file
- - [ ] Create and merge a PR from `merge-release-vX.Y.Z` to `master`
- - โ ๏ธ do **NOT** use `Squash and merge` nor `Rebase and merge` because we need to be able to sign the merge commit
- - โ ๏ธ **NOTE:** make sure to ignore the changes to [version.go](version.go) (keep the `-dev` in `master`)
+- [ ] **FINAL only:** Merge `release` โ `master`
+ - [ ] Create branch `merge-release-vX.Y.Z` from `release`
+ - [ ] Merge `master` to `merge-release-vX.Y.Z` first, and resolve conflict in `version.go`
+ - โ ๏ธ **NOTE:** make sure to ignore the changes to [version.go](https://github.com/ipfs/kubo/blob/master/version.go) (keep the `-dev` in `master`)
+ - [ ] Create and merge PR from `merge-release-vX.Y.Z` to `master` using `Create a merge commit`
+ - โ ๏ธ do **NOT** use `Squash and merge` nor `Rebase and merge` because we want to preserve original commit history
- [ ] Update [ipshipyard/waterworks-infra](https://github.com/ipshipyard/waterworks-infra)
- - [ ] Update Kubo staging environment, see the [Running Kubo tests on staging](https://www.notion.so/Running-Kubo-tests-on-staging-488578bb46154f9bad982e4205621af8) for details.
- - [ ]  Test last release against the current RC
- - [ ]  Test last release against the current one
- - [ ] Update collab cluster boxes to the tagged release (final or RC)
- - [ ] Update libp2p bootstrappers to the tagged release (final or RC)
-- [ ] Promote the release
- - [ ] create an [IPFS Discourse](https://discuss.ipfs.tech) topic ([prerelease example](https://discuss.ipfs.tech/t/kubo-v0-16-0-rc1-release-candidate-is-out/15248), [release example](https://discuss.ipfs.tech/t/kubo-v0-16-0-release-is-out/15249))
- - [ ] use `Kubo vX.Y.Z(-rcN) is out!` as the title and `kubo` as tags
- - [ ] repeat the title as a heading (`##`) in the description
- - [ ] link to the GitHub Release, binaries on IPNS, docker pull command and release notes in the description
- - [ ] pin the [IPFS Discourse](https://discuss.ipfs.tech) topic globally, you can make the topic a banner if there is no banner already
- - [ ] verify the [IPFS Discourse](https://discuss.ipfs.tech) topic was copied to:
- - [ ] [#ipfs-chatter](https://discord.com/channels/669268347736686612/669268347736686615) in IPFS Discord
- - [ ] [#ipfs-chatter](https://filecoinproject.slack.com/archives/C018EJ8LWH1) in FIL Slack
- - [ ] [#ipfs-chatter:ipfs.io](https://matrix.to/#/#ipfs-chatter:ipfs.io) in Matrix
- - [ ]  Add the link to the [IPFS Discourse](https://discuss.ipfs.tech) topic to the [GitHub Release](https://github.com/ipfs/kubo/releases/tag/vX.Y.Z(-rcN)) description ([example](https://github.com/ipfs/kubo/releases/tag/v0.17.0))
- - [ ]  create an issue comment mentioning early testers on the release issue ([example](https://github.com/ipfs/kubo/issues/9319#issuecomment-1311002478))
- - [ ]  create an issue comment linking to the release on the release issue ([example](https://github.com/ipfs/kubo/issues/9417#issuecomment-1400740975))
- - [ ]   promote on bsky.app ([example](https://bsky.app/profile/ipshipyard.com/post/3lh2brzrwbs2c))
- - [ ]   promote on x.com ([example](https://x.com/ipshipyard/status/1885346348808929609))
- - [ ]   post the link to the [GitHub Release](https://github.com/ipfs/kubo/releases/tag/vX.Y.Z(-rcN)) to [Reddit](https://reddit.com/r/ipfs) ([example](https://www.reddit.com/r/ipfs/comments/9x0q0k/kubo_v0160_release_is_out/))
-- [ ] Manually smoke-test the new version with [IPFS Companion Browser Extension](https://docs.ipfs.tech/install/ipfs-companion/)
-- [ ] Update Kubo in [ipfs-desktop](https://github.com/ipfs/ipfs-desktop)
- - [ ] create a PR which updates `kubo` version to the tagged version in `package.json` and `package-lock.json`
- - [ ]  switch to final release and merge
-- [ ]  Update Kubo docs at docs.ipfs.tech:
- - [ ]  run the [update-on-new-ipfs-tag.yml](https://github.com/ipfs/ipfs-docs/actions/workflows/update-on-new-ipfs-tag.yml) workflow
- - [ ]  merge the PR created by the [update-on-new-ipfs-tag.yml](https://github.com/ipfs/ipfs-docs/actions/workflows/update-on-new-ipfs-tag.yml) workflow run
-
-- [ ]  Create a blog entry on [blog.ipfs.tech](https://blog.ipfs.tech)
- - [ ]  create a PR which adds a release note for the new Kubo version ([example](https://github.com/ipfs/ipfs-blog/pull/529))
- - [ ]  merge the PR
- - [ ]  verify the blog entry was published
-- [ ]   Create a dependency update PR
- - [ ]   check out [ipfs/kubo](https://github.com/ipfs/kubo)
- - [ ]   go over direct dependencies from `go.mod` in the root directory (NOTE: do not run `go get -u` as it will upgrade indirect dependencies which may cause problems)
- - [ ]   run `make mod_tidy`
- - [ ]   create a PR which updates `go.mod` and `go.sum`
- - [ ]   add the PR to the next release milestone
-- [ ]   Create the next release issue
-- [ ]  Close the release issue
+ - [ ] Update Kubo staging environment ([Running Kubo tests on staging](https://www.notion.so/Running-Kubo-tests-on-staging-488578bb46154f9bad982e4205621af8))
+ - [ ] **RC:** Test last release against current RC
+ - [ ] **FINAL:** Test last release against current one
+ - [ ] Update collab cluster boxes to the tagged release
+ - [ ] Update libp2p bootstrappers to the tagged release
+- [ ] Smoke test with [IPFS Companion Browser Extension](https://docs.ipfs.tech/install/ipfs-companion/)
+- [ ] Update [ipfs-desktop](https://github.com/ipfs/ipfs-desktop)
+ - [ ] Create PR updating kubo version in `package.json` and `package-lock.json`
+ - [ ] **FINAL only:** Merge and create/request new release
+- [ ] **FINAL only:** Update [docs.ipfs.tech](https://docs.ipfs.tech/): run [update-on-new-ipfs-tag.yml](https://github.com/ipfs/ipfs-docs/actions/workflows/update-on-new-ipfs-tag.yml) workflow and merge the PR
+
+### Promotion
+
+- [ ] Create [IPFS Discourse](https://discuss.ipfs.tech) topic ([RC example](https://discuss.ipfs.tech/t/kubo-v0-16-0-rc1-release-candidate-is-out/15248), [FINAL example](https://discuss.ipfs.tech/t/kubo-v0-37-0-is-out/19673))
+ - [ ] Title: `Kubo vX.Y.Z(-rcN) is out!`, tag: `kubo`
+ - [ ] Use title as heading (`##`) in description
+ - [ ] Include: GitHub release link, IPNS binaries, docker pull command, release notes
+ - [ ] Pin topic globally (make banner if no existing banner)
+- [ ] Verify bot posted to [#ipfs-chatter](https://discord.com/channels/669268347736686612/669268347736686615) (Discord) or [#ipfs-chatter:ipfs.io](https://matrix.to/#/#ipfs-chatter:ipfs.io) (Matrix)
+- [ ] **RC only:** Comment on release issue mentioning early testers ([example](https://github.com/ipfs/kubo/issues/9319#issuecomment-1311002478))
+- [ ] **FINAL only:** Comment on release issue with link ([example](https://github.com/ipfs/kubo/issues/9417#issuecomment-1400740975))
+- [ ] **FINAL only:** Create [blog.ipfs.tech](https://blog.ipfs.tech) entry ([example](https://github.com/ipfs/ipfs-blog/commit/32040d1e90279f21bad56b924fe4710bba5ba043))
+- [ ] **FINAL non-PATCH:** (optional) Post on social media ([bsky](https://bsky.app/profile/ipshipyard.com/post/3ltxcsrbn5s2k), [x.com](https://x.com/ipshipyard/status/1944867893226635603), [Reddit](https://www.reddit.com/r/ipfs/comments/1lzy6ze/release_v0360_ipfskubo/))
+
+### Final Steps
+
+- [ ] **FINAL non-PATCH:** Create dependency update PR
+ - [ ] Review direct dependencies from root `go.mod` (โ ๏ธ do **NOT** run `go get -u` as it will upgrade indirect dependencies which may cause problems)
+ - [ ] Run `make mod_tidy`
+ - [ ] Create PR with `go.mod` and `go.sum` updates
+ - [ ] Add PR to next release milestone
+- [ ] **FINAL non-PATCH:** Create next release issue ([example](https://github.com/ipfs/kubo/issues/10816))
+- [ ] **FINAL only:** Close release issue
\ No newline at end of file
From 17b0085fdd25de076303b083b6385f884c712cf6 Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Tue, 2 Sep 2025 13:13:01 -0700
Subject: [PATCH 355/499] repo: use config api to get node root path (#10934)
Replaces #8964
Closes #8848
---
cmd/ipfswatch/main.go | 11 +++++-
core/commands/sysdiag.go | 31 +++++++---------
repo/fsrepo/migrations/fetch_test.go | 15 ++------
repo/fsrepo/migrations/ipfsdir.go | 18 ++-------
repo/fsrepo/migrations/ipfsdir_test.go | 45 ++++++++++++-----------
repo/fsrepo/migrations/migrations_test.go | 14 ++-----
6 files changed, 57 insertions(+), 77 deletions(-)
diff --git a/cmd/ipfswatch/main.go b/cmd/ipfswatch/main.go
index 3178cf564..916a420d1 100644
--- a/cmd/ipfswatch/main.go
+++ b/cmd/ipfswatch/main.go
@@ -13,6 +13,7 @@ import (
"syscall"
commands "github.com/ipfs/kubo/commands"
+ "github.com/ipfs/kubo/config"
core "github.com/ipfs/kubo/core"
coreapi "github.com/ipfs/kubo/core/coreapi"
corehttp "github.com/ipfs/kubo/core/corehttp"
@@ -25,10 +26,18 @@ import (
var (
http = flag.Bool("http", false, "expose IPFS HTTP API")
- repoPath = flag.String("repo", os.Getenv("IPFS_PATH"), "IPFS_PATH to use")
+ repoPath *string
watchPath = flag.String("path", ".", "the path to watch")
)
+func init() {
+ ipfsPath, err := config.PathRoot()
+ if err != nil {
+ ipfsPath = os.Getenv(config.EnvDir)
+ }
+ repoPath = flag.String("repo", ipfsPath, "repo path to use")
+}
+
func main() {
flag.Parse()
diff --git a/core/commands/sysdiag.go b/core/commands/sysdiag.go
index 123dcb973..5a7c41ce9 100644
--- a/core/commands/sysdiag.go
+++ b/core/commands/sysdiag.go
@@ -2,14 +2,13 @@ package commands
import (
"os"
- "path"
"runtime"
+ "github.com/ipfs/go-ipfs-cmds"
version "github.com/ipfs/kubo"
+ "github.com/ipfs/kubo/config"
"github.com/ipfs/kubo/core"
cmdenv "github.com/ipfs/kubo/core/commands/cmdenv"
-
- cmds "github.com/ipfs/go-ipfs-cmds"
manet "github.com/multiformats/go-multiaddr/net"
sysi "github.com/whyrusleeping/go-sysinfo"
)
@@ -84,32 +83,28 @@ func runtimeInfo(out map[string]interface{}) error {
func envVarInfo(out map[string]interface{}) error {
ev := make(map[string]interface{})
ev["GOPATH"] = os.Getenv("GOPATH")
- ev["IPFS_PATH"] = os.Getenv("IPFS_PATH")
+ ev[config.EnvDir] = os.Getenv(config.EnvDir)
out["environment"] = ev
return nil
}
-func ipfsPath() string {
- p := os.Getenv("IPFS_PATH")
- if p == "" {
- p = path.Join(os.Getenv("HOME"), ".ipfs")
- }
- return p
-}
-
func diskSpaceInfo(out map[string]interface{}) error {
- di := make(map[string]interface{})
- dinfo, err := sysi.DiskUsage(ipfsPath())
+ pathRoot, err := config.PathRoot()
+ if err != nil {
+ return err
+ }
+ dinfo, err := sysi.DiskUsage(pathRoot)
if err != nil {
return err
}
- di["fstype"] = dinfo.FsType
- di["total_space"] = dinfo.Total
- di["free_space"] = dinfo.Free
+ out["diskinfo"] = map[string]interface{}{
+ "fstype": dinfo.FsType,
+ "total_space": dinfo.Total,
+ "free_space": dinfo.Free,
+ }
- out["diskinfo"] = di
return nil
}
diff --git a/repo/fsrepo/migrations/fetch_test.go b/repo/fsrepo/migrations/fetch_test.go
index 6e87c966b..c09b3444a 100644
--- a/repo/fsrepo/migrations/fetch_test.go
+++ b/repo/fsrepo/migrations/fetch_test.go
@@ -20,10 +20,7 @@ func TestGetDistPath(t *testing.T) {
}
testDist := "/unit/test/dist"
- err := os.Setenv(envIpfsDistPath, testDist)
- if err != nil {
- panic(err)
- }
+ t.Setenv(envIpfsDistPath, testDist)
defer func() {
os.Unsetenv(envIpfsDistPath)
}()
@@ -139,18 +136,12 @@ func TestFetchBinary(t *testing.T) {
if err != nil {
panic(err)
}
- err = os.Setenv("TMPDIR", tmpDir)
- if err != nil {
- panic(err)
- }
+ t.Setenv("TMPDIR", tmpDir)
_, err = FetchBinary(ctx, fetcher, "go-ipfs", "v1.0.0", "ipfs", tmpDir)
if !os.IsPermission(err) {
t.Error("expected 'permission' error, got:", err)
}
- err = os.Setenv("TMPDIR", "/tmp")
- if err != nil {
- panic(err)
- }
+ t.Setenv("TMPDIR", "/tmp")
err = os.Chmod(tmpDir, 0o755)
if err != nil {
panic(err)
diff --git a/repo/fsrepo/migrations/ipfsdir.go b/repo/fsrepo/migrations/ipfsdir.go
index 8cb087d53..88b39459b 100644
--- a/repo/fsrepo/migrations/ipfsdir.go
+++ b/repo/fsrepo/migrations/ipfsdir.go
@@ -8,12 +8,11 @@ import (
"strconv"
"strings"
+ "github.com/ipfs/kubo/config"
"github.com/ipfs/kubo/misc/fsutil"
)
const (
- envIpfsPath = "IPFS_PATH"
- defIpfsDir = ".ipfs"
versionFile = "version"
)
@@ -24,25 +23,16 @@ const (
func IpfsDir(dir string) (string, error) {
var err error
if dir == "" {
- dir = os.Getenv(envIpfsPath)
- }
- if dir != "" {
- dir, err = fsutil.ExpandHome(dir)
+ dir, err = config.PathRoot()
if err != nil {
return "", err
}
- return dir, nil
}
-
- home, err := os.UserHomeDir()
+ dir, err = fsutil.ExpandHome(dir)
if err != nil {
return "", err
}
- if home == "" {
- return "", errors.New("could not determine IPFS_PATH, home dir not set")
- }
-
- return filepath.Join(home, defIpfsDir), nil
+ return dir, nil
}
// CheckIpfsDir gets the ipfs directory and checks that the directory exists.
diff --git a/repo/fsrepo/migrations/ipfsdir_test.go b/repo/fsrepo/migrations/ipfsdir_test.go
index e4e626794..c94ebc586 100644
--- a/repo/fsrepo/migrations/ipfsdir_test.go
+++ b/repo/fsrepo/migrations/ipfsdir_test.go
@@ -4,24 +4,28 @@ import (
"os"
"path/filepath"
"testing"
-)
-var (
- fakeHome string
- fakeIpfs string
+ "github.com/ipfs/kubo/config"
)
func TestRepoDir(t *testing.T) {
- fakeHome = t.TempDir()
- os.Setenv("HOME", fakeHome)
- fakeIpfs = filepath.Join(fakeHome, ".ipfs")
+ fakeHome := t.TempDir()
+ t.Setenv("HOME", fakeHome)
+ fakeIpfs := filepath.Join(fakeHome, ".ipfs")
+ t.Setenv(config.EnvDir, fakeIpfs)
- t.Run("testIpfsDir", testIpfsDir)
- t.Run("testCheckIpfsDir", testCheckIpfsDir)
- t.Run("testRepoVersion", testRepoVersion)
+ t.Run("testIpfsDir", func(t *testing.T) {
+ testIpfsDir(t, fakeIpfs)
+ })
+ t.Run("testCheckIpfsDir", func(t *testing.T) {
+ testCheckIpfsDir(t, fakeIpfs)
+ })
+ t.Run("testRepoVersion", func(t *testing.T) {
+ testRepoVersion(t, fakeIpfs)
+ })
}
-func testIpfsDir(t *testing.T) {
+func testIpfsDir(t *testing.T, fakeIpfs string) {
_, err := CheckIpfsDir("")
if err == nil {
t.Fatal("expected error when no .ipfs directory to find")
@@ -37,16 +41,16 @@ func testIpfsDir(t *testing.T) {
t.Fatal(err)
}
if dir != fakeIpfs {
- t.Fatal("wrong ipfs directory:", dir)
+ t.Fatalf("wrong ipfs directory: got %s, expected %s", dir, fakeIpfs)
}
- os.Setenv(envIpfsPath, "~/.ipfs")
+ t.Setenv(config.EnvDir, "~/.ipfs")
dir, err = IpfsDir("")
if err != nil {
t.Fatal(err)
}
if dir != fakeIpfs {
- t.Fatal("wrong ipfs directory:", dir)
+ t.Fatalf("wrong ipfs directory: got %s, expected %s", dir, fakeIpfs)
}
_, err = IpfsDir("~somesuer/foo")
@@ -54,15 +58,12 @@ func testIpfsDir(t *testing.T) {
t.Fatal("expected error with user-specific home dir")
}
- err = os.Setenv(envIpfsPath, "~somesuer/foo")
- if err != nil {
- panic(err)
- }
+ t.Setenv(config.EnvDir, "~somesuer/foo")
_, err = IpfsDir("~somesuer/foo")
if err == nil {
t.Fatal("expected error with user-specific home dir")
}
- err = os.Unsetenv(envIpfsPath)
+ err = os.Unsetenv(config.EnvDir)
if err != nil {
panic(err)
}
@@ -72,7 +73,7 @@ func testIpfsDir(t *testing.T) {
t.Fatal(err)
}
if dir != fakeIpfs {
- t.Fatal("wrong ipfs directory:", dir)
+ t.Fatalf("wrong ipfs directory: got %s, expected %s", dir, fakeIpfs)
}
_, err = IpfsDir("")
@@ -81,7 +82,7 @@ func testIpfsDir(t *testing.T) {
}
}
-func testCheckIpfsDir(t *testing.T) {
+func testCheckIpfsDir(t *testing.T, fakeIpfs string) {
_, err := CheckIpfsDir("~somesuer/foo")
if err == nil {
t.Fatal("expected error with user-specific home dir")
@@ -101,7 +102,7 @@ func testCheckIpfsDir(t *testing.T) {
}
}
-func testRepoVersion(t *testing.T) {
+func testRepoVersion(t *testing.T, fakeIpfs string) {
badDir := "~somesuer/foo"
_, err := RepoVersion(badDir)
if err == nil {
diff --git a/repo/fsrepo/migrations/migrations_test.go b/repo/fsrepo/migrations/migrations_test.go
index f690290f8..c84e2d228 100644
--- a/repo/fsrepo/migrations/migrations_test.go
+++ b/repo/fsrepo/migrations/migrations_test.go
@@ -33,9 +33,7 @@ func TestFindMigrations(t *testing.T) {
createFakeBin(i-1, i, tmpDir)
}
- origPath := os.Getenv("PATH")
- os.Setenv("PATH", tmpDir)
- defer os.Setenv("PATH", origPath)
+ t.Setenv("PATH", tmpDir)
migs, bins, err = findMigrations(ctx, 0, 5)
if err != nil {
@@ -80,9 +78,7 @@ func TestFindMigrationsReverse(t *testing.T) {
createFakeBin(i-1, i, tmpDir)
}
- origPath := os.Getenv("PATH")
- os.Setenv("PATH", tmpDir)
- defer os.Setenv("PATH", origPath)
+ t.Setenv("PATH", tmpDir)
migs, bins, err = findMigrations(ctx, 5, 0)
if err != nil {
@@ -144,10 +140,8 @@ func TestFetchMigrations(t *testing.T) {
}
func TestRunMigrations(t *testing.T) {
- fakeHome := t.TempDir()
-
- os.Setenv("HOME", fakeHome)
- fakeIpfs := filepath.Join(fakeHome, ".ipfs")
+ fakeIpfs := filepath.Join(t.TempDir(), ".ipfs")
+ t.Setenv(config.EnvDir, fakeIpfs)
err := os.Mkdir(fakeIpfs, os.ModePerm)
if err != nil {
From 46cc640fc60baabca6b32650e87c05d91c88a9d9 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 4 Sep 2025 00:39:58 -0700
Subject: [PATCH 356/499] chore(deps): bump codecov/codecov-action from 5.4.3
to 5.5.0 (#10936)
Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 5.4.3 to 5.5.0.
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codecov/codecov-action/compare/18283e04ce6e62d37312384ff67231eb8fd56d24...fdcc8476540edceab3de004e990f80d881c6cc00)
---
updated-dependencies:
- dependency-name: codecov/codecov-action
dependency-version: 5.5.0
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
---
.github/workflows/gotest.yml | 2 +-
.github/workflows/sharness.yml | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/gotest.yml b/.github/workflows/gotest.yml
index 34d86352b..44fae92f8 100644
--- a/.github/workflows/gotest.yml
+++ b/.github/workflows/gotest.yml
@@ -45,7 +45,7 @@ jobs:
make -j "$PARALLEL" test/unit/gotest.junit.xml &&
[[ ! $(jq -s -c 'map(select(.Action == "fail")) | .[]' test/unit/gotest.json) ]]
- name: Upload coverage to Codecov
- uses: codecov/codecov-action@18283e04ce6e62d37312384ff67231eb8fd56d24 # v5.4.3
+ uses: codecov/codecov-action@fdcc8476540edceab3de004e990f80d881c6cc00 # v5.5.0
if: failure() || success()
with:
name: unittests
diff --git a/.github/workflows/sharness.yml b/.github/workflows/sharness.yml
index 9295bc1c1..ec387a0f4 100644
--- a/.github/workflows/sharness.yml
+++ b/.github/workflows/sharness.yml
@@ -55,7 +55,7 @@ jobs:
# increasing parallelism beyond 10 doesn't speed up the tests much
PARALLEL: ${{ github.repository == 'ipfs/kubo' && 10 || 3 }}
- name: Upload coverage report
- uses: codecov/codecov-action@18283e04ce6e62d37312384ff67231eb8fd56d24 # v5.4.3
+ uses: codecov/codecov-action@fdcc8476540edceab3de004e990f80d881c6cc00 # v5.5.0
if: failure() || success()
with:
name: sharness
From 72280f31d4fd06038cfac312c8ce1c12e44884a7 Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Thu, 4 Sep 2025 16:30:12 -0700
Subject: [PATCH 357/499] fix ctrl-c prompt during run migrations prompt
(#10947)
* fix ctrl-c prompt during run migrations prompt
At "Run migrations" prompt, hitting ctrl-c does not show the "(Hit ctrl-c again to force-shutdown the daemon.)" prompt, even though a 2nd ctrl-c does cause the daemon to exit.
The problem is that the goroutine that displays the prompt only run after the prompt to "Run migrations", so hitting ctrl-c during the "Run migrations" prompt does not show the "(Hit ctrl-c again to force-shutdown the daemon.)" prompt.
This PR fixes the problem by starting the goroutine to display the "(Hit ctrl-c again to force-shutdown the daemon.)" prompt sooner, before the "Run mirgarions" prompt. Additionally, this PR also disables showing the ctrl-c prompt if the daemon function has already exited, in which case only the exit message should be shown.
Closes #3157
* exit immediately if ctrl-c during migration prompt
---
cmd/ipfs/kubo/daemon.go | 10 ++++++++++
cmd/ipfs/util/signal.go | 8 +-------
2 files changed, 11 insertions(+), 7 deletions(-)
diff --git a/cmd/ipfs/kubo/daemon.go b/cmd/ipfs/kubo/daemon.go
index 6c594912d..37f683fd5 100644
--- a/cmd/ipfs/kubo/daemon.go
+++ b/cmd/ipfs/kubo/daemon.go
@@ -284,6 +284,15 @@ func daemonFunc(req *cmds.Request, re cmds.ResponseEmitter, env cmds.Environment
default:
return err
case fsrepo.ErrNeedMigration:
+ migrationDone := make(chan struct{})
+ go func() {
+ select {
+ case <-req.Context.Done():
+ os.Exit(1)
+ case <-migrationDone:
+ }
+ }()
+
domigrate, found := req.Options[migrateKwd].(bool)
// Get current repo version for more informative message
@@ -299,6 +308,7 @@ func daemonFunc(req *cmds.Request, re cmds.ResponseEmitter, env cmds.Environment
if !found {
domigrate = YesNoPrompt("Run migrations now? [y/N]")
}
+ close(migrationDone)
if !domigrate {
fmt.Printf("Not running migrations on repository at %s. Re-run daemon with --migrate or see 'ipfs repo migrate --help'\n", cctx.ConfigRoot)
diff --git a/cmd/ipfs/util/signal.go b/cmd/ipfs/util/signal.go
index 2cfd0d5bd..3cbe2481d 100644
--- a/cmd/ipfs/util/signal.go
+++ b/cmd/ipfs/util/signal.go
@@ -64,13 +64,7 @@ func SetupInterruptHandler(ctx context.Context) (io.Closer, context.Context) {
switch count {
case 1:
fmt.Println() // Prevent un-terminated ^C character in terminal
-
- ih.wg.Add(1)
- go func() {
- defer ih.wg.Done()
- cancelFunc()
- }()
-
+ cancelFunc()
default:
fmt.Println("Received another interrupt before graceful shutdown, terminating...")
os.Exit(-1)
From 6faa9d85bf403fd768bdb0b008cfccbb06df3486 Mon Sep 17 00:00:00 2001
From: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Date: Mon, 8 Sep 2025 10:20:24 -0700
Subject: [PATCH 358/499] close files opened during migration (#10956)
---
cmd/ipfs/kubo/add_migrations.go | 2 ++
repo/fsrepo/fsrepo.go | 1 +
2 files changed, 3 insertions(+)
diff --git a/cmd/ipfs/kubo/add_migrations.go b/cmd/ipfs/kubo/add_migrations.go
index d77d0afdf..e7cb135f7 100644
--- a/cmd/ipfs/kubo/add_migrations.go
+++ b/cmd/ipfs/kubo/add_migrations.go
@@ -83,10 +83,12 @@ func addMigrationFiles(ctx context.Context, node *core.IpfsNode, paths []string,
fi, err := f.Stat()
if err != nil {
+ f.Close()
return err
}
ipfsPath, err := ufs.Add(ctx, files.NewReaderStatFile(f, fi), options.Unixfs.Pin(pin, ""))
+ f.Close()
if err != nil {
return err
}
diff --git a/repo/fsrepo/fsrepo.go b/repo/fsrepo/fsrepo.go
index 671621ef3..718d5614d 100644
--- a/repo/fsrepo/fsrepo.go
+++ b/repo/fsrepo/fsrepo.go
@@ -393,6 +393,7 @@ func (r *FSRepo) SetAPIAddr(addr ma.Multiaddr) error {
}
if _, err = f.WriteString(addr.String()); err != nil {
+ f.Close()
return err
}
if err = f.Close(); err != nil {
From 906ce802bf8c619f67d9ed1242d78b1010740c09 Mon Sep 17 00:00:00 2001
From: Marcin Rataj