66import time
77import uuid
88
9- from collections import deque
10-
11- from .messages import envelope
129from .exceptions import ReceptorBufferError
10+ from .messages import envelope
1311from .stats import connected_peers_guage
1412
1513logger = logging .getLogger (__name__ )
1917
2018
2119class DataBuffer :
22- def __init__ (self , deserializer = json .loads ):
23- self .q = deque ( )
20+ def __init__ (self , loop = None , deserializer = json .loads ):
21+ self .q = asyncio . Queue ( loop = loop )
2422 self .data_buffer = b""
2523 self .deserializer = deserializer
2624
2725 def add (self , data ):
2826 self .data_buffer = self .data_buffer + data
2927 * ready , self .data_buffer = self .data_buffer .rsplit (DELIM )
30- self .q .extend (ready )
28+ for chunk in ready :
29+ self .q .put_nowait (chunk )
3130
32- def get (self ):
33- while self .q :
34- yield self .deserializer (self .q .popleft ())
31+ async def get (self ):
32+ return self .deserializer (await self .q .get ())
3533
3634
3735class BaseProtocol (asyncio .Protocol ):
@@ -74,8 +72,8 @@ def connection_made(self, transport):
7472 self .peername = transport .get_extra_info ('peername' )
7573 self .transport = transport
7674 self .greeted = False
77- self .incoming_buffer = DataBuffer ()
7875 connected_peers_guage .inc ()
76+ self .incoming_buffer = DataBuffer (loop = self .loop )
7977 self .loop .create_task (self .wait_greeting ())
8078
8179 def connection_lost (self , exc ):
@@ -91,18 +89,15 @@ async def wait_greeting(self):
9189 Initialized when the connection is established to handle the greeting
9290 before transitioning to message processing.
9391 '''
94- while not self .greeted :
95- logger .debug ('Looking for handshake...' )
96- for data in self .incoming_buffer .get ():
97- logger .debug (data )
98- if data ["cmd" ] == "HI" :
99- self .handle_handshake (data )
100- break
101- else :
102- logger .error ("Handshake failed!" )
103- self .transport .close ()
104- await asyncio .sleep (.1 )
105- logger .debug ("handshake complete, starting normal handle loop" )
92+ logger .debug ('Looking for handshake...' )
93+ data = await self .incoming_buffer .get ()
94+ logger .debug (data )
95+ if data ["cmd" ] == "HI" :
96+ self .handle_handshake (data )
97+ logger .debug ("handshake complete, starting normal handle loop" )
98+ else :
99+ logger .error ("Handshake failed!" )
100+ self .transport .close ()
106101
107102 def handle_handshake (self , data ):
108103 self .greeted = True
0 commit comments