Compare commits

..
Author SHA1 Message Date
Waters ChurchandClaude Fable 5 c4383c9e62 Timers 1.7.1: a failed LTC capture spawn retries instead of parking
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 <noreply@anthropic.com>
2026-10-07 11:46:09 -04:00
2 changed files with 8 additions and 1 deletions
@@ -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) => {
+1 -1
View File
@@ -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": [