diff options
| author | Igor Soarez <igor@soarez.org> | 2026-10-26 16:40:50 +0200 |
|---|---|---|
| committer | Igor Soarez <igor@soarez.org> | 2026-10-26 16:40:50 +0200 |
| commit | 53e86be78d7a80a114cf265dbf8189606297d040 (patch) | |
| tree | 4d54e2f714f67e59103793d7f98d535852f366c9 /crates | |
| parent | 185af91b4d525db6c192a050b53615772fb5fe11 (diff) | |
hooks: answer each message, so the extension sends a report once
the pi extension (herdr's protocol) waits for a reply line and sends a
report again after 0.5 s without one; dingger never replied. every report
arrived twice and took about 2 s, delaying the next one (the live log: 196
of 400 reports repeated the previous one, 0.49 s later). the daemon now
answers each line with {"ok":true}; senders that do not read replies
(dingger poke, importance, the claude hook) are unaffected.
e2e step 21: one report, done in 0.38 s; without replies, two, 2.08 s.
Diffstat (limited to 'crates')
| -rw-r--r-- | crates/dinggerd/src/hooks.rs | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/crates/dinggerd/src/hooks.rs b/crates/dinggerd/src/hooks.rs index 8b24659..a649fa0 100644 --- a/crates/dinggerd/src/hooks.rs +++ b/crates/dinggerd/src/hooks.rs @@ -18,6 +18,8 @@ //! order, so a turn that starts and finishes between two polls is still a //! completion, and each report wakes the watcher immediately. //! +//! Each line is answered with `{"ok":true}`. +//! //! `{"method":"poke"}` only wakes the watcher; `dingger focus` and tmux's //! focus-change hooks send it so attendance updates without waiting for the //! next poll. The last reported state stays authoritative for its pane @@ -123,8 +125,18 @@ struct HookParams { } fn handle_stream(stream: UnixStream) { + // Each message gets a reply line: an extension waits for one and sends + // the message again without it (herdr's protocol), so a report would + // arrive twice and take seconds. + let mut replies = stream.try_clone().ok(); for line in BufReader::new(stream).lines() { let Ok(line) = line else { return }; + if let Some(out) = replies.as_mut() { + use std::io::Write; + if out.write_all(b"{\"ok\":true}\n").is_err() { + replies = None; // the sender does not read replies + } + } let Ok(message) = serde_json::from_str::<HookMessage>(&line) else { warn!(%line, "invalid hook message"); continue; |
