| 95 | |
| 96 | |
| 97 | class _ReadStream(io.RawIOBase): |
| 98 | def __init__( |
| 99 | self, |
| 100 | int_buffer: JsArray, |
| 101 | byte_buffer: JsArray, |
| 102 | timeout: float, |
| 103 | worker: JsProxy, |
| 104 | connection_id: int, |
| 105 | request: EmscriptenRequest, |
| 106 | ): |
| 107 | self.int_buffer = int_buffer |
| 108 | self.byte_buffer = byte_buffer |
| 109 | self.read_pos = 0 |
| 110 | self.read_len = 0 |
| 111 | self.connection_id = connection_id |
| 112 | self.worker = worker |
| 113 | self.timeout = int(1000 * timeout) if timeout > 0 else None |
| 114 | self.is_live = True |
| 115 | self._is_closed = False |
| 116 | self.request: EmscriptenRequest | None = request |
| 117 | |
| 118 | def __del__(self) -> None: |
| 119 | self.close() |
| 120 | |
| 121 | # this is compatible with _base_connection |
| 122 | def is_closed(self) -> bool: |
| 123 | return self._is_closed |
| 124 | |
| 125 | # for compatibility with RawIOBase |
| 126 | @property |
| 127 | def closed(self) -> bool: |
| 128 | return self.is_closed() |
| 129 | |
| 130 | def close(self) -> None: |
| 131 | if self.is_closed(): |
| 132 | return |
| 133 | self.read_len = 0 |
| 134 | self.read_pos = 0 |
| 135 | self.int_buffer = None |
| 136 | self.byte_buffer = None |
| 137 | self._is_closed = True |
| 138 | self.request = None |
| 139 | if self.is_live: |
| 140 | self.worker.postMessage(_obj_from_dict({"close": self.connection_id})) |
| 141 | self.is_live = False |
| 142 | super().close() |
| 143 | |
| 144 | def readable(self) -> bool: |
| 145 | return True |
| 146 | |
| 147 | def writable(self) -> bool: |
| 148 | return False |
| 149 | |
| 150 | def seekable(self) -> bool: |
| 151 | return False |
| 152 | |
| 153 | def readinto(self, byte_obj: Buffer) -> int: |
| 154 | if not self.int_buffer: |