From c4383c9e62495278003521476b6981fc66ff85e6 Mon Sep 17 00:00:00 2001 From: Waters Church Date: Wed, 7 Oct 2026 11:46:09 -0400 Subject: [PATCH] Timers 1.7.1: a failed LTC capture spawn retries instead of parking MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When spawn() itself fails — EACCES on a helper that lost its execute bit, as the 1.10.2 catalog install did on AB on 2026-10-04 — the child emits 'error' with no 'exit' to follow. The handler reported the error but left `child` set and scheduled nothing: the 250 ms eval loop then kept reporting a misleading "No signal" over the dead child object, and the listener was parked until a remount. Null the child in the error handler and retry on the slow timer, the way spl-listener already does (which is why SPL healed itself the moment its binary was chmod +x'd, while Timers needed a remount). The error report stays visible: the eval loop does not report while there is no child. Co-Authored-By: Claude Fable 5 --- modules/propresenter-timers/ltc-listener.js | 7 +++++++ modules/propresenter-timers/module.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/modules/propresenter-timers/ltc-listener.js b/modules/propresenter-timers/ltc-listener.js index 2274aaa..147bd6c 100644 --- a/modules/propresenter-timers/ltc-listener.js +++ b/modules/propresenter-timers/ltc-listener.js @@ -162,7 +162,14 @@ function createLtcListener({ device, channel, moduleDir, log, onUpdate }) { }); child.on('error', (err) => { + // A spawn that fails (EACCES on a helper that lost its execute bit, + // ENOENT) emits 'error' with no 'exit' to follow. Leaving `child` set + // would let the eval loop report "No signal" over a dead child forever + // and nothing would ever retry — what parked LTC on AB on 2026-10-04. + // Null it and retry on the slow timer, the way spl-listener does. report({ error: TOOL_MISSING, detail: `LTC capture failed to start: ${err.message}` }); + child = null; + scheduleRestart(BAD_CONFIG_RETRY_MS); }); child.on('exit', (code) => { diff --git a/modules/propresenter-timers/module.json b/modules/propresenter-timers/module.json index f85f541..ad2a415 100644 --- a/modules/propresenter-timers/module.json +++ b/modules/propresenter-timers/module.json @@ -1,7 +1,7 @@ { "id": "propresenter-timers", "name": "Timers", - "version": "1.7.0", + "version": "1.7.1", "proddash": ">=1.4.0", "description": "Timers, Clocks, and LTC From configured Modules", "provides": [