feat: Use p/future for async handler execution #2
+9
−5
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
Use
p/futureinstead ofp/promisefor handler execution to enable true concurrent request processing.Changes
Benefits
1. Concurrent Request Handling
With
p/promise, handlers run synchronously on the request processing thread, blocking subsequent requests. Withp/future, handlers execute on a thread pool allowing multiple requests to be processed in parallel.Use case: MCP servers with swarm/multi-agent orchestration where multiple Claude instances make concurrent tool calls.
2. Stdout Protection
The
discarding-stdoutwrapper prevents accidentalprintlnor logging statements from corrupting the JSON-RPC channel (which uses stdout for communication).3. Non-blocking Event Loop
The main message processing loop stays responsive even when handlers are slow, preventing request queue buildup.
Testing
Tested with emacs-mcp swarm feature:
"working": 2)Backward Compatibility
This change is backward compatible - existing single-request usage works identically, with the added benefit of non-blocking execution.