@@ -365,6 +365,11 @@ proc supports*(peer: Peer, Protocol: type): bool =
365365 # # Checks whether a Peer supports a particular protocol
366366 peer.supports (Protocol .protocolInfo)
367367
368+ proc supports * (peer: Peer , protos: openArray [ProtocolInfo ]): bool =
369+ for proto in protos:
370+ if peer.supports (proto):
371+ return true
372+
368373template perPeerMsgId (peer: Peer , MsgType: type ): uint64 =
369374 perPeerMsgIdImpl (peer, MsgType .msgProtocol.protocolInfo, MsgType .msgId)
370375
@@ -981,7 +986,7 @@ proc removePeer(network: EthereumNode, peer: Peer) =
981986 if not peer.dispatcher.isNil:
982987 for observer in network.peerPool.observers.values:
983988 if not observer.onPeerDisconnected.isNil:
984- if observer.protocol.isNil or peer.supports (observer.protocol ):
989+ if observer.protocols.len == 0 or peer.supports (observer.protocols ):
985990 observer.onPeerDisconnected (peer)
986991
987992proc callDisconnectHandlers (
@@ -1557,6 +1562,26 @@ template rlpxWithFutureHandler*(PROTO: distinct type;
15571562 resolveResponseFuture (peer,
15581563 perPeerMsgId, addr (packet), reqId)
15591564
1565+ template rlpxWithFutureHandler * (PROTO: distinct type ;
1566+ MSGTYPE: distinct type ;
1567+ PROTYPE: distinct type ;
1568+ msgId: static [uint64 ];
1569+ peer: Peer ;
1570+ data: Rlp ,
1571+ fields: untyped ): untyped =
1572+ wrapRlpxWithPacketException (MSGTYPE , peer):
1573+ var
1574+ rlp = data
1575+ packet: MSGTYPE
1576+
1577+ tryEnterList (rlp)
1578+ let
1579+ reqId = read (rlp, uint64 )
1580+ perPeerMsgId = msgIdImpl (PROTO , peer, msgId)
1581+ checkedRlpFields (peer, rlp, packet, fields)
1582+ var proType = packet.to (PROTYPE )
1583+ resolveResponseFuture (peer,
1584+ perPeerMsgId, addr (proType), reqId)
15601585
15611586proc nextMsg * (PROTO: distinct type ,
15621587 peer: Peer ,
@@ -1595,6 +1620,9 @@ func initResponder*(peer: Peer, reqId: uint64): Responder =
15951620template state * (response: Responder , PROTO: type ): auto =
15961621 state (response.peer, PROTO )
15971622
1623+ template supports * (response: Responder , Protocol: type ): bool =
1624+ response.peer.supports (Protocol .protocolInfo)
1625+
15981626template networkState * (response: Responder , PROTO: type ): auto =
15991627 networkState (response.peer, PROTO )
16001628
@@ -1618,6 +1646,9 @@ template defineProtocol*(PROTO: untyped,
16181646 template NetworkState * (_: type PROTO ): type =
16191647 networkState
16201648
1649+ template protocolVersion * (_: type PROTO ): int =
1650+ version
1651+
16211652 func initProtocol * (_: type PROTO ): auto =
16221653 initProtocol (rlpxName,
16231654 version,
0 commit comments