This commit is contained in:
2026-08-24 17:06:08 +03:00
parent 1e46f1cb9f
commit bd22229430
4 changed files with 216 additions and 50 deletions

View File

@@ -1524,23 +1524,26 @@ class VmixAgentHub:
# semantics so diagnostics are still useful where exact field delivery matters.
interactive_shortcut = bool(str(sequence_id or "").strip() or str(button_id or "").strip())
delivery_mode = str(delivery_mode or "").strip().lower()
fast_timer = delivery_mode == "timer-fast"
fast_timer = delivery_mode in {"timer-fast", "timer-fast-ordered"}
ordered_timer = delivery_mode == "timer-fast-ordered"
no_ack_delivery = interactive_shortcut or fast_timer
supports_batch = self._agent_supports_batch(agent_version) and len(prepared_commands) > 1
use_batch = (not no_ack_delivery) and supports_batch
if fast_timer:
if ordered_timer:
transport = "timer-ordered-no-ack"
elif fast_timer:
transport = "timer-batch-no-ack" if supports_batch else "timer-no-ack"
else:
transport = "shortcut-no-ack" if interactive_shortcut else ("batch" if use_batch else "legacy")
if no_ack_delivery:
# BUILD103: realtime operator traffic (shortcuts + timers) bypasses Mapping's
# ACK queue. Timer pairs use ONE vmix.batch frame on Agent 1.4+ and return
# immediately after WebSocket delivery; the later Agent ACK is intentionally ignored.
# The shared realtime lock preserves exact frame order if Space and an F-key are
# pressed almost simultaneously without reintroducing the slow Mapping lock.
# BUILD106: realtime operator traffic bypasses Mapping's ACK queue. The new
# timer-fast-ordered mode deliberately sends each timer command as its own WebSocket
# frame in strict order (Stop -> Set -> Start) and never waits for Agent/vMix ACK.
# Legacy timer-fast keeps vmix.batch compatibility. The shared realtime lock prevents
# interleaving with F-key traffic without reintroducing the slow Mapping lock.
async with self._device_vmix_shortcut_send_lock(target_device_id):
if fast_timer and supports_batch:
if fast_timer and supports_batch and not ordered_timer:
request_id = secrets.token_urlsafe(12)
delivered = await self.send(
target_device_id,