mirror of
https://github.com/ChuckBuilds/LEDMatrix.git
synced 2026-10-05 14:55:08 +00:00
feat(ipc)!: remove the cache-key mailboxes (control socket stage 5)
The control socket is now the only way the web interface sends the display a command. The display stops reading display_on_demand_request and plugin_error_clear_request, and the web interface stops writing them. - Display: no mailbox poll (MailboxWatch, the 1 s / 0.25 s cadence, _consume_on_demand_request, the deprecation log) and no persisted display_on_demand_processed_id guard; the error publisher reads no clear request. CacheManager.file_signature and MailboxWatch are removed. - A write to either retired key is dropped by CacheManager.save_cache and logged once per writer, naming the plugin from the call stack (or the request's plugin_id), with the API to move to. - Web: on-demand start with no display listening starts the service (when start_service) and sends the request again once the socket answers (45 s, 10 s for a running service without a socket yet); every other failure is a 503 (400 for invalid_args). Stop answers 503 when no display listens, unless stop_service. errors/clear answers 503 with a reason-specific message instead of writing a request; clear_pending is always false. src.ipc.client.should_fall_back is replaced by display_not_listening. - Kept: display_current_state, display_on_demand_state, plugin_runtime_snapshot and the heartbeat (read whenever the socket cannot answer), and display_on_demand_config (the display's resume record). Tests: mailbox-only tests removed (test_on_demand_mailbox.py, the mailbox cadence, file_signature and MailboxWatch tests); tests that injected requests through the mailbox now use the socket queue or a plugin's in-process request. The run-loop harness sends on-demand requests over its fake control socket, so four golden traces change: on-demand starts and stops land at the request instant instead of the next 0.25 s mailbox look (one frame fewer on the screen they end), and in vegas.json within one frame instead of 263 ms, which shifts the later 1 s-throttled WiFi-notice check by under a second. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -19,6 +19,54 @@ accepts both, but the store flags the old spelling as deprecated
|
||||
|
||||
## Unreleased
|
||||
|
||||
### Removed: the cache-key mailboxes (control socket stage 5) -- breaking
|
||||
|
||||
The control socket (`docs/IPC_CONTROL_SOCKET.md`) is now the only way the
|
||||
web interface sends the display a command. The file mailboxes it fell back
|
||||
to for one release are gone.
|
||||
|
||||
- **`display_on_demand_request` and `plugin_error_clear_request` are no
|
||||
longer written or read.** The display stops polling the on-demand mailbox
|
||||
(`MailboxWatch`, `MAILBOX_POLL_INTERVAL_WITH_SOCKET`,
|
||||
`_consume_on_demand_request` and the persisted
|
||||
`display_on_demand_processed_id` guard are removed), and the error
|
||||
publisher stops reading the clear request. `CacheManager.file_signature`,
|
||||
`src.cache_manager.MailboxWatch`, `src.ipc.client.should_fall_back` and
|
||||
`src.error_aggregator.ERROR_CLEAR_REQUEST_KEY` are removed.
|
||||
- **A write to either key is dropped, with one warning per writer.**
|
||||
`CacheManager.save_cache` (and so `set`) refuses `RETIRED_MAILBOX_KEYS`
|
||||
and logs `Ignored a write to the retired '<key>' cache key by plugin
|
||||
'<id>'`, naming the plugin from the call stack or the request. Plugins
|
||||
must use `BasePlugin.request_on_demand()` / `end_on_demand()` (3.8.1).
|
||||
In the official monorepo, birdnet-go, mqtt-notifications, on-air and
|
||||
pomodoro-timer still write the mailbox, but only as their fallback when
|
||||
those methods are missing or answer `None`.
|
||||
- **On-demand routes without a listening display.** `POST
|
||||
/api/v3/display/on-demand/start` with the service stopped starts it (when
|
||||
`start_service`, the default) and sends the request once the display's
|
||||
socket answers, waiting up to 45 s (10 s for a service that is running but
|
||||
has no socket yet); otherwise it answers `400` (`start_service` false) or
|
||||
`503` with `socket_error`. Every other socket failure (`unknown_command`
|
||||
from an older display, `disabled`/`unsupported`, `busy`, a timeout) is a
|
||||
`503`. `/stop` answers `503` when no display is listening, unless
|
||||
`stop_service` stops the service. `transport` is always `"socket"`; the
|
||||
`"mailbox"` value is gone.
|
||||
- **`POST /api/v3/errors/clear` without the socket answers `503`** (with
|
||||
`context.socket_error` and a message saying why) instead of recording a
|
||||
request. `clear_pending` in the error routes is now always `false`;
|
||||
`src.error_aggregator.read_error_report()` returns only the snapshot, and
|
||||
`error_summary_from_report()` / `plugin_health_from_report()` /
|
||||
`request_error_clear()` lose their clear-request arguments.
|
||||
- **Kept:** the display still writes `display_current_state`,
|
||||
`display_on_demand_state`, `plugin_runtime_snapshot` and the heartbeat
|
||||
file, because the web interface reads them whenever the socket cannot
|
||||
answer (a stopped or starting display, a web user not yet in the socket's
|
||||
group, Windows), and `display_on_demand_config`, its own record for
|
||||
resuming a session after a restart.
|
||||
- **Windows and `LEDMATRIX_CONTROL_SOCKET=off`:** with no socket, the web
|
||||
interface can no longer start or stop on-demand sessions or clear errors
|
||||
on a running display (the mailbox used to carry them).
|
||||
|
||||
### Plugins ask for the screen in-process: `request_on_demand()` / `end_on_demand()`
|
||||
|
||||
The in-process way in that stage 5 of the control socket needed
|
||||
|
||||
Reference in New Issue
Block a user