OOOS: rejecting deferred child under a Slot-projecting wrapper trips 'Missing child' assert on resume
Nobody has claimed this yet.
- Dominant language
- TypeScript
- Stars
- 22.1k
- Forks
- 1.4k
- Avg merge
- 1d 10h
- Merged PRs (30d)
- 52
Description
What is it?
- Bug
Description
Under out-of-order streaming, when a Slot-projecting wrapper contains a sibling element and a <Suspense> whose deferred child rejects, the resumed client throws Internal assert ... Missing child at vnode_getChildWithIdx (core/client/vnode-utils.ts:873) via vnode_locate ← DomContainer.vNodeLocate ← ensureProjectionResolved ← materializeFromVNodeData ← vnode_materialize.
The rejection is required: an identical topology whose deferred child resolves late produces no assert and stays interactive. Reproduces at d54b5d436 (merge-base with main) — pre-existing, not caused by the ErrorBoundary branch where it was found.
Repro recipe
Router app served by the qwik-e2e dev-server; one route rendering: a Slot-projecting wrapper containing a sibling <div> and a <Suspense> whose child, on the server, returns waitForRelease(...).then(() => { throw new Error("boom") }) (release-gated so the shell streams first). POST the data-release-url, let the page resume, then click any signal-bumping button — the assert fires during materialization.
Two traps when bisecting against the merge-base from a feature branch: git checkout <merge-base> -- packages/qwik/src resurrects files the branch deleted (remove them manually or the build silently uses stale modules), and packages/qwik/handlers.mjs + packages/qwik/public.d.ts live outside src and must be reverted together.
Found migrating the error-handling e2e suite (#8745 stack); the affected e2e test is parked as test.fixme referencing this issue. Likely the same OOOS vnode-data family as #8876 but no shared-root evidence yet.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the affected error-handling e2e test, currently parked as test.fixme, and reproduce it through the qwik-e2e dev-server with the release-gated rejecting Suspense child. Trace the reported path from core/client/vnode-utils.ts:873 through vnode_locate, DomContainer.vNodeLocate, ensureProjectionResolved, and materializeFromVNodeData. Done means the rejection case resumes without the Missing child assert and remains interactive.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- frontend
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 48/100