async def read_frame(self) -> DataFrame:
if self._data_frames.qsize() == <NUM_LIT:0> and self.closed:<EOL><INDENT>raise StreamConsumedError(self.id)<EOL><DEDENT>frame = await self._data_frames.get()<EOL>self._data_frames.task_done()<EOL>if frame is None:<EOL><INDENT>raise StreamConsumedError(self.id)<EOL><DEDENT>return frame<EOL>
Read a single frame from the local buffer.

        If no frames are available but the stream is still open, waits until
        more frames arrive. Otherwise, raises StreamConsumedError.

        When a stream is closed, a single `None` is added to the data frame
        Queue to wake up any waiting `read_frame` coroutines.