feat: connection gater (#1142)

Port of https://github.com/libp2p/go-libp2p-core/blob/master/connmgr/gater.go

Adds a new configuration key `connectionGater` which allows denying the dialing of certain peers, individual multiaddrs and the creation of connections at certain points in the connection flow.

Fixes: https://github.com/libp2p/js-libp2p/issues/175
Refs: https://github.com/libp2p/js-libp2p/issues/744
Refs: https://github.com/libp2p/js-libp2p/issues/769

Co-authored-by: mzdws <8580712+mzdws@user.noreply.gitee.com>
This commit is contained in:
Alex Potsides
2022-01-25 16:27:01 +00:00
committed by GitHub
parent 9b22c6e2f9
commit ff32eba6a0
21 changed files with 770 additions and 98 deletions

View File

@ -18,7 +18,7 @@ const swarmKeyBuffer = uint8ArrayFromString(require('../fixtures/swarm.key'))
const Libp2p = require('../../src')
const Upgrader = require('../../src/upgrader')
const { codes } = require('../../src/errors')
const { mockConnectionGater } = require('../utils/mock-connection-gater')
const mockMultiaddrConnPair = require('../utils/mockMultiaddrConn')
const Peers = require('../fixtures/peers')
const addrs = [
@ -31,6 +31,17 @@ describe('Upgrader', () => {
let remoteUpgrader
let localPeer
let remotePeer
const connectionGater = mockConnectionGater()
const mockConnectionManager = {
gater: {
allowDialPeer: async () => true,
allowDialMultiaddr: async () => true,
acceptConnection: async () => true,
acceptEncryptedConnection: async () => true,
acceptUpgradedConnection: async () => true
}
}
before(async () => {
([
@ -42,10 +53,14 @@ describe('Upgrader', () => {
]))
localUpgrader = new Upgrader({
localPeer
connectionManager: mockConnectionManager,
localPeer,
connectionGater
})
remoteUpgrader = new Upgrader({
localPeer: remotePeer
connectionManager: mockConnectionManager,
localPeer: remotePeer,
connectionGater
})
localUpgrader.protocols.set('/echo/1.0.0', ({ stream }) => pipe(stream, stream))
@ -321,6 +336,7 @@ describe('Upgrader', () => {
describe('libp2p.upgrader', () => {
let peers
let libp2p
const connectionGater = mockConnectionGater()
before(async () => {
peers = await Promise.all([
@ -392,8 +408,10 @@ describe('libp2p.upgrader', () => {
const remoteUpgrader = new Upgrader({
localPeer: remotePeer,
connectionManager: libp2p.connectionManager,
muxers: new Map([[Muxer.multicodec, Muxer]]),
cryptos: new Map([[Crypto.protocol, Crypto]])
cryptos: new Map([[Crypto.protocol, Crypto]]),
connectionGater
})
remoteUpgrader.protocols.set('/echo/1.0.0', echoHandler)
@ -424,8 +442,10 @@ describe('libp2p.upgrader', () => {
const remoteUpgrader = new Upgrader({
localPeer: remotePeer,
connectionManager: libp2p.connectionManager,
muxers: new Map([[Muxer.multicodec, Muxer]]),
cryptos: new Map([[Crypto.protocol, Crypto]])
cryptos: new Map([[Crypto.protocol, Crypto]]),
connectionGater
})
const { inbound, outbound } = mockMultiaddrConnPair({ addrs, remotePeer })