Skip to content
This repository was archived by the owner on Aug 1, 2023. It is now read-only.

Commit 278e2a0

Browse files
committedNov 29, 2021
feat: circuit relay v2
Needed for: ipfs/kubo#8522
1 parent 69ded0b commit 278e2a0

15 files changed

+529
-138
lines changed
 

‎.github/workflows/test.yml

+2
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ jobs:
106106
type:
107107
- browser
108108
- webworker
109+
fail-fast: false
109110
steps:
110111
- uses: actions/checkout@v2
111112
- uses: actions/setup-node@v2
@@ -137,6 +138,7 @@ jobs:
137138
type:
138139
- electron-main
139140
- electron-renderer
141+
fail-fast: false
140142
steps:
141143
- uses: actions/checkout@v2
142144
- uses: actions/setup-node@v2

‎.gitignore

+3-1
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,6 @@ dist
3737
test/test-data/go-ipfs-repo/LOCK
3838
test/test-data/go-ipfs-repo/LOG
3939
test/test-data/go-ipfs-repo/LOG.old
40-
types
40+
types
41+
go-libp2p-relay-daemon
42+
*.identity

‎package-lock.json

+4-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎package.json

+8-3
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
"npm": ">6.0.0"
2424
},
2525
"scripts": {
26+
"postinstall": "./scripts/setup-relayd.sh",
27+
"clean": "rimraf /tmp/js-ipfs /tmp/go-ipfs ./go-libp2p-relay-daemon",
2628
"lint": "aegir lint",
2729
"build": "aegir build",
2830
"pretest": "aegir build --esm-tests",
@@ -45,7 +47,9 @@
4547
},
4648
"homepage": "https://github.com/ipfs/interop#readme",
4749
"browser": {
48-
"go-ipfs": false
50+
"go-ipfs": false,
51+
"fs": false,
52+
"execa": false
4953
},
5054
"dependencies": {
5155
"aegir": "^35.0.2",
@@ -55,8 +59,8 @@
5559
"delay": "^5.0.0",
5660
"detect-node": "^2.0.4",
5761
"ipfs-unixfs": "^6.0.3",
58-
"ipfsd-ctl": "^10.0.3",
5962
"ipfs-utils": "^9.0.1",
63+
"ipfsd-ctl": "^10.0.3",
6064
"ipns": "^0.15.0",
6165
"is-ci": "^3.0.0",
6266
"is-os": "^1.0.1",
@@ -75,7 +79,7 @@
7579
"promisify-es6": "^1.0.3",
7680
"random-fs": "^1.0.3",
7781
"readable-stream-buffer-stream": "^1.0.0",
78-
"rimraf": "^3.0.0",
82+
"rimraf": "^3.0.2",
7983
"uint8arrays": "^3.0.0",
8084
"wherearewe": "^1.0.0"
8185
},
@@ -97,6 +101,7 @@
97101
"Richard Littauer <richard.littauer@gmail.com>"
98102
],
99103
"devDependencies": {
104+
"execa": "^5.1.1",
100105
"go-ipfs": "^0.9.1",
101106
"ipfs": "^0.59.0",
102107
"ipfs-http-client": "^53.0.0"

‎scripts/relayd_v1.config.json

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"RelayV1": {
3+
"Enabled": true
4+
},
5+
"RelayV2": {
6+
"Enabled": false
7+
},
8+
"Network": {
9+
"ListenAddrs": ["/ip4/127.0.0.1/tcp/14111/ws"],
10+
"AnnounceAddrs": ["/ip4/127.0.0.1/tcp/14111/ws"]
11+
},
12+
"Daemon": {
13+
"PprofPort": -1
14+
}
15+
}

‎scripts/relayd_v2.config.json

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"RelayV1": {
3+
"Enabled": false
4+
},
5+
"RelayV2": {
6+
"Enabled": true
7+
},
8+
"Network": {
9+
"ListenAddrs": ["/ip4/127.0.0.1/tcp/24222/ws"],
10+
"AnnounceAddrs": ["/ip4/127.0.0.1/tcp/24222/ws"]
11+
},
12+
"Daemon": {
13+
"PprofPort": -1
14+
}
15+
}

