feat(runtimed-wasm): install console_error_panic_hook#2105
Merged
Conversation
Design for dx emitting a Parquet head + a pull handle for incremental Arrow IPC continuation, so huge DataFrames render a first screenful immediately and grow in place. Key shape: - Head: 100-ish rows serialized as Parquet through the existing dx path. Sift's existing load hits immediately. - Continuation: new `nteract.dx.stream.<id>` comm. Runtime agent pulls Arrow IPC chunks outside the execution-message hot path and appends them as blob refs in a new manifest field on the same output id. - Transport is shared with #1815 (query backend). - No mutable blobs, no ContentRef shape change — chunks are a JSON list of existing blob refs inside the manifest. - Late joiners replay from the CRDT because chunks go through normal sync, not a side channel.
The namespace rule moved out of CLAUDE.md and now lives in .claude/rules/architecture.md § "Reserved Comm Namespace: `nteract.dx.*`". Update the two spec references to point there. No change to the design itself.
Rust panics inside WASM currently surface to the frontend as an opaque `__wbg___wbindgen_throw_6b64449b9b9ed33c` stack with wasm-function indices and no file/line. The error reaches the App ErrorBoundary and the "Something went wrong" fallback renders, but the cause is invisible in packaged / CI builds. This is exactly what's happening on UV Pyproject + UV Prewarmed E2E today (post-#2103): something in the runtime-doc read path panics when the daemon syncs a RuntimeState that walks through the full lifecycle starting → running, and we have no way to name it. Install `console_error_panic_hook::set_once()` from a `#[wasm_bindgen(start)]` function so it runs exactly once before any `NotebookHandle` is constructed. Panics now log with file, line, message, and a Rust backtrace. Combined with #2101 (ErrorBoundary → host logger), the next failing E2E run will emit both the React component stack and the Rust panic payload into `e2e-logs/app.log`. Rebuilds the WASM bundle to pick up the hook wiring. Verification: - `cargo xtask wasm runtimed` — succeeds - `deno test --allow-read crates/runtimed-wasm/tests/` — shape test still passes (51 filtered + 1 ok, the expected set)
The wasm panic hook from the previous commit calls `console.error`. In dev builds `attachConsole()` from tauri-plugin-log is DEV-only (see packages/notebook-host/src/tauri/index.ts:280), and the plugin only bridges Rust log output INTO the browser console — it doesn't forward browser console OUT to Rust. In packaged / CI builds the panic message goes to `console.error` and stops there. Install a small forwarder in main.tsx: wrap `console.error` to also call `logger.error` (host-log). WASM panics now land in notebook.log alongside everything else, visible in CI's `e2e-logs/app.log`. Preserves the original console.error behavior so devtools stays unchanged. The forwarding call is in a try/catch so a logger failure can't swallow the original error.
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.
Summary
Install
console_error_panic_hook::set_once()from a#[wasm_bindgen(start)]function so Rust panics inside WASM surface toconsole.errorwith file, line, message, and a Rust backtrace — instead of the opaque__wbg___wbindgen_throw_6b64449b9b9ed33cstack the frontend sees today.Why now
Post-#2103, Smoke / Deno / UI (Cell Visibility) E2E specs all go green. But UV Pyproject and UV Prewarmed still show the App ErrorBoundary fallback. The last lines of
e2e-logs/app.logfrom those runs look like this:That's a Rust panic bridged through wasm-bindgen's
throw_str. We can't read it — no file, no line, no message. The specs that fail are the ones that auto-launch a kernel against a fixture with pyproject.toml, so the daemon's RuntimeStateDoc walks through the full lifecycle (NotStarted → Resolving → PreparingEnv → Launching → Connecting → Running(Idle)). Empty-notebook specs never drive the state doc through those transitions, which is why they survived.Combined with #2101 (ErrorBoundary → host logger), the next failing CI run will emit both the React component stack and the Rust panic payload into
e2e-logs/app.log. Then we can fix the actual bug.Changes
crates/runtimed-wasm/Cargo.toml— addconsole_error_panic_hook = "0.1".crates/runtimed-wasm/src/lib.rs—#[wasm_bindgen(start)] pub fn __wasm_start() { console_error_panic_hook::set_once(); }. Runs exactly once at module init, before anyNotebookHandleis constructed.apps/notebook/src/wasm/runtimed-wasm/to pick up the wiring.Test plan
cargo xtask wasm runtimedsucceedsdeno test --allow-read crates/runtimed-wasm/tests/— the shape test from test(runtimed-wasm): assert RuntimeState shape from committed WASM #2104 still passes