Skip to content

Commit

Permalink
feat: custom and store self agent version + store self protocol versi…
Browse files Browse the repository at this point in the history
…on (#800)

* feat: custom and store self protocol and agent version

* fix: do not enable custom protocolVersion
  • Loading branch information
vasco-santos authored Nov 20, 2020
1 parent 824a444 commit d0a9fad
Show file tree
Hide file tree
Showing 4 changed files with 85 additions and 12 deletions.
1 change: 1 addition & 0 deletions doc/API.md
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ Creates an instance of Libp2p.
| options.modules | [`Array<object>`](./CONFIGURATION.md#modules) | libp2p [modules](./CONFIGURATION.md#modules) to use |
| [options.addresses] | `{ listen: Array<string>, announce: Array<string>, noAnnounce: Array<string> }` | Addresses for transport listening and to advertise to the network |
| [options.config] | `object` | libp2p modules configuration and core configuration |
| [options.host] | `{ agentVersion: string }` | libp2p host options |
| [options.connectionManager] | [`object`](./CONFIGURATION.md#configuring-connection-manager) | libp2p Connection Manager [configuration](./CONFIGURATION.md#configuring-connection-manager) |
| [options.transportManager] | [`object`](./CONFIGURATION.md#configuring-transport-manager) | libp2p transport manager [configuration](./CONFIGURATION.md#configuring-transport-manager) |
| [options.datastore] | `object` | must implement [ipfs/interface-datastore](https://github.com/ipfs/interface-datastore) (in memory datastore will be used if not provided) |
Expand Down
4 changes: 4 additions & 0 deletions src/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ const mergeOptions = require('merge-options')
const { dnsaddrResolver } = require('multiaddr/src/resolvers')

const Constants = require('./constants')
const { AGENT_VERSION } = require('./identify/consts')

const { FaultTolerance } = require('./transport-manager')

Expand All @@ -27,6 +28,9 @@ const DefaultConfig = {
dnsaddr: dnsaddrResolver
}
},
host: {
agentVersion: AGENT_VERSION
},
metrics: {
enabled: false
},
Expand Down
14 changes: 12 additions & 2 deletions src/identify/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,16 @@ class IdentifyService {
this._protocols = protocols

this.handleMessage = this.handleMessage.bind(this)

// Store self host metadata
this._host = {
agentVersion: AGENT_VERSION,
protocolVersion: PROTOCOL_VERSION,
...libp2p._options.host
}

this.peerStore.metadataBook.set(this.peerId, 'AgentVersion', uint8ArrayFromString(this._host.agentVersion))
this.peerStore.metadataBook.set(this.peerId, 'ProtocolVersion', uint8ArrayFromString(this._host.protocolVersion))
}

/**
Expand Down Expand Up @@ -246,8 +256,8 @@ class IdentifyService {
const signedPeerRecord = await this._getSelfPeerRecord()

const message = Message.encode({
protocolVersion: PROTOCOL_VERSION,
agentVersion: AGENT_VERSION,
protocolVersion: this._host.protocolVersion,
agentVersion: this._host.agentVersion,
publicKey,
listenAddrs: this._libp2p.multiaddrs.map((ma) => ma.bytes),
signedPeerRecord,
Expand Down
78 changes: 68 additions & 10 deletions test/identify/index.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,8 @@ describe('Identify', () => {
peerId: localPeer,
connectionManager: new EventEmitter(),
peerStore: new PeerStore({ peerId: localPeer }),
multiaddrs: listenMaddrs
multiaddrs: listenMaddrs,
_options: { host: {} }
},
protocols
})
Expand All @@ -63,7 +64,8 @@ describe('Identify', () => {
peerId: remotePeer,
connectionManager: new EventEmitter(),
peerStore: new PeerStore({ peerId: remotePeer }),
multiaddrs: listenMaddrs
multiaddrs: listenMaddrs,
_options: { host: {} }
},
protocols
})
Expand Down Expand Up @@ -106,7 +108,8 @@ describe('Identify', () => {
peerId: localPeer,
connectionManager: new EventEmitter(),
peerStore: new PeerStore({ peerId: localPeer }),
multiaddrs: listenMaddrs
multiaddrs: listenMaddrs,
_options: { host: {} }
},
protocols
})
Expand All @@ -116,7 +119,8 @@ describe('Identify', () => {
peerId: remotePeer,
connectionManager: new EventEmitter(),
peerStore: new PeerStore({ peerId: remotePeer }),
multiaddrs: listenMaddrs
multiaddrs: listenMaddrs,
_options: { host: {} }
},
protocols
})
Expand Down Expand Up @@ -165,7 +169,8 @@ describe('Identify', () => {
peerId: localPeer,
connectionManager: new EventEmitter(),
peerStore: new PeerStore({ peerId: localPeer }),
multiaddrs: []
multiaddrs: [],
_options: { host: {} }
},
protocols
})
Expand All @@ -174,7 +179,8 @@ describe('Identify', () => {
peerId: remotePeer,
connectionManager: new EventEmitter(),
peerStore: new PeerStore({ peerId: remotePeer }),
multiaddrs: []
multiaddrs: [],
_options: { host: {} }
},
protocols
})
Expand All @@ -201,6 +207,36 @@ describe('Identify', () => {
.and.to.have.property('code', Errors.ERR_INVALID_PEER)
})

it('should store host data and protocol version into metadataBook', () => {
const agentVersion = 'js-project/1.0.0'
const peerStore = new PeerStore({ peerId: localPeer })

sinon.spy(peerStore.metadataBook, 'set')

new IdentifyService({ // eslint-disable-line no-new
libp2p: {
peerId: localPeer,
connectionManager: new EventEmitter(),
peerStore,
multiaddrs: listenMaddrs,
_options: {
host: {
agentVersion
}
}
},
protocols
})

expect(peerStore.metadataBook.set.callCount).to.eql(2)

const storedAgentVersion = peerStore.metadataBook.getValue(localPeer, 'AgentVersion')
const storedProtocolVersion = peerStore.metadataBook.getValue(localPeer, 'ProtocolVersion')

expect(agentVersion).to.eql(unit8ArrayToString(storedAgentVersion))
expect(storedProtocolVersion).to.exist()
})

describe('push', () => {
it('should be able to push identify updates to another peer', async () => {
const connectionManager = new EventEmitter()
Expand All @@ -211,7 +247,8 @@ describe('Identify', () => {
peerId: localPeer,
connectionManager: new EventEmitter(),
peerStore: new PeerStore({ peerId: localPeer }),
multiaddrs: listenMaddrs
multiaddrs: listenMaddrs,
_options: { host: {} }
},
protocols: new Map([
[multicodecs.IDENTIFY],
Expand All @@ -224,7 +261,8 @@ describe('Identify', () => {
peerId: remotePeer,
connectionManager,
peerStore: new PeerStore({ peerId: remotePeer }),
multiaddrs: []
multiaddrs: [],
_options: { host: {} }
}
})

Expand Down Expand Up @@ -272,7 +310,8 @@ describe('Identify', () => {
peerId: localPeer,
connectionManager: new EventEmitter(),
peerStore: new PeerStore({ peerId: localPeer }),
multiaddrs: listenMaddrs
multiaddrs: listenMaddrs,
_options: { host: {} }
},
protocols: new Map([
[multicodecs.IDENTIFY],
Expand All @@ -285,7 +324,8 @@ describe('Identify', () => {
peerId: remotePeer,
connectionManager,
peerStore: new PeerStore({ peerId: remotePeer }),
multiaddrs: []
multiaddrs: [],
_options: { host: {} }
}
})

Expand Down Expand Up @@ -404,5 +444,23 @@ describe('Identify', () => {
// Verify the streams close
await pWaitFor(() => connection.streams.length === 0)
})

it('should store host data and protocol version into metadataBook', () => {
const agentVersion = 'js-project/1.0.0'

libp2p = new Libp2p({
...baseOptions,
peerId,
host: {
agentVersion
}
})

const storedAgentVersion = libp2p.peerStore.metadataBook.getValue(localPeer, 'AgentVersion')
const storedProtocolVersion = libp2p.peerStore.metadataBook.getValue(localPeer, 'ProtocolVersion')

expect(agentVersion).to.eql(unit8ArrayToString(storedAgentVersion))
expect(storedProtocolVersion).to.exist()
})
})
})

0 comments on commit d0a9fad

Please sign in to comment.