‎scripts/setup-relayd.sh

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#!/usr/bin/env bash
2+
3+
# This script ensures go-libp2p-relay-daemon is available
4+
# for use in circuit v1 and v2 tests.
5+
6+
set -eo pipefail
7+
8+
if ! type relayd; then
9+
git clone https://github.com/libp2p/go-libp2p-relay-daemon.git
10+
cd go-libp2p-relay-daemon
11+
# no releases atm, so we pin implementation to specific commit
12+
git checkout 65211a0b6d881086feb7c386d780f55c37dff101 # 2021-11-19
13+
go install ./...
14+
fi

‎test/circuit.js

+72-25
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
/* eslint max-nested-callbacks: ["error", 8] */
22
/* eslint-env mocha */
33

4-
import all from './circuit/all.js'
5-
import browser from './circuit/browser.js'
4+
import allV1 from './circuit/v1/all.js'
5+
import allV2 from './circuit/v2/all.js'
6+
import browserV1 from './circuit/v1/browser.js'
7+
import browserV2 from './circuit/v2/browser.js'
68
import isNode from 'detect-node'
79
import { connect, send, clean } from './utils/circuit.js'
10+
import { closeRelays } from './utils/relayd.js'
811
import { daemonFactory } from './utils/daemon-factory.js'
912

1013
const timeout = 80 * 1000
@@ -15,40 +18,84 @@ const baseTest = {
1518
}
1619

