mirror of
https://github.com/jhd3197/ServerKit.git
synced 2026-11-09 05:24:49 +09:00
Two callers asking for the same URL at the same moment now share one network request. This is NOT a cache -- the entry is dropped the instant the request settles, so nobody can read a stale body. It only collapses the overlap, which is where the duplicates were coming from: StrictMode double-invokes every effect in dev, two independent components own the same endpoint, and a poller whose previous tick has not returned fires again on schedule. Only plain GETs with no body, no custom headers (X-DB-Password and friends change what comes back) and no abort signal (one caller aborting must not cancel someone else's request) are shared, keyed by workspace since the same path returns different rows under a different X-Workspace-Id. A joining caller gets a structured clone, so the two keep the independent objects they had when each ran its own fetch. Also: refreshContributions() always started a new request, so using it to mean "make sure this is loaded" fetched the plugin envelope twice on every app load. Split into ensureContributions() (load once -- what the dashboard shell and useContributions want) and refreshContributions() (deliberate re-fetch, correct after installing or removing an extension). Measured with the new probe-requests.mjs against a 700ms-per-reply backend, which is what exposes pollers stacking. /domains went from a capture showing domains x4, deployment-jobs x8 across two statuses, notices x3, status x3 and five more x2 endpoints, to 20 requests / 19 distinct -- the only repeat is the deploy poller's second tick inside the 9s dwell, which is the poller working. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>