mirror of
https://github.com/logos-storage/nim-libp2p.git
synced 2026-01-05 15:13:08 +00:00
* master merge * wip * avoid deadlocks * tcp limits * expose client field in chronosstream * limit incoming connections * update with new listen api * fix release * don't override peerinfo in connection * rework transport with accept * use semaphore to track resource ussage * rework with new transport accept api * move events to conn manager (#373) * use semaphore to track resource ussage * merge master * expose api to acquire conn slots * don't fail expensive metrics * allow tracking and updating connections * set global connection limits to 80 * add per peer connection limits * make sure conn is closed if tracking failed * more descriptive naming for handle * rework with new transport accept api * add `getStream` hide `selectConn` * add TransportClosedError * make nil explicit * don't make unnecessary copies of message * logging * error handling * cleanup semaphore * track connections properly * throw `TooManyConnections` when tracking outgoing * use proper exception and handle conventions * check onCloseHandle for nil * revert internalConnect changes * adding upgraded flag * await stream before closing * simplify tracking * wip * logging * split connection limits into incoming and outgoing * further streamline connection limits split counts * don't use closeWithEOF * move peer and conn event triggers from switch * wip * wip * wip * merge master * handle nil connections properly * add clarifying comment * don't raise exc on nil * no finally * add proper min/max connections logic * rebase master * merge master * master merge * remove request timeout should be addressed in separate PR * merge master * share semaphore when in/out limits arent enforced * merge master * use import * pass semaphore to trackConn * don't close last conn * use storeConn * merge master * use storeConn
73 lines
2.3 KiB
Nim
73 lines
2.3 KiB
Nim
import
|
|
options, tables, chronos, bearssl,
|
|
switch, peerid, peerinfo, stream/connection, multiaddress,
|
|
crypto/crypto, transports/[transport, tcptransport],
|
|
muxers/[muxer, mplex/mplex],
|
|
protocols/[identify, secure/secure]
|
|
|
|
import
|
|
protocols/secure/noise,
|
|
protocols/secure/secio
|
|
|
|
export
|
|
switch, peerid, peerinfo, connection, multiaddress, crypto
|
|
|
|
type
|
|
SecureProtocol* {.pure.} = enum
|
|
Noise,
|
|
Secio
|
|
|
|
proc newStandardSwitch*(privKey = none(PrivateKey),
|
|
address = MultiAddress.init("/ip4/127.0.0.1/tcp/0").tryGet(),
|
|
secureManagers: openarray[SecureProtocol] = [
|
|
# array cos order matters
|
|
SecureProtocol.Secio,
|
|
SecureProtocol.Noise,
|
|
],
|
|
transportFlags: set[ServerFlags] = {},
|
|
rng = newRng(),
|
|
inTimeout: Duration = 5.minutes,
|
|
outTimeout: Duration = 5.minutes,
|
|
maxConnections = MaxConnections,
|
|
maxIn = -1,
|
|
maxOut = -1,
|
|
maxConnsPerPeer = MaxConnectionsPerPeer): Switch =
|
|
proc createMplex(conn: Connection): Muxer =
|
|
Mplex.init(
|
|
conn,
|
|
inTimeout = inTimeout,
|
|
outTimeout = outTimeout)
|
|
|
|
if rng == nil: # newRng could fail
|
|
raise (ref CatchableError)(msg: "Cannot initialize RNG")
|
|
|
|
let
|
|
seckey = privKey.get(otherwise = PrivateKey.random(rng[]).tryGet())
|
|
peerInfo = PeerInfo.init(seckey, [address])
|
|
mplexProvider = newMuxerProvider(createMplex, MplexCodec)
|
|
transports = @[Transport(TcpTransport.init(transportFlags))]
|
|
muxers = {MplexCodec: mplexProvider}.toTable
|
|
identify = newIdentify(peerInfo)
|
|
|
|
var
|
|
secureManagerInstances: seq[Secure]
|
|
for sec in secureManagers:
|
|
case sec
|
|
of SecureProtocol.Noise:
|
|
secureManagerInstances &= newNoise(rng, seckey).Secure
|
|
of SecureProtocol.Secio:
|
|
secureManagerInstances &= newSecio(rng, seckey).Secure
|
|
|
|
let switch = newSwitch(
|
|
peerInfo,
|
|
transports,
|
|
identify,
|
|
muxers,
|
|
secureManagers = secureManagerInstances,
|
|
maxConnections = maxConnections,
|
|
maxIn = maxIn,
|
|
maxOut = maxOut,
|
|
maxConnsPerPeer = maxConnsPerPeer)
|
|
|
|
return switch
|