mirror of
https://github.com/MBombeck/HealthLog.git
synced 2026-11-09 21:10:59 +00:00
Every server render left its request reachable for ten minutes after the response was sent. Providers builds its QueryClient once per render, and the app's defaults give queries a ten-minute gcTime. On the server each entry the render built, disabled observers included, started a timer of that length, and a Node timer keeps the async context it was created in. That context is the request's: the response, the React Flight stream and the compressed body. A heap snapshot after a run of unauthenticated probes showed one 600 s query-core timer per request and the retained Flight chunks, ServerResponses and gzip buffers all hanging from them: about 150 KB of heap and 90 KB of buffers per not-found render. TanStack Query already defaults gcTime to Infinity on the server for this reason; an explicit value from the defaults or a hook overrides it. AppQueryClient folds Infinity back in at defaultQueryOptions, the merge point every observer, cache build and hydration passes through, so the server cache goes with the client at the end of the request. The browser keeps its configured lifetimes. The retention test reproduces the chain without a server: a response object held only by an AsyncLocalStorage store must be collectable after the render's client is dropped, with a positive control on a plain client that must keep it alive. A guard keeps client modules from building a QueryClient themselves and allows only option-less clients elsewhere.