QwikDev / QwikDev/qwik

OOOS: rejecting deferred child under a Slot-projecting wrapper trips 'Missing child' assert on resume

Open
#8,877 0 comments 0 reactions 0 assignees View on GitHub

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_locateDomContainer.vNodeLocateensureProjectionResolvedmaterializeFromVNodeDatavnode_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

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.