google-gemini / google-gemini/gemini-cli
fix(core): MessageBus.request() silently hangs 60s when publish() fails
- Dominant language
- TypeScript
- Stars
- 107k
- Forks
- 14.6k
- Avg merge
- 2d 3h
- Merged PRs (30d)
- 45
Description
## Bug Description
`MessageBus.request()` contains a floating promise that causes two failure modes when `publish()`
rejects:
1. The rejection is routed to `this.emit('error', error)` on the EventEmitter. If no `error`
listener is registered at call time, Node.js throws an uncaught exception and **crashes the
process**.
2. Even with an error listener, the `Promise` returned by `request()` silently hangs for the full
60-second timeout instead of failing fast — the caller gets no immediate signal that the publish
failed.
## Root Cause
In `packages/core/src/confirmation-bus/message-bus.ts`, inside the `new Promise()` constructor
callback, `this.publish()` is not awaited and has no `.catch()` chain:
```typescript
// eslint-disable-next-line @typescript-eslint/no-floating-promises,
@typescript-eslint/no-unsafe-type-assertion
this.publish({ ...request, correlationId } as TRequest);
```
## Fix
Chain .catch(reject) on the publish call so any publish failure immediately cancels the timeout and rejects the caller. This affects any code path that calls messageBus.request() — including the planned STEP_THROUGH_REQUEST/RESPONSE flow in step-through mode, where a malformed message would deadlock the scheduler for 60 seconds.
Contributor guide
Assessment
This issue has not been assessed yet.