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

Commit be12489

Browse files
committed
feat: removing multihop (onion) dialing
1 parent b6ce189 commit be12489

File tree

7 files changed

+53
-399
lines changed

7 files changed

+53
-399
lines changed

src/dialer.js renamed to src/circuit.js

+18-22
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
const mafmt = require('mafmt')
44
const multiaddr = require('multiaddr')
55

6-
const OnionDialer = require('./circuit/onion-dialer')
6+
const CircuitDialer = require('./circuit/dialer')
77
const utilsFactory = require('./circuit/utils')
88

99
const debug = require('debug')
@@ -12,7 +12,7 @@ log.err = debug('libp2p:circuit:error:transportdialer')
1212

1313
const createListener = require('./listener')
1414

15-
class Dialer {
15+
class Circuit {
1616
/**
1717
* Creates an instance of Dialer.
1818
*
@@ -28,26 +28,22 @@ class Dialer {
2828
this.dialer = null
2929
this.utils = utilsFactory(swarm)
3030
this.peerInfo = this.swarm._peerInfo
31-
32-
// get all the relay addresses for this swarm
33-
const relays = this.filter(this.peerInfo.multiaddrs.toArray())
31+
this.relays = this.filter(this.peerInfo.multiaddrs.toArray())
3432

3533
// if no explicit relays, add a default relay addr
36-
if (relays.length === 0) {
34+
if (this.relays.length === 0) {
3735
this.peerInfo
3836
.multiaddrs
3937
.add(`/p2p-circuit/ipfs/${this.peerInfo.id.toB58String()}`)
4038
}
4139

4240
// TODO: add flag for other types of dealers, ie telescope
43-
this.dialer = new OnionDialer(swarm, options)
41+
this.dialer = new CircuitDialer(swarm, options)
4442

4543
this.swarm.on('peer-mux-established', this.dialer.canHop.bind(this.dialer))
4644
this.swarm.on('peer-mux-closed', (peerInfo) => {
4745
this.dialer.relayPeers.delete(peerInfo.id.toB58String())
4846
})
49-
50-
this._dialSwarmRelays(relays)
5147
}
5248

5349
/**
@@ -56,18 +52,16 @@ class Dialer {
5652
* @param {Array} relays
5753
* @return {void}
5854
*/
59-
_dialSwarmRelays (relays) {
55+
_dialSwarmRelays () {
6056
// if we have relay addresses in swarm config, then dial those relays
61-
this.swarm.on('listening', () => {
62-
relays.forEach((relay) => {
63-
let relaySegments = relay
64-
.toString()
65-
.split('/p2p-circuit')
66-
.filter(segment => segment.length)
67-
68-
relaySegments.forEach((relaySegment) => {
69-
this.dialer.dialRelay(this.utils.peerInfoFromMa(multiaddr(relaySegment)))
70-
})
57+
this.relays.forEach((relay) => {
58+
let relaySegments = relay
59+
.toString()
60+
.split('/p2p-circuit')
61+
.filter(segment => segment.length)
62+
63+
relaySegments.forEach((relaySegment) => {
64+
this.dialer.dialRelay(this.utils.peerInfoFromMa(multiaddr(relaySegment)))
7165
})
7266
})
7367
}
@@ -99,7 +93,9 @@ class Dialer {
9993
options = this.options || {}
10094
}
10195

102-
return createListener(this.swarm, options, handler)
96+
const listener = createListener(this.swarm, options, handler)
97+
listener.on('listen', this._dialSwarmRelays.bind(this))
98+
return listener
10399
}
104100

105101
/**
@@ -121,4 +117,4 @@ class Dialer {
121117
}
122118
}
123119

124-
module.exports = Dialer
120+
module.exports = Circuit

src/circuit/constants.js

-30
This file was deleted.

src/circuit/dialer.js

+32-5
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,27 @@ class Dialer {
3434
* Dial a peer over a relay
3535
*
3636
* @param {multiaddr} ma - the multiaddr of the peer to dial
37-
* @param {Object} options - dial options
3837
* @param {Function} cb - a callback called once dialed
3938
* @returns {Connection} - the connection
4039
*
4140
* @memberOf Dialer
4241
*/
43-
dial (ma, options, cb) {
44-
throw new Error('abstract class, method not implemented')
42+
dial (ma, cb) {
43+
const addr = ma.toString().split('p2p-circuit')
44+
const relay = addr[0] === '/' ? null : multiaddr(addr[0])
45+
const peer = multiaddr(addr[1] || addr[0])
46+
47+
const dstConn = new Connection()
48+
setImmediate(this.dialPeer.bind(this), peer, relay, (err, conn) => {
49+
if (err) {
50+
log.err(err)
51+
return cb(err)
52+
}
53+
dstConn.setInnerConn(conn)
54+
cb(null, dstConn)
55+
})
56+
57+
return dstConn
4558
}
4659

4760
/**
@@ -186,8 +199,22 @@ class Dialer {
186199
return cb(err)
187200
}
188201

189-
this.relayPeers.set(this.utils.getB58String(peer), peer)
190-
cb(null)
202+
streamHandler.read((err, msg) => {
203+
if (err) {
204+
log.err(err)
205+
return cb(err)
206+
}
207+
208+
const response = proto.CircuitRelay.decode(msg)
209+
210+
if (response.code !== proto.CircuitRelay.Status.SUCCESS) {
211+
return log(`HOP not supported, skipping - ${this.utils.getB58String(peer)}`)
212+
}
213+
214+
log(`HOP supported adding as relay - ${this.utils.getB58String(peer)}`)
215+
this.relayPeers.set(this.utils.getB58String(peer), peer)
216+
cb(null)
217+
})
191218
})
192219
})
193220
}

src/circuit/hop.js

+2-3
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ const debug = require('debug')
88
const PeerInfo = require('peer-info')
99
const PeerId = require('peer-id')
1010
const EE = require('events').EventEmitter
11-
const constants = require('./constants')
1211
const once = require('once')
1312
const utilsFactory = require('./utils')
1413
const StreamHandler = require('./stream-handler')
@@ -97,7 +96,7 @@ class Hop extends EE {
9796
this._dialPeer(message.dstPeer, (err, dstConn) => {
9897
if (err) {
9998
const errStreamHandler = new StreamHandler(conn)
100-
this._writeErr(errStreamHandler, constants.RESPONSE.CANT_DIAL_DST)
99+
this.utils.writeResponse(errStreamHandler, proto.CircuitRelay.Status.HOP_CANT_DIAL_DST)
101100
pull(pull.empty(), errStreamHandler.rest())
102101
log.err(err)
103102
return cb(err)
@@ -119,7 +118,7 @@ class Hop extends EE {
119118
streamHandler.write(proto.CircuitRelay.encode(stopMsg), (err) => {
120119
if (err) {
121120
const errStreamHandler = new StreamHandler(conn)
122-
this._writeErr(errStreamHandler, constants.RESPONSE.CANT_OPEN_DST_STREAM)
121+
this.utils.writeResponse(errStreamHandler, proto.CircuitRelay.Status.HOP_CANT_OPEN_DST_STREAM)
123122
pull(pull.empty(), errStreamHandler.rest())
124123

125124
log.err(err)

src/circuit/onion-dialer.js

-161
This file was deleted.

src/index.js

+1-6
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,3 @@
11
'use strict'
22

3-
module.exports = {
4-
Hop: require('./circuit/hop'),
5-
Dialer: require('./dialer'),
6-
multicodec: require('./multicodec'),
7-
tag: 'Circuit'
8-
}
3+
module.exports = require('./circuit')

0 commit comments

Comments
 (0)