Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f6c11ae54a |
@@ -1,13 +0,0 @@
|
||||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: npm
|
||||
# this should point to the latest js-libp2p major in order to automate
|
||||
# updating deps automatically after a release
|
||||
directory: "/transport-interop/impl/js/v1.x"
|
||||
schedule:
|
||||
interval: daily
|
||||
time: "10:00"
|
||||
open-pull-requests-limit: 20
|
||||
commit-message:
|
||||
prefix: "deps"
|
||||
prefix-development: "deps(dev)"
|
||||
@@ -16,57 +16,15 @@ permissions:
|
||||
actions: write
|
||||
|
||||
jobs:
|
||||
add:
|
||||
name: Add new ${{ matrix.repository_name }} version to ${{ matrix.test_name }}
|
||||
go:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- repository_name: go-libp2p
|
||||
implementation_name: go-libp2p
|
||||
test_name: perf
|
||||
implementation_update_script: |
|
||||
sed -i "1s/$LOCAL_MAJOR_MINOR_VERSION/$REMOTE_MAJOR_MINOR_VERSION/g" go.mod
|
||||
go mod tidy -go=$GO_MAJOR_MINOR_VERSION
|
||||
go mod tidy
|
||||
go get github.com/libp2p/go-libp2p@$REMOTE_VERSION
|
||||
- repository_name: go-libp2p
|
||||
implementation_name: go
|
||||
test_name: transport-interop
|
||||
implementation_update_script: |
|
||||
sed -i "s/image_name := go-${LOCAL_MAJOR_MINOR_VERSION}/image_name := go-${REMOTE_MAJOR_MINOR_VERSION}/g" Makefile
|
||||
sed -i "s/version := ${LOCAL_MAJOR_MINOR_VERSION#v}\..*/version := ${REMOTE_VERSION#v}/g" Makefile
|
||||
make version.lock
|
||||
- repository_name: rust-libp2p
|
||||
implementation_name: rust-libp2p
|
||||
test_name: perf
|
||||
implementation_update_script: |
|
||||
sed -i "s/commitSha := .*/commitSha := ${REMOTE_SHA}/g" Makefile
|
||||
- repository_name: rust-libp2p
|
||||
implementation_name: rust
|
||||
test_name: transport-interop
|
||||
implementation_update_script: |
|
||||
sed -i "s/image_name := rust-${LOCAL_MAJOR_MINOR_VERSION}/image_name := rust-${REMOTE_MAJOR_MINOR_VERSION}/g" Makefile
|
||||
sed -i "s/commitSha := .*/commitSha := ${REMOTE_SHA}/g" Makefile
|
||||
- repository_name: js-libp2p
|
||||
implementation_name: js-libp2p
|
||||
test_name: perf
|
||||
implementation_update_script: |
|
||||
suffix="$(echo "${REMOTE_MAJOR_MINOR_VERSION#v}" | sed 's/\./-/g')"
|
||||
sed -i "s/perf-js-libp2p-[^\"]*/perf-js-libp2p-$suffix/g" package.json
|
||||
npm install libp2p@$REMOTE_VERSION
|
||||
- repository_name: js-libp2p
|
||||
implementation_name: js
|
||||
test_name: transport-interop
|
||||
implementation_update_script: |
|
||||
sed -i "s/image_name := js-${LOCAL_MAJOR_MINOR_VERSION}\..*/image_name := js-${REMOTE_VERSION}/g" Makefile
|
||||
npm install libp2p@$REMOTE_VERSION
|
||||
env:
|
||||
BRANCH: add/${{ matrix.test_name }}/${{ matrix.repository_name }}
|
||||
DIR: perf/impl/go-libp2p
|
||||
REPO: libp2p/go-libp2p
|
||||
BRANCH: perf/go-libp2p
|
||||
steps:
|
||||
- name: Checkout test-plans
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v3
|
||||
- name: Configure git
|
||||
run: |
|
||||
git fetch origin $BRANCH && git checkout $BRANCH || git checkout -b $BRANCH
|
||||
@@ -74,79 +32,40 @@ jobs:
|
||||
git config --global user.email $GITHUB_ACTOR@users.noreply.github.com
|
||||
git config --global user.name $GITHUB_ACTOR
|
||||
- id: go
|
||||
uses: actions/setup-go@v5
|
||||
uses: actions/setup-go@v3
|
||||
with:
|
||||
go-version: stable
|
||||
- name: Get the latest version (local)
|
||||
id: local
|
||||
env:
|
||||
IMPLEMENTATION_DIRECTORY: ${{ matrix.test_name }}/impl/${{ matrix.implementation_name }}
|
||||
run: |
|
||||
pushd $IMPLEMENTATION_DIRECTORY
|
||||
ls -d v* | sort -V | tail -n-1 | xargs -I{} echo "version={}" | tee -a $GITHUB_OUTPUT
|
||||
popd
|
||||
run: ls -d v* | sort -V | tail -n-1 | xargs -I{} echo "version={}" | tee -a $GITHUB_OUTPUT
|
||||
working-directory: ${{ env.DIR }}
|
||||
- name: Get the latest version (remote)
|
||||
id: remote
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ github.token }}
|
||||
REPOSITORY_NAME: ${{ matrix.repository_name }}
|
||||
run: |
|
||||
releases="$(gh api --paginate repos/libp2p/$REPOSITORY_NAME/releases)"
|
||||
latest="$(jq 'map(select(.tag_name | startswith("libp2p-"))) | first' <<< "$releases")"
|
||||
if [[ "$latest" == "null" ]]; then
|
||||
latest="$(jq 'first' <<< "$releases")"
|
||||
fi
|
||||
tag_name=$(jq -r '.tag_name' <<< "$latest")
|
||||
target_commitish=$(jq -r '.target_commitish' <<< "$latest")
|
||||
echo "version=${tag_name#libp2p-}" | tee -a $GITHUB_OUTPUT
|
||||
echo "target_commitish=${target_commitish}" | tee -a $GITHUB_OUTPUT
|
||||
- id: mm
|
||||
env:
|
||||
REMOTE_VERSION: ${{ steps.remote.outputs.version }}
|
||||
GO_VERSION: ${{ steps.go.outputs.go-version }}
|
||||
run: |
|
||||
echo $REMOTE_VERSION | sed 's/\.[0-9]*$//' | xargs -I{} echo "remote={}" | tee -a $GITHUB_OUTPUT
|
||||
echo $GO_VERSION | sed 's/\.[0-9]*$//' | xargs -I{} echo "go={}" | tee -a $GITHUB_OUTPUT
|
||||
run: gh api repos/$REPO/releases/latest --jq '.tag_name' | xargs -I{} echo "version={}" | tee -a $GITHUB_OUTPUT
|
||||
- name: Add the latest version
|
||||
if: ${{ !startsWith(steps.remote.outputs.version, steps.local.outputs.version) }}
|
||||
env:
|
||||
LOCAL_MAJOR_MINOR_VERSION: ${{ steps.local.outputs.version }}
|
||||
LOCAL_VERSION: ${{ steps.local.outputs.version }}
|
||||
REMOTE_VERSION: ${{ steps.remote.outputs.version }}
|
||||
REMOTE_MAJOR_MINOR_VERSION: ${{ steps.mm.outputs.remote }}
|
||||
REMOTE_SHA: ${{ steps.remote.outputs.sha }}
|
||||
GO_VERSION: ${{ steps.go.outputs.go-version }}
|
||||
GO_MAJOR_MINOR_VERSION: ${{ steps.mm.outputs.go }}
|
||||
GITHUB_TOKEN: ${{ github.token }}
|
||||
IMPLEMENTATION_DIRECTORY: ${{ matrix.test_name }}/impl/${{ matrix.implementation_name }}
|
||||
VERSIONS_DIRECTORY: ${{ matrix.test_name == 'perf' && format('{0}/runner', matrix.test_name) || matrix.test_name }}
|
||||
IMPLEMENTATION_NAME: ${{ matrix.implementation_name }}
|
||||
REPOSITORY_NAME: ${{ matrix.repository_name }}
|
||||
TEST_NAME: ${{ matrix.test_name }}
|
||||
run: |
|
||||
pushd $IMPLEMENTATION_DIRECTORY
|
||||
cp -r $LOCAL_MAJOR_MINOR_VERSION $REMOTE_MAJOR_MINOR_VERSION
|
||||
pushd $REMOTE_MAJOR_MINOR_VERSION
|
||||
${{ matrix.implementation_update_script }}
|
||||
popd
|
||||
popd
|
||||
|
||||
pushd $VERSIONS_DIRECTORY
|
||||
versions=''
|
||||
if [[ "$TEST_NAME" == "perf" ]]; then
|
||||
versions="$(jq '. + map(select(.implementation == env.IMPLEMENTATION_NAME and .id == env.LOCAL_MAJOR_MINOR_VERSION) | .id = env.REMOTE_MAJOR_MINOR_VERSION)' versionsInput.json)"
|
||||
else
|
||||
versions="$(jq '. + map(select(.id == "\(env.IMPLEMENTATION_NAME)-\(env.LOCAL_MAJOR_MINOR_VERSION)") | .id = "\(env.IMPLEMENTATION_NAME)-\(env.REMOTE_MAJOR_MINOR_VERSION)")' versionsInput.json)"
|
||||
fi
|
||||
echo "$versions" > versionsInput.json
|
||||
popd
|
||||
|
||||
majorMinorRemoteVersion=$(echo $REMOTE_VERSION | sed 's/\.[0-9]*$//')
|
||||
majorMinorGoVersion=$(echo $GO_VERSION | sed 's/\.[0-9]*$//')
|
||||
cp -r $LOCAL_VERSION $majorMinorRemoteVersion
|
||||
cd $majorMinorRemoteVersion
|
||||
sed -i "1s/$LOCAL_VERSION/$majorMinorRemoteVersion/g" go.mod
|
||||
go mod tidy -go=$majorMinorGoVersion
|
||||
go mod tidy
|
||||
go get github.com/libp2p/go-libp2p@$REMOTE_VERSION
|
||||
git add .
|
||||
git commit -m "chore: add $REPOSITORY_NAME@$REMOTE_VERSION to $TEST_NAME"
|
||||
|
||||
git commit -m "chore: add go-libp2p@$REMOTE_VERSION to $DIR"
|
||||
git push origin $BRANCH --force
|
||||
|
||||
# create a PR if an open one doesn't exist yet
|
||||
if [[ $(gh pr list --state open --base $GITHUB_REF --head $BRANCH | wc -l) -eq 0 ]]; then
|
||||
gh pr create --title "chore: add $REPOSITORY_NAME@$REMOTE_VERSION to $TEST_NAME" --body "This PR adds $REPOSITORY_NAME@$REMOTE_VERSION to $TEST_NAME" --head $BRANCH --base $GITHUB_REF
|
||||
gh pr create --title "chore: add go-libp2p@$REMOTE_VERSION to $DIR" --body "This PR adds go-libp2p@$REMOTE_VERSION to $DIR" --head $BRANCH --base $GITHUB_REF
|
||||
fi
|
||||
|
||||
gh workflow run $TEST_NAME.yml --ref $BRANCH
|
||||
gh workflow run perf.yml --ref $BRANCH
|
||||
working-directory: ${{ env.DIR }}
|
||||
|
||||
@@ -22,7 +22,7 @@ jobs:
|
||||
perf:
|
||||
name: Perf
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 240
|
||||
timeout-minutes: 120
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
|
||||
@@ -43,7 +43,6 @@ __pycache__/
|
||||
### NodeJS
|
||||
|
||||
node_modules
|
||||
dist
|
||||
|
||||
# ignore system files
|
||||
.DS_Store
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Interoperability/end to end test-plans & performance benchmarking for libp2p
|
||||
|
||||
[](https://github.com/status-im/libp2p-test-plans/actions/runs/7043365318/attempts/1#summary-19169013615)
|
||||
[](https://github.com/libp2p/test-plans/actions/runs/6799715897/attempts/1#summary-18486611435)
|
||||
|
||||
[](http://protocol.ai)
|
||||
|
||||
|
||||
+2
-2
@@ -1,5 +1,5 @@
|
||||
image_name := rust-v0.53
|
||||
commitSha := 7f4ba690e87a867403f6266d8ee7d7db5e7a15bc
|
||||
image_name := rust-master
|
||||
commitSha := 461209ab1ba6b8e2a653ca354a5aad38802a35f9
|
||||
|
||||
all: image.json
|
||||
|
||||
@@ -10,8 +10,9 @@ export type Version = {
|
||||
|
||||
export const versions: Array<Version> = [
|
||||
{
|
||||
id: "rust-v0.53",
|
||||
transports: ["tcp", "quic"]
|
||||
id: "rust-master",
|
||||
transports: ["tcp", "quic"],
|
||||
containerImageID: readImageId("./impl/rust/master/image.json"),
|
||||
} as Version,
|
||||
].map((v: Version) => (typeof v.containerImageID === "undefined" ? ({ ...v, containerImageID: readImageId(canonicalImagePath(v.id)) }) : v))
|
||||
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
perf
|
||||
.cache
|
||||
@@ -0,0 +1,12 @@
|
||||
GO_FILES := $(wildcard *.go)
|
||||
|
||||
all: perf
|
||||
|
||||
perf: $(GO_FILES)
|
||||
docker run --rm --user "$(shell id -u):$(shell id -g)" -v "$(shell pwd)":/usr/src/myapp -w /usr/src/myapp -e GOCACHE=/usr/src/myapp/.cache golang:$(shell awk '/^go [0-9]+\.[0-9]+$$/ {print $$2}' go.mod) go build -o perf .
|
||||
|
||||
clean:
|
||||
rm -r .cache
|
||||
rm perf
|
||||
|
||||
.PHONY: all clean
|
||||
@@ -0,0 +1,95 @@
|
||||
module github.com/libp2p/test-plans/perf/impl/go-libp2p/v0.32
|
||||
|
||||
go 1.21
|
||||
|
||||
toolchain go1.21.0
|
||||
|
||||
require (
|
||||
github.com/ipfs/go-log/v2 v2.5.1
|
||||
github.com/libp2p/go-buffer-pool v0.1.0
|
||||
github.com/libp2p/go-libp2p v0.32.1
|
||||
github.com/multiformats/go-multiaddr v0.12.0
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/benbjohnson/clock v1.3.5 // indirect
|
||||
github.com/beorn7/perks v1.0.1 // indirect
|
||||
github.com/cespare/xxhash/v2 v2.2.0 // indirect
|
||||
github.com/containerd/cgroups v1.1.0 // indirect
|
||||
github.com/coreos/go-systemd/v22 v22.5.0 // indirect
|
||||
github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect
|
||||
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect
|
||||
github.com/docker/go-units v0.5.0 // indirect
|
||||
github.com/elastic/gosigar v0.14.2 // indirect
|
||||
github.com/flynn/noise v1.0.0 // indirect
|
||||
github.com/francoispqt/gojay v1.2.13 // indirect
|
||||
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect
|
||||
github.com/godbus/dbus/v5 v5.1.0 // indirect
|
||||
github.com/gogo/protobuf v1.3.2 // indirect
|
||||
github.com/golang/mock v1.6.0 // indirect
|
||||
github.com/golang/protobuf v1.5.3 // indirect
|
||||
github.com/google/gopacket v1.1.19 // indirect
|
||||
github.com/google/pprof v0.0.0-20231023181126-ff6d637d2a7b // indirect
|
||||
github.com/gorilla/websocket v1.5.0 // indirect
|
||||
github.com/huin/goupnp v1.3.0 // indirect
|
||||
github.com/ipfs/go-cid v0.4.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/klauspost/compress v1.17.2 // indirect
|
||||
github.com/klauspost/cpuid/v2 v2.2.5 // indirect
|
||||
github.com/koron/go-ssdp v0.0.4 // indirect
|
||||
github.com/libp2p/go-cidranger v1.1.0 // indirect
|
||||
github.com/libp2p/go-flow-metrics v0.1.0 // indirect
|
||||
github.com/libp2p/go-libp2p-asn-util v0.3.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-reuseport v0.4.0 // indirect
|
||||
github.com/libp2p/go-yamux/v4 v4.0.1 // indirect
|
||||
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect
|
||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
|
||||
github.com/miekg/dns v1.1.56 // 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
|
||||
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-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-multihash v0.2.3 // indirect
|
||||
github.com/multiformats/go-multistream v0.5.0 // indirect
|
||||
github.com/multiformats/go-varint v0.0.7 // indirect
|
||||
github.com/onsi/ginkgo/v2 v2.13.0 // indirect
|
||||
github.com/opencontainers/runtime-spec v1.1.0 // indirect
|
||||
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect
|
||||
github.com/pkg/errors v0.9.1 // indirect
|
||||
github.com/prometheus/client_golang v1.14.0 // indirect
|
||||
github.com/prometheus/client_model v0.4.0 // indirect
|
||||
github.com/prometheus/common v0.42.0 // indirect
|
||||
github.com/prometheus/procfs v0.9.0 // indirect
|
||||
github.com/quic-go/qpack v0.4.0 // indirect
|
||||
github.com/quic-go/qtls-go1-20 v0.3.4 // indirect
|
||||
github.com/quic-go/quic-go v0.39.3 // indirect
|
||||
github.com/quic-go/webtransport-go v0.6.0 // indirect
|
||||
github.com/raulk/go-watchdog v1.3.0 // indirect
|
||||
github.com/spaolacci/murmur3 v1.1.0 // indirect
|
||||
go.uber.org/dig v1.17.1 // indirect
|
||||
go.uber.org/fx v1.20.1 // indirect
|
||||
go.uber.org/mock v0.3.0 // indirect
|
||||
go.uber.org/multierr v1.11.0 // indirect
|
||||
go.uber.org/zap v1.26.0 // indirect
|
||||
golang.org/x/crypto v0.14.0 // indirect
|
||||
golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect
|
||||
golang.org/x/mod v0.13.0 // indirect
|
||||
golang.org/x/net v0.17.0 // indirect
|
||||
golang.org/x/sync v0.4.0 // indirect
|
||||
golang.org/x/sys v0.13.0 // indirect
|
||||
golang.org/x/text v0.13.0 // indirect
|
||||
golang.org/x/tools v0.14.0 // indirect
|
||||
google.golang.org/protobuf v1.30.0 // indirect
|
||||
lukechampine.com/blake3 v1.2.1 // indirect
|
||||
)
|
||||
@@ -0,0 +1,506 @@
|
||||
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/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
|
||||
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=
|
||||
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/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g=
|
||||
github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s=
|
||||
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
|
||||
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||
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/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/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/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/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/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=
|
||||
github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo=
|
||||
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs=
|
||||
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0=
|
||||
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/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
|
||||
github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs=
|
||||
github.com/elastic/gosigar v0.14.2 h1:Dg80n8cr90OZ7x+bAax/QjoW/XqTI11RmA79ZwIm9/4=
|
||||
github.com/elastic/gosigar v0.14.2/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs=
|
||||
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
|
||||
github.com/flynn/noise v1.0.0 h1:DlTHqmzmvcEiKj+4RYo/imoswx/4r6iBlCMfVtrMXpQ=
|
||||
github.com/flynn/noise v1.0.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/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||
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-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q=
|
||||
github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ=
|
||||
github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
|
||||
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
|
||||
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.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
|
||||
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/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/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
|
||||
github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
|
||||
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.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
||||
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
|
||||
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
||||
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.5.2/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.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
|
||||
github.com/google/go-cmp v0.5.9/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-20230817174616-7a8ec2ada47b h1:h9U78+dx9a4BKdQkBBos92HalKpaGKHrp+3Uo6yTodo=
|
||||
github.com/google/pprof v0.0.0-20230817174616-7a8ec2ada47b/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=
|
||||
github.com/google/pprof v0.0.0-20231023181126-ff6d637d2a7b h1:RMpPgZTSApbPf7xaVel+QkoGPRLFLrwFO89uDUHEGf0=
|
||||
github.com/google/pprof v0.0.0-20231023181126-ff6d637d2a7b/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=
|
||||
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/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
|
||||
github.com/gorilla/websocket v1.5.0/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/huin/goupnp v1.2.0 h1:uOKW26NG1hsSSbXIZ1IR7XP9Gjd1U8pnLaCMgntmkmY=
|
||||
github.com/huin/goupnp v1.2.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8=
|
||||
github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc=
|
||||
github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8=
|
||||
github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s=
|
||||
github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk=
|
||||
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-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY=
|
||||
github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI=
|
||||
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=
|
||||
github.com/jbenet/go-temp-err-catcher v0.1.0/go.mod h1:0kJRvmDZXNMIiJirNPEYfhpPwbGVtZVWC34vc5WLsDk=
|
||||
github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU=
|
||||
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/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
|
||||
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||
github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I=
|
||||
github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
|
||||
github.com/klauspost/compress v1.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4=
|
||||
github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
|
||||
github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg=
|
||||
github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
|
||||
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 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
|
||||
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
||||
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=
|
||||
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=
|
||||
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.31.0 h1:LFShhP8F6xthWiBBq3euxbKjZsoRajVEyBS9snfHxYg=
|
||||
github.com/libp2p/go-libp2p v0.31.0/go.mod h1:W/FEK1c/t04PbRH3fA9i5oucu5YcgrG0JVoBWT1B7Eg=
|
||||
github.com/libp2p/go-libp2p v0.32.1 h1:wy1J4kZIZxOaej6NveTWCZmHiJ/kY7GoAqXgqNCnPps=
|
||||
github.com/libp2p/go-libp2p v0.32.1/go.mod h1:hXXC3kXPlBZ1eu8Q2hptGrMB4mZ3048JUoS4EKaHW5c=
|
||||
github.com/libp2p/go-libp2p-asn-util v0.3.0 h1:gMDcMyYiZKkocGXDQ5nsUQyquC9+H+iLEQHwOCZ7s8s=
|
||||
github.com/libp2p/go-libp2p-asn-util v0.3.0/go.mod h1:B1mcOrKUE35Xq/ASTmQ4tN3LNzVVaMNmq2NACuqyB9w=
|
||||
github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA=
|
||||
github.com/libp2p/go-libp2p-testing v0.12.0/go.mod h1:KcGDRXyN7sQCllucn1cOOS+Dmm7ujhfEyXQL5lvkcPg=
|
||||
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-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=
|
||||
github.com/libp2p/go-yamux/v4 v4.0.1/go.mod h1:NWjl8ZTLOGlozrXSOZ/HlfG++39iKNnM5wwmtQP1YB4=
|
||||
github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI=
|
||||
github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
||||
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/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
|
||||
github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
|
||||
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||
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=
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo=
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
|
||||
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.55 h1:GoQ4hpsj0nFLYe+bWiCToyrBEJXkQfOOIvFGFy0lEgo=
|
||||
github.com/miekg/dns v1.1.55/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY=
|
||||
github.com/miekg/dns v1.1.56 h1:5imZaSeoRNvpM9SzWNhEcP9QliKiz20/dA2QabIGVnE=
|
||||
github.com/miekg/dns v1.1.56/go.mod h1:cRm6Oo2C8TY9ZS/TqsSrseAcncm74lfK5G+ikN2SWWY=
|
||||
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=
|
||||
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/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/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.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4=
|
||||
github.com/multiformats/go-multiaddr v0.11.0 h1:XqGyJ8ufbCE0HmTDwx2kPdsrQ36AGPZNZX6s6xfJH10=
|
||||
github.com/multiformats/go-multiaddr v0.11.0/go.mod h1:gWUm0QLR4thQ6+ZF6SXUw8YjtwQSPapICM+NmCkxHSM=
|
||||
github.com/multiformats/go-multiaddr v0.12.0 h1:1QlibTFkoXJuDjjYsMHhE73TnzJQl8FSWatk/0gxGzE=
|
||||
github.com/multiformats/go-multiaddr v0.12.0/go.mod h1:WmZXgObOQOYp9r3cslLlppkrz1FYSHmE834dfz/lWu8=
|
||||
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-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.4.1 h1:rFy0Iiyn3YT0asivDUIR05leAdwZq3de4741sbiSdfo=
|
||||
github.com/multiformats/go-multistream v0.4.1/go.mod h1:Mz5eykRVAjJWckE2U78c6xqdtyNUEhKSM0Lwar2p77Q=
|
||||
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/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/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU=
|
||||
github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM=
|
||||
github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4=
|
||||
github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o=
|
||||
github.com/onsi/gomega v1.27.8 h1:gegWiwZjBsf2DgiSbf5hpokZ98JVDMcWkUiigk6/KXc=
|
||||
github.com/onsi/gomega v1.27.8/go.mod h1:2J8vzI/s+2shY9XHRApDkdgPo1TKT7P2u6fXeJKFnNQ=
|
||||
github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI=
|
||||
github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
|
||||
github.com/opencontainers/runtime-spec v1.1.0 h1:HHUyrt9mwHUjtasSbXSMvs4cyFxh+Bll4AjJ9odEGpg=
|
||||
github.com/opencontainers/runtime-spec v1.1.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
|
||||
github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8=
|
||||
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/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/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||
github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw=
|
||||
github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y=
|
||||
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
||||
github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY=
|
||||
github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU=
|
||||
github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
|
||||
github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM=
|
||||
github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc=
|
||||
github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||
github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI=
|
||||
github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY=
|
||||
github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo=
|
||||
github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A=
|
||||
github.com/quic-go/qtls-go1-20 v0.3.3 h1:17/glZSLI9P9fDAeyCHBFSWSqJcwx1byhLwP5eUIDCM=
|
||||
github.com/quic-go/qtls-go1-20 v0.3.3/go.mod h1:X9Nh97ZL80Z+bX/gUXMbipO6OxdiDi58b/fMC9mAL+k=
|
||||
github.com/quic-go/qtls-go1-20 v0.3.4 h1:MfFAPULvst4yoMgY9QmtpYmfij/em7O8UUi+bNVm7Cg=
|
||||
github.com/quic-go/qtls-go1-20 v0.3.4/go.mod h1:X9Nh97ZL80Z+bX/gUXMbipO6OxdiDi58b/fMC9mAL+k=
|
||||
github.com/quic-go/quic-go v0.38.1 h1:M36YWA5dEhEeT+slOu/SwMEucbYd0YFidxG3KlGPZaE=
|
||||
github.com/quic-go/quic-go v0.38.1/go.mod h1:ijnZM7JsFIkp4cRyjxJNIzdSfCLmUMg9wdyhGmg+SN4=
|
||||
github.com/quic-go/quic-go v0.39.3 h1:o3YB6t2SR+HU/pgwF29kJ6g4jJIJEwEZ8CKia1h1TKg=
|
||||
github.com/quic-go/quic-go v0.39.3/go.mod h1:T09QsDQWjLiQ74ZmacDfqZmhY/NLnw5BC40MANNNZ1Q=
|
||||
github.com/quic-go/webtransport-go v0.5.3 h1:5XMlzemqB4qmOlgIus5zB45AcZ2kCgCy2EptUrfOPWU=
|
||||
github.com/quic-go/webtransport-go v0.5.3/go.mod h1:OhmmgJIzTTqXK5xvtuX0oBpLV2GkLWNDA+UeTGJXErU=
|
||||
github.com/quic-go/webtransport-go v0.6.0 h1:CvNsKqc4W2HljHJnoT+rMmbRJybShZ0YPFDD3NxaZLY=
|
||||
github.com/quic-go/webtransport-go v0.6.0/go.mod h1:9KjU4AEBqEQidGHNDkZrb8CAa1abRaosM2yGOyiikEc=
|
||||
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/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/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=
|
||||
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.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
||||
github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE=
|
||||
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/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
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.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.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
|
||||
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||
github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA=
|
||||
github.com/urfave/cli v1.22.2/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=
|
||||
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=
|
||||
go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA=
|
||||
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.17.0 h1:5Chju+tUvcC+N7N6EV08BJz41UZuO3BmHcN4A287ZLI=
|
||||
go.uber.org/dig v1.17.0/go.mod h1:rTxpf7l5I0eBTlE6/9RL+lDybC7WFwY2QH55ZSjy1mU=
|
||||
go.uber.org/dig v1.17.1 h1:Tga8Lz8PcYNsWsyHMZ1Vm0OQOUaJNDyvPImgbAu9YSc=
|
||||
go.uber.org/dig v1.17.1/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE=
|
||||
go.uber.org/fx v1.20.0 h1:ZMC/pnRvhsthOZh9MZjMq5U8Or3mA9zBSPaLnzs3ihQ=
|
||||
go.uber.org/fx v1.20.0/go.mod h1:qCUj0btiR3/JnanEr1TYEePfSw6o/4qYJscgvzQ5Ub0=
|
||||
go.uber.org/fx v1.20.1 h1:zVwVQGS8zYvhh9Xxcu4w1M6ESyeMzebzj2NbSayZ4Mk=
|
||||
go.uber.org/fx v1.20.1/go.mod h1:iSYNbHf2y55acNCwCXKx7LbWb5WG1Bnue5RDXz1OREg=
|
||||
go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
|
||||
go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=
|
||||
go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo=
|
||||
go.uber.org/mock v0.3.0 h1:3mUxI1No2/60yUYax92Pt8eNOEecx2D3lcXZh2NEZJo=
|
||||
go.uber.org/mock v0.3.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc=
|
||||
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.25.0 h1:4Hvk6GtkucQ790dqmj7l1eEnRdKm3k3ZUrUMS2d5+5c=
|
||||
go.uber.org/zap v1.25.0/go.mod h1:JIAUzQIH94IC4fOJQm7gMmBJP5k7wQfdcnYdPoEXJYk=
|
||||
go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=
|
||||
go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=
|
||||
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.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk=
|
||||
golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
|
||||
golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc=
|
||||
golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 h1:m64FZMko/V45gv0bNmrNYoDEq8U5YUhetc9cBWKS1TQ=
|
||||
golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8=
|
||||
golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI=
|
||||
golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo=
|
||||
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=
|
||||
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.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc=
|
||||
golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||
golang.org/x/mod v0.13.0 h1:I/DsJXRlw/8l/0c24sM9yb0T4z9liZTduXvdAWYiysY=
|
||||
golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
||||
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=
|
||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/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.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14=
|
||||
golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
|
||||
golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
|
||||
golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
|
||||
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-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E=
|
||||
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
|
||||
golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ=
|
||||
golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
|
||||
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-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-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/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-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-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/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.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM=
|
||||
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
|
||||
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
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.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc=
|
||||
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||
golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
|
||||
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||
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/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-20181030221726-6c7e314b6563/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-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-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||
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.12.1-0.20230815132531-74c255bcf846 h1:Vve/L0v7CXXuxUmaMGIEK/dEeq7uiqb5qBgQrZzIE7E=
|
||||
golang.org/x/tools v0.12.1-0.20230815132531-74c255bcf846/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM=
|
||||
golang.org/x/tools v0.14.0 h1:jvNa2pY0M4r62jkRQ6RwEZZyPcymeL9XZMLBbV7U2nc=
|
||||
golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg=
|
||||
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=
|
||||
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/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/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.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng=
|
||||
google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
||||
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=
|
||||
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.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=
|
||||
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=
|
||||
lukechampine.com/blake3 v1.2.1 h1:YuqqRuaqsGV71BV/nm9xlI0MKUv4QC54jQnBChWbGnI=
|
||||
lukechampine.com/blake3 v1.2.1/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k=
|
||||
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=
|
||||
@@ -0,0 +1,120 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"flag"
|
||||
"fmt"
|
||||
"net"
|
||||
"time"
|
||||
|
||||
"github.com/libp2p/go-libp2p"
|
||||
"github.com/libp2p/go-libp2p/core/crypto"
|
||||
"github.com/libp2p/go-libp2p/core/peer"
|
||||
"github.com/multiformats/go-multiaddr"
|
||||
)
|
||||
|
||||
func main() {
|
||||
runServer := flag.Bool("run-server", false, "Should run as server")
|
||||
serverAddr := flag.String("server-address", "", "Server address")
|
||||
transport := flag.String("transport", "tcp", "Transport to use")
|
||||
uploadBytes := flag.Uint64("upload-bytes", 0, "Upload bytes")
|
||||
downloadBytes := flag.Uint64("download-bytes", 0, "Download bytes")
|
||||
flag.Parse()
|
||||
|
||||
host, port, err := net.SplitHostPort(*serverAddr)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
tcpMultiAddrStr := fmt.Sprintf("/ip4/%s/tcp/%s", host, port)
|
||||
quicMultiAddrStr := fmt.Sprintf("/ip4/%s/udp/%s/quic-v1", host, port)
|
||||
|
||||
var opts []libp2p.Option
|
||||
if *runServer {
|
||||
opts = append(opts, libp2p.ListenAddrStrings(tcpMultiAddrStr, quicMultiAddrStr))
|
||||
|
||||
// Generate stable fake identity.
|
||||
//
|
||||
// Using a stable identity (i.e. peer ID) allows the client to
|
||||
// connect to the server without a prior exchange of the
|
||||
// server's peer ID.
|
||||
priv, _, err := crypto.GenerateEd25519Key(&simpleReader{seed: 0})
|
||||
if err != nil {
|
||||
log.Fatalf("failed to generate key: %s", err)
|
||||
}
|
||||
opts = append(opts, libp2p.Identity(priv))
|
||||
}
|
||||
|
||||
h, err := libp2p.New(opts...)
|
||||
if err != nil {
|
||||
log.Fatalf("failed to instantiate libp2p: %s", err)
|
||||
}
|
||||
|
||||
perf := NewPerfService(h)
|
||||
if *runServer {
|
||||
for _, a := range h.Addrs() {
|
||||
fmt.Println(a.Encapsulate(multiaddr.StringCast("/p2p/" + h.ID().String())))
|
||||
}
|
||||
|
||||
select {} // run forever, exit on interrupt
|
||||
}
|
||||
|
||||
var multiAddrStr string
|
||||
switch *transport {
|
||||
case "tcp":
|
||||
multiAddrStr = tcpMultiAddrStr
|
||||
case "quic-v1":
|
||||
multiAddrStr = quicMultiAddrStr
|
||||
default:
|
||||
fmt.Println("Invalid transport. Accepted values: 'tcp' or 'quic-v1'")
|
||||
return
|
||||
}
|
||||
// Peer ID corresponds to the above fake identity.
|
||||
multiAddrStr = multiAddrStr + "/p2p/12D3KooWDpJ7As7BWAwRMfu1VU2WCqNjvq387JEYKDBj4kx6nXTN"
|
||||
serverInfo, err := peer.AddrInfoFromString(multiAddrStr)
|
||||
if err != nil {
|
||||
log.Fatalf("failed to build address info: %s", err)
|
||||
}
|
||||
|
||||
start := time.Now()
|
||||
err = h.Connect(context.Background(), *serverInfo)
|
||||
if err != nil {
|
||||
log.Fatalf("failed to dial peer: %s", err)
|
||||
}
|
||||
|
||||
err = perf.RunPerf(context.Background(), serverInfo.ID, uint64(*uploadBytes), uint64(*downloadBytes))
|
||||
if err != nil {
|
||||
log.Fatalf("failed to execute perf: %s", err)
|
||||
}
|
||||
|
||||
jsonB, err := json.Marshal(Result{
|
||||
TimeSeconds: time.Since(start).Seconds(),
|
||||
UploadBytes: *uploadBytes,
|
||||
DownloadBytes: *downloadBytes,
|
||||
Type: "final",
|
||||
})
|
||||
if err != nil {
|
||||
log.Fatalf("failed to marshal perf result: %s", err)
|
||||
}
|
||||
|
||||
fmt.Println(string(jsonB))
|
||||
}
|
||||
|
||||
type Result struct {
|
||||
Type string `json:"type"`
|
||||
TimeSeconds float64 `json:"timeSeconds"`
|
||||
UploadBytes uint64 `json:"uploadBytes"`
|
||||
DownloadBytes uint64 `json:"downloadBytes"`
|
||||
}
|
||||
|
||||
type simpleReader struct {
|
||||
seed uint8
|
||||
}
|
||||
|
||||
func (r *simpleReader) Read(p []byte) (n int, err error) {
|
||||
for i := range p {
|
||||
p[i] = r.seed
|
||||
}
|
||||
return len(p), nil
|
||||
}
|
||||
@@ -0,0 +1,169 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/binary"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"time"
|
||||
|
||||
logging "github.com/ipfs/go-log/v2"
|
||||
pool "github.com/libp2p/go-buffer-pool"
|
||||
"github.com/libp2p/go-libp2p/core/host"
|
||||
"github.com/libp2p/go-libp2p/core/network"
|
||||
"github.com/libp2p/go-libp2p/core/peer"
|
||||
)
|
||||
|
||||
var log = logging.Logger("perf")
|
||||
|
||||
const (
|
||||
ID = "/perf/1.0.0"
|
||||
blockSize = 64 << 10
|
||||
)
|
||||
|
||||
type PerfService struct {
|
||||
Host host.Host
|
||||
}
|
||||
|
||||
func NewPerfService(h host.Host) *PerfService {
|
||||
ps := &PerfService{h}
|
||||
h.SetStreamHandler(ID, ps.PerfHandler)
|
||||
return ps
|
||||
}
|
||||
|
||||
func (ps *PerfService) PerfHandler(s network.Stream) {
|
||||
u64Buf := make([]byte, 8)
|
||||
if _, err := io.ReadFull(s, u64Buf); err != nil {
|
||||
log.Errorw("err", err)
|
||||
s.Reset()
|
||||
return
|
||||
}
|
||||
|
||||
bytesToSend := binary.BigEndian.Uint64(u64Buf)
|
||||
|
||||
if _, err := drainStream(s); err != nil {
|
||||
log.Errorw("err", err)
|
||||
s.Reset()
|
||||
return
|
||||
}
|
||||
|
||||
if err := sendBytes(s, bytesToSend); err != nil {
|
||||
log.Errorw("err", err)
|
||||
s.Reset()
|
||||
return
|
||||
}
|
||||
s.CloseWrite()
|
||||
}
|
||||
|
||||
func (ps *PerfService) RunPerf(ctx context.Context, p peer.ID, bytesToSend uint64, bytesToRecv uint64) error {
|
||||
s, err := ps.Host.NewStream(ctx, p, ID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
sizeBuf := make([]byte, 8)
|
||||
binary.BigEndian.PutUint64(sizeBuf, bytesToRecv)
|
||||
|
||||
_, err = s.Write(sizeBuf)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := sendBytes(s, bytesToSend); err != nil {
|
||||
return err
|
||||
}
|
||||
s.CloseWrite()
|
||||
|
||||
recvd, err := drainStream(s)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if recvd != bytesToRecv {
|
||||
return fmt.Errorf("expected to recv %d bytes, got %d", bytesToRecv, recvd)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func sendBytes(s io.Writer, bytesToSend uint64) error {
|
||||
buf := pool.Get(blockSize)
|
||||
defer pool.Put(buf)
|
||||
|
||||
lastReportTime := time.Now()
|
||||
lastReportWrite := uint64(0)
|
||||
|
||||
for bytesToSend > 0 {
|
||||
now := time.Now()
|
||||
if now.Sub(lastReportTime) >= time.Second {
|
||||
jsonB, err := json.Marshal(Result{
|
||||
TimeSeconds: now.Sub(lastReportTime).Seconds(),
|
||||
UploadBytes: lastReportWrite,
|
||||
Type: "intermediary",
|
||||
})
|
||||
if err != nil {
|
||||
log.Fatalf("failed to marshal perf result: %s", err)
|
||||
}
|
||||
fmt.Println(string(jsonB))
|
||||
|
||||
lastReportTime = now
|
||||
lastReportWrite = 0
|
||||
}
|
||||
|
||||
toSend := buf
|
||||
if bytesToSend < blockSize {
|
||||
toSend = buf[:bytesToSend]
|
||||
}
|
||||
|
||||
n, err := s.Write(toSend)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
bytesToSend -= uint64(n)
|
||||
lastReportWrite += uint64(n)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func drainStream(s io.Reader) (uint64, error) {
|
||||
var recvd int64
|
||||
recvd, err := io.Copy(io.Discard, &reportingReader{orig: s, LastReportTime: time.Now()})
|
||||
if err != nil && err != io.EOF {
|
||||
return uint64(recvd), err
|
||||
}
|
||||
return uint64(recvd), nil
|
||||
}
|
||||
|
||||
type reportingReader struct {
|
||||
orig io.Reader
|
||||
LastReportTime time.Time
|
||||
lastReportRead uint64
|
||||
}
|
||||
|
||||
var _ io.Reader = &reportingReader{}
|
||||
|
||||
func (r *reportingReader) Read(b []byte) (int, error) {
|
||||
n, err := r.orig.Read(b)
|
||||
r.lastReportRead += uint64(n)
|
||||
|
||||
now := time.Now()
|
||||
if now.Sub(r.LastReportTime) >= time.Second {
|
||||
result := Result{
|
||||
TimeSeconds: now.Sub(r.LastReportTime).Seconds(),
|
||||
Type: "intermediary",
|
||||
DownloadBytes: r.lastReportRead,
|
||||
}
|
||||
|
||||
jsonB, err := json.Marshal(result)
|
||||
if err != nil {
|
||||
log.Fatalf("failed to marshal perf result: %s", err)
|
||||
}
|
||||
fmt.Println(string(jsonB))
|
||||
|
||||
r.LastReportTime = now
|
||||
r.lastReportRead = 0
|
||||
}
|
||||
|
||||
return n, err
|
||||
}
|
||||
@@ -1,12 +1,19 @@
|
||||
DOCKER_IMAGE := node:20-alpine
|
||||
DOCKER_RUN := docker run --rm -v "$(shell pwd)":/usr/src/myapp -w /usr/src/myapp $(DOCKER_IMAGE)
|
||||
NPM_PACKAGE_VERSION := 1.1.6
|
||||
NPM_PACKAGE := @libp2p/perf
|
||||
NPM_PACKAGE_NAME := $(NPM_PACKAGE)@$(NPM_PACKAGE_VERSION)
|
||||
|
||||
SOURCE_DIR := js-libp2p-protocol-perf
|
||||
|
||||
DOCKER_IMAGE := node:18.17.1
|
||||
DOCKER_RUN := docker run --rm -v "$(shell pwd)/$(SOURCE_DIR)":/usr/src/myapp -w /usr/src/myapp $(DOCKER_IMAGE)
|
||||
|
||||
all: perf
|
||||
|
||||
perf:
|
||||
$(DOCKER_RUN) npm ci
|
||||
mkdir -p $(SOURCE_DIR)
|
||||
$(DOCKER_RUN) npm install $(NPM_PACKAGE_NAME)
|
||||
|
||||
clean:
|
||||
rm -rf node_modules
|
||||
rm -rf js-libp2p-*
|
||||
|
||||
.PHONY: all clean perf
|
||||
|
||||
@@ -1,108 +0,0 @@
|
||||
import { noise } from '@chainsafe/libp2p-noise'
|
||||
import { yamux } from '@chainsafe/libp2p-yamux'
|
||||
import { tcp } from '@libp2p/tcp'
|
||||
import { multiaddr } from '@multiformats/multiaddr'
|
||||
import { createLibp2p } from 'libp2p'
|
||||
import { perfService } from '@libp2p/perf'
|
||||
import { parseArgs } from 'node:util'
|
||||
|
||||
const argv = parseArgs({
|
||||
options: {
|
||||
'run-server': {
|
||||
type: 'string',
|
||||
default: 'false'
|
||||
},
|
||||
'server-address': {
|
||||
type: 'string'
|
||||
},
|
||||
transport: {
|
||||
type: 'string',
|
||||
default: 'tcp'
|
||||
},
|
||||
'upload-bytes': {
|
||||
type: 'string',
|
||||
default: '0'
|
||||
},
|
||||
'download-bytes': {
|
||||
type: 'string',
|
||||
default: '0'
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
/**
|
||||
* @param {boolean} runServer
|
||||
* @param {string} serverIpAddress
|
||||
* @param {string} transport
|
||||
* @param {number} uploadBytes
|
||||
* @param {number} downloadBytes
|
||||
*/
|
||||
export async function main (runServer, serverIpAddress, transport, uploadBytes, downloadBytes) {
|
||||
const { host, port } = splitHostPort(serverIpAddress)
|
||||
|
||||
const config = {
|
||||
transports: [
|
||||
tcp()
|
||||
],
|
||||
streamMuxers: [
|
||||
yamux()
|
||||
],
|
||||
connectionEncryption: [
|
||||
noise()
|
||||
],
|
||||
connectionManager: {
|
||||
minConnections: 0
|
||||
},
|
||||
services: {
|
||||
perf: perfService()
|
||||
}
|
||||
}
|
||||
|
||||
if (runServer) {
|
||||
Object.assign(config, {
|
||||
addresses: {
|
||||
listen: [
|
||||
// #TODO: right now we only support tcp
|
||||
`/ip4/${host}/tcp/${port}`
|
||||
]
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
const node = await createLibp2p(config)
|
||||
|
||||
await node.start()
|
||||
|
||||
if (!runServer) {
|
||||
for await (const output of node.services.perf.measurePerformance(multiaddr(`/ip4/${host}/tcp/${port}`), uploadBytes, downloadBytes)) {
|
||||
// eslint-disable-next-line no-console
|
||||
console.log(JSON.stringify(output))
|
||||
}
|
||||
|
||||
await node.stop()
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string} address
|
||||
* @returns { host: string, port?: string }
|
||||
*/
|
||||
function splitHostPort (address) {
|
||||
try {
|
||||
const parts = address.split(':')
|
||||
const host = parts[0]
|
||||
const port = parts[1]
|
||||
return {
|
||||
host,
|
||||
port
|
||||
}
|
||||
} catch (error) {
|
||||
throw Error('Invalid server address')
|
||||
}
|
||||
}
|
||||
|
||||
main(argv.values['run-server'] === 'true', argv.values['server-address'], argv.values.transport, Number(argv.values['upload-bytes']), Number(argv.values['download-bytes'])).catch((err) => {
|
||||
// eslint-disable-next-line no-console
|
||||
console.error(err)
|
||||
process.exit(1)
|
||||
})
|
||||
-1376
File diff suppressed because it is too large
Load Diff
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"name": "@libp2p/perf-js-libp2p-0-46",
|
||||
"private": true,
|
||||
"main": "index.js",
|
||||
"type": "module",
|
||||
"dependencies": {
|
||||
"@chainsafe/libp2p-noise": "^13.0.3",
|
||||
"@chainsafe/libp2p-yamux": "^5.0.3",
|
||||
"@libp2p/perf": "^2.0.1",
|
||||
"@libp2p/tcp": "^8.0.13",
|
||||
"libp2p": "^0.46.21"
|
||||
}
|
||||
}
|
||||
@@ -36,7 +36,7 @@ for ((i = 1; i <= $#; i++)); do
|
||||
done
|
||||
|
||||
# Run perf
|
||||
node $(dirname "$0")/index.js --run-server=$run_server --server-address=$server_address --upload-bytes=$upload_bytes --download-bytes=$download_bytes --transport=$transport &
|
||||
node impl/js-libp2p/v0.46/js-libp2p-protocol-perf/node_modules/@libp2p/perf/dist/src/main.js --run-server=$run_server --server-address=$server_address --upload-bytes=$upload_bytes --download-bytes=$download_bytes --transport=$transport &
|
||||
|
||||
node_pid=$!
|
||||
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
DOCKER_IMAGE := node:20-alpine
|
||||
DOCKER_RUN := docker run --rm -v "$(shell pwd)":/usr/src/myapp -w /usr/src/myapp $(DOCKER_IMAGE)
|
||||
|
||||
all: perf
|
||||
|
||||
perf:
|
||||
$(DOCKER_RUN) npm ci
|
||||
|
||||
clean:
|
||||
rm -rf node_modules
|
||||
|
||||
.PHONY: all clean perf
|
||||
@@ -1,108 +0,0 @@
|
||||
import { noise } from '@chainsafe/libp2p-noise'
|
||||
import { yamux } from '@chainsafe/libp2p-yamux'
|
||||
import { tcp } from '@libp2p/tcp'
|
||||
import { multiaddr } from '@multiformats/multiaddr'
|
||||
import { createLibp2p } from 'libp2p'
|
||||
import { perf } from '@libp2p/perf'
|
||||
import { parseArgs } from 'node:util'
|
||||
|
||||
const argv = parseArgs({
|
||||
options: {
|
||||
'run-server': {
|
||||
type: 'string',
|
||||
default: 'false'
|
||||
},
|
||||
'server-address': {
|
||||
type: 'string'
|
||||
},
|
||||
transport: {
|
||||
type: 'string',
|
||||
default: 'tcp'
|
||||
},
|
||||
'upload-bytes': {
|
||||
type: 'string',
|
||||
default: '0'
|
||||
},
|
||||
'download-bytes': {
|
||||
type: 'string',
|
||||
default: '0'
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
/**
|
||||
* @param {boolean} runServer
|
||||
* @param {string} serverIpAddress
|
||||
* @param {string} transport
|
||||
* @param {number} uploadBytes
|
||||
* @param {number} downloadBytes
|
||||
*/
|
||||
export async function main (runServer, serverIpAddress, transport, uploadBytes, downloadBytes) {
|
||||
const { host, port } = splitHostPort(serverIpAddress)
|
||||
|
||||
const config = {
|
||||
transports: [
|
||||
tcp()
|
||||
],
|
||||
streamMuxers: [
|
||||
yamux()
|
||||
],
|
||||
connectionEncryption: [
|
||||
noise()
|
||||
],
|
||||
connectionManager: {
|
||||
minConnections: 0
|
||||
},
|
||||
services: {
|
||||
perf: perf()
|
||||
}
|
||||
}
|
||||
|
||||
if (runServer) {
|
||||
Object.assign(config, {
|
||||
addresses: {
|
||||
listen: [
|
||||
// #TODO: right now we only support tcp
|
||||
`/ip4/${host}/tcp/${port}`
|
||||
]
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
const node = await createLibp2p(config)
|
||||
|
||||
await node.start()
|
||||
|
||||
if (!runServer) {
|
||||
for await (const output of node.services.perf.measurePerformance(multiaddr(`/ip4/${host}/tcp/${port}`), uploadBytes, downloadBytes)) {
|
||||
// eslint-disable-next-line no-console
|
||||
console.log(JSON.stringify(output))
|
||||
}
|
||||
|
||||
await node.stop()
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string} address
|
||||
* @returns { host: string, port?: string }
|
||||
*/
|
||||
function splitHostPort (address) {
|
||||
try {
|
||||
const parts = address.split(':')
|
||||
const host = parts[0]
|
||||
const port = parts[1]
|
||||
return {
|
||||
host,
|
||||
port
|
||||
}
|
||||
} catch (error) {
|
||||
throw Error('Invalid server address')
|
||||
}
|
||||
}
|
||||
|
||||
main(argv.values['run-server'] === 'true', argv.values['server-address'], argv.values.transport, Number(argv.values['upload-bytes']), Number(argv.values['download-bytes'])).catch((err) => {
|
||||
// eslint-disable-next-line no-console
|
||||
console.error(err)
|
||||
process.exit(1)
|
||||
})
|
||||
-908
@@ -1,908 +0,0 @@
|
||||
{
|
||||
"name": "@libp2p/perf-js-libp2p-1-0",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "@libp2p/perf-js-libp2p-1-0",
|
||||
"dependencies": {
|
||||
"@chainsafe/libp2p-noise": "^14.0.0",
|
||||
"@chainsafe/libp2p-yamux": "^6.0.1",
|
||||
"@libp2p/perf": "^3.0.4",
|
||||
"@libp2p/tcp": "^9.0.4",
|
||||
"libp2p": "^1.0.5"
|
||||
}
|
||||
},
|
||||
"node_modules/@chainsafe/as-chacha20poly1305": {
|
||||
"version": "0.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@chainsafe/as-chacha20poly1305/-/as-chacha20poly1305-0.1.0.tgz",
|
||||
"integrity": "sha512-BpNcL8/lji/GM3+vZ/bgRWqJ1q5kwvTFmGPk7pxm/QQZDbaMI98waOHjEymTjq2JmdD/INdNBFOVSyJofXg7ew=="
|
||||
},
|
||||
"node_modules/@chainsafe/as-sha256": {
|
||||
"version": "0.4.1",
|
||||
"resolved": "https://registry.npmjs.org/@chainsafe/as-sha256/-/as-sha256-0.4.1.tgz",
|
||||
"integrity": "sha512-IqeeGwQihK6Y2EYLFofqs2eY2ep1I2MvQXHzOAI+5iQN51OZlUkrLgyAugu2x86xZewDk5xas7lNczkzFzF62w=="
|
||||
},
|
||||
"node_modules/@chainsafe/is-ip": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@chainsafe/is-ip/-/is-ip-2.0.2.tgz",
|
||||
"integrity": "sha512-ndGqEMG1W5WkGagaqOZHpPU172AGdxr+LD15sv3WIUvT5oCFUrG1Y0CW/v2Egwj4JXEvSibaIIIqImsm98y1nA=="
|
||||
},
|
||||
"node_modules/@chainsafe/libp2p-noise": {
|
||||
"version": "14.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@chainsafe/libp2p-noise/-/libp2p-noise-14.0.0.tgz",
|
||||
"integrity": "sha512-/E7QnSL24APpfXTj/YRS/EVRvTATg09+AwqEUGs+OeLFcO/DwPal3W6pj7c4eyJFSgxnegbpbgiH8EBvTZ4Iwg==",
|
||||
"dependencies": {
|
||||
"@chainsafe/as-chacha20poly1305": "^0.1.0",
|
||||
"@chainsafe/as-sha256": "^0.4.1",
|
||||
"@libp2p/crypto": "^3.0.0",
|
||||
"@libp2p/interface": "^1.0.0",
|
||||
"@libp2p/peer-id": "^4.0.0",
|
||||
"@noble/ciphers": "^0.4.0",
|
||||
"@noble/curves": "^1.1.0",
|
||||
"@noble/hashes": "^1.3.1",
|
||||
"it-byte-stream": "^1.0.0",
|
||||
"it-length-prefixed": "^9.0.1",
|
||||
"it-length-prefixed-stream": "^1.0.0",
|
||||
"it-pair": "^2.0.6",
|
||||
"it-pipe": "^3.0.1",
|
||||
"it-stream-types": "^2.0.1",
|
||||
"protons-runtime": "^5.0.0",
|
||||
"uint8arraylist": "^2.4.3",
|
||||
"uint8arrays": "^4.0.4",
|
||||
"wherearewe": "^2.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=16.0.0",
|
||||
"npm": ">=7.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@chainsafe/libp2p-yamux": {
|
||||
"version": "6.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@chainsafe/libp2p-yamux/-/libp2p-yamux-6.0.1.tgz",
|
||||
"integrity": "sha512-8ar6jph9ZuUUxQ8t8W1MaZqH7f7KvGK2wR7TDGnN0r4QtZc07ICNgVjnolnI9/8bclrI5Um4uMa8QCYKTrdvDQ==",
|
||||
"dependencies": {
|
||||
"@libp2p/interface": "^1.0.0",
|
||||
"@libp2p/utils": "^5.0.0",
|
||||
"get-iterator": "^2.0.1",
|
||||
"it-foreach": "^2.0.3",
|
||||
"it-pipe": "^3.0.1",
|
||||
"it-pushable": "^3.2.0",
|
||||
"uint8arraylist": "^2.4.3"
|
||||
}
|
||||
},
|
||||
"node_modules/@chainsafe/netmask": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@chainsafe/netmask/-/netmask-2.0.0.tgz",
|
||||
"integrity": "sha512-I3Z+6SWUoaljh3TBzCnCxjlUyN8tA+NAk5L6m9IxvCf1BENQTePzPMis97CoN/iMW1St3WN+AWCCRp+TTBRiDg==",
|
||||
"dependencies": {
|
||||
"@chainsafe/is-ip": "^2.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/@libp2p/crypto": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@libp2p/crypto/-/crypto-3.0.1.tgz",
|
||||
"integrity": "sha512-CvqzsWvAYaga/Du3gDRChN9d8PUnOoCQg3VlugKf6tfw5+1pd7sMDhyMLajXqFsWqQUY6FojgB1TS4izpODMpw==",
|
||||
"dependencies": {
|
||||
"@libp2p/interface": "^1.0.1",
|
||||
"@noble/curves": "^1.1.0",
|
||||
"@noble/hashes": "^1.3.1",
|
||||
"multiformats": "^12.1.3",
|
||||
"node-forge": "^1.1.0",
|
||||
"protons-runtime": "^5.0.0",
|
||||
"uint8arraylist": "^2.4.3",
|
||||
"uint8arrays": "^4.0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/@libp2p/interface": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@libp2p/interface/-/interface-1.0.1.tgz",
|
||||
"integrity": "sha512-TRo1YxJ+AVjt5ms+mTOp8xcoCis5HAUMzv0XfCvxtIw77Bog6TPR5VdkGutlEQOKUMzXtLP0lW88fTQBeiiOnA==",
|
||||
"dependencies": {
|
||||
"@multiformats/multiaddr": "^12.1.10",
|
||||
"it-pushable": "^3.2.1",
|
||||
"it-stream-types": "^2.0.1",
|
||||
"multiformats": "^12.1.3",
|
||||
"uint8arraylist": "^2.4.3"
|
||||
}
|
||||
},
|
||||
"node_modules/@libp2p/interface-internal": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@libp2p/interface-internal/-/interface-internal-1.0.1.tgz",
|
||||
"integrity": "sha512-mJ2uWPzjnIk9Y1/Ca/xk0coz8PCg8tnAQgxN+GNG0cdAbY6Wu7dNDm0P3aTh9NYfjCp+5nzSSEE2UW/nr7TB9Q==",
|
||||
"dependencies": {
|
||||
"@libp2p/interface": "^1.0.1",
|
||||
"@libp2p/peer-collections": "^5.0.0",
|
||||
"@multiformats/multiaddr": "^12.1.10",
|
||||
"uint8arraylist": "^2.4.3"
|
||||
}
|
||||
},
|
||||
"node_modules/@libp2p/logger": {
|
||||
"version": "4.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@libp2p/logger/-/logger-4.0.1.tgz",
|
||||
"integrity": "sha512-d7kJmbkphNvEI3Da4so+4nxUJhwW/T/d8Pd+aQIuT27RYNeVoRfkFkjYwPIP+NvJXtU4LDju7VDPLbPbU2zFGA==",
|
||||
"dependencies": {
|
||||
"@libp2p/interface": "^1.0.1",
|
||||
"@multiformats/multiaddr": "^12.1.10",
|
||||
"debug": "^4.3.4",
|
||||
"interface-datastore": "^8.2.0",
|
||||
"multiformats": "^12.1.3"
|
||||
}
|
||||
},
|
||||
"node_modules/@libp2p/multistream-select": {
|
||||
"version": "5.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@libp2p/multistream-select/-/multistream-select-5.0.0.tgz",
|
||||
"integrity": "sha512-1y4b8he9djNQYteKFRnDisryOGV70SQOaSuiNJgKaIPFFJ9DwYbz/ZCV0k0Ld4zqB4Ncm8ibBmyYuZg+yoOBuQ==",
|
||||
"dependencies": {
|
||||
"@libp2p/interface": "^1.0.1",
|
||||
"it-length-prefixed": "^9.0.3",
|
||||
"it-length-prefixed-stream": "^1.1.1",
|
||||
"it-pipe": "^3.0.1",
|
||||
"it-stream-types": "^2.0.1",
|
||||
"p-defer": "^4.0.0",
|
||||
"uint8-varint": "^2.0.2",
|
||||
"uint8arraylist": "^2.4.3",
|
||||
"uint8arrays": "^4.0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/@libp2p/peer-collections": {
|
||||
"version": "5.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@libp2p/peer-collections/-/peer-collections-5.0.0.tgz",
|
||||
"integrity": "sha512-2h6BF6t68TxnsErZrPzkMapH0GpZSCmOaimUMidrs9oSnxIMf62QnNAbfar8U2XbXnPJD9WkEicnSuJgDwg8Vw==",
|
||||
"dependencies": {
|
||||
"@libp2p/interface": "^1.0.1",
|
||||
"@libp2p/peer-id": "^4.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/@libp2p/peer-id": {
|
||||
"version": "4.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@libp2p/peer-id/-/peer-id-4.0.1.tgz",
|
||||
"integrity": "sha512-rEgZ4YPSVh7gqIXxWE9HVw318Og8fJohI2vWXNx2h+Ib/iMQTGrqGgSaJhjUMWYIy8MadpjofCPXObPEIX3E3g==",
|
||||
"dependencies": {
|
||||
"@libp2p/interface": "^1.0.1",
|
||||
"multiformats": "^12.1.3",
|
||||
"uint8arrays": "^4.0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/@libp2p/peer-id-factory": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@libp2p/peer-id-factory/-/peer-id-factory-4.0.0.tgz",
|
||||
"integrity": "sha512-dFbQOpxqEw4CqV+ZalMc5UABqts+hskMoaqytjmR55pXgL4KDamOyg7hBT/HrHRp2sStf8E2vwQ5wnjv1W9uFQ==",
|
||||
"dependencies": {
|
||||
"@libp2p/crypto": "^3.0.1",
|
||||
"@libp2p/interface": "^1.0.1",
|
||||
"@libp2p/peer-id": "^4.0.1",
|
||||
"multiformats": "^12.1.3",
|
||||
"protons-runtime": "^5.0.0",
|
||||
"uint8arraylist": "^2.4.3",
|
||||
"uint8arrays": "^4.0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/@libp2p/peer-record": {
|
||||
"version": "7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@libp2p/peer-record/-/peer-record-7.0.0.tgz",
|
||||
"integrity": "sha512-Kr5XgyRzqJjK4rBu+QA2e2zGT59rp2OKD8kviwpE4NwKWyDs85JaRduorso9KujJG/F0uZI8tOhPjadO1Lwatw==",
|
||||
"dependencies": {
|
||||
"@libp2p/crypto": "^3.0.1",
|
||||
"@libp2p/interface": "^1.0.1",
|
||||
"@libp2p/peer-id": "^4.0.1",
|
||||
"@libp2p/utils": "^5.0.2",
|
||||
"@multiformats/multiaddr": "^12.1.10",
|
||||
"protons-runtime": "^5.0.0",
|
||||
"uint8-varint": "^2.0.0",
|
||||
"uint8arraylist": "^2.4.3",
|
||||
"uint8arrays": "^4.0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/@libp2p/peer-store": {
|
||||
"version": "10.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@libp2p/peer-store/-/peer-store-10.0.0.tgz",
|
||||
"integrity": "sha512-DQilgZXfwokKTbr1EDQssIfn5bAMLCEUronhqy9VEIrF7mkiSqjsBtOcftDEJT4dXhDOV8F7mifznvJI32tZIA==",
|
||||
"dependencies": {
|
||||
"@libp2p/interface": "^1.0.1",
|
||||
"@libp2p/peer-collections": "^5.0.0",
|
||||
"@libp2p/peer-id": "^4.0.1",
|
||||
"@libp2p/peer-id-factory": "^4.0.0",
|
||||
"@libp2p/peer-record": "^7.0.0",
|
||||
"@multiformats/multiaddr": "^12.1.10",
|
||||
"interface-datastore": "^8.2.0",
|
||||
"it-all": "^3.0.2",
|
||||
"mortice": "^3.0.1",
|
||||
"multiformats": "^12.1.3",
|
||||
"protons-runtime": "^5.0.0",
|
||||
"uint8arraylist": "^2.4.3",
|
||||
"uint8arrays": "^4.0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/@libp2p/perf": {
|
||||
"version": "3.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@libp2p/perf/-/perf-3.0.4.tgz",
|
||||
"integrity": "sha512-keoLx6WkhWn+W5IA6Y4m/N1JxfLdpReXdDmrNMDwoLFsymWI0KmCUq/wQRT3l2T+xRlSPthg+Q7/QabJDSU3ig==",
|
||||
"dependencies": {
|
||||
"@libp2p/interface": "^1.0.1",
|
||||
"@libp2p/interface-internal": "^1.0.1",
|
||||
"@multiformats/multiaddr": "^12.1.10",
|
||||
"it-pushable": "^3.2.3"
|
||||
}
|
||||
},
|
||||
"node_modules/@libp2p/tcp": {
|
||||
"version": "9.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@libp2p/tcp/-/tcp-9.0.4.tgz",
|
||||
"integrity": "sha512-q3wAZMhEUXIEKnHPPHEjcO564P7pIkCWazC8SUGIPRLbmuSnni8cT2kd/Jx6xSv5ZOK2LHzJSKodLlpfi1Gmzg==",
|
||||
"dependencies": {
|
||||
"@libp2p/interface": "^1.0.1",
|
||||
"@libp2p/utils": "^5.0.2",
|
||||
"@multiformats/mafmt": "^12.1.6",
|
||||
"@multiformats/multiaddr": "^12.1.10",
|
||||
"@types/sinon": "^17.0.0",
|
||||
"stream-to-it": "^0.2.2"
|
||||
}
|
||||
},
|
||||
"node_modules/@libp2p/utils": {
|
||||
"version": "5.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@libp2p/utils/-/utils-5.0.2.tgz",
|
||||
"integrity": "sha512-PcDAH8pwtXq0pfoO9arHtg3CsqF+reheUd0OaQ9/Fn0YjjNpqcpseQyByBiwhiuQsauWo5RU+CKqRaRdvXKemA==",
|
||||
"dependencies": {
|
||||
"@chainsafe/is-ip": "^2.0.2",
|
||||
"@libp2p/interface": "^1.0.1",
|
||||
"@multiformats/multiaddr": "^12.1.10",
|
||||
"@multiformats/multiaddr-matcher": "^1.1.0",
|
||||
"get-iterator": "^2.0.1",
|
||||
"is-loopback-addr": "^2.0.1",
|
||||
"it-pushable": "^3.2.2",
|
||||
"it-stream-types": "^2.0.1",
|
||||
"p-queue": "^7.4.1",
|
||||
"private-ip": "^3.0.1",
|
||||
"race-signal": "^1.0.1",
|
||||
"uint8arraylist": "^2.4.3"
|
||||
}
|
||||
},
|
||||
"node_modules/@multiformats/mafmt": {
|
||||
"version": "12.1.6",
|
||||
"resolved": "https://registry.npmjs.org/@multiformats/mafmt/-/mafmt-12.1.6.tgz",
|
||||
"integrity": "sha512-tlJRfL21X+AKn9b5i5VnaTD6bNttpSpcqwKVmDmSHLwxoz97fAHaepqFOk/l1fIu94nImIXneNbhsJx/RQNIww==",
|
||||
"dependencies": {
|
||||
"@multiformats/multiaddr": "^12.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@multiformats/multiaddr": {
|
||||
"version": "12.1.11",
|
||||
"resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.1.11.tgz",
|
||||
"integrity": "sha512-CWG9kETEGTTMdr1T+/JEuMwFld3r3fHNP8LkLoUcLvHRy6yr8sWdotVGEDNEdDO/vrKhuD7bQBws3xMSMMyylg==",
|
||||
"dependencies": {
|
||||
"@chainsafe/is-ip": "^2.0.1",
|
||||
"@chainsafe/netmask": "^2.0.0",
|
||||
"@libp2p/interface": "^1.0.0",
|
||||
"dns-over-http-resolver": "3.0.0",
|
||||
"multiformats": "^12.0.1",
|
||||
"uint8-varint": "^2.0.1",
|
||||
"uint8arrays": "^4.0.2"
|
||||
}
|
||||
},
|
||||
"node_modules/@multiformats/multiaddr-matcher": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@multiformats/multiaddr-matcher/-/multiaddr-matcher-1.1.0.tgz",
|
||||
"integrity": "sha512-B/QbKpAxaHYVXFnbTdTgYqPDxmqoF2RYffwYoOv1MWfi2vBCZLdzmEKUBKv6fQr6s+LJFSHn2j2vczmwMFCQIA==",
|
||||
"dependencies": {
|
||||
"@chainsafe/is-ip": "^2.0.1",
|
||||
"@multiformats/multiaddr": "^12.0.0",
|
||||
"multiformats": "^12.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/@noble/ciphers": {
|
||||
"version": "0.4.0",
|
||||
"resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-0.4.0.tgz",
|
||||
"integrity": "sha512-xaUaUUDWbHIFSxaQ/pIe+33VG2mfJp6N/KxKLmZr5biWdNznCAmfu24QRhX10BbVAuqOahAoyp0S4M9md6GPDw==",
|
||||
"funding": {
|
||||
"url": "https://paulmillr.com/funding/"
|
||||
}
|
||||
},
|
||||
"node_modules/@noble/curves": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz",
|
||||
"integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==",
|
||||
"dependencies": {
|
||||
"@noble/hashes": "1.3.2"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://paulmillr.com/funding/"
|
||||
}
|
||||
},
|
||||
"node_modules/@noble/hashes": {
|
||||
"version": "1.3.2",
|
||||
"resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz",
|
||||
"integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==",
|
||||
"engines": {
|
||||
"node": ">= 16"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://paulmillr.com/funding/"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/sinon": {
|
||||
"version": "17.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-17.0.2.tgz",
|
||||
"integrity": "sha512-Zt6heIGsdqERkxctIpvN5Pv3edgBrhoeb3yHyxffd4InN0AX2SVNKSrhdDZKGQICVOxWP/q4DyhpfPNMSrpIiA==",
|
||||
"dependencies": {
|
||||
"@types/sinonjs__fake-timers": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/sinonjs__fake-timers": {
|
||||
"version": "8.1.5",
|
||||
"resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.5.tgz",
|
||||
"integrity": "sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ=="
|
||||
},
|
||||
"node_modules/any-signal": {
|
||||
"version": "4.1.1",
|
||||
"resolved": "https://registry.npmjs.org/any-signal/-/any-signal-4.1.1.tgz",
|
||||
"integrity": "sha512-iADenERppdC+A2YKbOXXB2WUeABLaM6qnpZ70kZbPZ1cZMMJ7eF+3CaYm+/PhBizgkzlvssC7QuHS30oOiQYWA==",
|
||||
"engines": {
|
||||
"node": ">=16.0.0",
|
||||
"npm": ">=7.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/datastore-core": {
|
||||
"version": "9.2.5",
|
||||
"resolved": "https://registry.npmjs.org/datastore-core/-/datastore-core-9.2.5.tgz",
|
||||
"integrity": "sha512-3Z54iBjwj4KDp5Se4aZRYWnjv1OlQgPfrEF2X+T9rlet8Pe3AKRLVYx0v+11PuL+47d7w0Vc/4847Ylas6fEbQ==",
|
||||
"dependencies": {
|
||||
"@libp2p/logger": "^4.0.1",
|
||||
"err-code": "^3.0.1",
|
||||
"interface-store": "^5.0.0",
|
||||
"it-all": "^3.0.1",
|
||||
"it-drain": "^3.0.1",
|
||||
"it-filter": "^3.0.0",
|
||||
"it-map": "^3.0.1",
|
||||
"it-merge": "^3.0.1",
|
||||
"it-pipe": "^3.0.0",
|
||||
"it-pushable": "^3.0.0",
|
||||
"it-sort": "^3.0.1",
|
||||
"it-take": "^3.0.1",
|
||||
"uint8arrays": "^4.0.2"
|
||||
}
|
||||
},
|
||||
"node_modules/debug": {
|
||||
"version": "4.3.4",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
|
||||
"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
|
||||
"dependencies": {
|
||||
"ms": "2.1.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6.0"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"supports-color": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/delay": {
|
||||
"version": "6.0.0",
|
||||
"resolved": "https://registry.npmjs.org/delay/-/delay-6.0.0.tgz",
|
||||
"integrity": "sha512-2NJozoOHQ4NuZuVIr5CWd0iiLVIRSDepakaovIN+9eIDHEhdCAEvSy2cuf1DCrPPQLvHmbqTHODlhHg8UCy4zw==",
|
||||
"engines": {
|
||||
"node": ">=16"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/dns-over-http-resolver": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/dns-over-http-resolver/-/dns-over-http-resolver-3.0.0.tgz",
|
||||
"integrity": "sha512-5+BI+B7n8LKhNaEZBYErr+CBd9t5nYtjunByLhrLGtZ+i3TRgiU8yE87pCjEBu2KOwNsD9ljpSXEbZ4S8xih5g==",
|
||||
"dependencies": {
|
||||
"debug": "^4.3.4",
|
||||
"receptacle": "^1.3.2"
|
||||
}
|
||||
},
|
||||
"node_modules/err-code": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz",
|
||||
"integrity": "sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA=="
|
||||
},
|
||||
"node_modules/eventemitter3": {
|
||||
"version": "5.0.1",
|
||||
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz",
|
||||
"integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="
|
||||
},
|
||||
"node_modules/get-iterator": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/get-iterator/-/get-iterator-2.0.1.tgz",
|
||||
"integrity": "sha512-7HuY/hebu4gryTDT7O/XY/fvY9wRByEGdK6QOa4of8npTcv0+NS6frFKABcf6S9EBAsveTuKTsZQQBFMMNILIg=="
|
||||
},
|
||||
"node_modules/interface-datastore": {
|
||||
"version": "8.2.7",
|
||||
"resolved": "https://registry.npmjs.org/interface-datastore/-/interface-datastore-8.2.7.tgz",
|
||||
"integrity": "sha512-ot5B5+VogufRfjhedAXZHm5NuEKyYZkDyVpTjBYIrxYUpS5GIfF2soE/dsd/FiBVqubcxa4IEToMXL5ruMwhjw==",
|
||||
"dependencies": {
|
||||
"interface-store": "^5.0.0",
|
||||
"nanoid": "^5.0.3",
|
||||
"uint8arrays": "^4.0.2"
|
||||
}
|
||||
},
|
||||
"node_modules/interface-store": {
|
||||
"version": "5.1.5",
|
||||
"resolved": "https://registry.npmjs.org/interface-store/-/interface-store-5.1.5.tgz",
|
||||
"integrity": "sha512-X0KnJBk3o+YL13MxZBMwa88/b3Mdrpm0yPzkSTKDDVn9BSPH7UK6W+ZtIPO2bxKOQVmq7zqOwAnYnpfqWjb6/g=="
|
||||
},
|
||||
"node_modules/ip-regex": {
|
||||
"version": "5.0.0",
|
||||
"resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-5.0.0.tgz",
|
||||
"integrity": "sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw==",
|
||||
"engines": {
|
||||
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/ipaddr.js": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz",
|
||||
"integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==",
|
||||
"engines": {
|
||||
"node": ">= 10"
|
||||
}
|
||||
},
|
||||
"node_modules/is-electron": {
|
||||
"version": "2.2.2",
|
||||
"resolved": "https://registry.npmjs.org/is-electron/-/is-electron-2.2.2.tgz",
|
||||
"integrity": "sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg=="
|
||||
},
|
||||
"node_modules/is-loopback-addr": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/is-loopback-addr/-/is-loopback-addr-2.0.2.tgz",
|
||||
"integrity": "sha512-26POf2KRCno/KTNL5Q0b/9TYnL00xEsSaLfiFRmjM7m7Lw7ZMmFybzzuX4CcsLAluZGd+niLUiMRxEooVE3aqg=="
|
||||
},
|
||||
"node_modules/is-plain-obj": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
|
||||
"integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/it-all": {
|
||||
"version": "3.0.4",
|
||||
"resolved": "https://registry.npmjs.org/it-all/-/it-all-3.0.4.tgz",
|
||||
"integrity": "sha512-UMiy0i9DqCHBdWvMbzdYvVGa5/w4t1cc4nchpbnjdLhklglv8mQeEYnii0gvKESJuL1zV32Cqdb33R6/GPfxpQ=="
|
||||
},
|
||||
"node_modules/it-byte-stream": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/it-byte-stream/-/it-byte-stream-1.0.5.tgz",
|
||||
"integrity": "sha512-wGHbXPE0ZiU0poJTgCNOW06+mh9yyCwdF8bVv0zxchgql6CMQd/2NEXXtmwWE+N65st8bi/KWUWcMU2pJU2fEw==",
|
||||
"dependencies": {
|
||||
"it-stream-types": "^2.0.1",
|
||||
"p-defer": "^4.0.0",
|
||||
"race-signal": "^1.0.1",
|
||||
"uint8arraylist": "^2.4.1"
|
||||
}
|
||||
},
|
||||
"node_modules/it-drain": {
|
||||
"version": "3.0.5",
|
||||
"resolved": "https://registry.npmjs.org/it-drain/-/it-drain-3.0.5.tgz",
|
||||
"integrity": "sha512-qYFe4SWdvs9oJGUY5bSjvmiLUMLzFEODNOQUdYdCIkuIgQF+AUB2INhM4yQ09buJ2rhHKDFxvTD/+yUq6qg0XA=="
|
||||
},
|
||||
"node_modules/it-filter": {
|
||||
"version": "3.0.4",
|
||||
"resolved": "https://registry.npmjs.org/it-filter/-/it-filter-3.0.4.tgz",
|
||||
"integrity": "sha512-e0sz+st4sudK/zH6GZ/gRTRP8A/ADuJFCYDmRgMbZvR79y5+v4ZXav850bBZk5wL9zXaYZFxS1v/6Qi+Vjwh5g==",
|
||||
"dependencies": {
|
||||
"it-peekable": "^3.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/it-first": {
|
||||
"version": "3.0.4",
|
||||
"resolved": "https://registry.npmjs.org/it-first/-/it-first-3.0.4.tgz",
|
||||
"integrity": "sha512-FtQl84iTNxN5EItP/JgL28V2rzNMkCzTUlNoj41eVdfix2z1DBuLnBqZ0hzYhGGa1rMpbQf0M7CQSA2adlrLJg=="
|
||||
},
|
||||
"node_modules/it-foreach": {
|
||||
"version": "2.0.6",
|
||||
"resolved": "https://registry.npmjs.org/it-foreach/-/it-foreach-2.0.6.tgz",
|
||||
"integrity": "sha512-OVosBHJsdXpAyeFlCbe3IGZia+65UykyAznakNsKXK+b99dbhuu/mOnXxTadDEo1GWhKx+WA8RNanKkMf07zQw==",
|
||||
"dependencies": {
|
||||
"it-peekable": "^3.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/it-length-prefixed": {
|
||||
"version": "9.0.3",
|
||||
"resolved": "https://registry.npmjs.org/it-length-prefixed/-/it-length-prefixed-9.0.3.tgz",
|
||||
"integrity": "sha512-YAu424ceYpXctxtjcLOqn7vJq082CaoP8J646ZusYISfQc3bpzQErgTUqMFj81V262KG2W9/YMBHsy6A/4yvmg==",
|
||||
"dependencies": {
|
||||
"err-code": "^3.0.1",
|
||||
"it-reader": "^6.0.1",
|
||||
"it-stream-types": "^2.0.1",
|
||||
"uint8-varint": "^2.0.1",
|
||||
"uint8arraylist": "^2.0.0",
|
||||
"uint8arrays": "^4.0.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=16.0.0",
|
||||
"npm": ">=7.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/it-length-prefixed-stream": {
|
||||
"version": "1.1.4",
|
||||
"resolved": "https://registry.npmjs.org/it-length-prefixed-stream/-/it-length-prefixed-stream-1.1.4.tgz",
|
||||
"integrity": "sha512-6YcQ5jsaYnuXBqF+oSGjSdSY9jF7HWl7yh+dxYytXxbE2GcdiOpn6pLM7m6AlIID9MCzQqMY5nOzaiatQ8A3/A==",
|
||||
"dependencies": {
|
||||
"it-byte-stream": "^1.0.0",
|
||||
"it-length-prefixed": "^9.0.1",
|
||||
"it-stream-types": "^2.0.1",
|
||||
"uint8-varint": "^2.0.1",
|
||||
"uint8arraylist": "^2.4.1"
|
||||
}
|
||||
},
|
||||
"node_modules/it-map": {
|
||||
"version": "3.0.5",
|
||||
"resolved": "https://registry.npmjs.org/it-map/-/it-map-3.0.5.tgz",
|
||||
"integrity": "sha512-hB0TDXo/h4KSJJDSRLgAPmDroiXP6Fx1ck4Bzl3US9hHfZweTKsuiP0y4gXuTMcJlS6vj0bb+f70rhkD47ZA3w==",
|
||||
"dependencies": {
|
||||
"it-peekable": "^3.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/it-merge": {
|
||||
"version": "3.0.3",
|
||||
"resolved": "https://registry.npmjs.org/it-merge/-/it-merge-3.0.3.tgz",
|
||||
"integrity": "sha512-FYVU15KC5pb/GQX1Ims+lee8d4pdqGVCpWr0lkNj8o4xuNo7jY71k6GuEiWdP+T7W1bJqewSxX5yoTy5yZpRVA==",
|
||||
"dependencies": {
|
||||
"it-pushable": "^3.2.0"
|
||||
}
|
||||
},
|
||||
"node_modules/it-pair": {
|
||||
"version": "2.0.6",
|
||||
"resolved": "https://registry.npmjs.org/it-pair/-/it-pair-2.0.6.tgz",
|
||||
"integrity": "sha512-5M0t5RAcYEQYNG5BV7d7cqbdwbCAp5yLdzvkxsZmkuZsLbTdZzah6MQySYfaAQjNDCq6PUnDt0hqBZ4NwMfW6g==",
|
||||
"dependencies": {
|
||||
"it-stream-types": "^2.0.1",
|
||||
"p-defer": "^4.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=16.0.0",
|
||||
"npm": ">=7.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/it-peekable": {
|
||||
"version": "3.0.3",
|
||||
"resolved": "https://registry.npmjs.org/it-peekable/-/it-peekable-3.0.3.tgz",
|
||||
"integrity": "sha512-Wx21JX/rMzTEl9flx3DGHuPV1KQFGOl8uoKfQtmZHgPQtGb89eQ6RyVd82h3HuP9Ghpt0WgBDlmmdWeHXqyx7w=="
|
||||
},
|
||||
"node_modules/it-pipe": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/it-pipe/-/it-pipe-3.0.1.tgz",
|
||||
"integrity": "sha512-sIoNrQl1qSRg2seYSBH/3QxWhJFn9PKYvOf/bHdtCBF0bnghey44VyASsWzn5dAx0DCDDABq1hZIuzKmtBZmKA==",
|
||||
"dependencies": {
|
||||
"it-merge": "^3.0.0",
|
||||
"it-pushable": "^3.1.2",
|
||||
"it-stream-types": "^2.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=16.0.0",
|
||||
"npm": ">=7.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/it-pushable": {
|
||||
"version": "3.2.3",
|
||||
"resolved": "https://registry.npmjs.org/it-pushable/-/it-pushable-3.2.3.tgz",
|
||||
"integrity": "sha512-gzYnXYK8Y5t5b/BnJUr7glfQLO4U5vyb05gPx/TyTw+4Bv1zM9gFk4YsOrnulWefMewlphCjKkakFvj1y99Tcg==",
|
||||
"dependencies": {
|
||||
"p-defer": "^4.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/it-reader": {
|
||||
"version": "6.0.4",
|
||||
"resolved": "https://registry.npmjs.org/it-reader/-/it-reader-6.0.4.tgz",
|
||||
"integrity": "sha512-XCWifEcNFFjjBHtor4Sfaj8rcpt+FkY0L6WdhD578SCDhV4VUm7fCkF3dv5a+fTcfQqvN9BsxBTvWbYO6iCjTg==",
|
||||
"dependencies": {
|
||||
"it-stream-types": "^2.0.1",
|
||||
"uint8arraylist": "^2.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=16.0.0",
|
||||
"npm": ">=7.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/it-sort": {
|
||||
"version": "3.0.4",
|
||||
"resolved": "https://registry.npmjs.org/it-sort/-/it-sort-3.0.4.tgz",
|
||||
"integrity": "sha512-tvnC93JZZWjX4UxALy0asow0dzXabkoaRbrPJKClTKhNCqw4gzHr+H5axf1gohcthedRRkqd/ae+wl7WqoxFhw==",
|
||||
"dependencies": {
|
||||
"it-all": "^3.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/it-stream-types": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/it-stream-types/-/it-stream-types-2.0.1.tgz",
|
||||
"integrity": "sha512-6DmOs5r7ERDbvS4q8yLKENcj6Yecr7QQTqWApbZdfAUTEC947d+PEha7PCqhm//9oxaLYL7TWRekwhoXl2s6fg==",
|
||||
"engines": {
|
||||
"node": ">=16.0.0",
|
||||
"npm": ">=7.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/it-take": {
|
||||
"version": "3.0.4",
|
||||
"resolved": "https://registry.npmjs.org/it-take/-/it-take-3.0.4.tgz",
|
||||
"integrity": "sha512-RG8HDjAZlvkzz5Nav4xq6gK5zNT+Ff1UTIf+CrSJW8nIl6N1FpBH5e7clUshiCn+MmmMoSdIEpw4UaTolszxhA=="
|
||||
},
|
||||
"node_modules/libp2p": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/libp2p/-/libp2p-1.0.5.tgz",
|
||||
"integrity": "sha512-h6JsVRCo31WWNwZxI6T5e0hbBagw6GG2N4u2n1vCpnSyVPZQV64cm3hgMQFuNPHv3e69+ABGq2viHRzrBDAaTw==",
|
||||
"dependencies": {
|
||||
"@libp2p/crypto": "^3.0.1",
|
||||
"@libp2p/interface": "^1.0.1",
|
||||
"@libp2p/interface-internal": "^1.0.1",
|
||||
"@libp2p/logger": "^4.0.1",
|
||||
"@libp2p/multistream-select": "^5.0.0",
|
||||
"@libp2p/peer-collections": "^5.0.0",
|
||||
"@libp2p/peer-id": "^4.0.1",
|
||||
"@libp2p/peer-id-factory": "^4.0.0",
|
||||
"@libp2p/peer-store": "^10.0.0",
|
||||
"@libp2p/utils": "^5.0.2",
|
||||
"@multiformats/mafmt": "^12.1.6",
|
||||
"@multiformats/multiaddr": "^12.1.10",
|
||||
"@multiformats/multiaddr-matcher": "^1.1.0",
|
||||
"any-signal": "^4.1.1",
|
||||
"datastore-core": "^9.0.1",
|
||||
"delay": "^6.0.0",
|
||||
"interface-datastore": "^8.2.0",
|
||||
"it-all": "^3.0.2",
|
||||
"it-drain": "^3.0.2",
|
||||
"it-filter": "^3.0.1",
|
||||
"it-first": "^3.0.3",
|
||||
"it-map": "^3.0.4",
|
||||
"it-merge": "^3.0.0",
|
||||
"it-pipe": "^3.0.1",
|
||||
"it-stream-types": "^2.0.1",
|
||||
"merge-options": "^3.0.4",
|
||||
"multiformats": "^12.1.3",
|
||||
"p-defer": "^4.0.0",
|
||||
"p-queue": "^7.4.1",
|
||||
"private-ip": "^3.0.1",
|
||||
"rate-limiter-flexible": "^3.0.0",
|
||||
"uint8arraylist": "^2.4.3",
|
||||
"uint8arrays": "^4.0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/merge-options": {
|
||||
"version": "3.0.4",
|
||||
"resolved": "https://registry.npmjs.org/merge-options/-/merge-options-3.0.4.tgz",
|
||||
"integrity": "sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==",
|
||||
"dependencies": {
|
||||
"is-plain-obj": "^2.1.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/mortice": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/mortice/-/mortice-3.0.1.tgz",
|
||||
"integrity": "sha512-eyDUsl1nCR9+JtNksKnaESLP9MgAXCA4w1LTtsmOSQNsThnv++f36rrBu5fC/fdGIwTJZmbiaR/QewptH93pYA==",
|
||||
"dependencies": {
|
||||
"nanoid": "^4.0.0",
|
||||
"observable-webworkers": "^2.0.1",
|
||||
"p-queue": "^7.2.0",
|
||||
"p-timeout": "^6.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=16.0.0",
|
||||
"npm": ">=7.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/mortice/node_modules/nanoid": {
|
||||
"version": "4.0.2",
|
||||
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz",
|
||||
"integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/ai"
|
||||
}
|
||||
],
|
||||
"bin": {
|
||||
"nanoid": "bin/nanoid.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^14 || ^16 || >=18"
|
||||
}
|
||||
},
|
||||
"node_modules/ms": {
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
|
||||
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
|
||||
},
|
||||
"node_modules/multiformats": {
|
||||
"version": "12.1.3",
|
||||
"resolved": "https://registry.npmjs.org/multiformats/-/multiformats-12.1.3.tgz",
|
||||
"integrity": "sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw==",
|
||||
"engines": {
|
||||
"node": ">=16.0.0",
|
||||
"npm": ">=7.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/nanoid": {
|
||||
"version": "5.0.3",
|
||||
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.3.tgz",
|
||||
"integrity": "sha512-I7X2b22cxA4LIHXPSqbBCEQSL+1wv8TuoefejsX4HFWyC6jc5JG7CEaxOltiKjc1M+YCS2YkrZZcj4+dytw9GA==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/ai"
|
||||
}
|
||||
],
|
||||
"bin": {
|
||||
"nanoid": "bin/nanoid.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^18 || >=20"
|
||||
}
|
||||
},
|
||||
"node_modules/netmask": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz",
|
||||
"integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==",
|
||||
"engines": {
|
||||
"node": ">= 0.4.0"
|
||||
}
|
||||
},
|
||||
"node_modules/node-forge": {
|
||||
"version": "1.3.1",
|
||||
"resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
|
||||
"integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==",
|
||||
"engines": {
|
||||
"node": ">= 6.13.0"
|
||||
}
|
||||
},
|
||||
"node_modules/observable-webworkers": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/observable-webworkers/-/observable-webworkers-2.0.1.tgz",
|
||||
"integrity": "sha512-JI1vB0u3pZjoQKOK1ROWzp0ygxSi7Yb0iR+7UNsw4/Zn4cQ0P3R7XL38zac/Dy2tEA7Lg88/wIJTjF8vYXZ0uw==",
|
||||
"engines": {
|
||||
"node": ">=16.0.0",
|
||||
"npm": ">=7.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/p-defer": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/p-defer/-/p-defer-4.0.0.tgz",
|
||||
"integrity": "sha512-Vb3QRvQ0Y5XnF40ZUWW7JfLogicVh/EnA5gBIvKDJoYpeI82+1E3AlB9yOcKFS0AhHrWVnAQO39fbR0G99IVEQ==",
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/p-queue": {
|
||||
"version": "7.4.1",
|
||||
"resolved": "https://registry.npmjs.org/p-queue/-/p-queue-7.4.1.tgz",
|
||||
"integrity": "sha512-vRpMXmIkYF2/1hLBKisKeVYJZ8S2tZ0zEAmIJgdVKP2nq0nh4qCdf8bgw+ZgKrkh71AOCaqzwbJJk1WtdcF3VA==",
|
||||
"dependencies": {
|
||||
"eventemitter3": "^5.0.1",
|
||||
"p-timeout": "^5.0.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/p-queue/node_modules/p-timeout": {
|
||||
"version": "5.1.0",
|
||||
"resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz",
|
||||
"integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==",
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/p-timeout": {
|
||||
"version": "6.1.2",
|
||||
"resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.2.tgz",
|
||||
"integrity": "sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==",
|
||||
"engines": {
|
||||
"node": ">=14.16"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/private-ip": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/private-ip/-/private-ip-3.0.1.tgz",
|
||||
"integrity": "sha512-Ezc16ANuhSHmWAE6lbXUKburNzGpR0J5X0Zh5Um/PZ/s57Fp+HYqYe6BYPH2QbqKr/5WebfzJQ1jq6Kj5dbRmA==",
|
||||
"dependencies": {
|
||||
"@chainsafe/is-ip": "^2.0.1",
|
||||
"ip-regex": "^5.0.0",
|
||||
"ipaddr.js": "^2.1.0",
|
||||
"netmask": "^2.0.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14.16"
|
||||
}
|
||||
},
|
||||
"node_modules/protons-runtime": {
|
||||
"version": "5.2.0",
|
||||
"resolved": "https://registry.npmjs.org/protons-runtime/-/protons-runtime-5.2.0.tgz",
|
||||
"integrity": "sha512-jL3VSbXllgm17zurKQ/z+Ath0w+4BknJ+l/NLocfjAB8hbeASOZTNtb7zK3nDsKq2pHK9YFumNQvpkZ6gFfWhA==",
|
||||
"dependencies": {
|
||||
"uint8arraylist": "^2.4.3",
|
||||
"uint8arrays": "^4.0.6"
|
||||
}
|
||||
},
|
||||
"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=="
|
||||
},
|
||||
"node_modules/rate-limiter-flexible": {
|
||||
"version": "3.0.4",
|
||||
"resolved": "https://registry.npmjs.org/rate-limiter-flexible/-/rate-limiter-flexible-3.0.4.tgz",
|
||||
"integrity": "sha512-LFrdT9Pl/TRxG143frHBPyESXHvS2tstLfAUM6shBbJ3M6YssT2cIUWFwAWVAU9Vl4Z2gUN7ZE7tSdQh/0aqcA=="
|
||||
},
|
||||
"node_modules/receptacle": {
|
||||
"version": "1.3.2",
|
||||
"resolved": "https://registry.npmjs.org/receptacle/-/receptacle-1.3.2.tgz",
|
||||
"integrity": "sha512-HrsFvqZZheusncQRiEE7GatOAETrARKV/lnfYicIm8lbvp/JQOdADOfhjBd2DajvoszEyxSM6RlAAIZgEoeu/A==",
|
||||
"dependencies": {
|
||||
"ms": "^2.1.1"
|
||||
}
|
||||
},
|
||||
"node_modules/stream-to-it": {
|
||||
"version": "0.2.4",
|
||||
"resolved": "https://registry.npmjs.org/stream-to-it/-/stream-to-it-0.2.4.tgz",
|
||||
"integrity": "sha512-4vEbkSs83OahpmBybNJXlJd7d6/RxzkkSdT3I0mnGt79Xd2Kk+e1JqbvAvsQfCeKj3aKb0QIWkyK3/n0j506vQ==",
|
||||
"dependencies": {
|
||||
"get-iterator": "^1.0.2"
|
||||
}
|
||||
},
|
||||
"node_modules/stream-to-it/node_modules/get-iterator": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/get-iterator/-/get-iterator-1.0.2.tgz",
|
||||
"integrity": "sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg=="
|
||||
},
|
||||
"node_modules/uint8-varint": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.2.tgz",
|
||||
"integrity": "sha512-LZXmBT0jiHR7J4oKM1GUhtdLFW1yPauzI8NjJlotXn92TprO9u8VMvEVR4QMk8xhUVUd+2fqfU2/kGbVHYSSWw==",
|
||||
"dependencies": {
|
||||
"uint8arraylist": "^2.0.0",
|
||||
"uint8arrays": "^4.0.2"
|
||||
}
|
||||
},
|
||||
"node_modules/uint8arraylist": {
|
||||
"version": "2.4.7",
|
||||
"resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-2.4.7.tgz",
|
||||
"integrity": "sha512-ohRElqR6C5dd60vRFLq40MCiSnUe1AzkpHvbCEMCGGP6zMoFYECsjdhL6bR1kTK37ONNRDuHQ3RIpScRYcYYIg==",
|
||||
"dependencies": {
|
||||
"uint8arrays": "^4.0.2"
|
||||
}
|
||||
},
|
||||
"node_modules/uint8arrays": {
|
||||
"version": "4.0.9",
|
||||
"resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-4.0.9.tgz",
|
||||
"integrity": "sha512-iHU8XJJnfeijILZWzV7RgILdPHqe0mjJvyzY4mO8aUUtHsDbPa2Gc8/02Kc4zeokp2W6Qq8z9Ap1xkQ1HfbKwg==",
|
||||
"dependencies": {
|
||||
"multiformats": "^12.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/wherearewe": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/wherearewe/-/wherearewe-2.0.1.tgz",
|
||||
"integrity": "sha512-XUguZbDxCA2wBn2LoFtcEhXL6AXo+hVjGonwhSTTTU9SzbWG8Xu3onNIpzf9j/mYUcJQ0f+m37SzG77G851uFw==",
|
||||
"dependencies": {
|
||||
"is-electron": "^2.2.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=16.0.0",
|
||||
"npm": ">=7.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"name": "@libp2p/perf-js-libp2p-1-0",
|
||||
"private": true,
|
||||
"main": "index.js",
|
||||
"type": "module",
|
||||
"dependencies": {
|
||||
"@chainsafe/libp2p-noise": "^14.0.0",
|
||||
"@chainsafe/libp2p-yamux": "^6.0.1",
|
||||
"@libp2p/perf": "^3.0.4",
|
||||
"@libp2p/tcp": "^9.0.4",
|
||||
"libp2p": "^1.0.5"
|
||||
}
|
||||
}
|
||||
@@ -1,45 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# In case this script is `kill`ed, `kill` its child process, namely the `node`
|
||||
# process below.
|
||||
cleanup() {
|
||||
kill $node_pid
|
||||
}
|
||||
trap cleanup EXIT TERM
|
||||
|
||||
# Find the path to the Node.js executable
|
||||
node_path=$(which node)
|
||||
|
||||
run_server=false
|
||||
server_address=""
|
||||
upload_bytes=0
|
||||
download_bytes=0
|
||||
transport=""
|
||||
|
||||
# Parse named parameters manually
|
||||
for ((i = 1; i <= $#; i++)); do
|
||||
if [ "${!i}" == "--server-address" ]; then
|
||||
server_address="${@:i+1:1}"
|
||||
fi
|
||||
if [ "${!i}" == "--upload-bytes" ]; then
|
||||
upload_bytes="${@:i+1:1}"
|
||||
fi
|
||||
if [ "${!i}" == "--download-bytes" ]; then
|
||||
download_bytes="${@:i+1:1}"
|
||||
fi
|
||||
if [ "${!i}" == "--transport" ]; then
|
||||
transport="${@:i+1:1}"
|
||||
fi
|
||||
if [ "${!i}" == "--run-server" ]; then
|
||||
run_server=true
|
||||
fi
|
||||
done
|
||||
|
||||
# Run perf
|
||||
node $(dirname "$0")/index.js --run-server=$run_server --server-address=$server_address --upload-bytes=$upload_bytes --download-bytes=$download_bytes --transport=$transport &
|
||||
|
||||
node_pid=$!
|
||||
|
||||
# Wait for `node_pid` to finish, or for it to be `kill`ed by the above
|
||||
# `cleanup`.
|
||||
wait $node_pid
|
||||
@@ -1,4 +1,4 @@
|
||||
commitSha := b7914e407da34c99fb76dcc300b3d44b9af97fac
|
||||
commitSha := d15bb69a9d2b353d73ead79a29f668dca3e1dc4a
|
||||
|
||||
all: perf
|
||||
|
||||
|
||||
+21952
-27634
File diff suppressed because it is too large
Load Diff
@@ -1,10 +1,43 @@
|
||||
import fs from 'fs';
|
||||
import path from 'path';
|
||||
|
||||
export type Version = {
|
||||
id: string,
|
||||
implementation: "go-libp2p" | "js-libp2p" | "nim-libp2p" | "rust-libp2p" | "zig-libp2p" | "https" | "quic-go",
|
||||
transportStacks: string[],
|
||||
}
|
||||
|
||||
export const versions: Array<Version> = JSON.parse(fs.readFileSync(path.join(__dirname, '../versionsInput.json'), 'utf8'));
|
||||
export const versions: Array<Version> = [
|
||||
{
|
||||
id: "v0.34",
|
||||
implementation: "quic-go",
|
||||
transportStacks: ["quic-v1"]
|
||||
},
|
||||
{
|
||||
id: "v0.53",
|
||||
implementation: "rust-libp2p",
|
||||
transportStacks: ["tcp", "quic-v1"]
|
||||
},
|
||||
{
|
||||
id: "v0.1",
|
||||
implementation: "https",
|
||||
transportStacks: ["tcp"]
|
||||
},
|
||||
{
|
||||
id: "v0.27",
|
||||
implementation: "go-libp2p",
|
||||
transportStacks: ["tcp", "quic-v1"]
|
||||
},
|
||||
{
|
||||
id: "v0.28",
|
||||
implementation: "go-libp2p",
|
||||
transportStacks: ["tcp", "quic-v1"]
|
||||
},
|
||||
{
|
||||
id: "v0.29",
|
||||
implementation: "go-libp2p",
|
||||
transportStacks: ["tcp", "quic-v1"]
|
||||
},
|
||||
{
|
||||
id: "v0.31",
|
||||
implementation: "go-libp2p",
|
||||
transportStacks: ["tcp", "quic-v1"]
|
||||
},
|
||||
]
|
||||
|
||||
@@ -1,70 +0,0 @@
|
||||
[
|
||||
{
|
||||
"id": "v0.34",
|
||||
"implementation": "quic-go",
|
||||
"transportStacks": [
|
||||
"quic-v1"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "v0.53",
|
||||
"implementation": "rust-libp2p",
|
||||
"transportStacks": [
|
||||
"tcp",
|
||||
"quic-v1"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "v0.1",
|
||||
"implementation": "https",
|
||||
"transportStacks": [
|
||||
"tcp"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "v0.27",
|
||||
"implementation": "go-libp2p",
|
||||
"transportStacks": [
|
||||
"tcp",
|
||||
"quic-v1"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "v0.28",
|
||||
"implementation": "go-libp2p",
|
||||
"transportStacks": [
|
||||
"tcp",
|
||||
"quic-v1"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "v0.29",
|
||||
"implementation": "go-libp2p",
|
||||
"transportStacks": [
|
||||
"tcp",
|
||||
"quic-v1"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "v0.31",
|
||||
"implementation": "go-libp2p",
|
||||
"transportStacks": [
|
||||
"tcp",
|
||||
"quic-v1"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "v0.46",
|
||||
"implementation": "js-libp2p",
|
||||
"transportStacks": [
|
||||
"tcp"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "v1.0",
|
||||
"implementation": "js-libp2p",
|
||||
"transportStacks": [
|
||||
"tcp"
|
||||
]
|
||||
}
|
||||
]
|
||||
@@ -1,31 +0,0 @@
|
||||
image_name := go-v0.32
|
||||
version := 0.32.2
|
||||
|
||||
all: image.json
|
||||
|
||||
image.json: verify-checksum go-libp2p-${version}
|
||||
cd go-libp2p-${version} && IMAGE_NAME=${image_name} ../../../../dockerBuildWrapper.sh -f test-plans/PingDockerfile .
|
||||
docker image inspect ${image_name} -f "{{.Id}}" | \
|
||||
xargs -I {} echo "{\"imageID\": \"{}\"}" > $@
|
||||
|
||||
go-libp2p-${version}: go-libp2p-${version}.zip
|
||||
unzip -o go-libp2p-${version}.zip
|
||||
|
||||
go-libp2p-${version}.zip:
|
||||
wget -O $@ "https://github.com/libp2p/go-libp2p/archive/v${version}.zip"
|
||||
|
||||
# Run `make version.lock` to generate this lock file. This file should be commited.
|
||||
# This locks the exact contents of the specified version. This lets us use the
|
||||
# human readable name while still making sure the contents don't change.
|
||||
version.lock: go-libp2p-${version}.zip
|
||||
shasum -a 256 go-libp2p-${version}.zip > $@
|
||||
|
||||
verify-checksum: go-libp2p-${version}.zip
|
||||
shasum -a 256 -c version.lock
|
||||
|
||||
.PHONY: clean all verify-checksum
|
||||
|
||||
clean:
|
||||
rm image.json
|
||||
rm go-libp2p-*.zip
|
||||
rm -rf go-libp2p-*
|
||||
@@ -1 +0,0 @@
|
||||
2169e11c42c71e57398930c9d334e437fb1958b9acd9afdf20a6cce30040588f go-libp2p-0.32.2.zip
|
||||
@@ -1,31 +0,0 @@
|
||||
image_name := go-v0.33
|
||||
version := 0.33.0
|
||||
|
||||
all: image.json
|
||||
|
||||
image.json: verify-checksum go-libp2p-${version}
|
||||
cd go-libp2p-${version} && IMAGE_NAME=${image_name} ../../../../dockerBuildWrapper.sh -f test-plans/PingDockerfile .
|
||||
docker image inspect ${image_name} -f "{{.Id}}" | \
|
||||
xargs -I {} echo "{\"imageID\": \"{}\"}" > $@
|
||||
|
||||
go-libp2p-${version}: go-libp2p-${version}.zip
|
||||
unzip -o go-libp2p-${version}.zip
|
||||
|
||||
go-libp2p-${version}.zip:
|
||||
wget -O $@ "https://github.com/libp2p/go-libp2p/archive/v${version}.zip"
|
||||
|
||||
# Run `make version.lock` to generate this lock file. This file should be commited.
|
||||
# This locks the exact contents of the specified version. This lets us use the
|
||||
# human readable name while still making sure the contents don't change.
|
||||
version.lock: go-libp2p-${version}.zip
|
||||
shasum -a 256 go-libp2p-${version}.zip > $@
|
||||
|
||||
verify-checksum: go-libp2p-${version}.zip
|
||||
shasum -a 256 -c version.lock
|
||||
|
||||
.PHONY: clean all verify-checksum
|
||||
|
||||
clean:
|
||||
rm image.json
|
||||
rm go-libp2p-*.zip
|
||||
rm -rf go-libp2p-*
|
||||
@@ -1 +0,0 @@
|
||||
6ec52eaeaf89648848c5844507c6d0db1afb9643eb9499d53242231df939ad0f go-libp2p-0.33.0.zip
|
||||
@@ -1,31 +0,0 @@
|
||||
image_name := go-v0.34
|
||||
version := 0.34.0
|
||||
|
||||
all: image.json
|
||||
|
||||
image.json: verify-checksum go-libp2p-${version}
|
||||
cd go-libp2p-${version} && IMAGE_NAME=${image_name} ../../../../dockerBuildWrapper.sh -f test-plans/PingDockerfile .
|
||||
docker image inspect ${image_name} -f "{{.Id}}" | \
|
||||
xargs -I {} echo "{\"imageID\": \"{}\"}" > $@
|
||||
|
||||
go-libp2p-${version}: go-libp2p-${version}.zip
|
||||
unzip -o go-libp2p-${version}.zip
|
||||
|
||||
go-libp2p-${version}.zip:
|
||||
wget -O $@ "https://github.com/libp2p/go-libp2p/archive/v${version}.zip"
|
||||
|
||||
# Run `make version.lock` to generate this lock file. This file should be commited.
|
||||
# This locks the exact contents of the specified version. This lets us use the
|
||||
# human readable name while still making sure the contents don't change.
|
||||
version.lock: go-libp2p-${version}.zip
|
||||
shasum -a 256 go-libp2p-${version}.zip > $@
|
||||
|
||||
verify-checksum: go-libp2p-${version}.zip
|
||||
shasum -a 256 -c version.lock
|
||||
|
||||
.PHONY: clean all verify-checksum
|
||||
|
||||
clean:
|
||||
rm image.json
|
||||
rm go-libp2p-*.zip
|
||||
rm -rf go-libp2p-*
|
||||
@@ -1 +0,0 @@
|
||||
4d9d7fbf769a4008112475419174e18a83a6eeebf0fa0635a50e4afd692b5510 go-libp2p-0.34.0.zip
|
||||
@@ -1,31 +0,0 @@
|
||||
image_name := go-v0.35
|
||||
version := 0.35.0
|
||||
|
||||
all: image.json
|
||||
|
||||
image.json: verify-checksum go-libp2p-${version}
|
||||
cd go-libp2p-${version} && IMAGE_NAME=${image_name} ../../../../dockerBuildWrapper.sh -f test-plans/PingDockerfile .
|
||||
docker image inspect ${image_name} -f "{{.Id}}" | \
|
||||
xargs -I {} echo "{\"imageID\": \"{}\"}" > $@
|
||||
|
||||
go-libp2p-${version}: go-libp2p-${version}.zip
|
||||
unzip -o go-libp2p-${version}.zip
|
||||
|
||||
go-libp2p-${version}.zip:
|
||||
wget -O $@ "https://github.com/libp2p/go-libp2p/archive/v${version}.zip"
|
||||
|
||||
# Run `make version.lock` to generate this lock file. This file should be commited.
|
||||
# This locks the exact contents of the specified version. This lets us use the
|
||||
# human readable name while still making sure the contents don't change.
|
||||
version.lock: go-libp2p-${version}.zip
|
||||
shasum -a 256 go-libp2p-${version}.zip > $@
|
||||
|
||||
verify-checksum: go-libp2p-${version}.zip
|
||||
shasum -a 256 -c version.lock
|
||||
|
||||
.PHONY: clean all verify-checksum
|
||||
|
||||
clean:
|
||||
rm image.json
|
||||
rm go-libp2p-*.zip
|
||||
rm -rf go-libp2p-*
|
||||
@@ -1 +0,0 @@
|
||||
535ef1d8984c5f79fcdbbd569e827aad9cd41d9168a2827f67182c99736caa31 go-libp2p-0.35.0.zip
|
||||
@@ -1,31 +0,0 @@
|
||||
image_name := go-v0.36
|
||||
version := 0.36.0
|
||||
|
||||
all: image.json
|
||||
|
||||
image.json: verify-checksum go-libp2p-${version}
|
||||
cd go-libp2p-${version} && IMAGE_NAME=${image_name} ../../../../dockerBuildWrapper.sh -f test-plans/PingDockerfile .
|
||||
docker image inspect ${image_name} -f "{{.Id}}" | \
|
||||
xargs -I {} echo "{\"imageID\": \"{}\"}" > $@
|
||||
|
||||
go-libp2p-${version}: go-libp2p-${version}.zip
|
||||
unzip -o go-libp2p-${version}.zip
|
||||
|
||||
go-libp2p-${version}.zip:
|
||||
wget -O $@ "https://github.com/libp2p/go-libp2p/archive/v${version}.zip"
|
||||
|
||||
# Run `make version.lock` to generate this lock file. This file should be commited.
|
||||
# This locks the exact contents of the specified version. This lets us use the
|
||||
# human readable name while still making sure the contents don't change.
|
||||
version.lock: go-libp2p-${version}.zip
|
||||
shasum -a 256 go-libp2p-${version}.zip > $@
|
||||
|
||||
verify-checksum: go-libp2p-${version}.zip
|
||||
shasum -a 256 -c version.lock
|
||||
|
||||
.PHONY: clean all verify-checksum
|
||||
|
||||
clean:
|
||||
rm image.json
|
||||
rm go-libp2p-*.zip
|
||||
rm -rf go-libp2p-*
|
||||
@@ -1 +0,0 @@
|
||||
09828c27b44af441d49617146f196638879a19570e1ba06cb7bf63df0a34bbef go-libp2p-0.36.0.zip
|
||||
@@ -1,117 +0,0 @@
|
||||
/* eslint-disable no-console */
|
||||
import http from 'http'
|
||||
import { pEvent } from 'p-event'
|
||||
import { createClient } from 'redis'
|
||||
|
||||
const redisAddr = process.env.redis_addr || 'redis:6379'
|
||||
const transport = process.env.transport
|
||||
const isDialer = process.env.is_dialer === 'true'
|
||||
|
||||
/** @type {import('aegir/types').PartialOptions} */
|
||||
export default {
|
||||
test: {
|
||||
browser: {
|
||||
config: {
|
||||
// Ignore self signed certificates
|
||||
browserContextOptions: { ignoreHTTPSErrors: true }
|
||||
}
|
||||
},
|
||||
async before () {
|
||||
// import after build is complete
|
||||
const { createRelay } = await import('./dist/test/fixtures/relay.js')
|
||||
|
||||
let relayNode
|
||||
let relayAddr
|
||||
if (transport === 'webrtc' && !isDialer) {
|
||||
relayNode = await createRelay()
|
||||
|
||||
const sortByNonLocalIp = (a, b) => {
|
||||
if (a.toString().includes('127.0.0.1')) {
|
||||
return 1
|
||||
}
|
||||
return -1
|
||||
}
|
||||
|
||||
relayAddr = relayNode.getMultiaddrs().sort(sortByNonLocalIp)[0].toString()
|
||||
}
|
||||
|
||||
const redisClient = createClient({
|
||||
url: `redis://${redisAddr}`
|
||||
})
|
||||
redisClient.on('error', (err) => {
|
||||
console.error('Redis client error:', err)
|
||||
})
|
||||
await redisClient.connect()
|
||||
|
||||
const requestListener = async function (req, res) {
|
||||
const requestJSON = await new Promise(resolve => {
|
||||
let body = ''
|
||||
req.on('data', function (data) {
|
||||
body += data
|
||||
})
|
||||
|
||||
req.on('end', function () {
|
||||
resolve(JSON.parse(body))
|
||||
})
|
||||
})
|
||||
|
||||
try {
|
||||
const redisRes = await redisClient.sendCommand(requestJSON)
|
||||
|
||||
if (redisRes == null) {
|
||||
console.error('Redis failure - sent', requestJSON, 'received', redisRes)
|
||||
|
||||
res.writeHead(500, {
|
||||
'Access-Control-Allow-Origin': '*'
|
||||
})
|
||||
res.end(JSON.stringify({
|
||||
message: 'Redis sent back null'
|
||||
}))
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
res.writeHead(200, {
|
||||
'Access-Control-Allow-Origin': '*'
|
||||
})
|
||||
res.end(JSON.stringify(redisRes))
|
||||
} catch (err) {
|
||||
console.error('Error in redis command:', err)
|
||||
res.writeHead(500, {
|
||||
'Access-Control-Allow-Origin': '*'
|
||||
})
|
||||
res.end(err.toString())
|
||||
}
|
||||
}
|
||||
|
||||
const proxyServer = http.createServer(requestListener)
|
||||
proxyServer.listen(0)
|
||||
|
||||
await pEvent(proxyServer, 'listening', {
|
||||
signal: AbortSignal.timeout(5000)
|
||||
})
|
||||
|
||||
return {
|
||||
redisClient,
|
||||
relayNode,
|
||||
proxyServer,
|
||||
env: {
|
||||
...process.env,
|
||||
RELAY_ADDR: relayAddr,
|
||||
REDIS_PROXY_PORT: proxyServer.address().port
|
||||
}
|
||||
}
|
||||
},
|
||||
async after (_, { proxyServer, redisClient, relayNode }) {
|
||||
await new Promise(resolve => {
|
||||
proxyServer?.close(() => resolve())
|
||||
})
|
||||
|
||||
try {
|
||||
// We don't care if this fails
|
||||
await redisClient?.disconnect()
|
||||
await relayNode?.stop()
|
||||
} catch { }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -8,17 +8,14 @@ FROM ${BASE_IMAGE} as js-libp2p-base
|
||||
|
||||
FROM mcr.microsoft.com/playwright
|
||||
|
||||
COPY --from=js-libp2p-base /app/ /app/
|
||||
WORKDIR /app
|
||||
|
||||
COPY --from=js-libp2p-base /app/ /app/
|
||||
WORKDIR /app/interop
|
||||
# We install browsers here instead of the cached version so that we use the latest browsers at run time.
|
||||
# Ideally this would also be pinned, but playwright controls this, so there isn't much we can do about it.
|
||||
# By installing here, we avoid installing it at test time.
|
||||
RUN npx playwright install-deps
|
||||
RUN npx playwright install
|
||||
ARG BROWSER=chromium # Options: chromium, firefox, webkit
|
||||
ENV BROWSER=$BROWSER
|
||||
|
||||
# Options: chromium, firefox, webkit
|
||||
ARG BROWSER=chromium
|
||||
ENV BROWSER=${BROWSER}
|
||||
|
||||
ENTRYPOINT npm test -- -t browser -- --browser $BROWSER
|
||||
ENTRYPOINT npm test -- --build false --types false -t browser -- --browser $BROWSER
|
||||
|
||||
@@ -1,17 +1,11 @@
|
||||
# Here because we want to fetch the node_modules within docker so that it's
|
||||
# installed on the same platform the test is run. Otherwise tools like `esbuild` will fail to run
|
||||
FROM node:lts
|
||||
|
||||
FROM node:18
|
||||
WORKDIR /app
|
||||
COPY . .
|
||||
RUN npm i && npm run build
|
||||
|
||||
COPY package*.json .aegir.js tsconfig.json ./
|
||||
COPY src ./src
|
||||
COPY test ./test
|
||||
WORKDIR /app/interop
|
||||
RUN npm i && npm run build
|
||||
|
||||
# disable colored output and CLI animation from test runners
|
||||
ENV CI true
|
||||
|
||||
RUN npm ci
|
||||
RUN npm run build
|
||||
|
||||
ENTRYPOINT npm test -- -t node
|
||||
ENTRYPOINT [ "npm", "test", "--", "--build", "false", "--types", "false", "-t", "node" ]
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
image_name := js-v0.45
|
||||
commitSha := 47a96706527fd82cd9daf3cc298f56866a5d027a
|
||||
|
||||
# TODO Enable webkit once https://github.com/libp2p/js-libp2p/pull/1627 is in
|
||||
all: image.json chromium-image.json firefox-image.json update-lock-file
|
||||
all: image.json chromium-image.json firefox-image.json
|
||||
|
||||
# Necessary because multistage builds require a docker image name rather than a digest to be used
|
||||
load-image-json: image.json
|
||||
@@ -17,19 +18,17 @@ firefox-image.json: load-image-json BrowserDockerfile
|
||||
docker image inspect firefox-${image_name} -f "{{.Id}}" | \
|
||||
xargs -I {} echo "{\"imageID\": \"{}\"}" > $@
|
||||
|
||||
# We update the lock file here so that we make sure we are always using the correct lock file.
|
||||
# If this changes, CI will fail since there are unstaged changes.
|
||||
update-lock-file: image.json
|
||||
CONTAINER_ID=$$(docker create $$(jq -r .imageID image.json)); \
|
||||
docker cp $$CONTAINER_ID:/app/package-lock.json ./package-lock.json; \
|
||||
docker rm $$CONTAINER_ID
|
||||
|
||||
image.json:
|
||||
docker build -t ${image_name} -f ./Dockerfile .
|
||||
image.json: js-libp2p-${commitSha}
|
||||
cd js-libp2p-${commitSha} && docker build -t ${image_name} -f ../Dockerfile .
|
||||
docker image inspect ${image_name} -f "{{.Id}}" | \
|
||||
xargs -I {} echo "{\"imageID\": \"{}\"}" > $@
|
||||
|
||||
js-libp2p-${commitSha}:
|
||||
wget -O js-libp2p-${commitSha}.zip "https://github.com/libp2p/js-libp2p/archive/${commitSha}.zip"
|
||||
unzip -o js-libp2p-${commitSha}.zip
|
||||
unzip -o js-libp2p-${commitSha}.zip
|
||||
|
||||
clean:
|
||||
rm -rf *-image.json
|
||||
rm -rf image.json js-libp2p-*.zip js-libp2p-* *-image.json
|
||||
|
||||
.PHONY: all clean browser-images load-image-json
|
||||
|
||||
-24471
File diff suppressed because it is too large
Load Diff
@@ -1,31 +0,0 @@
|
||||
{
|
||||
"name": "@libp2p/transport-interop-libp2p-0.45.x",
|
||||
"version": "1.0.0",
|
||||
"type": "module",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"clean": "aegir clean",
|
||||
"build": "aegir build --bundle false",
|
||||
"test": "aegir test",
|
||||
"lint": "aegir lint",
|
||||
"dep-check": "aegir dep-check"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@chainsafe/libp2p-noise": "^12.0.1",
|
||||
"@chainsafe/libp2p-yamux": "^4.0.2",
|
||||
"@libp2p/interface-libp2p": "^3.2.0",
|
||||
"@libp2p/mplex": "^8.0.3",
|
||||
"@libp2p/tcp": "^7.0.1",
|
||||
"@libp2p/webrtc": "^2.0.10",
|
||||
"@libp2p/websockets": "^6.0.3",
|
||||
"@libp2p/webtransport": "^2.0.1",
|
||||
"@multiformats/multiaddr": "^12.1.3",
|
||||
"aegir": "^42.2.11",
|
||||
"libp2p": "^0.45.6",
|
||||
"p-event": "^6.0.1",
|
||||
"redis": "^4.6.14"
|
||||
},
|
||||
"browser": {
|
||||
"@libp2p/tcp": false
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
// Everything is defined in the test folder
|
||||
|
||||
export { }
|
||||
@@ -1,55 +0,0 @@
|
||||
/* eslint-disable no-console */
|
||||
/* eslint-env mocha */
|
||||
|
||||
import { multiaddr } from '@multiformats/multiaddr'
|
||||
import { getLibp2p } from './fixtures/get-libp2p.js'
|
||||
import { redisProxy } from './fixtures/redis-proxy.js'
|
||||
import type { Libp2p } from 'libp2p'
|
||||
import type { PingService } from 'libp2p/ping'
|
||||
|
||||
const isDialer: boolean = process.env.is_dialer === 'true'
|
||||
const timeoutSecs: string = process.env.test_timeout_secs ?? '180'
|
||||
|
||||
describe('ping test (dialer)', function () {
|
||||
if (!isDialer) {
|
||||
return
|
||||
}
|
||||
|
||||
// make the default timeout longer than the listener timeout
|
||||
this.timeout((parseInt(timeoutSecs) * 1000) + 30000)
|
||||
let node: Libp2p<{ ping: PingService }>
|
||||
|
||||
beforeEach(async () => {
|
||||
node = await getLibp2p()
|
||||
})
|
||||
|
||||
afterEach(async () => {
|
||||
// Shutdown libp2p node
|
||||
try {
|
||||
// We don't care if this fails
|
||||
await node.stop()
|
||||
} catch { }
|
||||
})
|
||||
|
||||
it('should dial and ping', async function () {
|
||||
let [, otherMaStr]: string[] = await redisProxy(['BLPOP', 'listenerAddr', timeoutSecs])
|
||||
|
||||
// Hack until these are merged:
|
||||
// - https://github.com/multiformats/js-multiaddr-to-uri/pull/120
|
||||
otherMaStr = otherMaStr.replace('/tls/ws', '/wss')
|
||||
|
||||
const otherMa = multiaddr(otherMaStr)
|
||||
const handshakeStartInstant = Date.now()
|
||||
|
||||
console.error(`node ${node.peerId.toString()} dials: ${otherMa}`)
|
||||
await node.dial(otherMa)
|
||||
|
||||
console.error(`node ${node.peerId.toString()} pings: ${otherMa}`)
|
||||
const pingRTT = await node.services.ping.ping(multiaddr(otherMa))
|
||||
const handshakePlusOneRTT = Date.now() - handshakeStartInstant
|
||||
console.log(JSON.stringify({
|
||||
handshakePlusOneRTTMillis: handshakePlusOneRTT,
|
||||
pingRTTMilllis: pingRTT
|
||||
}))
|
||||
})
|
||||
})
|
||||
@@ -1,130 +0,0 @@
|
||||
/* eslint-disable complexity */
|
||||
|
||||
import { noise } from '@chainsafe/libp2p-noise'
|
||||
import { yamux } from '@chainsafe/libp2p-yamux'
|
||||
import { mplex } from '@libp2p/mplex'
|
||||
import { tcp } from '@libp2p/tcp'
|
||||
import { webRTC, webRTCDirect } from '@libp2p/webrtc'
|
||||
import { webSockets } from '@libp2p/websockets'
|
||||
import * as filters from '@libp2p/websockets/filters'
|
||||
import { webTransport } from '@libp2p/webtransport'
|
||||
import { type Libp2pOptions, createLibp2p } from 'libp2p'
|
||||
import { circuitRelayTransport } from 'libp2p/circuit-relay'
|
||||
import { identifyService } from 'libp2p/identify'
|
||||
import { type PingService, pingService } from 'libp2p/ping'
|
||||
import type { Libp2p } from '@libp2p/interface-libp2p'
|
||||
|
||||
const isDialer: boolean = process.env.is_dialer === 'true'
|
||||
|
||||
// Setup libp2p node
|
||||
const TRANSPORT = process.env.transport
|
||||
const SECURE_CHANNEL = process.env.security
|
||||
const MUXER = process.env.muxer
|
||||
const IP = process.env.ip ?? '0.0.0.0'
|
||||
|
||||
export async function getLibp2p (): Promise<Libp2p<{ ping: PingService }>> {
|
||||
const options: Libp2pOptions<{ ping: PingService, identify: unknown }> = {
|
||||
start: true,
|
||||
connectionManager: {
|
||||
minConnections: 0
|
||||
},
|
||||
connectionGater: {
|
||||
denyDialMultiaddr: async () => false
|
||||
},
|
||||
services: {
|
||||
ping: pingService(),
|
||||
identify: identifyService()
|
||||
}
|
||||
}
|
||||
|
||||
switch (TRANSPORT) {
|
||||
case 'tcp':
|
||||
options.transports = [tcp()]
|
||||
options.addresses = {
|
||||
listen: isDialer ? [] : [`/ip4/${IP}/tcp/0`]
|
||||
}
|
||||
break
|
||||
case 'webtransport':
|
||||
options.transports = [webTransport()]
|
||||
if (!isDialer) {
|
||||
throw new Error('WebTransport is not supported as a listener')
|
||||
}
|
||||
break
|
||||
case 'webrtc-direct':
|
||||
options.transports = [webRTCDirect()]
|
||||
options.addresses = {
|
||||
listen: isDialer ? [] : [`/ip4/${IP}/udp/0/webrtc-direct`]
|
||||
}
|
||||
break
|
||||
case 'webrtc':
|
||||
options.transports = [webRTC(),
|
||||
webSockets({ filter: filters.all }), // ws needed to connect to relay
|
||||
circuitRelayTransport({
|
||||
discoverRelays: 1
|
||||
}) // needed to use the relay
|
||||
]
|
||||
options.addresses = {
|
||||
listen: isDialer ? [] : ['/webrtc']
|
||||
}
|
||||
break
|
||||
case 'ws':
|
||||
options.transports = [webSockets()]
|
||||
options.addresses = {
|
||||
listen: isDialer ? [] : [`/ip4/${IP}/tcp/0/ws`]
|
||||
}
|
||||
break
|
||||
case 'wss':
|
||||
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'
|
||||
options.transports = [webSockets()]
|
||||
options.addresses = {
|
||||
listen: isDialer ? [] : [`/ip4/${IP}/tcp/0/wss`]
|
||||
}
|
||||
break
|
||||
default:
|
||||
throw new Error(`Unknown transport: ${TRANSPORT ?? '???'}`)
|
||||
}
|
||||
|
||||
let skipSecureChannel = false
|
||||
let skipMuxer = false
|
||||
switch (TRANSPORT) {
|
||||
case 'webtransport':
|
||||
case 'webrtc-direct':
|
||||
skipSecureChannel = true
|
||||
skipMuxer = true
|
||||
break
|
||||
case 'webrtc':
|
||||
skipSecureChannel = true
|
||||
skipMuxer = true
|
||||
// Setup yamux and noise to connect to the relay node
|
||||
options.streamMuxers = [yamux()]
|
||||
options.connectionEncryption = [noise()]
|
||||
break
|
||||
default:
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
if (!skipSecureChannel) {
|
||||
switch (SECURE_CHANNEL) {
|
||||
case 'noise':
|
||||
options.connectionEncryption = [noise()]
|
||||
break
|
||||
default:
|
||||
throw new Error(`Unknown secure channel: ${SECURE_CHANNEL ?? ''}`)
|
||||
}
|
||||
}
|
||||
|
||||
if (!skipMuxer) {
|
||||
switch (MUXER) {
|
||||
case 'mplex':
|
||||
options.streamMuxers = [mplex()]
|
||||
break
|
||||
case 'yamux':
|
||||
options.streamMuxers = [yamux()]
|
||||
break
|
||||
default:
|
||||
throw new Error(`Unknown muxer: ${MUXER ?? '???'}`)
|
||||
}
|
||||
}
|
||||
|
||||
return createLibp2p(options)
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
export async function redisProxy (commands: any[]): Promise<any> {
|
||||
const res = await fetch(`http://localhost:${process.env.REDIS_PROXY_PORT}`, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(commands)
|
||||
})
|
||||
|
||||
if (!res.ok) {
|
||||
throw new Error('Redis command failed')
|
||||
}
|
||||
|
||||
return res.json()
|
||||
}
|
||||
@@ -1,34 +0,0 @@
|
||||
import { noise } from '@chainsafe/libp2p-noise'
|
||||
import { yamux } from '@chainsafe/libp2p-yamux'
|
||||
import { webSockets } from '@libp2p/websockets'
|
||||
import * as filters from '@libp2p/websockets/filters'
|
||||
import { createLibp2p } from 'libp2p'
|
||||
import { circuitRelayServer } from 'libp2p/circuit-relay'
|
||||
import { identifyService } from 'libp2p/identify'
|
||||
import type { Libp2p } from '@libp2p/interface-libp2p'
|
||||
|
||||
export async function createRelay (): Promise<Libp2p> {
|
||||
const server = await createLibp2p({
|
||||
addresses: {
|
||||
listen: ['/ip4/0.0.0.0/tcp/0/ws']
|
||||
},
|
||||
transports: [
|
||||
webSockets({
|
||||
filter: filters.all
|
||||
})
|
||||
],
|
||||
connectionEncryption: [noise()],
|
||||
streamMuxers: [yamux()],
|
||||
services: {
|
||||
identify: identifyService(),
|
||||
relay: circuitRelayServer({
|
||||
reservations: {
|
||||
maxReservations: Infinity,
|
||||
applyDefaultLimit: false
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
return server
|
||||
}
|
||||
@@ -1,76 +0,0 @@
|
||||
/* eslint-disable no-console */
|
||||
/* eslint-env mocha */
|
||||
|
||||
import { multiaddr, type Multiaddr } from '@multiformats/multiaddr'
|
||||
import { getLibp2p } from './fixtures/get-libp2p.js'
|
||||
import { redisProxy } from './fixtures/redis-proxy.js'
|
||||
import type { Libp2p } from 'libp2p'
|
||||
import type { PingService } from 'libp2p/ping'
|
||||
|
||||
const isDialer: boolean = process.env.is_dialer === 'true'
|
||||
const timeoutSecs: string = process.env.test_timeout_secs ?? '180'
|
||||
|
||||
describe('ping test (listener)', function () {
|
||||
if (isDialer) {
|
||||
return
|
||||
}
|
||||
|
||||
// make the default timeout longer than the listener timeout
|
||||
this.timeout((parseInt(timeoutSecs) * 1000) + 30000)
|
||||
let node: Libp2p<{ ping: PingService }>
|
||||
|
||||
beforeEach(async () => {
|
||||
node = await getLibp2p()
|
||||
})
|
||||
|
||||
afterEach(async () => {
|
||||
// Shutdown libp2p node
|
||||
try {
|
||||
// We don't care if this fails
|
||||
await node.stop()
|
||||
} catch { }
|
||||
})
|
||||
|
||||
it('should listen for ping', async function () {
|
||||
const sortByNonLocalIp = (a: Multiaddr, b: Multiaddr): -1 | 0 | 1 => {
|
||||
if (a.toString().includes('127.0.0.1')) {
|
||||
return 1
|
||||
}
|
||||
|
||||
return -1
|
||||
}
|
||||
|
||||
let multiaddrs = node.getMultiaddrs().sort(sortByNonLocalIp).map(ma => ma.toString())
|
||||
|
||||
const transport = process.env.transport
|
||||
if (transport === 'webrtc') {
|
||||
const relayAddr = process.env.RELAY_ADDR
|
||||
const hasWebrtcMultiaddr = new Promise<string[]>((resolve) => {
|
||||
const abortController = new AbortController()
|
||||
node.addEventListener('self:peer:update', (event) => {
|
||||
const webrtcMas = node.getMultiaddrs().filter(ma => ma.toString().includes('/webrtc'))
|
||||
if (webrtcMas.length > 0) {
|
||||
resolve(webrtcMas.sort(sortByNonLocalIp).map(ma => ma.toString()))
|
||||
}
|
||||
abortController.abort()
|
||||
}, { signal: abortController.signal })
|
||||
})
|
||||
|
||||
if (relayAddr == null || relayAddr === '') {
|
||||
throw new Error('No relayAddr')
|
||||
}
|
||||
// const conn = await node.dial(multiaddr(relayAddr))
|
||||
console.error('dial relay')
|
||||
await node.dial(multiaddr(relayAddr))
|
||||
console.error('wait for relay reservation')
|
||||
multiaddrs = await hasWebrtcMultiaddr
|
||||
}
|
||||
|
||||
console.error('inform redis of dial address')
|
||||
// Send the listener addr over the proxy server so this works on both the Browser and Node
|
||||
await redisProxy(['RPUSH', 'listenerAddr', multiaddrs[0]])
|
||||
// Wait
|
||||
console.error('wait for incoming ping')
|
||||
await new Promise(resolve => setTimeout(resolve, 1000 * parseInt(timeoutSecs, 10)))
|
||||
})
|
||||
})
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"extends": "aegir/src/config/tsconfig.aegir.json",
|
||||
"compilerOptions": {
|
||||
"outDir": "dist"
|
||||
},
|
||||
"include": [
|
||||
"src",
|
||||
"test"
|
||||
]
|
||||
}
|
||||
@@ -1,117 +0,0 @@
|
||||
/* eslint-disable no-console */
|
||||
import http from 'http'
|
||||
import { pEvent } from 'p-event'
|
||||
import { createClient } from 'redis'
|
||||
|
||||
const redisAddr = process.env.redis_addr || 'redis:6379'
|
||||
const transport = process.env.transport
|
||||
const isDialer = process.env.is_dialer === 'true'
|
||||
|
||||
/** @type {import('aegir/types').PartialOptions} */
|
||||
export default {
|
||||
test: {
|
||||
browser: {
|
||||
config: {
|
||||
// Ignore self signed certificates
|
||||
browserContextOptions: { ignoreHTTPSErrors: true }
|
||||
}
|
||||
},
|
||||
async before () {
|
||||
// import after build is complete
|
||||
const { createRelay } = await import('./dist/test/fixtures/relay.js')
|
||||
|
||||
let relayNode
|
||||
let relayAddr
|
||||
if (transport === 'webrtc' && !isDialer) {
|
||||
relayNode = await createRelay()
|
||||
|
||||
const sortByNonLocalIp = (a, b) => {
|
||||
if (a.toString().includes('127.0.0.1')) {
|
||||
return 1
|
||||
}
|
||||
return -1
|
||||
}
|
||||
|
||||
relayAddr = relayNode.getMultiaddrs().sort(sortByNonLocalIp)[0].toString()
|
||||
}
|
||||
|
||||
const redisClient = createClient({
|
||||
url: `redis://${redisAddr}`
|
||||
})
|
||||
redisClient.on('error', (err) => {
|
||||
console.error('Redis client error:', err)
|
||||
})
|
||||
await redisClient.connect()
|
||||
|
||||
const requestListener = async function (req, res) {
|
||||
const requestJSON = await new Promise(resolve => {
|
||||
let body = ''
|
||||
req.on('data', function (data) {
|
||||
body += data
|
||||
})
|
||||
|
||||
req.on('end', function () {
|
||||
resolve(JSON.parse(body))
|
||||
})
|
||||
})
|
||||
|
||||
try {
|
||||
const redisRes = await redisClient.sendCommand(requestJSON)
|
||||
|
||||
if (redisRes == null) {
|
||||
console.error('Redis failure - sent', requestJSON, 'received', redisRes)
|
||||
|
||||
res.writeHead(500, {
|
||||
'Access-Control-Allow-Origin': '*'
|
||||
})
|
||||
res.end(JSON.stringify({
|
||||
message: 'Redis sent back null'
|
||||
}))
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
res.writeHead(200, {
|
||||
'Access-Control-Allow-Origin': '*'
|
||||
})
|
||||
res.end(JSON.stringify(redisRes))
|
||||
} catch (err) {
|
||||
console.error('Error in redis command:', err)
|
||||
res.writeHead(500, {
|
||||
'Access-Control-Allow-Origin': '*'
|
||||
})
|
||||
res.end(err.toString())
|
||||
}
|
||||
}
|
||||
|
||||
const proxyServer = http.createServer(requestListener)
|
||||
proxyServer.listen(0)
|
||||
|
||||
await pEvent(proxyServer, 'listening', {
|
||||
signal: AbortSignal.timeout(5000)
|
||||
})
|
||||
|
||||
return {
|
||||
redisClient,
|
||||
relayNode,
|
||||
proxyServer,
|
||||
env: {
|
||||
...process.env,
|
||||
RELAY_ADDR: relayAddr,
|
||||
REDIS_PROXY_PORT: proxyServer.address().port
|
||||
}
|
||||
}
|
||||
},
|
||||
async after (_, { proxyServer, redisClient, relayNode }) {
|
||||
await new Promise(resolve => {
|
||||
proxyServer?.close(() => resolve())
|
||||
})
|
||||
|
||||
try {
|
||||
// We don't care if this fails
|
||||
await redisClient?.disconnect()
|
||||
await relayNode?.stop()
|
||||
} catch { }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -8,17 +8,14 @@ FROM ${BASE_IMAGE} as js-libp2p-base
|
||||
|
||||
FROM mcr.microsoft.com/playwright
|
||||
|
||||
COPY --from=js-libp2p-base /app/ /app/
|
||||
WORKDIR /app
|
||||
|
||||
COPY --from=js-libp2p-base /app/ /app/
|
||||
WORKDIR /app/node_modules/@libp2p/multidim-interop
|
||||
# We install browsers here instead of the cached version so that we use the latest browsers at run time.
|
||||
# Ideally this would also be pinned, but playwright controls this, so there isn't much we can do about it.
|
||||
# By installing here, we avoid installing it at test time.
|
||||
RUN npx playwright install-deps
|
||||
RUN npx playwright install
|
||||
ARG BROWSER=chromium # Options: chromium, firefox, webkit
|
||||
ENV BROWSER=$BROWSER
|
||||
|
||||
# Options: chromium, firefox, webkit
|
||||
ARG BROWSER=chromium
|
||||
ENV BROWSER=${BROWSER}
|
||||
|
||||
ENTRYPOINT npm test -- -t browser -- --browser $BROWSER
|
||||
ENTRYPOINT npm run test:interop:multidim -- --build false --types false -t browser -- --browser $BROWSER
|
||||
|
||||
@@ -1,17 +1,11 @@
|
||||
# Here because we want to fetch the node_modules within docker so that it's
|
||||
# installed on the same platform the test is run. Otherwise tools like `esbuild` will fail to run
|
||||
FROM node:lts
|
||||
|
||||
FROM node:18.17.1
|
||||
WORKDIR /app
|
||||
|
||||
COPY package*.json .aegir.js tsconfig.json ./
|
||||
COPY src ./src
|
||||
COPY test ./test
|
||||
|
||||
# disable colored output and CLI animation from test runners
|
||||
ENV CI true
|
||||
|
||||
RUN apt-get update && apt-get install -y cmake
|
||||
COPY package*.json ./
|
||||
RUN npm ci
|
||||
RUN npm run build
|
||||
|
||||
ENTRYPOINT npm test -- -t node
|
||||
WORKDIR /app/node_modules/@libp2p/multidim-interop
|
||||
|
||||
ENTRYPOINT [ "npm", "run", "test:interop:multidim", "--", "--build", "false", "--types", "false", "-t", "node" ]
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
image_name := js-v0.46
|
||||
image_name := js-v0.46.9
|
||||
|
||||
# TODO Enable webkit once https://github.com/libp2p/js-libp2p/pull/1627 is in
|
||||
all: image.json chromium-image.json firefox-image.json update-lock-file
|
||||
@@ -29,6 +29,7 @@ image.json:
|
||||
docker image inspect ${image_name} -f "{{.Id}}" | \
|
||||
xargs -I {} echo "{\"imageID\": \"{}\"}" > $@
|
||||
|
||||
|
||||
clean:
|
||||
rm -rf image.json *-image.json
|
||||
|
||||
|
||||
+6019
-8006
File diff suppressed because it is too large
Load Diff
@@ -1,31 +1,19 @@
|
||||
{
|
||||
"name": "@libp2p/transport-interop-libp2p-0.46.x",
|
||||
"version": "1.0.0",
|
||||
"type": "module",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"clean": "aegir clean",
|
||||
"build": "aegir build --bundle false",
|
||||
"test": "aegir test",
|
||||
"lint": "aegir lint",
|
||||
"dep-check": "aegir dep-check"
|
||||
"dependencies": {
|
||||
"@libp2p/multidim-interop": "1.0.0-c4eff4c5"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@chainsafe/libp2p-noise": "^13.0.3",
|
||||
"@chainsafe/libp2p-yamux": "^5.0.2",
|
||||
"@libp2p/interface": "^0.1.6",
|
||||
"@libp2p/mplex": "^9.0.12",
|
||||
"@libp2p/tcp": "^8.0.13",
|
||||
"@libp2p/webrtc": "^3.2.11",
|
||||
"@libp2p/websockets": "^7.0.13",
|
||||
"@libp2p/webtransport": "^3.1.10",
|
||||
"@multiformats/multiaddr": "^12.1.10",
|
||||
"aegir": "^42.2.11",
|
||||
"libp2p": "^0.46.21",
|
||||
"p-event": "^6.0.1",
|
||||
"redis": "^4.6.10"
|
||||
},
|
||||
"browser": {
|
||||
"@libp2p/tcp": false
|
||||
"overrides": {
|
||||
"@chainsafe/libp2p-noise": "13.0.1",
|
||||
"@chainsafe/libp2p-yamux": "5.0.0",
|
||||
"@libp2p/mplex": "9.0.5",
|
||||
"@libp2p/tcp": "8.0.5",
|
||||
"@libp2p/webrtc": "3.1.9",
|
||||
"@libp2p/websockets": "7.0.5",
|
||||
"@libp2p/webtransport": "3.0.9",
|
||||
"@multiformats/mafmt": "12.1.6",
|
||||
"@multiformats/multiaddr": "12.1.7",
|
||||
"aegir": "40.0.12",
|
||||
"libp2p": "0.46.9",
|
||||
"redis": "4.6.8"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
// Everything is defined in the test folder
|
||||
|
||||
export { }
|
||||
@@ -1,55 +0,0 @@
|
||||
/* eslint-disable no-console */
|
||||
/* eslint-env mocha */
|
||||
|
||||
import { multiaddr } from '@multiformats/multiaddr'
|
||||
import { getLibp2p } from './fixtures/get-libp2p.js'
|
||||
import { redisProxy } from './fixtures/redis-proxy.js'
|
||||
import type { Libp2p } from '@libp2p/interface'
|
||||
import type { PingService } from 'libp2p/ping'
|
||||
|
||||
const isDialer: boolean = process.env.is_dialer === 'true'
|
||||
const timeoutSecs: string = process.env.test_timeout_secs ?? '180'
|
||||
|
||||
describe('ping test (dialer)', function () {
|
||||
if (!isDialer) {
|
||||
return
|
||||
}
|
||||
|
||||
// make the default timeout longer than the listener timeout
|
||||
this.timeout((parseInt(timeoutSecs) * 1000) + 30000)
|
||||
let node: Libp2p<{ ping: PingService }>
|
||||
|
||||
beforeEach(async () => {
|
||||
node = await getLibp2p()
|
||||
})
|
||||
|
||||
afterEach(async () => {
|
||||
// Shutdown libp2p node
|
||||
try {
|
||||
// We don't care if this fails
|
||||
await node.stop()
|
||||
} catch { }
|
||||
})
|
||||
|
||||
it('should dial and ping', async function () {
|
||||
let [, otherMaStr]: string[] = await redisProxy(['BLPOP', 'listenerAddr', timeoutSecs])
|
||||
|
||||
// Hack until these are merged:
|
||||
// - https://github.com/multiformats/js-multiaddr-to-uri/pull/120
|
||||
otherMaStr = otherMaStr.replace('/tls/ws', '/wss')
|
||||
|
||||
const otherMa = multiaddr(otherMaStr)
|
||||
const handshakeStartInstant = Date.now()
|
||||
|
||||
console.error(`node ${node.peerId.toString()} dials: ${otherMa}`)
|
||||
await node.dial(otherMa)
|
||||
|
||||
console.error(`node ${node.peerId.toString()} pings: ${otherMa}`)
|
||||
const pingRTT = await node.services.ping.ping(multiaddr(otherMa))
|
||||
const handshakePlusOneRTT = Date.now() - handshakeStartInstant
|
||||
console.log(JSON.stringify({
|
||||
handshakePlusOneRTTMillis: handshakePlusOneRTT,
|
||||
pingRTTMilllis: pingRTT
|
||||
}))
|
||||
})
|
||||
})
|
||||
@@ -1,130 +0,0 @@
|
||||
/* eslint-disable complexity */
|
||||
|
||||
import { noise } from '@chainsafe/libp2p-noise'
|
||||
import { yamux } from '@chainsafe/libp2p-yamux'
|
||||
import { mplex } from '@libp2p/mplex'
|
||||
import { tcp } from '@libp2p/tcp'
|
||||
import { webRTC, webRTCDirect } from '@libp2p/webrtc'
|
||||
import { webSockets } from '@libp2p/websockets'
|
||||
import * as filters from '@libp2p/websockets/filters'
|
||||
import { webTransport } from '@libp2p/webtransport'
|
||||
import { type Libp2pOptions, createLibp2p } from 'libp2p'
|
||||
import { circuitRelayTransport } from 'libp2p/circuit-relay'
|
||||
import { type IdentifyService, identifyService } from 'libp2p/identify'
|
||||
import { type PingService, pingService } from 'libp2p/ping'
|
||||
import type { Libp2p } from '@libp2p/interface'
|
||||
|
||||
const isDialer: boolean = process.env.is_dialer === 'true'
|
||||
|
||||
// Setup libp2p node
|
||||
const TRANSPORT = process.env.transport
|
||||
const SECURE_CHANNEL = process.env.security
|
||||
const MUXER = process.env.muxer
|
||||
const IP = process.env.ip ?? '0.0.0.0'
|
||||
|
||||
export async function getLibp2p (): Promise<Libp2p<{ ping: PingService }>> {
|
||||
const options: Libp2pOptions<{ ping: PingService, identify: IdentifyService }> = {
|
||||
start: true,
|
||||
connectionManager: {
|
||||
minConnections: 0
|
||||
},
|
||||
connectionGater: {
|
||||
denyDialMultiaddr: async () => false
|
||||
},
|
||||
services: {
|
||||
ping: pingService(),
|
||||
identify: identifyService()
|
||||
}
|
||||
}
|
||||
|
||||
switch (TRANSPORT) {
|
||||
case 'tcp':
|
||||
options.transports = [tcp()]
|
||||
options.addresses = {
|
||||
listen: isDialer ? [] : [`/ip4/${IP}/tcp/0`]
|
||||
}
|
||||
break
|
||||
case 'webtransport':
|
||||
options.transports = [webTransport()]
|
||||
if (!isDialer) {
|
||||
throw new Error('WebTransport is not supported as a listener')
|
||||
}
|
||||
break
|
||||
case 'webrtc-direct':
|
||||
options.transports = [webRTCDirect()]
|
||||
options.addresses = {
|
||||
listen: isDialer ? [] : [`/ip4/${IP}/udp/0/webrtc-direct`]
|
||||
}
|
||||
break
|
||||
case 'webrtc':
|
||||
options.transports = [webRTC(),
|
||||
webSockets({ filter: filters.all }), // ws needed to connect to relay
|
||||
circuitRelayTransport({
|
||||
discoverRelays: 1
|
||||
}) // needed to use the relay
|
||||
]
|
||||
options.addresses = {
|
||||
listen: isDialer ? [] : ['/webrtc']
|
||||
}
|
||||
break
|
||||
case 'ws':
|
||||
options.transports = [webSockets()]
|
||||
options.addresses = {
|
||||
listen: isDialer ? [] : [`/ip4/${IP}/tcp/0/ws`]
|
||||
}
|
||||
break
|
||||
case 'wss':
|
||||
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'
|
||||
options.transports = [webSockets()]
|
||||
options.addresses = {
|
||||
listen: isDialer ? [] : [`/ip4/${IP}/tcp/0/wss`]
|
||||
}
|
||||
break
|
||||
default:
|
||||
throw new Error(`Unknown transport: ${TRANSPORT ?? '???'}`)
|
||||
}
|
||||
|
||||
let skipSecureChannel = false
|
||||
let skipMuxer = false
|
||||
switch (TRANSPORT) {
|
||||
case 'webtransport':
|
||||
case 'webrtc-direct':
|
||||
skipSecureChannel = true
|
||||
skipMuxer = true
|
||||
break
|
||||
case 'webrtc':
|
||||
skipSecureChannel = true
|
||||
skipMuxer = true
|
||||
// Setup yamux and noise to connect to the relay node
|
||||
options.streamMuxers = [yamux()]
|
||||
options.connectionEncryption = [noise()]
|
||||
break
|
||||
default:
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
if (!skipSecureChannel) {
|
||||
switch (SECURE_CHANNEL) {
|
||||
case 'noise':
|
||||
options.connectionEncryption = [noise()]
|
||||
break
|
||||
default:
|
||||
throw new Error(`Unknown secure channel: ${SECURE_CHANNEL ?? ''}`)
|
||||
}
|
||||
}
|
||||
|
||||
if (!skipMuxer) {
|
||||
switch (MUXER) {
|
||||
case 'mplex':
|
||||
options.streamMuxers = [mplex()]
|
||||
break
|
||||
case 'yamux':
|
||||
options.streamMuxers = [yamux()]
|
||||
break
|
||||
default:
|
||||
throw new Error(`Unknown muxer: ${MUXER ?? '???'}`)
|
||||
}
|
||||
}
|
||||
|
||||
return createLibp2p(options)
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
export async function redisProxy (commands: any[]): Promise<any> {
|
||||
const res = await fetch(`http://localhost:${process.env.REDIS_PROXY_PORT}`, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(commands)
|
||||
})
|
||||
|
||||
if (!res.ok) {
|
||||
throw new Error('Redis command failed')
|
||||
}
|
||||
|
||||
return res.json()
|
||||
}
|
||||
@@ -1,34 +0,0 @@
|
||||
import { noise } from '@chainsafe/libp2p-noise'
|
||||
import { yamux } from '@chainsafe/libp2p-yamux'
|
||||
import { webSockets } from '@libp2p/websockets'
|
||||
import * as filters from '@libp2p/websockets/filters'
|
||||
import { createLibp2p } from 'libp2p'
|
||||
import { circuitRelayServer } from 'libp2p/circuit-relay'
|
||||
import { identifyService } from 'libp2p/identify'
|
||||
import type { Libp2p } from '@libp2p/interface'
|
||||
|
||||
export async function createRelay (): Promise<Libp2p> {
|
||||
const server = await createLibp2p({
|
||||
addresses: {
|
||||
listen: ['/ip4/0.0.0.0/tcp/0/ws']
|
||||
},
|
||||
transports: [
|
||||
webSockets({
|
||||
filter: filters.all
|
||||
})
|
||||
],
|
||||
connectionEncryption: [noise()],
|
||||
streamMuxers: [yamux()],
|
||||
services: {
|
||||
identify: identifyService(),
|
||||
relay: circuitRelayServer({
|
||||
reservations: {
|
||||
maxReservations: Infinity,
|
||||
applyDefaultLimit: false
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
return server
|
||||
}
|
||||
@@ -1,76 +0,0 @@
|
||||
/* eslint-disable no-console */
|
||||
/* eslint-env mocha */
|
||||
|
||||
import { multiaddr, type Multiaddr } from '@multiformats/multiaddr'
|
||||
import { getLibp2p } from './fixtures/get-libp2p.js'
|
||||
import { redisProxy } from './fixtures/redis-proxy.js'
|
||||
import type { Libp2p } from '@libp2p/interface'
|
||||
import type { PingService } from 'libp2p/ping'
|
||||
|
||||
const isDialer: boolean = process.env.is_dialer === 'true'
|
||||
const timeoutSecs: string = process.env.test_timeout_secs ?? '180'
|
||||
|
||||
describe('ping test (listener)', function () {
|
||||
if (isDialer) {
|
||||
return
|
||||
}
|
||||
|
||||
// make the default timeout longer than the listener timeout
|
||||
this.timeout((parseInt(timeoutSecs) * 1000) + 30000)
|
||||
let node: Libp2p<{ ping: PingService }>
|
||||
|
||||
beforeEach(async () => {
|
||||
node = await getLibp2p()
|
||||
})
|
||||
|
||||
afterEach(async () => {
|
||||
// Shutdown libp2p node
|
||||
try {
|
||||
// We don't care if this fails
|
||||
await node.stop()
|
||||
} catch { }
|
||||
})
|
||||
|
||||
it('should listen for ping', async function () {
|
||||
const sortByNonLocalIp = (a: Multiaddr, b: Multiaddr): -1 | 0 | 1 => {
|
||||
if (a.toString().includes('127.0.0.1')) {
|
||||
return 1
|
||||
}
|
||||
|
||||
return -1
|
||||
}
|
||||
|
||||
let multiaddrs = node.getMultiaddrs().sort(sortByNonLocalIp).map(ma => ma.toString())
|
||||
|
||||
const transport = process.env.transport
|
||||
if (transport === 'webrtc') {
|
||||
const relayAddr = process.env.RELAY_ADDR
|
||||
const hasWebrtcMultiaddr = new Promise<string[]>((resolve) => {
|
||||
const abortController = new AbortController()
|
||||
node.addEventListener('self:peer:update', (event) => {
|
||||
const webrtcMas = node.getMultiaddrs().filter(ma => ma.toString().includes('/webrtc'))
|
||||
if (webrtcMas.length > 0) {
|
||||
resolve(webrtcMas.sort(sortByNonLocalIp).map(ma => ma.toString()))
|
||||
}
|
||||
abortController.abort()
|
||||
}, { signal: abortController.signal })
|
||||
})
|
||||
|
||||
if (relayAddr == null || relayAddr === '') {
|
||||
throw new Error('No relayAddr')
|
||||
}
|
||||
// const conn = await node.dial(multiaddr(relayAddr))
|
||||
console.error('dial relay')
|
||||
await node.dial(multiaddr(relayAddr))
|
||||
console.error('wait for relay reservation')
|
||||
multiaddrs = await hasWebrtcMultiaddr
|
||||
}
|
||||
|
||||
console.error('inform redis of dial address')
|
||||
// Send the listener addr over the proxy server so this works on both the Browser and Node
|
||||
await redisProxy(['RPUSH', 'listenerAddr', multiaddrs[0]])
|
||||
// Wait
|
||||
console.error('wait for incoming ping')
|
||||
await new Promise(resolve => setTimeout(resolve, 1000 * parseInt(timeoutSecs, 10)))
|
||||
})
|
||||
})
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"extends": "aegir/src/config/tsconfig.aegir.json",
|
||||
"compilerOptions": {
|
||||
"outDir": "dist"
|
||||
},
|
||||
"include": [
|
||||
"src",
|
||||
"test"
|
||||
]
|
||||
}
|
||||
@@ -1,117 +0,0 @@
|
||||
/* eslint-disable no-console */
|
||||
import http from 'http'
|
||||
import { pEvent } from 'p-event'
|
||||
import { createClient } from 'redis'
|
||||
|
||||
const redisAddr = process.env.redis_addr || 'redis:6379'
|
||||
const transport = process.env.transport
|
||||
const isDialer = process.env.is_dialer === 'true'
|
||||
|
||||
/** @type {import('aegir/types').PartialOptions} */
|
||||
export default {
|
||||
test: {
|
||||
browser: {
|
||||
config: {
|
||||
// Ignore self signed certificates
|
||||
browserContextOptions: { ignoreHTTPSErrors: true }
|
||||
}
|
||||
},
|
||||
async before () {
|
||||
// import after build is complete
|
||||
const { createRelay } = await import('./dist/test/fixtures/relay.js')
|
||||
|
||||
let relayNode
|
||||
let relayAddr
|
||||
if (transport === 'webrtc' && !isDialer) {
|
||||
relayNode = await createRelay()
|
||||
|
||||
const sortByNonLocalIp = (a, b) => {
|
||||
if (a.toString().includes('127.0.0.1')) {
|
||||
return 1
|
||||
}
|
||||
return -1
|
||||
}
|
||||
|
||||
relayAddr = relayNode.getMultiaddrs().sort(sortByNonLocalIp)[0].toString()
|
||||
}
|
||||
|
||||
const redisClient = createClient({
|
||||
url: `redis://${redisAddr}`
|
||||
})
|
||||
redisClient.on('error', (err) => {
|
||||
console.error('Redis client error:', err)
|
||||
})
|
||||
await redisClient.connect()
|
||||
|
||||
const requestListener = async function (req, res) {
|
||||
const requestJSON = await new Promise(resolve => {
|
||||
let body = ''
|
||||
req.on('data', function (data) {
|
||||
body += data
|
||||
})
|
||||
|
||||
req.on('end', function () {
|
||||
resolve(JSON.parse(body))
|
||||
})
|
||||
})
|
||||
|
||||
try {
|
||||
const redisRes = await redisClient.sendCommand(requestJSON)
|
||||
|
||||
if (redisRes == null) {
|
||||
console.error('Redis failure - sent', requestJSON, 'received', redisRes)
|
||||
|
||||
res.writeHead(500, {
|
||||
'Access-Control-Allow-Origin': '*'
|
||||
})
|
||||
res.end(JSON.stringify({
|
||||
message: 'Redis sent back null'
|
||||
}))
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
res.writeHead(200, {
|
||||
'Access-Control-Allow-Origin': '*'
|
||||
})
|
||||
res.end(JSON.stringify(redisRes))
|
||||
} catch (err) {
|
||||
console.error('Error in redis command:', err)
|
||||
res.writeHead(500, {
|
||||
'Access-Control-Allow-Origin': '*'
|
||||
})
|
||||
res.end(err.toString())
|
||||
}
|
||||
}
|
||||
|
||||
const proxyServer = http.createServer(requestListener)
|
||||
proxyServer.listen(0)
|
||||
|
||||
await pEvent(proxyServer, 'listening', {
|
||||
signal: AbortSignal.timeout(5000)
|
||||
})
|
||||
|
||||
return {
|
||||
redisClient,
|
||||
relayNode,
|
||||
proxyServer,
|
||||
env: {
|
||||
...process.env,
|
||||
RELAY_ADDR: relayAddr,
|
||||
REDIS_PROXY_PORT: proxyServer.address().port
|
||||
}
|
||||
}
|
||||
},
|
||||
async after (_, { proxyServer, redisClient, relayNode }) {
|
||||
await new Promise(resolve => {
|
||||
proxyServer?.close(() => resolve())
|
||||
})
|
||||
|
||||
try {
|
||||
// We don't care if this fails
|
||||
await redisClient?.disconnect()
|
||||
await relayNode?.stop()
|
||||
} catch { }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
# syntax=docker/dockerfile:1
|
||||
|
||||
# Copied since we won't have the repo to use if expanding from cache.
|
||||
|
||||
# Workaround: https://github.com/docker/cli/issues/996
|
||||
ARG BASE_IMAGE=node-js-libp2p-head
|
||||
FROM ${BASE_IMAGE} as js-libp2p-base
|
||||
|
||||
FROM mcr.microsoft.com/playwright
|
||||
|
||||
COPY --from=js-libp2p-base /app/ /app/
|
||||
WORKDIR /app
|
||||
|
||||
# We install browsers here instead of the cached version so that we use the latest browsers at run time.
|
||||
# Ideally this would also be pinned, but playwright controls this, so there isn't much we can do about it.
|
||||
# By installing here, we avoid installing it at test time.
|
||||
RUN npx playwright install-deps
|
||||
RUN npx playwright install
|
||||
|
||||
# Options: chromium, firefox, webkit
|
||||
ARG BROWSER=chromium
|
||||
ENV BROWSER=${BROWSER}
|
||||
|
||||
ENTRYPOINT npm test -- -t browser -- --browser $BROWSER
|
||||
@@ -1,17 +0,0 @@
|
||||
# Here because we want to fetch the node_modules within docker so that it's
|
||||
# installed on the same platform the test is run. Otherwise tools like `esbuild` will fail to run
|
||||
FROM node:lts
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY package*.json .aegir.js tsconfig.json ./
|
||||
COPY src ./src
|
||||
COPY test ./test
|
||||
|
||||
# disable colored output and CLI animation from test runners
|
||||
ENV CI true
|
||||
|
||||
RUN npm ci
|
||||
RUN npm run build
|
||||
|
||||
ENTRYPOINT npm test -- -t node
|
||||
@@ -1,35 +0,0 @@
|
||||
image_name := js-v1.x
|
||||
|
||||
# TODO Enable webkit once https://github.com/libp2p/js-libp2p/pull/1627 is in
|
||||
all: image.json chromium-image.json firefox-image.json update-lock-file
|
||||
|
||||
# Necessary because multistage builds require a docker image name rather than a digest to be used
|
||||
load-image-json: image.json
|
||||
docker image tag $$(jq -r .imageID image.json) ${image_name}
|
||||
|
||||
chromium-image.json: load-image-json BrowserDockerfile
|
||||
docker build -f BrowserDockerfile --build-arg=BASE_IMAGE=${image_name} --build-arg=BROWSER=chromium -t chromium-${image_name} .
|
||||
docker image inspect chromium-${image_name} -f "{{.Id}}" | \
|
||||
xargs -I {} echo "{\"imageID\": \"{}\"}" > $@
|
||||
|
||||
firefox-image.json: load-image-json BrowserDockerfile
|
||||
docker build -f BrowserDockerfile --build-arg=BASE_IMAGE=${image_name} --build-arg=BROWSER=firefox -t firefox-${image_name} .
|
||||
docker image inspect firefox-${image_name} -f "{{.Id}}" | \
|
||||
xargs -I {} echo "{\"imageID\": \"{}\"}" > $@
|
||||
|
||||
# We update the lock file here so that we make sure we are always using the correct lock file.
|
||||
# If this changes, CI will fail since there are unstaged changes.
|
||||
update-lock-file: image.json
|
||||
CONTAINER_ID=$$(docker create $$(jq -r .imageID image.json)); \
|
||||
docker cp $$CONTAINER_ID:/app/package-lock.json ./package-lock.json; \
|
||||
docker rm $$CONTAINER_ID
|
||||
|
||||
image.json:
|
||||
docker build -t ${image_name} -f ./Dockerfile .
|
||||
docker image inspect ${image_name} -f "{{.Id}}" | \
|
||||
xargs -I {} echo "{\"imageID\": \"{}\"}" > $@
|
||||
|
||||
clean:
|
||||
rm -rf image.json *-image.json
|
||||
|
||||
.PHONY: all clean browser-images load-image-json
|
||||
-31502
File diff suppressed because it is too large
Load Diff
@@ -1,34 +0,0 @@
|
||||
{
|
||||
"name": "@libp2p/transport-interop-libp2p-1.x",
|
||||
"version": "1.0.0",
|
||||
"type": "module",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"clean": "aegir clean",
|
||||
"build": "aegir build --bundle false",
|
||||
"test": "aegir test",
|
||||
"lint": "aegir lint",
|
||||
"dep-check": "aegir dep-check"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@chainsafe/libp2p-noise": "^15.0.0",
|
||||
"@chainsafe/libp2p-yamux": "^6.0.2",
|
||||
"@libp2p/circuit-relay-v2": "^1.0.24",
|
||||
"@libp2p/identify": "^2.0.2",
|
||||
"@libp2p/interface": "^1.4.0",
|
||||
"@libp2p/mplex": "^10.0.24",
|
||||
"@libp2p/ping": "^1.0.19",
|
||||
"@libp2p/tcp": "^9.0.26",
|
||||
"@libp2p/webrtc": "^4.0.33",
|
||||
"@libp2p/websockets": "^8.0.24",
|
||||
"@libp2p/webtransport": "^4.0.32",
|
||||
"@multiformats/multiaddr": "^12.1.10",
|
||||
"aegir": "^42.2.11",
|
||||
"libp2p": "^1.6.0",
|
||||
"p-event": "^6.0.1",
|
||||
"redis": "^4.6.10"
|
||||
},
|
||||
"browser": {
|
||||
"@libp2p/tcp": false
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
// Everything is defined in the test folder
|
||||
|
||||
export { }
|
||||
@@ -1,55 +0,0 @@
|
||||
/* eslint-disable no-console */
|
||||
/* eslint-env mocha */
|
||||
|
||||
import { multiaddr } from '@multiformats/multiaddr'
|
||||
import { getLibp2p } from './fixtures/get-libp2p.js'
|
||||
import { redisProxy } from './fixtures/redis-proxy.js'
|
||||
import type { Libp2p } from '@libp2p/interface'
|
||||
import type { PingService } from '@libp2p/ping'
|
||||
|
||||
const isDialer: boolean = process.env.is_dialer === 'true'
|
||||
const timeoutSecs: string = process.env.test_timeout_secs ?? '180'
|
||||
|
||||
describe('ping test (dialer)', function () {
|
||||
if (!isDialer) {
|
||||
return
|
||||
}
|
||||
|
||||
// make the default timeout longer than the listener timeout
|
||||
this.timeout((parseInt(timeoutSecs) * 1000) + 30000)
|
||||
let node: Libp2p<{ ping: PingService }>
|
||||
|
||||
beforeEach(async () => {
|
||||
node = await getLibp2p()
|
||||
})
|
||||
|
||||
afterEach(async () => {
|
||||
// Shutdown libp2p node
|
||||
try {
|
||||
// We don't care if this fails
|
||||
await node.stop()
|
||||
} catch { }
|
||||
})
|
||||
|
||||
it('should dial and ping', async function () {
|
||||
let [, otherMaStr]: string[] = await redisProxy(['BLPOP', 'listenerAddr', timeoutSecs])
|
||||
|
||||
// Hack until these are merged:
|
||||
// - https://github.com/multiformats/js-multiaddr-to-uri/pull/120
|
||||
otherMaStr = otherMaStr.replace('/tls/ws', '/wss')
|
||||
|
||||
const otherMa = multiaddr(otherMaStr)
|
||||
const handshakeStartInstant = Date.now()
|
||||
|
||||
console.error(`node ${node.peerId.toString()} dials: ${otherMa}`)
|
||||
await node.dial(otherMa)
|
||||
|
||||
console.error(`node ${node.peerId.toString()} pings: ${otherMa}`)
|
||||
const pingRTT = await node.services.ping.ping(multiaddr(otherMa))
|
||||
const handshakePlusOneRTT = Date.now() - handshakeStartInstant
|
||||
console.log(JSON.stringify({
|
||||
handshakePlusOneRTTMillis: handshakePlusOneRTT,
|
||||
pingRTTMilllis: pingRTT
|
||||
}))
|
||||
})
|
||||
})
|
||||
@@ -1,130 +0,0 @@
|
||||
/* eslint-disable complexity */
|
||||
|
||||
import { noise } from '@chainsafe/libp2p-noise'
|
||||
import { yamux } from '@chainsafe/libp2p-yamux'
|
||||
import { mplex } from '@libp2p/mplex'
|
||||
import { tcp } from '@libp2p/tcp'
|
||||
import { webRTC, webRTCDirect } from '@libp2p/webrtc'
|
||||
import { webSockets } from '@libp2p/websockets'
|
||||
import * as filters from '@libp2p/websockets/filters'
|
||||
import { webTransport } from '@libp2p/webtransport'
|
||||
import { type Libp2pOptions, createLibp2p } from 'libp2p'
|
||||
import { circuitRelayTransport } from '@libp2p/circuit-relay-v2'
|
||||
import { type Identify, identify } from '@libp2p/identify'
|
||||
import { type PingService, ping } from '@libp2p/ping'
|
||||
import type { Libp2p } from '@libp2p/interface'
|
||||
|
||||
const isDialer: boolean = process.env.is_dialer === 'true'
|
||||
|
||||
// Setup libp2p node
|
||||
const TRANSPORT = process.env.transport
|
||||
const SECURE_CHANNEL = process.env.security
|
||||
const MUXER = process.env.muxer
|
||||
const IP = process.env.ip ?? '0.0.0.0'
|
||||
|
||||
export async function getLibp2p (): Promise<Libp2p<{ ping: PingService }>> {
|
||||
const options: Libp2pOptions<{ ping: PingService, identify: Identify }> = {
|
||||
start: true,
|
||||
connectionManager: {
|
||||
minConnections: 0
|
||||
},
|
||||
connectionGater: {
|
||||
denyDialMultiaddr: async () => false
|
||||
},
|
||||
services: {
|
||||
ping: ping(),
|
||||
identify: identify()
|
||||
}
|
||||
}
|
||||
|
||||
switch (TRANSPORT) {
|
||||
case 'tcp':
|
||||
options.transports = [tcp()]
|
||||
options.addresses = {
|
||||
listen: isDialer ? [] : [`/ip4/${IP}/tcp/0`]
|
||||
}
|
||||
break
|
||||
case 'webtransport':
|
||||
options.transports = [webTransport()]
|
||||
if (!isDialer) {
|
||||
throw new Error('WebTransport is not supported as a listener')
|
||||
}
|
||||
break
|
||||
case 'webrtc-direct':
|
||||
options.transports = [webRTCDirect()]
|
||||
options.addresses = {
|
||||
listen: isDialer ? [] : [`/ip4/${IP}/udp/0/webrtc-direct`]
|
||||
}
|
||||
break
|
||||
case 'webrtc':
|
||||
options.transports = [webRTC(),
|
||||
webSockets({ filter: filters.all }), // ws needed to connect to relay
|
||||
circuitRelayTransport({
|
||||
discoverRelays: 1
|
||||
}) // needed to use the relay
|
||||
]
|
||||
options.addresses = {
|
||||
listen: isDialer ? [] : ['/webrtc']
|
||||
}
|
||||
break
|
||||
case 'ws':
|
||||
options.transports = [webSockets()]
|
||||
options.addresses = {
|
||||
listen: isDialer ? [] : [`/ip4/${IP}/tcp/0/ws`]
|
||||
}
|
||||
break
|
||||
case 'wss':
|
||||
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'
|
||||
options.transports = [webSockets()]
|
||||
options.addresses = {
|
||||
listen: isDialer ? [] : [`/ip4/${IP}/tcp/0/wss`]
|
||||
}
|
||||
break
|
||||
default:
|
||||
throw new Error(`Unknown transport: ${TRANSPORT ?? '???'}`)
|
||||
}
|
||||
|
||||
let skipSecureChannel = false
|
||||
let skipMuxer = false
|
||||
switch (TRANSPORT) {
|
||||
case 'webtransport':
|
||||
case 'webrtc-direct':
|
||||
skipSecureChannel = true
|
||||
skipMuxer = true
|
||||
break
|
||||
case 'webrtc':
|
||||
skipSecureChannel = true
|
||||
skipMuxer = true
|
||||
// Setup yamux and noise to connect to the relay node
|
||||
options.streamMuxers = [yamux()]
|
||||
options.connectionEncryption = [noise()]
|
||||
break
|
||||
default:
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
if (!skipSecureChannel) {
|
||||
switch (SECURE_CHANNEL) {
|
||||
case 'noise':
|
||||
options.connectionEncryption = [noise()]
|
||||
break
|
||||
default:
|
||||
throw new Error(`Unknown secure channel: ${SECURE_CHANNEL ?? ''}`)
|
||||
}
|
||||
}
|
||||
|
||||
if (!skipMuxer) {
|
||||
switch (MUXER) {
|
||||
case 'mplex':
|
||||
options.streamMuxers = [mplex()]
|
||||
break
|
||||
case 'yamux':
|
||||
options.streamMuxers = [yamux()]
|
||||
break
|
||||
default:
|
||||
throw new Error(`Unknown muxer: ${MUXER ?? '???'}`)
|
||||
}
|
||||
}
|
||||
|
||||
return createLibp2p(options)
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
export async function redisProxy (commands: any[]): Promise<any> {
|
||||
const res = await fetch(`http://localhost:${process.env.REDIS_PROXY_PORT}`, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(commands)
|
||||
})
|
||||
|
||||
if (!res.ok) {
|
||||
throw new Error('Redis command failed')
|
||||
}
|
||||
|
||||
return res.json()
|
||||
}
|
||||
@@ -1,34 +0,0 @@
|
||||
import { noise } from '@chainsafe/libp2p-noise'
|
||||
import { yamux } from '@chainsafe/libp2p-yamux'
|
||||
import { webSockets } from '@libp2p/websockets'
|
||||
import * as filters from '@libp2p/websockets/filters'
|
||||
import { createLibp2p } from 'libp2p'
|
||||
import { circuitRelayServer } from '@libp2p/circuit-relay-v2'
|
||||
import { identify } from '@libp2p/identify'
|
||||
import type { Libp2p } from '@libp2p/interface'
|
||||
|
||||
export async function createRelay (): Promise<Libp2p> {
|
||||
const server = await createLibp2p({
|
||||
addresses: {
|
||||
listen: ['/ip4/0.0.0.0/tcp/0/ws']
|
||||
},
|
||||
transports: [
|
||||
webSockets({
|
||||
filter: filters.all
|
||||
})
|
||||
],
|
||||
connectionEncryption: [noise()],
|
||||
streamMuxers: [yamux()],
|
||||
services: {
|
||||
identify: identify(),
|
||||
relay: circuitRelayServer({
|
||||
reservations: {
|
||||
maxReservations: Infinity,
|
||||
applyDefaultLimit: false
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
return server
|
||||
}
|
||||
@@ -1,76 +0,0 @@
|
||||
/* eslint-disable no-console */
|
||||
/* eslint-env mocha */
|
||||
|
||||
import { multiaddr, type Multiaddr } from '@multiformats/multiaddr'
|
||||
import { getLibp2p } from './fixtures/get-libp2p.js'
|
||||
import { redisProxy } from './fixtures/redis-proxy.js'
|
||||
import type { Libp2p } from '@libp2p/interface'
|
||||
import type { PingService } from '@libp2p/ping'
|
||||
|
||||
const isDialer: boolean = process.env.is_dialer === 'true'
|
||||
const timeoutSecs: string = process.env.test_timeout_secs ?? '180'
|
||||
|
||||
describe('ping test (listener)', function () {
|
||||
if (isDialer) {
|
||||
return
|
||||
}
|
||||
|
||||
// make the default timeout longer than the listener timeout
|
||||
this.timeout((parseInt(timeoutSecs) * 1000) + 30000)
|
||||
let node: Libp2p<{ ping: PingService }>
|
||||
|
||||
beforeEach(async () => {
|
||||
node = await getLibp2p()
|
||||
})
|
||||
|
||||
afterEach(async () => {
|
||||
// Shutdown libp2p node
|
||||
try {
|
||||
// We don't care if this fails
|
||||
await node.stop()
|
||||
} catch { }
|
||||
})
|
||||
|
||||
it('should listen for ping', async function () {
|
||||
const sortByNonLocalIp = (a: Multiaddr, b: Multiaddr): -1 | 0 | 1 => {
|
||||
if (a.toString().includes('127.0.0.1')) {
|
||||
return 1
|
||||
}
|
||||
|
||||
return -1
|
||||
}
|
||||
|
||||
let multiaddrs = node.getMultiaddrs().sort(sortByNonLocalIp).map(ma => ma.toString())
|
||||
|
||||
const transport = process.env.transport
|
||||
if (transport === 'webrtc') {
|
||||
const relayAddr = process.env.RELAY_ADDR
|
||||
const hasWebrtcMultiaddr = new Promise<string[]>((resolve) => {
|
||||
const abortController = new AbortController()
|
||||
node.addEventListener('self:peer:update', (event) => {
|
||||
const webrtcMas = node.getMultiaddrs().filter(ma => ma.toString().includes('/webrtc'))
|
||||
if (webrtcMas.length > 0) {
|
||||
resolve(webrtcMas.sort(sortByNonLocalIp).map(ma => ma.toString()))
|
||||
}
|
||||
abortController.abort()
|
||||
}, { signal: abortController.signal })
|
||||
})
|
||||
|
||||
if (relayAddr == null || relayAddr === '') {
|
||||
throw new Error('No relayAddr')
|
||||
}
|
||||
// const conn = await node.dial(multiaddr(relayAddr))
|
||||
console.error('dial relay')
|
||||
await node.dial(multiaddr(relayAddr))
|
||||
console.error('wait for relay reservation')
|
||||
multiaddrs = await hasWebrtcMultiaddr
|
||||
}
|
||||
|
||||
console.error('inform redis of dial address')
|
||||
// Send the listener addr over the proxy server so this works on both the Browser and Node
|
||||
await redisProxy(['RPUSH', 'listenerAddr', multiaddrs[0]])
|
||||
// Wait
|
||||
console.error('wait for incoming ping')
|
||||
await new Promise(resolve => setTimeout(resolve, 1000 * parseInt(timeoutSecs, 10)))
|
||||
})
|
||||
})
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"extends": "aegir/src/config/tsconfig.aegir.json",
|
||||
"compilerOptions": {
|
||||
"outDir": "dist"
|
||||
},
|
||||
"include": [
|
||||
"src",
|
||||
"test"
|
||||
]
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
ARG NimVersion="1.6.16"
|
||||
ARG NimVersion="1.6.10"
|
||||
FROM nimlang/nim:${NimVersion}-alpine as builder
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
image_name := rust-chromium-v0.52
|
||||
# BROKEN because glibc does not match.
|
||||
commitSha := f1bfe8d4ed423d03df4ef477072178e953c85f45
|
||||
image_name := rust-v0.52
|
||||
commitSha := 51070dae6395821c5ab45014b7208f15975c9101
|
||||
|
||||
all: image.json
|
||||
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
image_name := rust-chromium-v0.53
|
||||
commitSha := b7914e407da34c99fb76dcc300b3d44b9af97fac
|
||||
|
||||
all: image.json
|
||||
|
||||
image.json: rust-libp2p-${commitSha}
|
||||
cd rust-libp2p-${commitSha} && IMAGE_NAME=${image_name} ../../../../dockerBuildWrapper.sh -f interop-tests/Dockerfile.chromium .
|
||||
docker image inspect ${image_name} -f "{{.Id}}" | \
|
||||
xargs -I {} echo "{\"imageID\": \"{}\"}" > $@
|
||||
|
||||
rust-libp2p-${commitSha}: rust-libp2p-${commitSha}.zip
|
||||
unzip -o rust-libp2p-${commitSha}.zip
|
||||
|
||||
rust-libp2p-${commitSha}.zip:
|
||||
wget -O $@ "https://github.com/libp2p/rust-libp2p/archive/${commitSha}.zip"
|
||||
|
||||
clean:
|
||||
rm image.json
|
||||
rm rust-libp2p-*.zip
|
||||
rm -rf rust-libp2p-*
|
||||
@@ -1,5 +1,5 @@
|
||||
image_name := rust-v0.52
|
||||
commitSha := f1bfe8d4ed423d03df4ef477072178e953c85f45
|
||||
commitSha := 51070dae6395821c5ab45014b7208f15975c9101
|
||||
|
||||
all: image.json
|
||||
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
image_name := rust-v0.53
|
||||
commitSha := b7914e407da34c99fb76dcc300b3d44b9af97fac
|
||||
|
||||
all: image.json
|
||||
|
||||
image.json: rust-libp2p-${commitSha}
|
||||
cd rust-libp2p-${commitSha} && IMAGE_NAME=${image_name} ../../../../dockerBuildWrapper.sh -f interop-tests/Dockerfile.native .
|
||||
docker image inspect ${image_name} -f "{{.Id}}" | \
|
||||
xargs -I {} echo "{\"imageID\": \"{}\"}" > $@
|
||||
|
||||
rust-libp2p-${commitSha}: rust-libp2p-${commitSha}.zip
|
||||
unzip -o rust-libp2p-${commitSha}.zip
|
||||
|
||||
rust-libp2p-${commitSha}.zip:
|
||||
wget -O $@ "https://github.com/libp2p/rust-libp2p/archive/${commitSha}.zip"
|
||||
|
||||
clean:
|
||||
rm image.json
|
||||
rm rust-libp2p-*.zip
|
||||
rm -rf rust-libp2p-*
|
||||
Generated
+1693
-562
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"name": "@libp2p/transport-interop",
|
||||
"name": "Multidimensional libp2p interop test",
|
||||
"version": "0.0.1",
|
||||
"description": "Tests libp2p implementations against each other across various dimensions.",
|
||||
"main": "testplans.ts",
|
||||
|
||||
@@ -3,6 +3,7 @@ import { promises as fs } from 'fs';
|
||||
import path from 'path';
|
||||
import { exec as execStd } from 'child_process';
|
||||
import util from 'util';
|
||||
import { env } from 'process';
|
||||
import { ComposeSpecification, PropertiesServices } from "../compose-spec/compose-spec";
|
||||
import { stringify } from 'yaml';
|
||||
import { dialerStdout, dialerTimings } from './compose-stdout-helper';
|
||||
@@ -46,10 +47,11 @@ export async function run(namespace: string, compose: ComposeSpecification, opts
|
||||
}
|
||||
|
||||
try {
|
||||
const { stdout, stderr } = await exec(`docker compose -f ${path.join(dir, "compose.yaml")} up ${upFlags.join(" ")}`, {
|
||||
signal: AbortSignal.timeout(1000 * timeoutSecs)
|
||||
})
|
||||
|
||||
const controller = new AbortController();
|
||||
const timeoutId = setTimeout(() => controller.abort(), 1000 * timeoutSecs)
|
||||
const { signal } = controller;
|
||||
const { stdout, stderr } = await exec(`docker compose -f ${path.join(dir, "compose.yaml")} up ${upFlags.join(" ")}`, { signal })
|
||||
clearTimeout(timeoutId)
|
||||
try {
|
||||
const testResultsParsed = dialerTimings(dialerStdout(stdout))
|
||||
console.log("Finished:", namespace, testResultsParsed)
|
||||
|
||||
@@ -13,21 +13,11 @@ export function dialerStdout(composeStdout: string): string {
|
||||
}
|
||||
|
||||
export function dialerTimings(dialerStdout: string): Object {
|
||||
let openBracket = dialerStdout.indexOf("{")
|
||||
let error
|
||||
while (true) {
|
||||
if (openBracket === -1) break
|
||||
const closeBracket = dialerStdout.indexOf("}", openBracket)
|
||||
if (closeBracket === -1) throw new Error("Invalid JSON. No closing curly bracket found")
|
||||
try {
|
||||
const result = JSON.parse(dialerStdout.substring(openBracket, closeBracket + 1))
|
||||
if (result.handshakePlusOneRTTMillis != null && result.pingRTTMilllis != null) return result
|
||||
} catch (err) {
|
||||
error = err
|
||||
}
|
||||
openBracket = dialerStdout.indexOf("{", openBracket + 1)
|
||||
}
|
||||
throw error ?? new Error("Invalid JSON. No opening curly bracket found")
|
||||
const openBracket = dialerStdout.indexOf("{")
|
||||
if (openBracket === -1) throw new Error("Invalid JSON. No opening curly bracket found")
|
||||
const closeBracket = dialerStdout.indexOf("}", openBracket)
|
||||
if (closeBracket === -1) throw new Error("Invalid JSON. No closing curly bracket found")
|
||||
return JSON.parse(dialerStdout.substring(openBracket, closeBracket + 1))
|
||||
}
|
||||
|
||||
// simple test case - avoids bringing in a whole test framework
|
||||
@@ -67,9 +57,9 @@ function test() {
|
||||
2023-07-05T22:41:18.8186846Z zig-v0_0_1_x_zig-v0_0_1__quic-v1_-redis-1 | 1:M 05 Jul 2023 22:41:17.439 # Server initialized
|
||||
2023-07-05T22:41:18.8188914Z zig-v0_0_1_x_zig-v0_0_1__quic-v1_-redis-1 | 1:M 05 Jul 2023 22:41:17.439 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
|
||||
2023-07-05T22:41:18.8190173Z zig-v0_0_1_x_zig-v0_0_1__quic-v1_-redis-1 | 1:M 05 Jul 2023 22:41:17.439 * Ready to accept connections
|
||||
2023-07-05T22:41:18.8190833Z zig-v0_0_1_x_zig-v0_0_1__quic-v1_-dialer-1 | {"handshakePlusOneRTTMillis":
|
||||
2023-07-05T22:41:18.8190833Z zig-v0_0_1_x_zig-v0_0_1__quic-v1_-dialer-1 | {"handshakePlusOneRTTMillis":
|
||||
2023-07-05T22:41:18.8191389Z zig-v0_0_1_x_zig-v0_0_1__quic-v1_-dialer-1 | 8.849
|
||||
2023-07-05T22:41:18.8191930Z zig-v0_0_1_x_zig-v0_0_1__quic-v1_-dialer-1 | , "pingRTTMilllis":
|
||||
2023-07-05T22:41:18.8191930Z zig-v0_0_1_x_zig-v0_0_1__quic-v1_-dialer-1 | , "pingRTTMilllis":
|
||||
2023-07-05T22:41:18.8192455Z zig-v0_0_1_x_zig-v0_0_1__quic-v1_-dialer-1 | 7.897}
|
||||
2023-07-05T22:41:18.8192987Z zig-v0_0_1_x_zig-v0_0_1__quic-v1_-dialer-1 exited with code 0`
|
||||
|
||||
@@ -81,16 +71,16 @@ function test() {
|
||||
{
|
||||
const exampleComposeStdout = `
|
||||
2023-07-06T00:36:52.6198781Z firefox-js-v0_45_x_firefox-js-v0_45__webrtc__noise__yamux_-redis-1 | 1:M 06 Jul 2023 00:36:19.136 * Ready to accept connections
|
||||
2023-07-06T00:36:52.6199494Z firefox-js-v0_45_x_firefox-js-v0_45__webrtc__noise__yamux_-listener-1 |
|
||||
2023-07-06T00:36:52.6199494Z firefox-js-v0_45_x_firefox-js-v0_45__webrtc__noise__yamux_-listener-1 |
|
||||
2023-07-06T00:36:52.6200270Z firefox-js-v0_45_x_firefox-js-v0_45__webrtc__noise__yamux_-listener-1 | > multidim-interop@1.0.0 test
|
||||
2023-07-06T00:36:52.6201247Z firefox-js-v0_45_x_firefox-js-v0_45__webrtc__noise__yamux_-listener-1 | > aegir test --build false --types false -t browser -- --browser firefox
|
||||
2023-07-06T00:36:52.6202009Z firefox-js-v0_45_x_firefox-js-v0_45__webrtc__noise__yamux_-listener-1 |
|
||||
2023-07-06T00:36:52.6202659Z firefox-js-v0_45_x_firefox-js-v0_45__webrtc__noise__yamux_-listener-1 |
|
||||
2023-07-06T00:36:52.6203296Z firefox-js-v0_45_x_firefox-js-v0_45__webrtc__noise__yamux_-dialer-1 |
|
||||
2023-07-06T00:36:52.6202009Z firefox-js-v0_45_x_firefox-js-v0_45__webrtc__noise__yamux_-listener-1 |
|
||||
2023-07-06T00:36:52.6202659Z firefox-js-v0_45_x_firefox-js-v0_45__webrtc__noise__yamux_-listener-1 |
|
||||
2023-07-06T00:36:52.6203296Z firefox-js-v0_45_x_firefox-js-v0_45__webrtc__noise__yamux_-dialer-1 |
|
||||
2023-07-06T00:36:52.6204045Z firefox-js-v0_45_x_firefox-js-v0_45__webrtc__noise__yamux_-dialer-1 | > multidim-interop@1.0.0 test
|
||||
2023-07-06T00:36:52.6205016Z firefox-js-v0_45_x_firefox-js-v0_45__webrtc__noise__yamux_-dialer-1 | > aegir test --build false --types false -t browser -- --browser firefox
|
||||
2023-07-06T00:36:52.6205760Z firefox-js-v0_45_x_firefox-js-v0_45__webrtc__noise__yamux_-dialer-1 |
|
||||
2023-07-06T00:36:52.6206397Z firefox-js-v0_45_x_firefox-js-v0_45__webrtc__noise__yamux_-dialer-1 |
|
||||
2023-07-06T00:36:52.6205760Z firefox-js-v0_45_x_firefox-js-v0_45__webrtc__noise__yamux_-dialer-1 |
|
||||
2023-07-06T00:36:52.6206397Z firefox-js-v0_45_x_firefox-js-v0_45__webrtc__noise__yamux_-dialer-1 |
|
||||
2023-07-06T00:36:52.6207074Z firefox-js-v0_45_x_firefox-js-v0_45__webrtc__noise__yamux_-listener-1 | test browser
|
||||
2023-07-06T00:36:52.6207782Z firefox-js-v0_45_x_firefox-js-v0_45__webrtc__noise__yamux_-dialer-1 | test browser
|
||||
2023-07-06T00:36:52.6208473Z firefox-js-v0_45_x_firefox-js-v0_45__webrtc__noise__yamux_-dialer-1 | [0m[0m
|
||||
@@ -106,63 +96,6 @@ function test() {
|
||||
|
||||
const expectedParsed = JSON.stringify({ "handshakePlusOneRTTMillis": 4155, "pingRTTMilllis": 781 })
|
||||
assert(JSON.stringify(dialerTimings(dialerStdout(exampleComposeStdout))) === expectedParsed)
|
||||
|
||||
}
|
||||
|
||||
{
|
||||
const exampleComposeStdout = `
|
||||
Attaching to dialer-1, listener-1, redis-1
|
||||
redis-1 | 1:C 05 May 2024 12:33:40.595 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
|
||||
redis-1 | 1:C 05 May 2024 12:33:40.595 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
|
||||
redis-1 | 1:C 05 May 2024 12:33:40.595 * Redis version=7.2.4, bits=64, commit=00000000, modified=0, pid=1, just started
|
||||
redis-1 | 1:C 05 May 2024 12:33:40.595 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
|
||||
redis-1 | 1:M 05 May 2024 12:33:40.596 * monotonic clock: POSIX clock_gettime
|
||||
redis-1 | 1:M 05 May 2024 12:33:40.596 * Running mode=standalone, port=6379.
|
||||
redis-1 | 1:M 05 May 2024 12:33:40.597 * Server initialized
|
||||
redis-1 | 1:M 05 May 2024 12:33:40.597 * Ready to accept connections tcp
|
||||
listener-1 | [2024-05-05T12:33:41Z INFO interop_tests] Running ping test: 12D3KooWT3dMe8wpuqmztR3syYzni4vVk3TSCGujMGBeGN3qR4Cn
|
||||
listener-1 | [2024-05-05T12:33:41Z INFO interop_tests] Test instance, listening for incoming connections on: "/ip4/0.0.0.0/udp/0/webrtc-direct".
|
||||
dialer-1 |
|
||||
dialer-1 | > @libp2p/multidim-interop@2.0.31 test:interop:multidim
|
||||
dialer-1 | > aegir test --build false --types false -t browser -- --browser firefox
|
||||
dialer-1 |
|
||||
dialer-1 | test browser
|
||||
dialer-1 | [JavaScript Error: "Clear-Site-Data header found. Unknown value “"cache"”." {file: "http://127.0.0.1:34451/" line: 0}]
|
||||
dialer-1 | [JavaScript Error: "Clear-Site-Data header forced the clean up of “cookies” data." {file: "http://127.0.0.1:34451/" line: 0}]
|
||||
dialer-1 | [JavaScript Error: "Clear-Site-Data header forced the clean up of “storage” data." {file: "http://127.0.0.1:34451/" line: 0}]
|
||||
dialer-1 |
|
||||
dialer-1 | ping test
|
||||
dialer-1 | - should listen for ping
|
||||
listener-1 | [2024-05-05T12:33:55Z INFO webrtc::peer_connection] signaling state changed to have-remote-offer
|
||||
listener-1 | [2024-05-05T12:33:55Z INFO webrtc_ice::mdns] mDNS is using 224.0.0.251:5353 as dest_addr
|
||||
listener-1 | [2024-05-05T12:33:55Z INFO webrtc_ice::agent::agent_internal] [controlled]: Setting new connection state: Checking
|
||||
listener-1 | [2024-05-05T12:33:55Z INFO webrtc_mdns::conn] Looping and listening Ok(224.0.0.251:5353)
|
||||
listener-1 | [2024-05-05T12:33:55Z INFO webrtc::peer_connection] ICE connection state changed: checking
|
||||
listener-1 | [2024-05-05T12:33:55Z INFO webrtc::peer_connection] signaling state changed to stable
|
||||
listener-1 | [2024-05-05T12:33:55Z INFO webrtc_ice::agent::agent_internal] [controlled]: Setting new connection state: Connected
|
||||
listener-1 | [2024-05-05T12:33:55Z INFO webrtc::peer_connection] ICE connection state changed: connected
|
||||
listener-1 | [2024-05-05T12:33:55Z WARN webrtc_dtls::handshake::handshake_message_client_hello] Unsupported Extension Type 0 16
|
||||
listener-1 | [2024-05-05T12:33:55Z WARN webrtc_dtls::handshake::handshake_message_client_hello] Unsupported Extension Type 0 28
|
||||
listener-1 | [2024-05-05T12:33:55Z WARN webrtc_dtls::handshake::handshake_message_client_hello] Unsupported Extension Type 0 16
|
||||
listener-1 | [2024-05-05T12:33:55Z WARN webrtc_dtls::handshake::handshake_message_client_hello] Unsupported Extension Type 0 28
|
||||
listener-1 | [2024-05-05T12:33:55Z WARN webrtc_dtls::handshake::handshake_message_client_hello] Unsupported Extension Type 0 16
|
||||
listener-1 | [2024-05-05T12:33:55Z WARN webrtc_dtls::handshake::handshake_message_client_hello] Unsupported Extension Type 0 28
|
||||
listener-1 | [2024-05-05T12:33:55Z WARN webrtc_dtls::handshake::handshake_message_client_hello] Unsupported Extension Type 0 16
|
||||
listener-1 | [2024-05-05T12:33:55Z WARN webrtc_dtls::handshake::handshake_message_client_hello] Unsupported Extension Type 0 28
|
||||
listener-1 | [2024-05-05T12:33:55Z INFO webrtc::peer_connection] peer connection state changed: connected
|
||||
listener-1 | [2024-05-05T12:33:55Z INFO libp2p_webrtc_utils::stream::drop_listener] Stream dropped without graceful close, sending Reset
|
||||
listener-1 | [2024-05-05T12:33:56Z INFO libp2p_webrtc_utils::stream::drop_listener] Stream dropped without graceful close, sending Reset
|
||||
dialer-1 | {"handshakePlusOneRTTMillis":1384,"pingRTTMilllis":39}
|
||||
dialer-1 | ✅ should dial and ping (1405ms)
|
||||
listener-1 | [2024-05-05T12:33:57Z WARN webrtc_sctp::association] [] failed to read packets on net_conn: Alert is Fatal or Close Notify
|
||||
dialer-1 | 1 passing (2s)
|
||||
dialer-1 | 1 pending
|
||||
listener-1 | [2024-05-05T12:33:57Z INFO libp2p_webrtc_utils::stream::drop_listener] Stream dropped without graceful close, sending Reset
|
||||
dialer-1 exited with code 0
|
||||
`
|
||||
|
||||
const expectedParsed = JSON.stringify({ "handshakePlusOneRTTMillis": 1384, "pingRTTMilllis": 39 })
|
||||
assert(JSON.stringify(dialerTimings(dialerStdout(exampleComposeStdout))) === expectedParsed)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -49,12 +49,91 @@ function browserImageIDLookup(id: string): string {
|
||||
return imageID
|
||||
}
|
||||
|
||||
export const versions: Array<Version> = JSON.parse(fs.readFileSync(path.join(__dirname, 'versionsInput.json') , 'utf8')).map((v: Version) => {
|
||||
switch(v.containerImageID) {
|
||||
case "browser":
|
||||
return { ...v, containerImageID: browserImageIDLookup }
|
||||
case "canonical":
|
||||
default:
|
||||
return { ...v, containerImageID: canonicalImageIDLookup }
|
||||
}
|
||||
});
|
||||
export const versions: Array<Version> = [
|
||||
{
|
||||
id: "rust-v0.51",
|
||||
transports: ["ws", "tcp", "quic-v1", "webrtc-direct"],
|
||||
secureChannels: ["tls", "noise"],
|
||||
muxers: ["mplex", "yamux"],
|
||||
},
|
||||
{
|
||||
id: "rust-v0.52",
|
||||
transports: ["ws", "tcp", "quic-v1", "webrtc-direct"],
|
||||
secureChannels: ["tls", "noise"],
|
||||
muxers: ["mplex", "yamux"],
|
||||
},
|
||||
{
|
||||
id: "rust-chromium-v0.52",
|
||||
transports: [{ name: "webtransport", onlyDial: true }],
|
||||
secureChannels: [],
|
||||
muxers: [],
|
||||
},
|
||||
{
|
||||
id: "js-v0.45",
|
||||
transports: ["tcp", "ws", { name: "wss", onlyDial: true }],
|
||||
secureChannels: ["noise"],
|
||||
muxers: ["mplex", "yamux"],
|
||||
},
|
||||
{
|
||||
id: "js-v0.46",
|
||||
transports: ["tcp", "ws", { name: "wss", onlyDial: true }],
|
||||
secureChannels: ["noise"],
|
||||
muxers: ["mplex", "yamux"],
|
||||
},
|
||||
{
|
||||
id: "chromium-js-v0.46",
|
||||
containerImageID: browserImageIDLookup,
|
||||
transports: [{ name: "webtransport", onlyDial: true }, { name: "wss", onlyDial: true }, { name: "webrtc-direct", onlyDial: true }],
|
||||
secureChannels: ["noise"],
|
||||
muxers: ["mplex", "yamux"],
|
||||
},
|
||||
{
|
||||
id: "firefox-js-v0.46",
|
||||
containerImageID: browserImageIDLookup,
|
||||
transports: [{ name: "wss", onlyDial: true }, { name: "webrtc-direct", onlyDial: true }],
|
||||
secureChannels: ["noise"],
|
||||
muxers: ["mplex", "yamux"],
|
||||
},
|
||||
{
|
||||
id: "go-v0.31",
|
||||
transports: ["tcp", "ws", "quic-v1", "webtransport"],
|
||||
secureChannels: ["tls", "noise"],
|
||||
muxers: ["yamux"],
|
||||
},
|
||||
{
|
||||
id: "go-v0.30",
|
||||
transports: ["tcp", "ws", "quic-v1", "webtransport"],
|
||||
secureChannels: ["tls", "noise"],
|
||||
muxers: ["yamux"],
|
||||
},
|
||||
{
|
||||
id: "go-v0.29",
|
||||
transports: ["tcp", "ws", "quic", "quic-v1", "webtransport"],
|
||||
secureChannels: ["tls", "noise"],
|
||||
muxers: ["mplex", "yamux"],
|
||||
},
|
||||
{
|
||||
id: "nim-v1.0",
|
||||
transports: ["tcp", "ws"],
|
||||
secureChannels: ["noise"],
|
||||
muxers: ["mplex", "yamux"],
|
||||
},
|
||||
{
|
||||
id: "zig-v0.0.1",
|
||||
transports: ["quic-v1"],
|
||||
secureChannels: [],
|
||||
muxers: [],
|
||||
},
|
||||
{
|
||||
id: "java-v0.0.1",
|
||||
transports: ["tcp"],
|
||||
secureChannels: ["tls", "noise"],
|
||||
muxers: ["mplex", "yamux"],
|
||||
},
|
||||
{
|
||||
id: "java-v0.6",
|
||||
transports: ["tcp"],
|
||||
secureChannels: ["tls", "noise"],
|
||||
muxers: ["mplex", "yamux"],
|
||||
},
|
||||
].map((v: Version) => (typeof v.containerImageID === "undefined" ? ({ ...v, containerImageID: canonicalImageIDLookup }) : v))
|
||||
|
||||
@@ -1,260 +0,0 @@
|
||||
[
|
||||
{
|
||||
"id": "rust-v0.51",
|
||||
"transports": [
|
||||
"ws",
|
||||
"tcp",
|
||||
"quic-v1",
|
||||
"webrtc-direct"
|
||||
],
|
||||
"secureChannels": [
|
||||
"tls",
|
||||
"noise"
|
||||
],
|
||||
"muxers": [
|
||||
"mplex",
|
||||
"yamux"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "rust-v0.52",
|
||||
"transports": [
|
||||
"ws",
|
||||
"tcp",
|
||||
"quic-v1",
|
||||
"webrtc-direct"
|
||||
],
|
||||
"secureChannels": [
|
||||
"tls",
|
||||
"noise"
|
||||
],
|
||||
"muxers": [
|
||||
"mplex",
|
||||
"yamux"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "rust-v0.53",
|
||||
"transports": [
|
||||
"ws",
|
||||
"tcp",
|
||||
"quic-v1",
|
||||
"webrtc-direct"
|
||||
],
|
||||
"secureChannels": [
|
||||
"tls",
|
||||
"noise"
|
||||
],
|
||||
"muxers": [
|
||||
"mplex",
|
||||
"yamux"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "rust-chromium-v0.53",
|
||||
"transports": [
|
||||
{
|
||||
"name": "webtransport",
|
||||
"onlyDial": true
|
||||
},
|
||||
{
|
||||
"name": "webrtc-direct",
|
||||
"onlyDial": true
|
||||
},
|
||||
{
|
||||
"name": "ws",
|
||||
"onlyDial": true
|
||||
}
|
||||
],
|
||||
"secureChannels": [
|
||||
"noise"
|
||||
],
|
||||
"muxers": [
|
||||
"mplex",
|
||||
"yamux"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "chromium-js-v1.x",
|
||||
"containerImageID": "browser",
|
||||
"transports": [
|
||||
{
|
||||
"name": "webtransport",
|
||||
"onlyDial": true
|
||||
},
|
||||
{
|
||||
"name": "wss",
|
||||
"onlyDial": true
|
||||
},
|
||||
{
|
||||
"name": "webrtc-direct",
|
||||
"onlyDial": true
|
||||
},
|
||||
"webrtc"
|
||||
],
|
||||
"secureChannels": [
|
||||
"noise"
|
||||
],
|
||||
"muxers": [
|
||||
"mplex",
|
||||
"yamux"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "firefox-js-v1.x",
|
||||
"containerImageID": "browser",
|
||||
"transports": [
|
||||
{
|
||||
"name": "wss",
|
||||
"onlyDial": true
|
||||
},
|
||||
{
|
||||
"name": "webrtc-direct",
|
||||
"onlyDial": true
|
||||
},
|
||||
"webrtc"
|
||||
],
|
||||
"secureChannels": [
|
||||
"noise"
|
||||
],
|
||||
"muxers": [
|
||||
"mplex",
|
||||
"yamux"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "go-v0.33",
|
||||
"transports": [
|
||||
"tcp",
|
||||
"ws",
|
||||
"quic-v1",
|
||||
"webrtc-direct"
|
||||
],
|
||||
"secureChannels": [
|
||||
"tls",
|
||||
"noise"
|
||||
],
|
||||
"muxers": [
|
||||
"yamux"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "nim-v1.0",
|
||||
"transports": [
|
||||
"tcp",
|
||||
"ws"
|
||||
],
|
||||
"secureChannels": [
|
||||
"noise"
|
||||
],
|
||||
"muxers": [
|
||||
"mplex",
|
||||
"yamux"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "zig-v0.0.1",
|
||||
"transports": [
|
||||
"quic-v1"
|
||||
],
|
||||
"secureChannels": [],
|
||||
"muxers": []
|
||||
},
|
||||
{
|
||||
"id": "java-v0.0.1",
|
||||
"transports": [
|
||||
"tcp"
|
||||
],
|
||||
"secureChannels": [
|
||||
"tls",
|
||||
"noise"
|
||||
],
|
||||
"muxers": [
|
||||
"mplex",
|
||||
"yamux"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "java-v0.6",
|
||||
"transports": [
|
||||
"tcp"
|
||||
],
|
||||
"secureChannels": [
|
||||
"tls",
|
||||
"noise"
|
||||
],
|
||||
"muxers": [
|
||||
"mplex",
|
||||
"yamux"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "js-v1.x",
|
||||
"transports": [
|
||||
"tcp",
|
||||
"ws",
|
||||
{
|
||||
"name": "wss",
|
||||
"onlyDial": true
|
||||
}
|
||||
],
|
||||
"secureChannels": [
|
||||
"noise"
|
||||
],
|
||||
"muxers": [
|
||||
"mplex",
|
||||
"yamux"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "go-v0.34",
|
||||
"transports": [
|
||||
"tcp",
|
||||
"ws",
|
||||
"quic-v1",
|
||||
"webtransport",
|
||||
"webrtc-direct"
|
||||
],
|
||||
"secureChannels": [
|
||||
"tls",
|
||||
"noise"
|
||||
],
|
||||
"muxers": [
|
||||
"yamux"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "go-v0.35",
|
||||
"transports": [
|
||||
"tcp",
|
||||
"ws",
|
||||
"quic-v1",
|
||||
"webtransport",
|
||||
"webrtc-direct"
|
||||
],
|
||||
"secureChannels": [
|
||||
"tls",
|
||||
"noise"
|
||||
],
|
||||
"muxers": [
|
||||
"yamux"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "go-v0.36",
|
||||
"transports": [
|
||||
"tcp",
|
||||
"ws",
|
||||
"quic-v1",
|
||||
"webtransport",
|
||||
"webrtc-direct"
|
||||
],
|
||||
"secureChannels": [
|
||||
"tls",
|
||||
"noise"
|
||||
],
|
||||
"muxers": [
|
||||
"yamux"
|
||||
]
|
||||
}
|
||||
]
|
||||
Reference in New Issue
Block a user