1720
describe('circuit', () => {
18-
let factory
21+
after(closeRelays)
1922

20-
before(async () => {
21-
factory = await daemonFactory()
22-
})
23+
// Legacy v1 (unlimited relay)
24+
describe('v1', () => {
25+
let factory
2326

24-
const tests = isNode ? all : browser
27+
before(async () => {
28+
factory = await daemonFactory()
29+
})
2530

26-
Object.keys(tests).forEach((test) => {
27-
let nodeA
28-
let relay
29-
let nodeB
31+
const tests = isNode ? allV1 : browserV1
3032

31-
tests[test] = Object.assign({}, baseTest, tests[test])
33+
Object.keys(tests).forEach((test) => {
34+
let nodeA
35+
let relay
36+
let nodeB
3237

33-
const dsc = tests[test].skip && tests[test].skip()
34-
? describe.skip
35-
: describe
38+
tests[test] = Object.assign({}, baseTest, tests[test])
3639

37-
dsc(test, function () {
38-
this.timeout(tests[test].timeout)
40+
const dsc = tests[test].skip && tests[test].skip()
41+
? describe.skip
42+
: describe
3943

40-
before(async () => {
41-
[nodeA, relay, nodeB] = await tests[test].create(factory)
42-
})
44+
dsc(test, function () {
45+
this.timeout(tests[test].timeout)
46+
47+
before(async () => {
48+
[nodeA, relay, nodeB] = await tests[test].create(factory)
49+
})
50+
51+
after(() => clean(factory))
4352

44-
after(() => clean(factory))
53+
it('connect', () => {
54+
return tests[test].connect(nodeA, nodeB, relay)
55+
})
4556

46-
it('connect', () => {
47-
return tests[test].connect(nodeA, nodeB, relay)
57+
it('send', () => {
58+
return tests[test].send(nodeA, nodeB)
59+
})
4860
})
61+
})
62+
})
63+
64+
// Modern v2 (limited relay)
65+
// https://github.com/libp2p/specs/blob/master/relay/circuit-v2.md
66+
describe('v2', () => {
67+
let factory
68+
69+
before(async () => {
70+
factory = await daemonFactory()
71+
})
72+
73+
const tests = isNode ? allV2 : browserV2
74+
75+
Object.keys(tests).forEach((test) => {
76+
let nodeA
77+
let relay
78+
let nodeB
79+
80+
tests[test] = Object.assign({}, baseTest, tests[test])
81+
82+
const dsc = tests[test].skip && tests[test].skip()
83+
? describe.skip
84+
: describe
85+
86+
dsc(test, function () {
87+
this.timeout(tests[test].timeout)
88+
89+
before(async () => {
90+
[nodeA, relay, nodeB] = await tests[test].create(factory)
91+
})
92+
93+
after(() => clean(factory))
4994

50-
it('send', () => {
51-
return tests[test].send(nodeA, nodeB)
95+
it('connect', () => {
96+
return tests[test].connect(nodeA, nodeB, relay)
97+
})
98+
// Note: v2 provides a limited relay for things like hole punching – no send test
5299
})
53100
})
54101
})

‎test/circuit/all.js

-65
This file was deleted.

‎test/circuit/v1/all.js

+93
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
/* eslint max-nested-callbacks: ["error", 8] */
2+
/* eslint-env mocha */
3+
4+
import { createJs, createGo, randomWsAddr } from '../../utils/circuit.js'
5+
import { getRelayV } from '../../utils/relayd.js'
6+
7+
export default {
8+
9+
// rv1 is a standalone, reference implementation of circuit relay v1
10+
// (https://github.com/libp2p/go-libp2p-relay-daemon)
11+
12+
'go-rv1-go': {
13+
create: async (factory) => {
14+
const relay = await getRelayV(1)
15+
return Promise.all([
16+
createGo([randomWsAddr], factory),
17+
relay,
18+
createGo([randomWsAddr], factory)
19+
])
20+
}
21+
},
22+
23+
'js-rv1-js': {
24+
create: async (factory) => {
25+
const relay = await getRelayV(1)
26+
return Promise.all([
27+
createJs([randomWsAddr], factory),
28+
relay,
29+
createJs([randomWsAddr], factory)
30+
])
31+
}
32+
},
33+
34+
'js-rv1-go': {
35+
create: async (factory) => {
36+
const relay = await getRelayV(1)
37+
return Promise.all([
38+
createJs([randomWsAddr], factory),
39+
relay,
40+
createGo([randomWsAddr], factory)
41+
])
42+
}
43+
},
44+
45+
'go-rv1-js': {
46+
create: async (factory) => {
47+
const relay = await getRelayV(1)
48+
return Promise.all([
49+
createGo([randomWsAddr], factory),
50+
relay,
51+
createJs([randomWsAddr], factory)
52+
])
53+
}
54+
},
55+
56+
// Below are legacy tests that use js-ipfs as v1 relay
57+
// (no tests for go-ipfs as relay v1, because since 0.11 it only supports v2)
58+
// FIXME: remove after js-ipfs migrates to v2
59+
60+
'go-js-go': {
61+
create: async (factory) => {
62+
return Promise.all([
63+
createGo([randomWsAddr], factory),
64+
createJs([randomWsAddr], factory),
65+
createGo([randomWsAddr], factory)
66+
])
67+
}
68+
},
69+
'js-js-go': {
70+
create: async (factory) => {
71+
return Promise.all([
72+
createJs([randomWsAddr], factory),
73+
createJs([randomWsAddr], factory),
74+
createGo([randomWsAddr], factory)
75+
])
76+
}
77+
},
78+
'go-js-js': {
79+
create: (factory) => Promise.all([
80+
createGo([randomWsAddr], factory),
81+
createJs([randomWsAddr], factory),
82+
createJs([randomWsAddr], factory)
83+
])
84+
},
85+
'js-js-js': {
86+
create: (factory) => Promise.all([
87+
createJs([randomWsAddr], factory),
88+
createJs([randomWsAddr], factory),
89+
createJs([randomWsAddr], factory)
90+
])
91+
}
92+
93+
}

‎test/circuit/browser.js ‎test/circuit/v1/browser.js

+51-35
Original file line numberDiff line numberDiff line change
@@ -6,82 +6,98 @@ import { isWebWorker } from 'wherearewe'
66
import {
77
createJs,
88
createGo,
9+
createGoRelay,
910
createProc,
1011
connWithTimeout,
12+
randomWsAddr,
1113
getWsAddr,
1214
getWrtcStarAddr
13-
} from '../utils/circuit.js'
14-
15-
const base = '/ip4/127.0.0.1/tcp/0'
15+
} from '../../utils/circuit.js'
1616

1717
export default {
1818
'browser-go-js': {
19-
create: (factory) => Promise.all([
20-
createProc([], factory),
21-
createGo([`${base}/ws`], factory),
22-
createJs([`${base}/ws`], factory)
23-
]),
19+
skip: () => true, // FIXME when we have circuit v2 in js-ipfs and webrtc signaling
20+
create: async (factory) => {
21+
const relay = await createGoRelay([randomWsAddr], factory)
22+
return Promise.all([
23+
createProc([], factory),
24+
relay,
25+
createJs([randomWsAddr], factory, relay)
26+
])
27+
},
2428
connect: connWithTimeout(1500)
2529
},
2630
'browser-go-go': {
27-
create: (factory) => Promise.all([
28-
createProc([], factory),
29-
createGo([`${base}/ws`], factory),
30-
createGo([`${base}/ws`], factory)
31-
]),
31+
skip: () => true, // FIXME when we have circuit v2 in js-ipfs and webrtc signaling
32+
create: async (factory) => {
33+
const relay = await createGoRelay([randomWsAddr], factory)
34+
return Promise.all([
35+
createProc([], factory),
36+
relay,
37+
createGo([randomWsAddr], factory, relay)
38+
])
39+
},
3240
connect: connWithTimeout(1500)
3341
},
3442
'browser-js-js': {
3543
create: (factory) => Promise.all([
3644
createProc([], factory),
37-
createJs([`${base}/ws`], factory),
38-
createJs([`${base}/ws`], factory)
45+
createJs([randomWsAddr], factory),
46+
createJs([randomWsAddr], factory)
3947
]),
4048
connect: connWithTimeout(1500)
4149
},
4250
'browser-js-go': {
4351
create: (factory) => Promise.all([
4452
createProc([], factory),
45-
createJs([`${base}/ws`], factory),
46-
createGo([`${base}/ws`], factory)
53+
createJs([randomWsAddr], factory),
54+
createGo([randomWsAddr], factory)
4755
]),
4856
connect: connWithTimeout(1500)
4957
},
5058
'js-go-browser': {
51-
create: (factory) => Promise.all([
52-
createJs([`${base}/ws`], factory),
53-
createGo([`${base}/ws`], factory),
54-
createProc([], factory)
55-
]),
59+
skip: () => true, // FIXME when we have circuit v2 in js-ipfs and webrtc signaling
60+
create: async (factory) => {
61+
const relay = await createGoRelay([randomWsAddr], factory)
62+
return Promise.all([
63+
createJs([randomWsAddr], factory),
64+
relay,
65+
createProc([], factory, relay)
66+
])
67+
},
5668
connect: connWithTimeout(1500)
5769
},
5870
'go-go-browser': {
59-
create: (factory) => Promise.all([
60-
createGo([`${base}/ws`], factory),
61-
createGo([`${base}/ws`], factory),
62-
createProc([], factory)
63-
]),
71+
skip: () => true, // FIXME when we have circuit v2 in js-ipfs and webrtc signaling
72+
create: async (factory) => {
73+
const relay = await createGoRelay([randomWsAddr], factory)
74+
return Promise.all([
75+
createGo([randomWsAddr], factory),
76+
relay,
77+
createProc([], factory)
78+
])
79+
},
6480
connect: connWithTimeout(1500)
6581
},
6682
'js-js-browser': {
6783
create: (factory) => Promise.all([
68-
createJs([`${base}/ws`], factory),
69-
createJs([`${base}/ws`], factory),
84+
createJs([randomWsAddr], factory),
85+
createJs([randomWsAddr], factory),
7086
createProc([], factory)
7187
]),
7288
connect: connWithTimeout(1500)
7389
},
7490
'go-js-browser': {
7591
create: (factory) => Promise.all([
76-
createGo([`${base}/ws`], factory),
77-
createJs([`${base}/ws`], factory),
92+
createGo([randomWsAddr], factory),
93+
createJs([randomWsAddr], factory),
7894
createProc([], factory)
7995
]),
8096
connect: connWithTimeout(1500)
8197
},
8298
'go-browser-browser': {
8399
create: (factory) => Promise.all([
84-
createGo([`${base}/ws`], factory),
100+
createGo([randomWsAddr], factory),
85101
createProc(['/ip4/127.0.0.1/tcp/24642/ws/p2p-webrtc-star'], factory),
86102
createProc(['/ip4/127.0.0.1/tcp/24642/ws/p2p-webrtc-star'], factory)
87103
]),
@@ -97,7 +113,7 @@ export default {
97113
},
98114
'js-browser-browser': {
99115
create: (factory) => Promise.all([
100-
createJs([`${base}/ws`], factory),
116+
createJs([randomWsAddr], factory),
101117
createProc(['/ip4/127.0.0.1/tcp/24642/ws/p2p-webrtc-star'], factory),
102118
createProc(['/ip4/127.0.0.1/tcp/24642/ws/p2p-webrtc-star'], factory)
103119
]),
@@ -115,7 +131,7 @@ export default {
115131
create: (factory) => Promise.all([
116132
createProc(['/ip4/127.0.0.1/tcp/24642/wss/p2p-webrtc-star'], factory),
117133
createProc(['/ip4/127.0.0.1/tcp/24642/wss/p2p-webrtc-star'], factory),
118-
createGo([`${base}/ws`], factory)
134+
createGo([randomWsAddr], factory)
119135
]),
120136
connect: async (nodeA, nodeB, relay) => {
121137
await relay.api.swarm.connect(getWrtcStarAddr(nodeA.api.peerId.addresses))
@@ -131,7 +147,7 @@ export default {
131147
create: (factory) => Promise.all([
132148
createProc(['/ip4/127.0.0.1/tcp/24642/wss/p2p-webrtc-star'], factory),
133149
createProc(['/ip4/127.0.0.1/tcp/24642/wss/p2p-webrtc-star'], factory),
134-
createJs([`${base}/ws`], factory)
150+
createJs([randomWsAddr], factory)
135151
]),
136152
connect: async (nodeA, nodeB, relay) => {
137153
await relay.api.swarm.connect(getWrtcStarAddr(nodeA.api.peerId.addresses))

‎test/circuit/v2/all.js

+72
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
/* eslint max-nested-callbacks: ["error", 8] */
2+
/* eslint-env mocha */
3+
4+
import { createGo, createGoRelay, randomWsAddr } from '../../utils/circuit.js'
5+
import { getRelayV } from '../../utils/relayd.js'
6+
7+
export default {
8+
9+
// rv2 is a standalone, reference implementation of circuit relay v2
10+
// (https://github.com/libp2p/go-libp2p-relay-daemon)
11+
12+
'go-rv2-go': {
13+
create: async (factory) => {
14+
const relay = await getRelayV(2)
15+
return Promise.all([
16+
createGo([randomWsAddr], factory),
17+
relay,
18+
createGo([randomWsAddr], factory, relay)
19+
])
20+
}
21+
},
22+
23+
'js-rv2-js': {
24+
skip: () => true // FIXME when we have circuit v2 in js-ipfs
25+
},
26+
27+
'js-rv2-go': {
28+
skip: () => true // FIXME when we have circuit v2 in js-ipfs
29+
},
30+
31+
'go-rv2-js': {
32+
skip: () => true // FIXME when we have circuit v2 in js-ipfs
33+
},
34+
35+
// relay v2 implementation in go-ipfs 0.11+
36+
37+
'go-go-go': {
38+
create: async (factory) => {
39+
const relay = await createGoRelay([randomWsAddr], factory)
40+
return Promise.all([
41+
createGo([randomWsAddr], factory),
42+
relay,
43+
createGo([randomWsAddr], factory, relay)
44+
])
45+
}
46+
},
47+
'js-go-go': {
48+
skip: () => true // FIXME when we have circuit v2 in js-ipfs
49+
},
50+
'go-go-js': {
51+
skip: () => true // FIXME when we have circuit v2 in js-ipfs
52+
},
53+
'js-go-js': {
54+
skip: () => true // FIXME when we have circuit v2 in js-ipfs
55+
},
56+
57+
// relay v2 implementation in js-ipfs
58+
59+
'go-js-go': {
60+
skip: () => true // FIXME when we have circuit v2 in js-ipfs
61+
},
62+
'js-js-go': {
63+
skip: () => true // FIXME when we have circuit v2 in js-ipfs
64+
},
65+
'go-js-js': {
66+
skip: () => true // FIXME when we have circuit v2 in js-ipfs
67+
},
68+
'js-js-js': {
69+
skip: () => true // FIXME when we have circuit v2 in js-ipfs
70+
}
71+
72+
}

‎test/circuit/v2/browser.js

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/* eslint max-nested-callbacks: ["error", 8] */
2+
/* eslint-env mocha */
3+
4+
// TODO when we have circuit v2 in js-ipfs and webrtc signaling
5+
export default {
6+
'browser-go-js': {
7+
skip: () => true
8+
},
9+
'browser-go-go': {
10+
skip: () => true
11+
},
12+
'browser-js-js': {
13+
skip: () => true
14+
},
15+
'browser-js-go': {
16+
skip: () => true
17+
},
18+
'js-go-browser': {
19+
skip: () => true
20+
},
21+
'go-go-browser': {
22+
skip: () => true
23+
},
24+
'js-js-browser': {
25+
skip: () => true
26+
},
27+
'go-js-browser': {
28+
skip: () => true
29+
},
30+
'go-browser-browser': {
31+
skip: () => true
32+
},
33+
'js-browser-browser': {
34+
skip: () => true
35+
},
36+
'browser-browser-go': {
37+
skip: () => true
38+
},
39+
'browser-browser-js': {
40+
skip: () => true
41+
}
42+
}

‎test/utils/circuit.js

+92-7
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
/* eslint no-console: ["error", { allow: ["log"] }] */
12
import delay from 'delay'
23
import randomBytes from 'iso-random-stream/src/random.js'
34
import concat from 'it-concat'
@@ -7,15 +8,20 @@ import { expect } from 'aegir/utils/chai.js'
78

89
const transportKey = WS.prototype[Symbol.toStringTag]
910

10-
export function createProc (addrs, factory) {
11+
export const randomWsAddr = '/ip4/127.0.0.1/tcp/0/ws'
12+
13+
export function createProc (addrs, factory, relay) {
14+
if (relay) {
15+
throw new Error('createProc missing support for static relay v2')
16+
}
1117
return factory.spawn({
1218
type: 'proc',
1319
ipfsOptions: {
1420
config: {
1521
Addresses: {
1622
Swarm: addrs
1723
},
18-
relay: {
24+
relay: { // FIXME: this is circuit v1, needs support of v2
1925
enabled: true,
2026
hop: {
2127
enabled: true
@@ -35,15 +41,18 @@ export function createProc (addrs, factory) {
3541
})
3642
}
3743

38-
export function createJs (addrs, factory) {
44+
export function createJs (addrs, factory, relay) {
45+
if (relay) {
46+
throw new Error('createJs missing support for static relay v2')
47+
}
3948
return factory.spawn({
4049
type: 'js',
4150
ipfsOptions: {
4251
config: {
4352
Addresses: {
4453
Swarm: addrs
4554
},
46-
relay: {
55+
relay: { // FIXME: this is circuit v1, needs support of v2
4756
enabled: true,
4857
hop: {
4958
enabled: true
@@ -54,7 +63,48 @@ export function createJs (addrs, factory) {
5463
})
5564
}
5665

57-
export function createGo (addrs, factory) {
66+
// creates "private" go-ipfs node which is uses static relay if specified
67+
export function createGo (addrs, factory, relay) {
68+
let StaticRelays
69+
if (relay) {
70+
StaticRelays = [getWsAddr(relay.api.peerId.addresses)]
71+
}
72+
return factory.spawn({
73+
type: 'go',
74+
ipfsOptions: {
75+
config: {
76+
Addresses: {
77+
Swarm: addrs
78+
},
79+
Swarm: {
80+
// go uses circuit v2
81+
RelayClient: {
82+
Enabled: true,
83+
StaticRelays
84+
},
85+
RelayService: {
86+
Enabled: false
87+
}
88+
},
89+
Bootstraps: [],
90+
Discovery: {
91+
MDNS: {
92+
Enabled: false
93+
}
94+
},
95+
Routing: {
96+
Type: 'none'
97+
},
98+
Internal: {
99+
Libp2pForceReachability: 'private'
100+
}
101+
}
102+
}
103+
})
104+
}
105+
106+
// creates "publicly diallable" go-ipfs running a relay service
107+
export function createGoRelay (addrs, factory) {
58108
return factory.spawn({
59109
type: 'go',
60110
ipfsOptions: {
@@ -63,8 +113,25 @@ export function createGo (addrs, factory) {
63113
Swarm: addrs
64114
},
65115
Swarm: {
66-
DisableRelay: false,
67-
EnableRelayHop: true
116+
// go uses circuit v2
117+
RelayClient: {
118+
Enabled: false
119+
},
120+
RelayService: {
121+
Enabled: true
122+
}
123+
},
124+
Bootstraps: [],
125+
Discovery: {
126+
MDNS: {
127+
Enabled: false
128+
}
129+
},
130+
Routing: {
131+
Type: 'none'
132+
},
133+
Internal: {
134+
Libp2pForceReachability: 'public'
68135
}
69136
}
70137
}
@@ -136,12 +203,30 @@ export function getTcpAddr (addrs) {
136203

137204
export async function connect (nodeA, nodeB, relay, timeout = 1000) {
138205
const relayWsAddr = getWsAddr(relay.api.peerId.addresses)
206+
const nodeAId = nodeA.api.peerId.id
207+
const nodeBId = nodeB.api.peerId.id
208+
209+
if (process.env.DEBUG) console.log(`connect A (${nodeAId}) to relay at`, relayWsAddr)
139210
await nodeA.api.swarm.connect(relayWsAddr)
211+
212+
if (process.env.DEBUG) console.log(`connect B (${nodeBId}) to relay at`, relayWsAddr)
140213
await nodeB.api.swarm.connect(relayWsAddr)
214+
141215
// TODO: needed until https://github.com/ipfs/interop/issues/17 is resolved
142216
await delay(timeout)
143217
const nodeBCircuitAddr = `${relayWsAddr}/p2p-circuit/p2p/${nodeB.api.peerId.id}`
218+
if (process.env.DEBUG) console.log('connect A to B over circuit', nodeBCircuitAddr)
144219
await nodeA.api.swarm.connect(nodeBCircuitAddr)
220+
221+
if (process.env.DEBUG) {
222+
console.log('done!')
223+
const listConnections = async (name, node) => {
224+
const peers = await node.api.swarm.peers()
225+
console.log(`${name} has connections`, peers.map(p => `${p.addr.toString()}/p2p/${p.peer}`))
226+
}
227+
await listConnections('nodeA', nodeA)
228+
await listConnections('nodeB', nodeB)
229+
}
145230
}
146231

147232
export function connWithTimeout (timeout) {

‎test/utils/relayd.js

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import isNode from 'detect-node'
2+
import fs from 'fs'
3+
import { command } from 'execa'
4+
5+
// augumentWithRelayd is the glue code that makes running relayd-based relay
6+
// possible without changing too much in existing tests. We keep one instance
7+
// per circuit relay version.
8+
const relays = new Map()
9+
10+
export async function getRelayV (version, factory) {
11+
if (!isNode) return
12+
if (relays.has(version)) return relays.get(version)
13+
if (process.env.DEBUG) console.log(`Starting relayd_v${version}..`) // eslint-disable-line no-console
14+
if (version < 1 || version > 2) throw new Error('Unsupported circuit relay version')
15+
const relayd = command(`relayd -config scripts/relayd_v${version}.config.json -id scripts/relayd_v${version}.identity`)
16+
let id
17+
for await (const line of relayd.stdout) {
18+
const text = line.toString()
19+
if (process.env.DEBUG) console.log(text) // eslint-disable-line no-console
20+
if (text.includes(`RelayV${version} is running!`)) break
21+
if (text.includes('I am')) {
22+
id = text.split('I am')[1].split('\n')[0].trim()
23+
}
24+
}
25+
const config = JSON.parse(fs.readFileSync(`scripts/relayd_v${version}.config.json`))
26+
const result = {
27+
relayd,
28+
// Mock: make it look like other things returned by ipfsd-ctl to reuse existing code.
29+
api: {
30+
peerId: {
31+
id,
32+
addresses: [
33+
`${config.Network.ListenAddrs[0]}/p2p/${id}`
34+
]
35+
}
36+
}
37+
}
38+
relays.set(version, result)
39+
return result
40+
}
41+
42+
export async function closeRelays () {
43+
for (const r of relays.values()) {
44+
r.relayd.cancel()
45+
}
46+
}

0 commit comments

Comments
 (0)
This repository has been archived.