@@ -271,6 +271,52 @@ describe('Zod v4', () => {
271271 } ) ;
272272 } ) ;
273273
274+ it ( 'should reject a duplicate in-flight request id before overwriting stream mapping' , async ( ) => {
275+ let release ! : ( ) => void ;
276+ const gate = new Promise < void > ( resolve => {
277+ release = resolve ;
278+ } ) ;
279+ mcpServer . registerTool (
280+ 'hold' ,
281+ { description : 'wait before returning' , inputSchema : z . object ( { } ) } ,
282+ async ( ) : Promise < CallToolResult > => {
283+ await gate ;
284+ return { content : [ { type : 'text' , text : 'done' } ] } ;
285+ }
286+ ) ;
287+
288+ sessionId = await initializeServer ( ) ;
289+
290+ const duplicateId = 'duplicate-1' ;
291+ const firstMessage : JSONRPCMessage = {
292+ jsonrpc : '2.0' ,
293+ method : 'tools/call' ,
294+ params : { name : 'hold' , arguments : { } } ,
295+ id : duplicateId
296+ } ;
297+ const secondMessage : JSONRPCMessage = {
298+ jsonrpc : '2.0' ,
299+ method : 'tools/list' ,
300+ params : { } ,
301+ id : duplicateId
302+ } ;
303+
304+ let firstResponse : Response | undefined ;
305+ let secondResponse : Response | undefined ;
306+ try {
307+ firstResponse = await transport . handleRequest ( createRequest ( 'POST' , firstMessage , { sessionId } ) ) ;
308+ secondResponse = await transport . handleRequest ( createRequest ( 'POST' , secondMessage , { sessionId } ) ) ;
309+
310+ expect ( secondResponse . status ) . toBe ( 400 ) ;
311+ const errorData = await secondResponse . json ( ) ;
312+ expectErrorResponse ( errorData , - 32_600 , / a l r e a d y i n f l i g h t / ) ;
313+ } finally {
314+ release ( ) ;
315+ await firstResponse ?. body ?. cancel ( ) . catch ( ( ) => { } ) ;
316+ await secondResponse ?. body ?. cancel ( ) . catch ( ( ) => { } ) ;
317+ }
318+ } ) ;
319+
274320 it ( 'should reject requests without a valid session ID' , async ( ) => {
275321 const request = createRequest ( 'POST' , TEST_MESSAGES . toolsList ) ;
276322 const response = await transport . handleRequest ( request ) ;
0 commit comments