Avatar for the solidjs user
solidjs
solid
BlogDocsChangelog

Performance History

Latest Results

docs: sweep beta-era wording to RC across READMEs and 2.0 docs Co-authored-by: Cursor <cursoragent@cursor.com>
next
7 hours ago
feat(solid): bare ssrSource "client" suspends as a final hole — the structural form of a browser-only source. Previously "client" required a declared first paint (loadingValue/seedLoadingValue) and a bare declaration was a dev error; the matrix now has both channels. Bare = boundary channel: on the server the source's pending promise is a shared never-settling CLIENT_HOLE — reads suspend finally, and the nearest <Loading> boundary detects the tag and hands the position to the client. Discovered before fragment registration it takes the renderToString route verbatim (plain fallback + "$$f" client-continue marker — no placeholder template, nothing will ever swap); surfacing only after registration (an earlier real async read masked it), it rejects the fragment, the closest streaming analogue since "settle but keep the fallback" is not expressible in the fragment protocol — the client renders that boundary's content fresh after hydration. Read outside a <Loading> boundary it throws a real render error instead of wedging the stream. The tag rides both pending channels (component-body retryPromise and template-hole ret.p via createErrorBoundary's aggregate), and serverEffect gives up on holes instead of blocking. Declared form unchanged: loadingValue/seedLoadingValue stays the value channel (server renders commit #0; client serves it while hydrating, then computes). Client side, the bare-client dev assert and its extra type overloads are gone — the pre-hydration gate returns the shared UNASKED thenable unconditionally so bare nodes stay uninitialized and windowed nodes stay verdict-quiet — and the hydration claim now swallows the settled-rejected _fr promise, so rejected fragments (error finalize or client handoff) stop surfacing unhandled-rejection noise. Parity harness pins all three shapes (bare memo, bare store, late-surfacing hole; the streamed rejected swap splices dom-expressions' single-space rejection template, pinned via expectedTextStreamed). Full bar: turbo 27/27 (parity 85/85); size gates green — client cost is compression noise (raw minified byte-identical; gzip −18..+1 B, brotli +10..30 B across scenarios), the implementation is server-only bytes. Co-authored-by: Cursor <cursoragent@cursor.com>
next
24 hours ago
fix(solid): lazy() settles after its async gates — the beta.33 dev-streaming livelock. With an async asset resolver (dev-server manifests), every re-creation of a lazy component across suspended render passes armed a fresh assetsPending gate even after its module and assets had settled: the per-request _lazyAssets cache memoized the resolver's PROMISE forever (each new wrap chained .then off an already-resolved promise — pending at the render memo's compute, settled one microtask later), and the moduleUrl-less path chained p.then per creation with the same geometry. A route layout's outlet re-creates its lazy child on every retry pass, so each pass threw NotReadyError on a gate that resolved immediately after and the boundary resume loop re-rendered forever on the microtask queue — timers starved, ids and serializer state grew without bound, and the dev server died on V8 heap exhaustion (~30s per request; bisected to the dx 0.50.0-next.41 bump, whose retry-wrapper flattening removed the accidental bound the old per-pass wrapper stacking imposed). Both gates now settle structurally: the cache entry upgrades to the resolved VALUE when the resolver settles, and a re-creation after the module import settled reads $$moduleUrl synchronously instead of chaining another promise hop. Regression test bounds the re-creation loop with a give-up sentinel so the pre-fix state fails as an assertion (2/2 fail pre-fix, pass post-fix) instead of hanging the suite. Verified against the fullstack template repro: /users/1 dev-streamed in 0.29s cold / 4ms warm (was 30s+ then OOM, exit 134). Full bar: turbo 27/27; all eight size gates green (server-only change). Co-authored-by: Cursor <cursoragent@cursor.com>
next
1 day ago

Latest Branches

CodSpeed Performance Gauge
0%
Adopted claims derive their prefix from the wire id, not the call address#2973
8 days ago
19d75b1
brenelz:fix/adopt-claim-scope-wire-id
CodSpeed Performance Gauge
0%
9 days ago
15b512f
jer3m01:chore/type
CodSpeed Performance Gauge
0%
10 days ago
70d0da6
brenelz:fix/late-boundary-claim-and-live-slot-range
© 2026 CodSpeed Technology
Home Terms Privacy Docs