feat(mini-lynx): close the production gaps — errors, event transport, global props - #18
Merged
Merged
Conversation
… global props Three things stood between a green suite and an app shipping this, and they share a shape: each is a place where the runtime is the outermost JavaScript frame, with native code or the job queue above it and no caller to hand a problem to. - setErrorHandler, and guards at every boundary the engine calls in on. A handler throwing inside the engine's dispatch and a commit throwing on the promise job queue were both undefined behaviour with nothing listening. Errors are now caught, tagged with their source, and reported; handlers on one (type, name) are isolated from each other, a failed commit no longer wedges the scheduler, and /recycle answers the engine's own -1 rather than unwinding into list layout mid-scroll. - setEventTransport plus /bridge. The worklet round trip is the one engine assumption here that hardware could still disprove, and the failure would be silent and total. The listener form is now a seam with the worklet transport as its default, and the string-handler fallback ships with the app owning the wire back from the background thread. - globalProps(). The engine calls exactly one updateGlobalProps, so an app cannot own that slot and still let a component react to a change. renderPage claims it and turns it into a signal. renderPage also emits firstScreen when the root component throws: it is the platform's cue to stop waiting, not a report of success. Core budget moves 5064 -> 5414 gzipped to cover all of it. Co-Authored-By: Claude Opus 5 <[email protected]>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Three things stood between a green suite and an app shipping this, and they
share a shape: each is a place where the runtime is the outermost JavaScript
frame, with native code or the job queue above it and no caller to hand a
problem to.
handler throwing inside the engine's dispatch and a commit throwing on the
promise job queue were both undefined behaviour with nothing listening.
Errors are now caught, tagged with their source, and reported; handlers on
one (type, name) are isolated from each other, a failed commit no longer
wedges the scheduler, and /recycle answers the engine's own -1 rather than
unwinding into list layout mid-scroll.
assumption here that hardware could still disprove, and the failure would be
silent and total. The listener form is now a seam with the worklet transport
as its default, and the string-handler fallback ships with the app owning the
wire back from the background thread.
cannot own that slot and still let a component react to a change. renderPage
claims it and turns it into a signal.
renderPage also emits firstScreen when the root component throws: it is the
platform's cue to stop waiting, not a report of success.
Core budget moves 5064 -> 5414 gzipped to cover all of it.
Co-Authored-By: Claude Opus 5 [email protected]
📦 Bundle-size delta vs main (
55e928b→dd123bc)Gzipped bytes of each bundled entry (esbuild, minified, browser/es2022, optional peer deps external). Bundling is deterministic, so unlike a timed benchmark these numbers carry no noise and every Δ is exact. ⚪ within ±0.5% · 🟢 smaller · 🔴 larger. Each package's
core (.)must stay flat as subpath features land — that is the whole charter, andsrc/core-size-budget.test.tsholds the absolute ceiling.