Source code for grpclib_transports.transfer

"""Chunked data and file iterators for streaming payloads."""

from __future__ import annotations

from pathlib import Path
from typing import TYPE_CHECKING

from grpclib_transports.protocol import DEFAULT_TUNING

if TYPE_CHECKING:
    from collections.abc import Iterator


[docs] def iter_chunks(data: bytes | bytearray | memoryview, chunk_size: int) -> Iterator[bytes]: """Yield *chunk_size*-byte slices of *data*.""" if chunk_size <= 0: raise ValueError("chunk_size must be positive") view = memoryview(data) for offset in range(0, len(view), chunk_size): yield view[offset : offset + chunk_size].tobytes()
[docs] def iter_file_chunks( path: str | Path, *, chunk_size: int = DEFAULT_TUNING.transfer_chunk_size, ) -> Iterator[bytes]: """Yield *chunk_size*-byte chunks from the file at *path*.""" if chunk_size <= 0: raise ValueError("chunk_size must be positive") with Path(path).open("rb") as f: while True: chunk = f.read(chunk_size) if not chunk: break yield chunk