fix(google-meet): handle stdout/stderr stream errors in node host#102105
Conversation
|
Codex review: needs real behavior proof before merge. Reviewed July 9, 2026, 12:54 AM ET / 04:54 UTC. Summary PR surface: Source -1, Tests +42. Total +41 across 2 files. Reproducibility: yes. at source level: current main leaves piped child streams without matching error listeners, and Node 24 throws on an unhandled error event. I did not run a live Google Meet chrome-node crash repro in this read-only review. Review metrics: none identified. Stored data model Root-cause cluster Members:
Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything. Merge readiness Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch. Rank-up moves:
Proof guidance:
Risk before merge
Maintainer options:
Next step before merge
Security Review detailsBest possible solution: Keep the focused plugin-owned stream-error hardening, add current-head real child-process or live chrome-node proof, then land after exact merge-ref checks pass. Do we have a high-confidence way to reproduce the issue? Yes at source level: current main leaves piped child streams without matching error listeners, and Node 24 throws on an unhandled error event. I did not run a live Google Meet chrome-node crash repro in this read-only review. Is this the best way to solve the issue? Yes for the code shape: the PR fixes the issue at the Google Meet plugin child-process boundary and matches the merged realtime bridge pattern. It is not merge-ready until current-head real behavior proof is added or overridden. AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning high; reviewed against d6ec1c6ceab3. Label changesLabel changes:
Label justifications:
Evidence reviewedPR surface: Source -1, Tests +42. Total +41 across 2 files. View PR surface stats
What I checked:
Likely related people:
What the crustacean ranks mean
Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics. How this review workflow works
Review history (9 earlier review cycles; latest 8 shown)
|
|
@clawsweeper re-review |
|
🦞🧹 I asked ClawSweeper to review this item again. |
|
@clawsweeper re-review Fixed the round-2 P1: removed the nonexistent inputProcess.stdin listener. 8de7545.
Verified locally on the PR head:
🤖 Generated with Claude Code |
|
🦞🧹 I asked ClawSweeper to review this item again. |
|
@clawsweeper re-review Fixed the round-2 P1: removed the nonexistent inputProcess.stdin listener. 8de7545.
Verified locally on the PR head:
🤖 Generated with Claude Code |
Co-authored-by: wangmiao0668000666 <[email protected]>
8de7545 to
5903b9f
Compare
|
Land-ready maintainer pass complete on exact head What changed:
Proof:
Known gap: the failure burst is forced through deterministic child-process mocks; this does not join a live Google Meet call or require BlackHole/audio hardware. |
|
Merged via squash.
|
|
Thanks @steipete for the fast merge — and for catching the missing stdin error listener path in the r2 review. The stream-error campaign in |
Co-authored-by: Peter Steinberger <[email protected]>
Co-authored-by: Peter Steinberger <[email protected]> (cherry picked from commit 624dfa6)
What Problem This Solves
The Google Meet node-host command pair handled child-process failures but left the input stdout/stderr and output stderr streams without
errorlisteners. A stream failure could therefore escape the bridge lifecycle as an unhandled EventEmitter error, while a burst of related process and stream failures could schedule child termination repeatedly.Why This Change Was Made
The node-host now routes every piped stream failure through one idempotent session stop path. Output handlers share a current-process guard so a replaced playback process cannot close the active bridge; input and output children are terminated only on the first failure.
The original four-commit implementation and its test-only production exports were replaced with a smaller refactor and a regression in the existing public node-host command suite.
User Impact
Google Meet Chrome-node audio sessions now close cleanly when their local audio command pipes fail instead of risking a gateway crash or duplicated termination timers. Normal bridge start, output clearing, and stop behavior is unchanged.
Evidence
node scripts/run-vitest.mjs extensions/google-meet/node-host.test.ts --reporter=verboseon Linux Testbox: 1 file, 6 tests passed.pnpm check:changedon Linux Testbox: extension production/test types, lint, import cycles, and repository guards passed.git diff --check: passed.Real behavior proof
The public
handleGoogleMeetNodeHostCommandtest starts the command-pair lifecycle, emits output-stderr and input-stdout/input-stderr errors in one teardown burst, then verifies the bridge is closed and each child receives exactly oneSIGTERM. Removing any new listener makes the corresponding EventEmittererrorunhandled; removing the idempotent stop guard makes the termination-count assertion fail.Known proof gap
The regression uses the existing child-process mock to deterministically force all three stream errors. It does not join a live Google Meet call or depend on BlackHole/audio hardware.