mirror of
https://github.com/oven-sh/bun
synced 2026-02-09 18:38:55 +00:00
## Summary - Fixed `Bun.Terminal` callbacks (data, exit, drain) not being invoked when the terminal is created inside `AsyncLocalStorage.run()` ## Root Cause The bug was a redundant `isCallable()` check when storing callbacks in `initTerminal()`: 1. In `Options.parseFromJS()`, callbacks are validated with `isCallable()`, then wrapped with `withAsyncContextIfNeeded()` 2. Inside `AsyncLocalStorage.run()`, `withAsyncContextIfNeeded()` returns an `AsyncContextFrame` object that wraps the callback + async context 3. An `AsyncContextFrame` is NOT callable - it's a wrapper object. So the second `isCallable()` check fails 4. Because the check fails, the callback is never stored via `js.gc.set()` 5. When `onReadChunk()` tries to get the callback, it returns `null` and the callback is never invoked ## Fix Removed the redundant `isCallable()` check in `initTerminal()`. The check was already performed in `parseFromJS()` before wrapping. Other similar patterns (socket Handlers, Timer) simply store the wrapped callback without re-checking. Fixes #26286 ## Test plan - [x] Added regression test in `test/regression/issue/26286.test.ts` - [x] Verified test fails with system Bun (times out because callback never invoked) - [x] Verified test passes with debug build 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Bot <claude-bot@bun.sh> Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
1.9 KiB
1.9 KiB