mirror of
https://github.com/Matysh/houseplan-card
synced 2026-09-30 11:49:16 +00:00
The v1.55.2 recheck (verdict NEEDS FIX) found two lifecycle holes in the first-open boot veil (HP-1552); both are closed here and covered by demo/smoke_preloader_lifecycle.mjs, which fails on v1.55.2. AUD-1552-01 (high): disconnect/reconnect while booting hid the plan FOREVER. disconnectedCallback cleared the boot timer but kept its truthy id, so 'updated()' never restarted the watcher. Now the id is nulled on disconnect and connectedCallback restarts the whole veil lifecycle: a fresh watch (fresh clock, BOOT_MAX_MS hard cap) while booting, the tail timers when detached mid-fade or mid-grace. AUD-1552-02 (medium): two equal reads at 200/400 ms revealed the plan at ~400 ms, so HA chrome landing at 450+ ms jumped on a VISIBLE plan. The veil now holds a full protective window (BOOT_MIN_MS=700 — the old 600 ms plus a frame-latency margin: a shift applied at ~590 ms only materializes in the stage height a couple frames later) with 100 ms sampling and trailing quiescence (BOOT_QUIET_MS=250 restarts on every height change), capped by BOOT_MAX_MS=1200. After the reveal a short soft grace (BOOT_SOFT_MS=1500, .stage.hpsettle) turns later passive shifts into a 0.25 s height glide — the viewport ResizeObserver refits the plan along the transition; deliberate height changes (_setMode into an editor) cancel the grace so the plan never drifts under the pointer. Reduced motion disables the glide. Regressions (demo/smoke_preloader_lifecycle.mjs, all FAIL on v1.55.2): - A: detach before the first tick -> reattach -> veil lifts within the cap, plan visible, no hpboot class, no zombie veil after a mid-fade remount either; - B: parameterized layout shifts at 150/300/450/590 ms -> not a single frame shows the plan at a non-final stage height; - C: a shift after the reveal glides (>=3 intermediate frames), no snap. smoke_modes.mjs now strips the transient hpsettle class from its exact stage-class assertions. Docs: CHANGELOG en+ru, STATUS.
55 lines
2.3 KiB
Python
Executable File
55 lines
2.3 KiB
Python
Executable File
"""Constants of the House Plan integration."""
|
|
|
|
DOMAIN = "houseplan"
|
|
STORAGE_KEY = f"{DOMAIN}.layout"
|
|
STORAGE_CONFIG_KEY = f"{DOMAIN}.config"
|
|
STORAGE_VERSION = 1
|
|
STORAGE_MINOR_VERSION = 1
|
|
FRONTEND_URL = "/houseplan_files/houseplan-card.js"
|
|
PLANS_URL = "/houseplan_files/plans"
|
|
PLANS_DIR = "houseplan/plans" # relative to the HA configuration directory
|
|
FILES_URL = "/houseplan_files/files"
|
|
# authenticated read path (audit B1): /api/houseplan/content/<plans|files>/<sub>/<name>
|
|
CONTENT_URL = "/api/houseplan/content"
|
|
|
|
# How many paths one houseplan/content/sign call may carry. The card batches to
|
|
# the same number; a client that sends more used to get a partial answer with no
|
|
# way to tell which paths were dropped (review R2-2).
|
|
MAX_SIGN_PATHS = 200
|
|
|
|
# Nothing is ever deleted for being old (docs/SCOPE.md), so growth has to be
|
|
# stopped at the door instead. These bound the whole store, not one request: by
|
|
# default any authenticated user may upload, and a per-request cap of 8/50 MB
|
|
# says nothing about how many requests there are (HP-1470-01).
|
|
MAX_PLANS_BYTES = 256 * 1024 * 1024
|
|
MAX_PLANS_FILES = 200
|
|
# How many the picker asks for at once — newest first.
|
|
MAX_PLANS_LISTED = 60
|
|
MAX_FILES_BYTES = 1024 * 1024 * 1024
|
|
MAX_FILES_COUNT = 1000
|
|
# Refuse to write when the disk is nearly full: filling the config partition
|
|
# breaks .storage, the recorder and backups, not just this card.
|
|
MIN_FREE_BYTES = 512 * 1024 * 1024
|
|
|
|
# An uploaded plan that no accepted configuration references is collected only
|
|
# once it is this old. Age is a race guard, not a policy: a plan uploaded
|
|
# seconds ago may belong to another client's transaction that has not written
|
|
# its configuration yet (review R3-1).
|
|
PLAN_ORPHAN_TTL_S = 3600
|
|
|
|
# Kept for compatibility with anything reading it; the collectors no longer use
|
|
# a long grace at all. Every attempt to age files out ended badly — first by
|
|
# deleting detached plans, then by racing the save that was about to reference a
|
|
# retried upload. What is left is deliberately simple: files go when the user's
|
|
# action says so, plus staging folders after PLAN_ORPHAN_TTL_S.
|
|
SCHEDULED_GRACE_S = 30 * 24 * 3600
|
|
FILES_DIR = "houseplan/files"
|
|
CONF_ADMIN_ONLY = "admin_only"
|
|
VERSION = "1.55.3"
|
|
|
|
DEFAULT_CONFIG: dict = {
|
|
"spaces": [],
|
|
"markers": [],
|
|
"settings": {},
|
|
}
|