diff --git a/package.json b/package.json index e9cc248..1905421 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "tape": "^4.2.0" }, "dependencies": { + "ip-address": "^5.8.0", "multiaddr": "^1.0.0" } } diff --git a/src/index.js b/src/index.js index 41dca50..565c809 100644 --- a/src/index.js +++ b/src/index.js @@ -2,6 +2,7 @@ // const log = debug('libp2p:tcp') const tcp = require('net') const multiaddr = require('multiaddr') +const Address6 = require('ip-address').Address6 exports = module.exports = TCP @@ -17,7 +18,11 @@ function TCP () { options = {} } options.ready = options.ready || function noop () {} - return tcp.connect(multiaddr.toOptions(), options.ready) + const conn = tcp.connect(multiaddr.toOptions(), options.ready) + conn.getObservedAddrs = () => { + return [multiaddr] + } + return conn } this.createListener = (multiaddrs, options, handler, callback) => { @@ -35,7 +40,12 @@ function TCP () { const freshMultiaddrs = [] multiaddrs.forEach((m) => { - const listener = tcp.createServer(handler) + const listener = tcp.createServer((conn) => { + conn.getObservedAddrs = () => { + return [getMultiaddr(conn)] + } + handler(conn) + }) listener.listen(m.toOptions(), () => { // Node.js likes to convert addr to IPv6 (when 0.0.0.0 for e.g) const address = listener.address() @@ -71,3 +81,20 @@ function TCP () { } } +function getMultiaddr (conn) { + var mh + + if (conn.remoteFamily === 'IPv6') { + var addr = new Address6(conn.remoteAddress) + if (addr.v4) { + var ip4 = addr.to4().correctForm() + mh = multiaddr('/ip4/' + ip4 + '/tcp/' + conn.remotePort) + } else { + mh = multiaddr('/ip6/' + conn.remoteAddress + '/tcp/' + conn.remotePort) + } + } else { + mh = multiaddr('/ip4/' + conn.remoteAddress + '/tcp/' + conn.remotePort) + } + + return mh +} diff --git a/tests/libp2p-tcp-test.js b/tests/libp2p-tcp-test.js index ac4a252..6b6de08 100644 --- a/tests/libp2p-tcp-test.js +++ b/tests/libp2p-tcp-test.js @@ -53,5 +53,29 @@ describe('libp2p-tcp', function () { }) }) + it('get observed addrs', (done) => { + const mh = multiaddr('/ip4/127.0.0.1/tcp/9090') + var dialerObsAddrs + var listenerObsAddrs + + tcp.createListener(mh, (conn) => { + expect(conn).to.exist + dialerObsAddrs = conn.getObservedAddrs() + conn.end() + }, () => { + const conn = tcp.dial(mh) + conn.on('end', () => { + listenerObsAddrs = conn.getObservedAddrs() + conn.end() + + tcp.close(() => { + expect(listenerObsAddrs[0]).to.deep.equal(mh) + expect(dialerObsAddrs.length).to.equal(1) + done() + }) + }) + }) + }) + it.skip('listen on IPv6', (done) => {}) })