2015-07-15 21:19:46 -07:00
|
|
|
/*
|
|
|
|
* Identify is one of the protocols swarms speaks in order to broadcast and learn
|
|
|
|
* about the ip:port pairs a specific peer is available through
|
|
|
|
*/
|
|
|
|
|
|
|
|
var Interactive = require('multistream-select').Interactive
|
|
|
|
var EventEmmiter = require('events').EventEmitter
|
|
|
|
var util = require('util')
|
|
|
|
var protobufs = require('protocol-buffers-stream')
|
|
|
|
var fs = require('fs')
|
|
|
|
var schema = fs.readFileSync(__dirname + '/identify.proto')
|
2015-07-17 12:05:02 -07:00
|
|
|
var v6 = require('ip-address').v6
|
|
|
|
var Id = require('ipfs-peer-id')
|
|
|
|
var multiaddr = require('multiaddr')
|
2015-07-15 21:19:46 -07:00
|
|
|
|
|
|
|
exports = module.exports = Identify
|
|
|
|
|
|
|
|
util.inherits(Identify, EventEmmiter)
|
|
|
|
|
|
|
|
function Identify (swarm, peerSelf) {
|
|
|
|
var self = this
|
|
|
|
self.createProtoStream = protobufs(schema)
|
|
|
|
|
|
|
|
swarm.registerHandler('/ipfs/identify/1.0.0', function (stream) {
|
|
|
|
var ps = self.createProtoStream()
|
|
|
|
|
|
|
|
ps.on('identify', function (msg) {
|
2015-07-17 12:05:02 -07:00
|
|
|
// console.log('RECEIVED PROTOBUF - ', msg)
|
|
|
|
updateSelf(peerSelf, msg.observedAddr)
|
2015-07-15 21:19:46 -07:00
|
|
|
|
2015-07-17 12:05:02 -07:00
|
|
|
var peerId = Id.createFromPubKey(msg.publicKey)
|
2015-07-15 21:19:46 -07:00
|
|
|
|
2015-07-17 12:05:02 -07:00
|
|
|
var socket = swarm.connections[peerId.toB58String()].socket
|
|
|
|
var mh = getMultiaddr(socket)
|
|
|
|
ps.identify({
|
|
|
|
protocolVersion: 'na',
|
|
|
|
agentVersion: 'na',
|
|
|
|
publicKey: peerSelf.id.pubKey,
|
|
|
|
listenAddrs: peerSelf.multiaddrs.map(function (mh) {return mh.buffer}),
|
|
|
|
observedAddr: mh.buffer
|
|
|
|
})
|
|
|
|
|
|
|
|
self.emit('peer-update', {
|
|
|
|
peerId: peerId,
|
|
|
|
listenAddrs: msg.listenAddrs.map(function (mhb) {return multiaddr(mhb)})
|
|
|
|
})
|
2015-07-15 21:19:46 -07:00
|
|
|
|
2015-07-17 12:05:02 -07:00
|
|
|
ps.finalize()
|
|
|
|
})
|
|
|
|
ps.pipe(stream).pipe(ps)
|
2015-07-15 21:19:46 -07:00
|
|
|
})
|
|
|
|
|
2015-07-17 12:05:02 -07:00
|
|
|
swarm.on('connection-unknown', function (conn, socket) {
|
2015-07-15 21:19:46 -07:00
|
|
|
conn.dialStream(function (err, stream) {
|
|
|
|
if (err) { return console.log(err) }
|
|
|
|
var msi = new Interactive()
|
|
|
|
msi.handle(stream, function () {
|
|
|
|
msi.select('/ipfs/identify/1.0.0', function (err, ds) {
|
|
|
|
if (err) { return console.log(err) }
|
|
|
|
|
|
|
|
var ps = self.createProtoStream()
|
|
|
|
|
|
|
|
ps.on('identify', function (msg) {
|
2015-07-17 12:05:02 -07:00
|
|
|
// console.log('RECEIVED PROTOBUF - SIDE ZZ ', msg)
|
|
|
|
var peerId = Id.createFromPubKey(msg.publicKey)
|
|
|
|
|
|
|
|
updateSelf(peerSelf, msg.observedAddr)
|
|
|
|
|
|
|
|
swarm.connections[peerId.toB58String()] = {
|
|
|
|
conn: conn,
|
|
|
|
socket: socket
|
|
|
|
}
|
|
|
|
|
|
|
|
self.emit('peer-update', {
|
|
|
|
peerId: peerId,
|
|
|
|
listenAddrs: msg.listenAddrs.map(function (mhb) {return multiaddr(mhb)})
|
|
|
|
})
|
2015-07-15 21:19:46 -07:00
|
|
|
})
|
|
|
|
|
2015-07-17 12:05:02 -07:00
|
|
|
var mh = getMultiaddr(socket)
|
|
|
|
|
2015-07-15 21:19:46 -07:00
|
|
|
ps.identify({
|
|
|
|
protocolVersion: 'na',
|
|
|
|
agentVersion: 'na',
|
|
|
|
publicKey: peerSelf.id.pubKey,
|
2015-07-17 12:05:02 -07:00
|
|
|
listenAddrs: peerSelf.multiaddrs.map(function (mh) {return mh.buffer}),
|
|
|
|
observedAddr: mh.buffer
|
2015-07-15 21:19:46 -07:00
|
|
|
})
|
|
|
|
|
|
|
|
ps.pipe(ds).pipe(ps)
|
2015-07-17 12:05:02 -07:00
|
|
|
ps.finalize()
|
2015-07-15 21:19:46 -07:00
|
|
|
})
|
|
|
|
})
|
|
|
|
})
|
|
|
|
})
|
|
|
|
}
|
2015-07-17 12:05:02 -07:00
|
|
|
|
|
|
|
function getMultiaddr (socket) {
|
|
|
|
var mh
|
|
|
|
if (~socket.remoteAddress.indexOf(':')) {
|
|
|
|
var addr = new v6.Address(socket.remoteAddress)
|
|
|
|
if (addr.v4) {
|
|
|
|
var ip4 = socket.remoteAddress.split(':')[3]
|
|
|
|
mh = multiaddr('/ip4/' + ip4 + '/tcp/' + socket.remotePort)
|
|
|
|
} else {
|
|
|
|
mh = multiaddr('/ip6/' + socket.remoteAddress + '/tcp/' + socket.remotePort)
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
mh = multiaddr('/ip4/' + socket.remoteAddress + '/tcp/' + socket.remotePort)
|
|
|
|
}
|
|
|
|
return mh
|
|
|
|
}
|
|
|
|
|
|
|
|
function updateSelf (peerSelf, observedAddr) {
|
|
|
|
var omh = multiaddr(observedAddr)
|
|
|
|
var isIn = false
|
|
|
|
peerSelf.multiaddrs.forEach(function (mh) {
|
|
|
|
if (mh.toString() === omh.toString()) {
|
|
|
|
isIn = true
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
if (!isIn) {
|
|
|
|
peerSelf.multiaddrs.push(omh)
|
|
|
|
}
|
|
|
|
}
|