mirror of
https://github.com/fluencelabs/js-libp2p
synced 2025-05-07 16:32:15 +00:00
chore: address review
This commit is contained in:
parent
8a97dded26
commit
1d318e12d8
@ -8,5 +8,5 @@ module.exports.MULTICODEC_IDENTIFY = '/p2p/id/1.1.0'
|
|||||||
module.exports.MULTICODEC_IDENTIFY_PUSH = '/p2p/id/push/1.1.0'
|
module.exports.MULTICODEC_IDENTIFY_PUSH = '/p2p/id/push/1.1.0'
|
||||||
|
|
||||||
// Legacy
|
// Legacy
|
||||||
module.exports.MULTICODEC_IDENTIFY_LEGACY = '/ipfs/id/1.0.0'
|
module.exports.MULTICODEC_IDENTIFY_1_0_0 = '/ipfs/id/1.0.0'
|
||||||
module.exports.MULTICODEC_IDENTIFY_PUSH_LEGACY = '/ipfs/id/push/1.0.0'
|
module.exports.MULTICODEC_IDENTIFY_PUSH_1_0_0 = '/ipfs/id/push/1.0.0'
|
||||||
|
@ -22,9 +22,9 @@ const PeerRecord = require('../record/peer-record')
|
|||||||
|
|
||||||
const {
|
const {
|
||||||
MULTICODEC_IDENTIFY,
|
MULTICODEC_IDENTIFY,
|
||||||
MULTICODEC_IDENTIFY_LEGACY,
|
MULTICODEC_IDENTIFY_1_0_0,
|
||||||
MULTICODEC_IDENTIFY_PUSH,
|
MULTICODEC_IDENTIFY_PUSH,
|
||||||
MULTICODEC_IDENTIFY_PUSH_LEGACY,
|
MULTICODEC_IDENTIFY_PUSH_1_0_0,
|
||||||
AGENT_VERSION,
|
AGENT_VERSION,
|
||||||
PROTOCOL_VERSION
|
PROTOCOL_VERSION
|
||||||
} = require('./consts')
|
} = require('./consts')
|
||||||
@ -97,26 +97,12 @@ class IdentifyService {
|
|||||||
push (connections) {
|
push (connections) {
|
||||||
const pushes = connections.map(async connection => {
|
const pushes = connections.map(async connection => {
|
||||||
try {
|
try {
|
||||||
const { protocol, stream } = await connection.newStream([MULTICODEC_IDENTIFY_PUSH, MULTICODEC_IDENTIFY_PUSH_LEGACY])
|
const { stream } = await connection.newStream([MULTICODEC_IDENTIFY_PUSH, MULTICODEC_IDENTIFY_PUSH_1_0_0])
|
||||||
|
const signedPeerRecord = await this._getSelfPeerRecord()
|
||||||
// Handle Legacy
|
|
||||||
if (protocol === MULTICODEC_IDENTIFY_PUSH_LEGACY) {
|
|
||||||
return pipe(
|
|
||||||
[{
|
|
||||||
listenAddrs: this._libp2p.multiaddrs.map((ma) => ma.buffer),
|
|
||||||
protocols: Array.from(this._protocols.keys())
|
|
||||||
}],
|
|
||||||
pb.encode(Message),
|
|
||||||
stream,
|
|
||||||
consume
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
const envelope = await this._getSelfPeerRecord()
|
|
||||||
const signedPeerRecord = envelope.marshal()
|
|
||||||
|
|
||||||
await pipe(
|
await pipe(
|
||||||
[{
|
[{
|
||||||
|
listenAddrs: this._libp2p.multiaddrs.map((ma) => ma.buffer),
|
||||||
signedPeerRecord,
|
signedPeerRecord,
|
||||||
protocols: Array.from(this._protocols.keys())
|
protocols: Array.from(this._protocols.keys())
|
||||||
}],
|
}],
|
||||||
@ -159,7 +145,7 @@ class IdentifyService {
|
|||||||
* @returns {Promise<void>}
|
* @returns {Promise<void>}
|
||||||
*/
|
*/
|
||||||
async identify (connection) {
|
async identify (connection) {
|
||||||
const { protocol, stream } = await connection.newStream([MULTICODEC_IDENTIFY, MULTICODEC_IDENTIFY_LEGACY])
|
const { protocol, stream } = await connection.newStream([MULTICODEC_IDENTIFY, MULTICODEC_IDENTIFY_1_0_0])
|
||||||
const [data] = await pipe(
|
const [data] = await pipe(
|
||||||
[],
|
[],
|
||||||
stream,
|
stream,
|
||||||
@ -198,7 +184,7 @@ class IdentifyService {
|
|||||||
observedAddr = IdentifyService.getCleanMultiaddr(observedAddr)
|
observedAddr = IdentifyService.getCleanMultiaddr(observedAddr)
|
||||||
|
|
||||||
// LEGACY: differentiate message with SignedPeerRecord
|
// LEGACY: differentiate message with SignedPeerRecord
|
||||||
if (protocol === MULTICODEC_IDENTIFY_LEGACY) {
|
if (protocol === MULTICODEC_IDENTIFY_1_0_0) {
|
||||||
// Update peers data in PeerStore
|
// Update peers data in PeerStore
|
||||||
this.peerStore.addressBook.set(id, listenAddrs.map((addr) => multiaddr(addr)))
|
this.peerStore.addressBook.set(id, listenAddrs.map((addr) => multiaddr(addr)))
|
||||||
this.peerStore.protoBook.set(id, protocols)
|
this.peerStore.protoBook.set(id, protocols)
|
||||||
@ -250,13 +236,11 @@ class IdentifyService {
|
|||||||
handleMessage ({ connection, stream, protocol }) {
|
handleMessage ({ connection, stream, protocol }) {
|
||||||
switch (protocol) {
|
switch (protocol) {
|
||||||
case MULTICODEC_IDENTIFY:
|
case MULTICODEC_IDENTIFY:
|
||||||
|
case MULTICODEC_IDENTIFY_1_0_0:
|
||||||
return this._handleIdentify({ connection, stream })
|
return this._handleIdentify({ connection, stream })
|
||||||
case MULTICODEC_IDENTIFY_LEGACY:
|
|
||||||
return this._handleIdentifyLegacy({ connection, stream })
|
|
||||||
case MULTICODEC_IDENTIFY_PUSH:
|
case MULTICODEC_IDENTIFY_PUSH:
|
||||||
|
case MULTICODEC_IDENTIFY_PUSH_1_0_0:
|
||||||
return this._handlePush({ connection, stream })
|
return this._handlePush({ connection, stream })
|
||||||
case MULTICODEC_IDENTIFY_PUSH_LEGACY:
|
|
||||||
return this._handlePushLegacy({ connection, stream })
|
|
||||||
default:
|
default:
|
||||||
log.error('cannot handle unknown protocol %s', protocol)
|
log.error('cannot handle unknown protocol %s', protocol)
|
||||||
}
|
}
|
||||||
@ -276,45 +260,14 @@ class IdentifyService {
|
|||||||
publicKey = this.peerId.pubKey.bytes
|
publicKey = this.peerId.pubKey.bytes
|
||||||
}
|
}
|
||||||
|
|
||||||
const envelope = await this._getSelfPeerRecord()
|
const signedPeerRecord = await this._getSelfPeerRecord()
|
||||||
const signedPeerRecord = envelope.marshal()
|
|
||||||
|
|
||||||
const message = Message.encode({
|
|
||||||
protocolVersion: PROTOCOL_VERSION,
|
|
||||||
agentVersion: AGENT_VERSION,
|
|
||||||
publicKey,
|
|
||||||
signedPeerRecord,
|
|
||||||
observedAddr: connection.remoteAddr.buffer,
|
|
||||||
protocols: Array.from(this._protocols.keys())
|
|
||||||
})
|
|
||||||
|
|
||||||
pipe(
|
|
||||||
[message],
|
|
||||||
lp.encode(),
|
|
||||||
stream,
|
|
||||||
consume
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sends the `Identify` response with listen addresses (LEGACY)
|
|
||||||
* to the requesting peer over the given `connection`
|
|
||||||
* @private
|
|
||||||
* @param {object} options
|
|
||||||
* @param {*} options.stream
|
|
||||||
* @param {Connection} options.connection
|
|
||||||
*/
|
|
||||||
_handleIdentifyLegacy ({ connection, stream }) {
|
|
||||||
let publicKey = Buffer.alloc(0)
|
|
||||||
if (this.peerId.pubKey) {
|
|
||||||
publicKey = this.peerId.pubKey.bytes
|
|
||||||
}
|
|
||||||
|
|
||||||
const message = Message.encode({
|
const message = Message.encode({
|
||||||
protocolVersion: PROTOCOL_VERSION,
|
protocolVersion: PROTOCOL_VERSION,
|
||||||
agentVersion: AGENT_VERSION,
|
agentVersion: AGENT_VERSION,
|
||||||
publicKey,
|
publicKey,
|
||||||
listenAddrs: this._libp2p.multiaddrs.map((ma) => ma.buffer),
|
listenAddrs: this._libp2p.multiaddrs.map((ma) => ma.buffer),
|
||||||
|
signedPeerRecord,
|
||||||
observedAddr: connection.remoteAddr.buffer,
|
observedAddr: connection.remoteAddr.buffer,
|
||||||
protocols: Array.from(this._protocols.keys())
|
protocols: Array.from(this._protocols.keys())
|
||||||
})
|
})
|
||||||
@ -354,6 +307,22 @@ class IdentifyService {
|
|||||||
return log.error('received invalid message', err)
|
return log.error('received invalid message', err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const id = connection.remotePeer
|
||||||
|
|
||||||
|
// Legacy
|
||||||
|
if (!message.signedPeerRecord) {
|
||||||
|
try {
|
||||||
|
this.peerStore.addressBook.set(id, message.listenAddrs.map((addr) => multiaddr(addr)))
|
||||||
|
} catch (err) {
|
||||||
|
return log.error('received invalid listen addrs', err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update the protocols
|
||||||
|
this.peerStore.protoBook.set(id, message.protocols)
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// Open envelope and verify if is authenticated
|
// Open envelope and verify if is authenticated
|
||||||
let envelope
|
let envelope
|
||||||
try {
|
try {
|
||||||
@ -373,7 +342,6 @@ class IdentifyService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Update peers data in PeerStore
|
// Update peers data in PeerStore
|
||||||
const id = connection.remotePeer
|
|
||||||
try {
|
try {
|
||||||
// TODO: Store as certified record
|
// TODO: Store as certified record
|
||||||
|
|
||||||
@ -387,45 +355,8 @@ class IdentifyService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reads the Identify Push message from the given `connection`
|
* Get self signed peer record raw envelope.
|
||||||
* with listen addresses (LEGACY)
|
* @return {Buffer}
|
||||||
* @private
|
|
||||||
* @param {object} options
|
|
||||||
* @param {*} options.stream
|
|
||||||
* @param {Connection} options.connection
|
|
||||||
*/
|
|
||||||
async _handlePushLegacy ({ connection, stream }) {
|
|
||||||
const [data] = await pipe(
|
|
||||||
[],
|
|
||||||
stream,
|
|
||||||
lp.decode(),
|
|
||||||
take(1),
|
|
||||||
toBuffer,
|
|
||||||
collect
|
|
||||||
)
|
|
||||||
|
|
||||||
let message
|
|
||||||
try {
|
|
||||||
message = Message.decode(data)
|
|
||||||
} catch (err) {
|
|
||||||
return log.error('received invalid message', err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update peers data in PeerStore
|
|
||||||
const id = connection.remotePeer
|
|
||||||
try {
|
|
||||||
this.peerStore.addressBook.set(id, message.listenAddrs.map((addr) => multiaddr(addr)))
|
|
||||||
} catch (err) {
|
|
||||||
return log.error('received invalid listen addrs', err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update the protocols
|
|
||||||
this.peerStore.protoBook.set(id, message.protocols)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get self signed peer record envelope.
|
|
||||||
* @return {Envelope}
|
|
||||||
*/
|
*/
|
||||||
async _getSelfPeerRecord () {
|
async _getSelfPeerRecord () {
|
||||||
// TODO: Verify if updated
|
// TODO: Verify if updated
|
||||||
@ -437,7 +368,9 @@ class IdentifyService {
|
|||||||
peerId: this.peerId,
|
peerId: this.peerId,
|
||||||
multiaddrs: this._libp2p.multiaddrs
|
multiaddrs: this._libp2p.multiaddrs
|
||||||
})
|
})
|
||||||
this._selfRecord = await Envelope.seal(peerRecord, this.peerId)
|
const envelope = await Envelope.seal(peerRecord, this.peerId)
|
||||||
|
|
||||||
|
this._selfRecord = envelope.marshal()
|
||||||
|
|
||||||
return this._selfRecord
|
return this._selfRecord
|
||||||
}
|
}
|
||||||
@ -450,8 +383,8 @@ module.exports.IdentifyService = IdentifyService
|
|||||||
*/
|
*/
|
||||||
module.exports.multicodecs = {
|
module.exports.multicodecs = {
|
||||||
IDENTIFY: MULTICODEC_IDENTIFY,
|
IDENTIFY: MULTICODEC_IDENTIFY,
|
||||||
IDENTIFY_LEGACY: MULTICODEC_IDENTIFY_LEGACY,
|
IDENTIFY_1_0_0: MULTICODEC_IDENTIFY_1_0_0,
|
||||||
IDENTIFY_PUSH: MULTICODEC_IDENTIFY_PUSH,
|
IDENTIFY_PUSH: MULTICODEC_IDENTIFY_PUSH,
|
||||||
IDENTIFY_PUSH_LEGACY: MULTICODEC_IDENTIFY_PUSH_LEGACY
|
IDENTIFY_PUSH_1_0_0: MULTICODEC_IDENTIFY_PUSH_1_0_0
|
||||||
}
|
}
|
||||||
module.exports.Message = Message
|
module.exports.Message = Message
|
||||||
|
@ -31,8 +31,8 @@ const protocols = new Map([
|
|||||||
])
|
])
|
||||||
|
|
||||||
const protocolsLegacy = new Map([
|
const protocolsLegacy = new Map([
|
||||||
[multicodecs.IDENTIFY_LEGACY, () => { }],
|
[multicodecs.IDENTIFY_1_0_0, () => { }],
|
||||||
[multicodecs.IDENTIFY_PUSH_LEGACY, () => { }]
|
[multicodecs.IDENTIFY_PUSH_1_0_0, () => { }]
|
||||||
])
|
])
|
||||||
|
|
||||||
describe('Identify', () => {
|
describe('Identify', () => {
|
||||||
@ -50,7 +50,7 @@ describe('Identify', () => {
|
|||||||
sinon.restore()
|
sinon.restore()
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should be able to identify another peer with legacy protocol', async () => {
|
it('should be able to identify another peer with 1.0.0 legacy protocol', async () => {
|
||||||
const localIdentify = new IdentifyService({
|
const localIdentify = new IdentifyService({
|
||||||
libp2p: {
|
libp2p: {
|
||||||
peerId: localPeer,
|
peerId: localPeer,
|
||||||
@ -82,7 +82,7 @@ describe('Identify', () => {
|
|||||||
const remoteConnectionMock = { remoteAddr: observedAddr }
|
const remoteConnectionMock = { remoteAddr: observedAddr }
|
||||||
|
|
||||||
const [local, remote] = duplexPair()
|
const [local, remote] = duplexPair()
|
||||||
sinon.stub(localConnectionMock, 'newStream').returns({ stream: local, protocol: multicodecs.IDENTIFY_LEGACY })
|
sinon.stub(localConnectionMock, 'newStream').returns({ stream: local, protocol: multicodecs.IDENTIFY_1_0_0 })
|
||||||
|
|
||||||
sinon.spy(localIdentify.peerStore.addressBook, 'set')
|
sinon.spy(localIdentify.peerStore.addressBook, 'set')
|
||||||
sinon.spy(localIdentify.peerStore.protoBook, 'set')
|
sinon.spy(localIdentify.peerStore.protoBook, 'set')
|
||||||
@ -93,7 +93,7 @@ describe('Identify', () => {
|
|||||||
remoteIdentify.handleMessage({
|
remoteIdentify.handleMessage({
|
||||||
connection: remoteConnectionMock,
|
connection: remoteConnectionMock,
|
||||||
stream: remote,
|
stream: remote,
|
||||||
protocol: multicodecs.IDENTIFY_LEGACY
|
protocol: multicodecs.IDENTIFY_1_0_0
|
||||||
})
|
})
|
||||||
])
|
])
|
||||||
|
|
||||||
@ -224,7 +224,7 @@ describe('Identify', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
describe('push', () => {
|
describe('push', () => {
|
||||||
it('should be able to push identify updates to another peer with legacy protocol', async () => {
|
it('should be able to push identify updates to another peer with 1.0.0 legacy protocols', async () => {
|
||||||
const connectionManager = new EventEmitter()
|
const connectionManager = new EventEmitter()
|
||||||
connectionManager.getConnection = () => {}
|
connectionManager.getConnection = () => {}
|
||||||
|
|
||||||
@ -235,8 +235,8 @@ describe('Identify', () => {
|
|||||||
multiaddrs: listenMaddrs
|
multiaddrs: listenMaddrs
|
||||||
},
|
},
|
||||||
protocols: new Map([
|
protocols: new Map([
|
||||||
[multicodecs.IDENTIFY_LEGACY],
|
[multicodecs.IDENTIFY_1_0_0],
|
||||||
[multicodecs.IDENTIFY_PUSH_LEGACY],
|
[multicodecs.IDENTIFY_PUSH_1_0_0],
|
||||||
['/echo/1.0.0']
|
['/echo/1.0.0']
|
||||||
])
|
])
|
||||||
})
|
})
|
||||||
@ -257,12 +257,12 @@ describe('Identify', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
// Setup peer protocols and multiaddrs
|
// Setup peer protocols and multiaddrs
|
||||||
const localProtocols = new Set([multicodecs.IDENTIFY_LEGACY, multicodecs.IDENTIFY_PUSH_LEGACY, '/echo/1.0.0'])
|
const localProtocols = new Set([multicodecs.IDENTIFY_1_0_0, multicodecs.IDENTIFY_PUSH_1_0_0, '/echo/1.0.0'])
|
||||||
const localConnectionMock = { newStream: () => {} }
|
const localConnectionMock = { newStream: () => {} }
|
||||||
const remoteConnectionMock = { remotePeer: localPeer }
|
const remoteConnectionMock = { remotePeer: localPeer }
|
||||||
|
|
||||||
const [local, remote] = duplexPair()
|
const [local, remote] = duplexPair()
|
||||||
sinon.stub(localConnectionMock, 'newStream').returns({ stream: local, protocol: multicodecs.IDENTIFY_PUSH_LEGACY })
|
sinon.stub(localConnectionMock, 'newStream').returns({ stream: local, protocol: multicodecs.IDENTIFY_PUSH_1_0_0 })
|
||||||
|
|
||||||
sinon.spy(remoteIdentify.peerStore.addressBook, 'set')
|
sinon.spy(remoteIdentify.peerStore.addressBook, 'set')
|
||||||
sinon.spy(remoteIdentify.peerStore.protoBook, 'set')
|
sinon.spy(remoteIdentify.peerStore.protoBook, 'set')
|
||||||
@ -273,7 +273,7 @@ describe('Identify', () => {
|
|||||||
remoteIdentify.handleMessage({
|
remoteIdentify.handleMessage({
|
||||||
connection: remoteConnectionMock,
|
connection: remoteConnectionMock,
|
||||||
stream: remote,
|
stream: remote,
|
||||||
protocol: multicodecs.IDENTIFY_PUSH_LEGACY
|
protocol: multicodecs.IDENTIFY_PUSH_1_0_0
|
||||||
})
|
})
|
||||||
])
|
])
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user