Handle a Unity Editor connection
(
self,
reader: asyncio.StreamReader,
writer: asyncio.StreamWriter,
register_msg: dict[str, Any],
)
| 226 | # ===== Unity Connection Handling ===== |
| 227 | |
| 228 | async def _handle_unity_connection( |
| 229 | self, |
| 230 | reader: asyncio.StreamReader, |
| 231 | writer: asyncio.StreamWriter, |
| 232 | register_msg: dict[str, Any], |
| 233 | ) -> None: |
| 234 | """Handle a Unity Editor connection""" |
| 235 | # Validate protocol version |
| 236 | protocol_version = register_msg.get("protocol_version", "") |
| 237 | if protocol_version != PROTOCOL_VERSION: |
| 238 | response = RegisteredMessage( |
| 239 | success=False, |
| 240 | error={ |
| 241 | "code": ErrorCode.PROTOCOL_VERSION_MISMATCH.value, |
| 242 | "message": f"Unsupported protocol version: {protocol_version}. Expected: {PROTOCOL_VERSION}", |
| 243 | }, |
| 244 | ) |
| 245 | await write_frame(writer, response.to_dict()) |
| 246 | return |
| 247 | |
| 248 | # Register instance |
| 249 | instance_id = register_msg.get("instance_id", "") |
| 250 | raw_bridge_version = register_msg.get("bridge_version", "") |
| 251 | bridge_version = raw_bridge_version if isinstance(raw_bridge_version, str) else "" |
| 252 | if len(bridge_version) > 64: |
| 253 | bridge_version = "" |
| 254 | instance = await self.registry.register( |
| 255 | instance_id=instance_id, |
| 256 | project_name=register_msg.get("project_name", ""), |
| 257 | unity_version=register_msg.get("unity_version", ""), |
| 258 | capabilities=register_msg.get("capabilities", []), |
| 259 | reader=reader, |
| 260 | writer=writer, |
| 261 | bridge_version=bridge_version, |
| 262 | ) |
| 263 | |
| 264 | # Send registration response |
| 265 | response = RegisteredMessage( |
| 266 | success=True, |
| 267 | heartbeat_interval_ms=HEARTBEAT_INTERVAL_MS, |
| 268 | ) |
| 269 | await write_frame(writer, response.to_dict()) |
| 270 | |
| 271 | # Start heartbeat task |
| 272 | heartbeat_task = asyncio.create_task(self._heartbeat_loop(instance_id)) |
| 273 | self._heartbeat_tasks[instance_id] = heartbeat_task |
| 274 | |
| 275 | # Handle messages from Unity |
| 276 | try: |
| 277 | while self._running and instance.is_connected: |
| 278 | try: |
| 279 | msg = await asyncio.wait_for( |
| 280 | read_frame(reader), |
| 281 | timeout=HEARTBEAT_TIMEOUT_MS / 1000, |
| 282 | ) |
| 283 | await self._handle_unity_message(instance, msg) |
| 284 | except TimeoutError: |
| 285 | # Don't disconnect here — let _heartbeat_loop handle retries via PING/PONG. |
no test coverage detected