fix(server): answer a close() during the priming write as Session not… - #2606
Draft
rxits wants to merge 3 commits into
Draft
fix(server): answer a close() during the priming write as Session not…#2606rxits wants to merge 3 commits into
rxits wants to merge 3 commits into
Conversation
… found, not Parse error handleRequest() re-checks _closed and answers 404 Session not found, but writePrimingEvent() awaits the user-supplied event store after those checks. A close() landing during that write left the priming event enqueueing onto an already-closed controller, and the resulting Invalid state error fell into the POST handler's catch-all, which answered 400 Parse error (-32700) — telling the client to fix a body that was never the problem. writePrimingEvent() now returns early when the transport closed during the store write, the POST handler answers 404 Session not found at that suspension point like it does at the two before it, and the catch-all maps to 500 Internal error (-32603). Genuine parse failures are unaffected: invalid JSON and invalid JSON-RPC messages are still answered 400 -32700 by the guards that precede it.
🦋 Changeset detectedLatest commit: de1eec2 The changes in this PR will be included in the next version bump. This PR includes changesets to release 6 packages
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
@modelcontextprotocol/client
@modelcontextprotocol/codemod
@modelcontextprotocol/core
@modelcontextprotocol/server
@modelcontextprotocol/server-legacy
@modelcontextprotocol/express
@modelcontextprotocol/fastify
@modelcontextprotocol/hono
@modelcontextprotocol/node
commit: |
… callback A user-supplied onsessioninitialized callback that throws is a server-internal failure — the client's body parsed fine — so it now answers 500 -32603 rather than 400 -32700. Update the middleware/node expectation to match; the two parse-error assertions in the same file cover genuinely invalid JSON and are unchanged.
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.
… found, not Parse error
handleRequest() re-checks _closed and answers 404 Session not found, but writePrimingEvent() awaits the user-supplied event store after those checks. A close() landing during that write left the priming event enqueueing onto an already-closed controller, and the resulting Invalid state error fell into the POST handler's catch-all, which answered 400 Parse error (-32700) — telling the client to fix a body that was never the problem.
writePrimingEvent() now returns early when the transport closed during the store write, the POST handler answers 404 Session not found at that suspension point like it does at the two before it, and the catch-all maps to 500 Internal error (-32603).
Genuine parse failures are unaffected: invalid JSON and invalid JSON-RPC messages are still answered 400 -32700 by the guards that precede it.
Motivation and Context
How Has This Been Tested?
Breaking Changes
Types of changes
Checklist
Additional context