Read messages from the stream (runs in thread)
(self)
| 255 | await loop.run_in_executor(None, write) |
| 256 | |
| 257 | def _read_loop(self): |
| 258 | """Read messages from the stream (runs in thread)""" |
| 259 | try: |
| 260 | while self._running: |
| 261 | message = self._read_message() |
| 262 | if message: |
| 263 | self._handle_message(message) |
| 264 | else: |
| 265 | # No message means stream closed - process likely exited |
| 266 | break |
| 267 | except EOFError: |
| 268 | # Stream closed - check if process exited |
| 269 | pass |
| 270 | except Exception as e: |
| 271 | if self._running: |
| 272 | logger.warning("Failed to parse incoming JSON-RPC message", exc_info=True) |
| 273 | # Store error for pending requests |
| 274 | self._process_exit_error = str(e) |
| 275 | |
| 276 | # Process exited or read failed - fail all pending requests |
| 277 | if self._running: |
| 278 | logger.debug("JSON-RPC read loop ended") |
| 279 | self._fail_pending_requests() |
| 280 | if self.on_close is not None: |
| 281 | self.on_close() |
| 282 | |
| 283 | def _fail_pending_requests(self): |
| 284 | """Fail all pending requests when process exits""" |
nothing calls this directly
no test coverage detected