Handle a new connection (Unity or CLI)
(
self,
reader: asyncio.StreamReader,
writer: asyncio.StreamWriter,
)
| 187 | logger.info("Relay Server stopped") |
| 188 | |
| 189 | async def _handle_connection( |
| 190 | self, |
| 191 | reader: asyncio.StreamReader, |
| 192 | writer: asyncio.StreamWriter, |
| 193 | ) -> None: |
| 194 | """Handle a new connection (Unity or CLI)""" |
| 195 | peername = writer.get_extra_info("peername") |
| 196 | logger.debug(f"New connection from {peername}") |
| 197 | |
| 198 | try: |
| 199 | # Read first message to determine connection type |
| 200 | first_msg = await asyncio.wait_for(read_frame(reader), timeout=10.0) |
| 201 | msg_type = first_msg.get("type") |
| 202 | |
| 203 | if msg_type == MessageType.REGISTER.value: |
| 204 | await self._handle_unity_connection(reader, writer, first_msg) |
| 205 | elif msg_type in ( |
| 206 | MessageType.REQUEST.value, |
| 207 | MessageType.LIST_INSTANCES.value, |
| 208 | MessageType.SET_DEFAULT.value, |
| 209 | ): |
| 210 | await self._handle_cli_message(writer, first_msg) |
| 211 | # CLI connections are one-shot |
| 212 | else: |
| 213 | logger.warning(f"Unknown message type: {msg_type}") |
| 214 | |
| 215 | except TimeoutError: |
| 216 | logger.warning(f"Connection timeout from {peername}") |
| 217 | except asyncio.IncompleteReadError: |
| 218 | logger.debug(f"Connection closed by {peername}") |
| 219 | except Exception as e: |
| 220 | logger.error(f"Error handling connection from {peername}: {e}") |
| 221 | finally: |
| 222 | if not writer.is_closing(): |
| 223 | writer.close() |
| 224 | await writer.wait_closed() |
| 225 | |
| 226 | # ===== Unity Connection Handling ===== |
| 227 |
nothing calls this directly
no test coverage detected