fix(voice): preserve pending message intent across reconnects

This commit is contained in:
stu2not
2026-10-30 16:46:55 +08:00
parent 9ebb1a78ec
commit 475a2447d1
4 changed files with 290 additions and 33 deletions
+2 -5
View File
@@ -62,7 +62,6 @@ class DeviceTargetCache:
self.targets[device_id] = VoiceTarget(
kind=kind, target_device_id=target_device_id, uuid=uuid,
audio_cache_key=f"voice:{device_id}:{uuid4().hex}",
websocket=await connection_manager.get_connection(device_id),
expires_at=self.clock() + self.timeout_seconds,
)
session_logger.info(device_id, "target", f"留言目标已设置: kind={kind}, timeout={self.timeout_seconds}s")
@@ -94,17 +93,15 @@ class DeviceTargetCache:
return target
async def bind_connection(self, device_id, websocket):
"""Adopt commands received before connect; discard older socket intents."""
"""Keep pending commands; discard recordings owned by another socket."""
async with self.lock:
if await connection_manager.get_connection(device_id) is not websocket:
return
target = await self._get_locked(device_id)
if target is None:
return
if target.websocket is not None and target.websocket is not websocket:
if target.session_id is not None and target.websocket is not websocket:
await self._remove_locked(device_id, target, "connection_changed")
else:
target.websocket = websocket
async def append_audio(self, device_id, target, websocket, session_id, audio):
async with self.lock: