py-libp2p/peer/peerstore.py

88 lines
2.1 KiB
Python
Raw Normal View History

from .peerstore_interface import IPeerStore
import asyncio
class PeerStore(IPeerStore):
def __init__(self, context):
self.context = context
self.peerMap = {}
def peer_info(self, peerID):
if peerID in self.peerMap:
peer = self.peerMap[peerID]
return {
"peerID": peerID,
"addrs": peer.get_addrs()
}
else:
return None
def get_protocols(self, peerID):
if peerID in self.peerMap:
return self.peerMap[peerId].get_protocols(), None
else:
return None, peerID + " not found"
def add_protocols(self, peerID, protocols):
peer = __create_or_get_peer(peerID)
peer.add_protocols(protocols)
def peers(self):
return self.peerMap.keys()
def get(self, peerID, key):
if peerID in self.peerMap:
val, error = self.peerMap[peerID].get_metadata(key)
return val, error
else:
return None, peerID + " not found"
def put(self, peerID, key, val):
# <<?>>
# This can output an error, not sure what the possible errors are
peer = __create_or_get_peer(peerID)
self.peerMap[peerID].put_metadata(key, val)
def add_addr(self, peerID, addr, ttl):
self.add_addrs(self, peerID, [addr])
def add_addrs(self, peerID, addrs, ttl):
# Ignore ttl for now
peer = __create_or_get_peer(peerID)
peer.add_addrs(addrs)
def addrs(self, peerID):
if peerID in self.peerMap:
return self.peerMap[peerId].get_addrs(), None
else:
return None, peerID + " not found"
pass
def clear_addrs(self, peerID):
# Only clear addresses if the peer is in peer map
if peerID in self.peerMap:
self.peerMap[peerID].clear_addrs()
def peers_with_addrs(self):
# Add all peers with addrs at least 1 to output
output = []
for key in self.peerMap:
if len(self.peerMap[key].get_addrs()) >= 1:
output.append(key)
return output
def __create_or_get_peer(self, peerID):
"""
Returns the peer data for peerID or creates a new
peer data (and stores it in peerMap) if peer
data for peerID does not yet exist
:param peerID: peer ID
:return: peer data
"""
if peerId in self.peerMap:
return self.peerMap[peerId]
else:
data = PeerData(self.context)
self.peerMap[peerId] = data
return self.peerMap[peerId]