From 23224bcda6d17b6df0deed336fa4daa2af6990d4 Mon Sep 17 00:00:00 2001 From: Daniel N <2color@users.noreply.github.com> Date: Fri, 14 Feb 2025 12:51:21 +0100 Subject: [PATCH] wip --- js-peer/package-lock.json | 291 ++++++++++++++++++++--------------- js-peer/package.json | 1 + js-peer/src/lib/constants.ts | 8 +- js-peer/src/lib/libp2p.ts | 57 +++---- 4 files changed, 193 insertions(+), 164 deletions(-) diff --git a/js-peer/package-lock.json b/js-peer/package-lock.json index da0be4d..ceaaec8 100644 --- a/js-peer/package-lock.json +++ b/js-peer/package-lock.json @@ -16,6 +16,7 @@ "@libp2p/circuit-relay-v2": "^3.1.0", "@libp2p/identify": "^3.0.10", "@libp2p/interface-pubsub": "^4.0.1", + "@libp2p/kad-dht": "^14.2.5", "@libp2p/logger": "^5.1.3", "@libp2p/ping": "^2.0.10", "@libp2p/pubsub-peer-discovery": "^11.0.0", @@ -2971,25 +2972,25 @@ } }, "node_modules/@libp2p/crypto": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@libp2p/crypto/-/crypto-5.0.6.tgz", - "integrity": "sha512-5mD/riNxUuSOerk3aPXUUMN96lwZsrU33lp97ySfffloh2WhLZcjVJszibBgIP7DP5nqmSOWY9++rqrBuYHvnQ==", + "version": "5.0.11", + "resolved": "https://registry.npmjs.org/@libp2p/crypto/-/crypto-5.0.11.tgz", + "integrity": "sha512-1//iAZAO6XKFPwKqX7xCNJFwIgSyLOTE7wVS0gFaD7jWXeYmD78cojFq5QC1jRl04iTJe4COTTNHen/cpqurwA==", "license": "Apache-2.0 OR MIT", "dependencies": { - "@libp2p/interface": "^2.2.0", - "@noble/curves": "^1.4.0", - "@noble/hashes": "^1.4.0", + "@libp2p/interface": "^2.5.0", + "@noble/curves": "^1.7.0", + "@noble/hashes": "^1.6.1", "asn1js": "^3.0.5", - "multiformats": "^13.1.0", - "protons-runtime": "^5.4.0", + "multiformats": "^13.3.1", + "protons-runtime": "^5.5.0", "uint8arraylist": "^2.4.8", "uint8arrays": "^5.1.0" } }, "node_modules/@libp2p/crypto/node_modules/multiformats": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.3.0.tgz", - "integrity": "sha512-CBiqvsufgmpo01VT5ze94O+uc+Pbf6f/sThlvWss0sBZmAOu6GQn5usrYV2sf2mr17FWYc0rO8c/CNe2T90QAA==", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.3.2.tgz", + "integrity": "sha512-qbB0CQDt3QKfiAzZ5ZYjLFOs+zW43vA4uyM8g27PeEuXZybUOFyjrVdP93HPBHMoglibwfkdVwbzfUq8qGcH6g==", "license": "Apache-2.0 OR MIT" }, "node_modules/@libp2p/identify": { @@ -3016,16 +3017,16 @@ } }, "node_modules/@libp2p/interface": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@libp2p/interface/-/interface-2.2.0.tgz", - "integrity": "sha512-Pn3P5ixDggBjDyuULT0GvwdgD3JA426OqZ0e521mI7ysS+/M9Z9fp4Qcy8JrkJ45bLmIi9cgrNrefuU/Zu+bAQ==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@libp2p/interface/-/interface-2.5.0.tgz", + "integrity": "sha512-XKUHsDMbMVwEGgYYj1uB5XCnlFeF21SgyynKbc4sqfVCEJdjxF7ILYX0dm6tjBGjVThubjUd2b82RwOqeds3Kg==", "license": "Apache-2.0 OR MIT", "dependencies": { - "@multiformats/multiaddr": "^12.2.3", + "@multiformats/multiaddr": "^12.3.3", "it-pushable": "^3.2.3", - "it-stream-types": "^2.0.1", - "multiformats": "^13.1.0", - "progress-events": "^1.0.0", + "it-stream-types": "^2.0.2", + "multiformats": "^13.3.1", + "progress-events": "^1.0.1", "uint8arraylist": "^2.4.8" } }, @@ -3045,16 +3046,15 @@ } }, "node_modules/@libp2p/interface-internal": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@libp2p/interface-internal/-/interface-internal-2.0.10.tgz", - "integrity": "sha512-LRnn6w5rtvMQlEukihDI5NhSZXZj7ITFT1Hbo3Dn3HGo1oxZe7oWh7ERc5LwZw835QHGzFKZYerBFKdqxoWsFQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@libp2p/interface-internal/-/interface-internal-2.3.0.tgz", + "integrity": "sha512-3D2cKBMXiSHv5VKX8unD3W+GL1K9EDt6nLxNl4/aU2t1IE8jwZ5ovx/9hIhKZFOJ+c3fgkp1OdH44i4w/Wc/1w==", "license": "Apache-2.0 OR MIT", "dependencies": { - "@libp2p/interface": "^2.2.0", - "@libp2p/peer-collections": "^6.0.10", - "@multiformats/multiaddr": "^12.2.3", - "progress-events": "^1.0.0", - "uint8arraylist": "^2.4.8" + "@libp2p/interface": "^2.5.0", + "@libp2p/peer-collections": "^6.0.17", + "@multiformats/multiaddr": "^12.3.3", + "progress-events": "^1.0.1" } }, "node_modules/@libp2p/interface-peer-id": { @@ -3084,9 +3084,9 @@ } }, "node_modules/@libp2p/interface/node_modules/multiformats": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.3.0.tgz", - "integrity": "sha512-CBiqvsufgmpo01VT5ze94O+uc+Pbf6f/sThlvWss0sBZmAOu6GQn5usrYV2sf2mr17FWYc0rO8c/CNe2T90QAA==", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.3.2.tgz", + "integrity": "sha512-qbB0CQDt3QKfiAzZ5ZYjLFOs+zW43vA4uyM8g27PeEuXZybUOFyjrVdP93HPBHMoglibwfkdVwbzfUq8qGcH6g==", "license": "Apache-2.0 OR MIT" }, "node_modules/@libp2p/interfaces": { @@ -3098,23 +3098,68 @@ "npm": ">=7.0.0" } }, + "node_modules/@libp2p/kad-dht": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@libp2p/kad-dht/-/kad-dht-14.2.5.tgz", + "integrity": "sha512-Gb9OlVjOJsYF/PQYfdlE1l6QtAXdAg+1VdomasVEYjdJEcY8Acvh2vJZakIdtCasFT0m7rUyFY6O0RXH1IN59g==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@libp2p/crypto": "^5.0.11", + "@libp2p/interface": "^2.5.0", + "@libp2p/interface-internal": "^2.3.0", + "@libp2p/peer-collections": "^6.0.17", + "@libp2p/peer-id": "^5.0.12", + "@libp2p/record": "^4.0.4", + "@libp2p/utils": "^6.5.1", + "@multiformats/multiaddr": "^12.3.3", + "any-signal": "^4.1.1", + "interface-datastore": "^8.3.1", + "it-all": "^3.0.6", + "it-drain": "^3.0.7", + "it-length": "^3.0.6", + "it-length-prefixed": "^9.1.0", + "it-map": "^3.1.1", + "it-merge": "^3.0.5", + "it-parallel": "^3.0.8", + "it-pipe": "^3.0.1", + "it-protobuf-stream": "^1.1.5", + "it-take": "^3.0.6", + "mortice": "^3.0.6", + "multiformats": "^13.3.1", + "p-defer": "^4.0.1", + "p-event": "^6.0.1", + "progress-events": "^1.0.1", + "protons-runtime": "^5.5.0", + "race-signal": "^1.1.0", + "uint8-varint": "^2.0.4", + "uint8arraylist": "^2.4.8", + "uint8arrays": "^5.1.0" + } + }, + "node_modules/@libp2p/kad-dht/node_modules/multiformats": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.3.2.tgz", + "integrity": "sha512-qbB0CQDt3QKfiAzZ5ZYjLFOs+zW43vA4uyM8g27PeEuXZybUOFyjrVdP93HPBHMoglibwfkdVwbzfUq8qGcH6g==", + "license": "Apache-2.0 OR MIT" + }, "node_modules/@libp2p/logger": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/@libp2p/logger/-/logger-5.1.3.tgz", - "integrity": "sha512-NUVWEWGbXlBDgDE5ntdm51+ZICmaKYI8mor6KrlPeB1WXDyIFxRWIBw6uzt+HgprQJWzLTojeUEGv6OPsj95Dg==", + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/@libp2p/logger/-/logger-5.1.8.tgz", + "integrity": "sha512-Mevhz+dTQuV5UbwqLMOJZv2IpMg+/89x/Ouq0iKtkgB5vAgTwJ3DlM7+IYOeyzQRUpCPfaRiJet3aBB5wnPMRg==", "license": "Apache-2.0 OR MIT", "dependencies": { - "@libp2p/interface": "^2.2.0", - "@multiformats/multiaddr": "^12.2.3", - "interface-datastore": "^8.3.0", - "multiformats": "^13.1.0", - "weald": "^1.0.2" + "@libp2p/interface": "^2.5.0", + "@multiformats/multiaddr": "^12.3.3", + "interface-datastore": "^8.3.1", + "multiformats": "^13.3.1", + "weald": "^1.0.4" } }, "node_modules/@libp2p/logger/node_modules/multiformats": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.1.0.tgz", - "integrity": "sha512-HzdtdBwxsIkzpeXzhQ5mAhhuxcHbjEHH+JQoxt7hG/2HGFjjwyolLo7hbaexcnhoEuV4e0TNJ8kkpMjiEYY4VQ==" + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.3.2.tgz", + "integrity": "sha512-qbB0CQDt3QKfiAzZ5ZYjLFOs+zW43vA4uyM8g27PeEuXZybUOFyjrVdP93HPBHMoglibwfkdVwbzfUq8qGcH6g==", + "license": "Apache-2.0 OR MIT" }, "node_modules/@libp2p/multistream-select": { "version": "6.0.8", @@ -3134,39 +3179,39 @@ } }, "node_modules/@libp2p/peer-collections": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/@libp2p/peer-collections/-/peer-collections-6.0.10.tgz", - "integrity": "sha512-KQQiBZ2Y3+wvxjfIWbUCL0suCRVn5ylLuQ2r+OGXLA7LtgRw1RLQnUHHFVoY+CE9pvfIfamwTFlkZhWtvi271w==", + "version": "6.0.17", + "resolved": "https://registry.npmjs.org/@libp2p/peer-collections/-/peer-collections-6.0.17.tgz", + "integrity": "sha512-ww+4rXe0iL2vMafq0N58tabUNHlfozzJEVIxXMN15L0VZnvUK5TryOM6AnGpUj+nvoToGBuB1ZYalI+17nJmMg==", "license": "Apache-2.0 OR MIT", "dependencies": { - "@libp2p/interface": "^2.2.0", - "@libp2p/peer-id": "^5.0.7", - "@libp2p/utils": "^6.1.3", - "multiformats": "^13.2.2" + "@libp2p/interface": "^2.5.0", + "@libp2p/peer-id": "^5.0.12", + "@libp2p/utils": "^6.5.1", + "multiformats": "^13.3.1" } }, "node_modules/@libp2p/peer-collections/node_modules/multiformats": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.3.0.tgz", - "integrity": "sha512-CBiqvsufgmpo01VT5ze94O+uc+Pbf6f/sThlvWss0sBZmAOu6GQn5usrYV2sf2mr17FWYc0rO8c/CNe2T90QAA==", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.3.2.tgz", + "integrity": "sha512-qbB0CQDt3QKfiAzZ5ZYjLFOs+zW43vA4uyM8g27PeEuXZybUOFyjrVdP93HPBHMoglibwfkdVwbzfUq8qGcH6g==", "license": "Apache-2.0 OR MIT" }, "node_modules/@libp2p/peer-id": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@libp2p/peer-id/-/peer-id-5.0.7.tgz", - "integrity": "sha512-ecF0Mu4Nxy8IHUMBYVNIEihjUlx52DM+X3CIfBItvGqvnhrUSkJJjkska2dJX3yf2J8wufzCT3jCg4NZWmndYg==", + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/@libp2p/peer-id/-/peer-id-5.0.12.tgz", + "integrity": "sha512-SovviVLG+vBwYZVIiJ+NN/f29jXczPVzoDGp9bMLBQoDPqGAB8IQ71BZLba25CUF+llJlXZRNzYwjZiJ0Y2DuA==", "license": "Apache-2.0 OR MIT", "dependencies": { - "@libp2p/crypto": "^5.0.6", - "@libp2p/interface": "^2.2.0", - "multiformats": "^13.1.0", + "@libp2p/crypto": "^5.0.11", + "@libp2p/interface": "^2.5.0", + "multiformats": "^13.3.1", "uint8arrays": "^5.1.0" } }, "node_modules/@libp2p/peer-id/node_modules/multiformats": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.3.0.tgz", - "integrity": "sha512-CBiqvsufgmpo01VT5ze94O+uc+Pbf6f/sThlvWss0sBZmAOu6GQn5usrYV2sf2mr17FWYc0rO8c/CNe2T90QAA==", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.3.2.tgz", + "integrity": "sha512-qbB0CQDt3QKfiAzZ5ZYjLFOs+zW43vA4uyM8g27PeEuXZybUOFyjrVdP93HPBHMoglibwfkdVwbzfUq8qGcH6g==", "license": "Apache-2.0 OR MIT" }, "node_modules/@libp2p/peer-record": { @@ -3276,19 +3321,30 @@ "integrity": "sha512-CBiqvsufgmpo01VT5ze94O+uc+Pbf6f/sThlvWss0sBZmAOu6GQn5usrYV2sf2mr17FWYc0rO8c/CNe2T90QAA==", "license": "Apache-2.0 OR MIT" }, + "node_modules/@libp2p/record": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@libp2p/record/-/record-4.0.4.tgz", + "integrity": "sha512-wEEeHXGNIcc8HtGbgGMuSHbboUWMxKG7OxALFwkE+KACgfRJZTESOp6XIdZnyC0r9lfEFsjF01pFKBTzoBmWEQ==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "protons-runtime": "^5.4.0", + "uint8arraylist": "^2.4.8", + "uint8arrays": "^5.1.0" + } + }, "node_modules/@libp2p/utils": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@libp2p/utils/-/utils-6.1.3.tgz", - "integrity": "sha512-n1D6phOXGkqE3tuvmZwm5gaHKcGanlKwCWEBlrZqx9SSCyd5U5C58BcyQ8YH5/nb4kYMI7HyjomfQAVs2S2R9Q==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@libp2p/utils/-/utils-6.5.1.tgz", + "integrity": "sha512-2LMLzel5HrvGjh/4W3PMPhsgSDs574vNiFWC6WNB5AsBROrfC0QMoMJjzXoUSPei/PJS9kYaxZOXwmkU3mWzLw==", "license": "Apache-2.0 OR MIT", "dependencies": { "@chainsafe/is-ip": "^2.0.2", - "@libp2p/crypto": "^5.0.6", - "@libp2p/interface": "^2.2.0", - "@libp2p/logger": "^5.1.3", - "@multiformats/multiaddr": "^12.2.3", + "@chainsafe/netmask": "^2.0.0", + "@libp2p/crypto": "^5.0.11", + "@libp2p/interface": "^2.5.0", + "@libp2p/logger": "^5.1.8", + "@multiformats/multiaddr": "^12.3.3", "@sindresorhus/fnv1a": "^3.1.0", - "@types/murmurhash3js-revisited": "^3.0.3", "any-signal": "^4.1.1", "delay": "^6.0.0", "get-iterator": "^2.0.1", @@ -3296,12 +3352,11 @@ "it-foreach": "^2.1.1", "it-pipe": "^3.0.1", "it-pushable": "^3.2.3", - "it-stream-types": "^2.0.1", - "murmurhash3js-revisited": "^3.0.0", + "it-stream-types": "^2.0.2", "netmask": "^2.0.2", "p-defer": "^4.0.1", "race-event": "^1.3.0", - "race-signal": "^1.0.2", + "race-signal": "^1.1.0", "uint8arraylist": "^2.4.8", "uint8arrays": "^5.1.0" } @@ -3411,9 +3466,9 @@ } }, "node_modules/@multiformats/multiaddr": { - "version": "12.3.1", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.3.1.tgz", - "integrity": "sha512-yoGODQY4nIj41ENJClucS8FtBoe8w682bzbKldEQr9lSlfdHqAsRC+vpJAOBpiMwPps1tHua4kxrDmvprdhoDQ==", + "version": "12.3.5", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.3.5.tgz", + "integrity": "sha512-f3I7FDd6VM4s3X5dXbmwk8Y99pnvATWj7RorIr+qgeiYCDySp4cwybAFnxdRWeKs6XLPE9meB0p8tK4lQqO8gQ==", "license": "Apache-2.0 OR MIT", "dependencies": { "@chainsafe/is-ip": "^2.0.1", @@ -3668,22 +3723,27 @@ } }, "node_modules/@noble/curves": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.0.tgz", - "integrity": "sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.8.1.tgz", + "integrity": "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==", + "license": "MIT", "dependencies": { - "@noble/hashes": "1.4.0" + "@noble/hashes": "1.7.1" + }, + "engines": { + "node": "^14.21.3 || >=16" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.1.tgz", + "integrity": "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==", + "license": "MIT", "engines": { - "node": ">= 16" + "node": "^14.21.3 || >=16" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -4550,12 +4610,6 @@ "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", "dev": true }, - "node_modules/@types/murmurhash3js-revisited": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/murmurhash3js-revisited/-/murmurhash3js-revisited-3.0.3.tgz", - "integrity": "sha512-QvlqvYtGBYIDeO8dFdY4djkRubcrc+yTJtBc7n8VZPlJDUS/00A+PssbvERM8f9bYRmcaSEHPZgZojeQj7kzAA==", - "license": "MIT" - }, "node_modules/@types/node": { "version": "20.14.8", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.8.tgz", @@ -8639,6 +8693,12 @@ "it-peekable": "^3.0.0" } }, + "node_modules/it-length": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/it-length/-/it-length-3.0.6.tgz", + "integrity": "sha512-R7bxHAzpRzYz7vghc2DDH7x4KXvEkeLfN/h316++jzbkEHIRXbEPLbE20p5yrqqBdOeK6/FRUDuHlTJ0H1hysw==", + "license": "Apache-2.0 OR MIT" + }, "node_modules/it-length-prefixed": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/it-length-prefixed/-/it-length-prefixed-9.1.0.tgz", @@ -8702,18 +8762,11 @@ "npm": ">=7.0.0" } }, - "node_modules/it-pair/node_modules/it-stream-types": { - "version": "2.0.1", - "license": "Apache-2.0 OR MIT", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, "node_modules/it-parallel": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/it-parallel/-/it-parallel-3.0.7.tgz", - "integrity": "sha512-aIIc2t8knfER/mQu4uEHaAYZrnj/2Tdp+Vj6BA94Gi7xghx1kblvpyrLkCYO9K+eDyPS1cE3Vfhh9a20MEmzXA==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/it-parallel/-/it-parallel-3.0.8.tgz", + "integrity": "sha512-URLhs6eG4Hdr4OdvgBBPDzOjBeSSmI+Kqex2rv/aAyYClME26RYHirLVhZsZP5M+ZP6M34iRlXk8Wlqtezuqpg==", + "license": "Apache-2.0 OR MIT", "dependencies": { "p-defer": "^4.0.1" } @@ -8790,12 +8843,10 @@ } }, "node_modules/it-stream-types": { - "version": "2.0.1", - "license": "Apache-2.0 OR MIT", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/it-stream-types/-/it-stream-types-2.0.2.tgz", + "integrity": "sha512-Rz/DEZ6Byn/r9+/SBCuJhpPATDF9D+dz5pbgSUyBsCDtza6wtNATrz/jz1gDyNanC3XdLboriHnOC925bZRBww==", + "license": "Apache-2.0 OR MIT" }, "node_modules/it-take": { "version": "3.0.6", @@ -10429,15 +10480,6 @@ "npm": ">=7.0.0" } }, - "node_modules/murmurhash3js-revisited": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/murmurhash3js-revisited/-/murmurhash3js-revisited-3.0.0.tgz", - "integrity": "sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g==", - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/mz": { "version": "2.7.0", "dev": true, @@ -11538,12 +11580,10 @@ "peer": true }, "node_modules/progress-events": { - "version": "1.0.0", - "license": "Apache-2.0 OR MIT", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/progress-events/-/progress-events-1.0.1.tgz", + "integrity": "sha512-MOzLIwhpt64KIVN64h1MwdKWiyKFNc/S6BoYKPIVUHFg0/eIEyBulhWCgn678v/4c0ri3FdGuzXymNCv02MUIw==", + "license": "Apache-2.0 OR MIT" }, "node_modules/promise": { "version": "8.3.0", @@ -11781,9 +11821,10 @@ "license": "Apache-2.0 OR MIT" }, "node_modules/race-signal": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/race-signal/-/race-signal-1.0.2.tgz", - "integrity": "sha512-o3xNv0iTcIDQCXFlF6fPAMEBRjFxssgGoRqLbg06m+AdzEXXLUmoNOoUHTVz2NoBI8hHwKFKoC6IqyNtWr2bww==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/race-signal/-/race-signal-1.1.0.tgz", + "integrity": "sha512-VqsW1uzCXfKBd2DhA3K3NhQlqQr04+5WQ7+kHpf1HzT01Q+ePSFWZdQHXKZPuLmm2eXTZM1XLO76cq15ZRAaEA==", + "license": "Apache-2.0 OR MIT" }, "node_modules/range-parser": { "version": "1.2.1", @@ -13932,9 +13973,9 @@ } }, "node_modules/weald": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/weald/-/weald-1.0.3.tgz", - "integrity": "sha512-h5pTSGRApQotfZ8Goqe5Jrg6iOjx4uXB55I00A+WRMZbhbiWfUatr6fMLt6UNrURzqXaX/ZDhIvcDzs1TEzz4Q==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/weald/-/weald-1.0.4.tgz", + "integrity": "sha512-+kYTuHonJBwmFhP1Z4YQK/dGi3jAnJGCYhyODFpHK73rbxnp9lnZQj7a2m+WVgn8fXr5bJaxUpF6l8qZpPeNWQ==", "license": "Apache-2.0 OR MIT", "dependencies": { "ms": "^3.0.0-canary.1", diff --git a/js-peer/package.json b/js-peer/package.json index c1a40e0..979e39b 100644 --- a/js-peer/package.json +++ b/js-peer/package.json @@ -20,6 +20,7 @@ "@libp2p/circuit-relay-v2": "^3.1.0", "@libp2p/identify": "^3.0.10", "@libp2p/interface-pubsub": "^4.0.1", + "@libp2p/kad-dht": "^14.2.5", "@libp2p/logger": "^5.1.3", "@libp2p/ping": "^2.0.10", "@libp2p/pubsub-peer-discovery": "^11.0.0", diff --git a/js-peer/src/lib/constants.ts b/js-peer/src/lib/constants.ts index dbbcdd4..3a9e4cc 100644 --- a/js-peer/src/lib/constants.ts +++ b/js-peer/src/lib/constants.ts @@ -8,8 +8,8 @@ export const CIRCUIT_RELAY_CODE = 290 export const MIME_TEXT_PLAIN = 'text/plain' -// 👇 App specific dedicated bootstrap PeerIDs -// Their multiaddrs are ephemeral so peer routing is used to resolve multiaddr -export const WEBTRANSPORT_BOOTSTRAP_PEER_ID = '12D3KooWFhXabKDwALpzqMbto94sB7rvmZ6M28hs9Y9xSopDKwQr' +// 👇 App specific dedicated bootstrapper subscribed to the pubsub topic `universal-connectivity` for relaying messages +export const GO_MESSAGE_BOOTSTRAP_PEER_ID = '12D3KooWFhXabKDwALpzqMbto94sB7rvmZ6M28hs9Y9xSopDKwQr' -export const BOOTSTRAP_PEER_IDS = [WEBTRANSPORT_BOOTSTRAP_PEER_ID] + +export const BOOTSTRAP_PEER_IDS = [GO_MESSAGE_BOOTSTRAP_PEER_ID] diff --git a/js-peer/src/lib/libp2p.ts b/js-peer/src/lib/libp2p.ts index f9429cf..6917344 100644 --- a/js-peer/src/lib/libp2p.ts +++ b/js-peer/src/lib/libp2p.ts @@ -18,22 +18,33 @@ import { webRTC, webRTCDirect } from '@libp2p/webrtc' import { circuitRelayTransport } from '@libp2p/circuit-relay-v2' import { pubsubPeerDiscovery } from '@libp2p/pubsub-peer-discovery' import { ping } from '@libp2p/ping' -import { BOOTSTRAP_PEER_IDS, CHAT_FILE_TOPIC, CHAT_TOPIC, PUBSUB_PEER_DISCOVERY } from './constants' +import { BOOTSTRAP_PEER_IDS, CHAT_FILE_TOPIC, CHAT_TOPIC, GO_MESSAGE_BOOTSTRAP_PEER_ID, PUBSUB_PEER_DISCOVERY } from './constants' import first from 'it-first' import { forComponent, enable } from './logger' import { directMessage } from './direct-message' import type { Libp2pType } from '@/context/ctx' - +import { kadDHT } from '@libp2p/kad-dht' const log = forComponent('libp2p') +// IPFS Amino DHT bootstrappers. Useful for finding circuit relay nodes +const AMINO_BOOTSTRAP_ADDRESSES = [ + '/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN', + '/dnsaddr/bootstrap.libp2p.io/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb', + '/dnsaddr/bootstrap.libp2p.io/p2p/QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt', + // va1 is not in the TXT records for _dnsaddr.bootstrap.libp2p.io yet + // so use the host name directly + '/dnsaddr/va1.bootstrap.libp2p.io/p2p/12D3KooWKnDdG3iXw9eTFijk3EWSunZcFi54Zka4wmtqtt6rPxc8', + '/ip4/104.131.131.82/tcp/4001/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ' +] + export async function startLibp2p(): Promise { // enable verbose logging in browser console to view debug logs enable('ui*,libp2p*,-libp2p:connection-manager*,-*:trace') const delegatedClient = createDelegatedRoutingV1HttpApiClient('https://delegated-ipfs.dev') - const { bootstrapAddrs, relayListenAddrs } = await getBootstrapMultiaddrs(delegatedClient) - log('starting libp2p with bootstrapAddrs %o and relayListenAddrs: %o', bootstrapAddrs, relayListenAddrs) + // const { bootstrapAddrs, relayListenAddrs } = await getBootstrapMultiaddrs(delegatedClient) + log('starting libp2p') let libp2p: Libp2pType @@ -42,11 +53,10 @@ export async function startLibp2p(): Promise { listen: [ // 👇 Listen for webRTC connection '/webrtc', - ...relayListenAddrs, + // '/p2p-circuit', // this will cause libp2p to start a random walk to find a circuit relay reservation ], }, transports: [ - webTransport(), webSockets(), webRTC(), // 👇 Required to estalbish connections with peers supporting WebRTC-direct, e.g. the Rust-peer @@ -65,11 +75,9 @@ export async function startLibp2p(): Promise { topics: [PUBSUB_PEER_DISCOVERY], listenOnly: false, }), - bootstrap({ - // The app-specific bootstrappers that use WebTransport and WebRTC-direct and have ephemeral multiadrrs - // that are resolved above using the delegated routing API - list: bootstrapAddrs, - }), + // bootstrap({ + // list: AMINO_BOOTSTRAP_ADDRESSES, + // }), ], services: { pubsub: gossipsub({ @@ -77,6 +85,7 @@ export async function startLibp2p(): Promise { msgIdFn: msgIdFnStrictNoSign, ignoreDuplicatePublishError: true, }), + // dht: kadDHT(), // Delegated routing helps us discover the ephemeral multiaddrs of the dedicated go and rust bootstrap peers // This relies on the public delegated routing endpoint https://docs.ipfs.tech/concepts/public-utilities/#delegated-routing delegatedRouting: () => delegatedClient, @@ -87,9 +96,8 @@ export async function startLibp2p(): Promise { }, }) - if (!libp2p) { - throw new Error('Failed to create libp2p node') - } + // 👇 dial the dedicated bootstrapper subscribed to the pubsub topic `universal-connectivity` for relaying messages + libp2p.dial(peerIdFromString(GO_MESSAGE_BOOTSTRAP_PEER_ID)) libp2p.services.pubsub.subscribe(CHAT_TOPIC) libp2p.services.pubsub.subscribe(CHAT_FILE_TOPIC) @@ -154,27 +162,6 @@ export const connectToMultiaddr = (libp2p: Libp2p) => async (multiaddr: Multiadd } } -// Function which resolves PeerIDs of rust/go bootstrap nodes to multiaddrs dialable from the browser -// Returns both the dialable multiaddrs in addition to the relay -async function getBootstrapMultiaddrs(client: DelegatedRoutingV1HttpApiClient): Promise { - const peers = await Promise.all(BOOTSTRAP_PEER_IDS.map((peerId) => first(client.getPeers(peerIdFromString(peerId))))) - - const bootstrapAddrs = [] - const relayListenAddrs = [] - for (const p of peers) { - if (p && p.Addrs.length > 0) { - for (const maddr of p.Addrs) { - const protos = maddr.protoNames() - if ((protos.includes('webtransport') || protos.includes('webrtc-direct')) && protos.includes('certhash')) { - if (maddr.nodeAddress().address === '127.0.0.1') continue // skip loopback - bootstrapAddrs.push(maddr.toString()) - relayListenAddrs.push(getRelayListenAddr(maddr, p.ID)) - } - } - } - } - return { bootstrapAddrs, relayListenAddrs } -} interface BootstrapsMultiaddrs { // Multiaddrs that are dialable from the browser