| 26 | |
| 27 | |
| 28 | class OneByteStream: |
| 29 | def __init__(self, data: bytes): |
| 30 | self._data = data |
| 31 | self._offset = 0 |
| 32 | |
| 33 | def read(self, size=-1): |
| 34 | if self._offset >= len(self._data): |
| 35 | return b"" |
| 36 | if size < 0: |
| 37 | size = len(self._data) - self._offset |
| 38 | if size == 0: |
| 39 | return b"" |
| 40 | read_size = min(1, size, len(self._data) - self._offset) |
| 41 | start = self._offset |
| 42 | self._offset += read_size |
| 43 | return self._data[start : start + read_size] |
| 44 | |
| 45 | def readinto(self, buffer): |
| 46 | if self._offset >= len(self._data): |
| 47 | return 0 |
| 48 | view = memoryview(buffer).cast("B") |
| 49 | if len(view) == 0: |
| 50 | return 0 |
| 51 | read_size = min(1, len(view), len(self._data) - self._offset) |
| 52 | start = self._offset |
| 53 | self._offset += read_size |
| 54 | view[:read_size] = self._data[start : start + read_size] |
| 55 | return read_size |
| 56 | |
| 57 | def recv_into(self, buffer, size=-1): |
| 58 | if self._offset >= len(self._data): |
| 59 | return 0 |
| 60 | view = memoryview(buffer).cast("B") |
| 61 | if size < 0 or size > len(view): |
| 62 | size = len(view) |
| 63 | if size == 0: |
| 64 | return 0 |
| 65 | read_size = min(1, size, len(self._data) - self._offset) |
| 66 | start = self._offset |
| 67 | self._offset += read_size |
| 68 | view[:read_size] = self._data[start : start + read_size] |
| 69 | return read_size |
| 70 | |
| 71 | def recvinto(self, buffer, size=-1): |
| 72 | return self.recv_into(buffer, size) |
| 73 | |
| 74 | |
| 75 | class OneByteWriteStream: |
no outgoing calls