8e8318aa5c
Also adds `msgio` utilities to mirror the Go implementation
22 lines
623 B
Python
22 lines
623 B
Python
from libp2p.io.abc import Reader
|
|
from libp2p.io.exceptions import IncompleteReadError
|
|
|
|
DEFAULT_RETRY_READ_COUNT = 100
|
|
|
|
|
|
async def read_exactly(
|
|
reader: Reader, n: int, retry_count: int = DEFAULT_RETRY_READ_COUNT
|
|
) -> bytes:
|
|
"""
|
|
NOTE: relying on exceptions to break out on erroneous conditions, like EOF
|
|
"""
|
|
data = await reader.read(n)
|
|
|
|
for _ in range(retry_count):
|
|
if len(data) < n:
|
|
remaining = n - len(data)
|
|
data += await reader.read(remaining)
|
|
else:
|
|
return data
|
|
raise IncompleteReadError({"requested_count": n, "received_count": len(data)})
|