Disconnect at once after restart, reboot, quit or hibernate

The device goes down without answering, so the editor waited out the 30 s
Sox timeout before dropping the session. The invoke now waits 3 s (time for
DASP to resend it once) and the editor disconnects either way; an error
reply from the device is still reported and keeps the connection. Covers the
App right-click actions and the restart Put with Files offers.

- sox: request/requests/invoke take a timeout

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-11 10:42:36 +03:00
co-authored by Claude Opus 5.5
parent e070bd0f1e
commit f2b18923b7
3 changed files with 26 additions and 17 deletions
+9 -9
View File
@@ -667,13 +667,13 @@ class SoxClient:
# ── Invoke Action ───────────────────────────────────────────
def invoke(self, comp_id, slot_id, type_id=None, arg=None):
def invoke(self, comp_id, slot_id, type_id=None, arg=None, timeout=30.0):
req = _prepare_request(ord('i'))
req.write_u2(comp_id)
req.write_u1(slot_id)
if arg is not None and type_id is not None:
encode_value(req, type_id, arg)
res = self.request(req)
res = self.request(req, timeout)
res.check_response('I')
# ── Add Component ───────────────────────────────────────────
@@ -1062,17 +1062,17 @@ class SoxClient:
# ── Networking ──────────────────────────────────────────────
def request(self, req):
results = self.requests([req])
def request(self, req, timeout=30.0):
results = self.requests([req], timeout)
return results[0]
def requests(self, reqs):
def requests(self, reqs, timeout=30.0):
"""Sends the batch and waits for every reply."""
if self.is_closed:
raise SoxException("SoxClient closed")
if len(reqs) > 255:
return self._chunk_requests(reqs)
return self._chunk_requests(reqs, timeout)
with self._lock:
for i, req in enumerate(reqs):
@@ -1085,7 +1085,7 @@ class SoxClient:
for req in reqs:
self._session.send(req.to_bytes())
deadline = time.monotonic() + 30.0
deadline = time.monotonic() + timeout
while True:
remaining = deadline - time.monotonic()
if remaining <= 0:
@@ -1107,11 +1107,11 @@ class SoxClient:
self._responses = None
raise SoxException("Request timeout")
def _chunk_requests(self, reqs):
def _chunk_requests(self, reqs, timeout=30.0):
results = []
for i in range(0, len(reqs), 255):
chunk = reqs[i:i + 255]
results.extend(self.requests(chunk))
results.extend(self.requests(chunk, timeout))
return results
# called by receiver thread