@@ -131,6 +131,34 @@ describe("WS endpoint re-framer (120/132)", () => {
131131 expect ( sent ) . toEqual ( [ ] ) ;
132132 } ) ;
133133
134+ test ( "stale pump cleanup does not erase the replacement turn cancel hook" , async ( ) => {
135+ const { ws } = mockWs ( ) ;
136+ let current = false ;
137+ const stalePump = pumpResponsesSseToWebSocket ( ws , sseStream ( [
138+ 'event: response.created\ndata: {"type":"response.created"}\n\n' ,
139+ ] ) , { isCurrent : ( ) => current } ) ;
140+ const replacementCancel = ( ) => { } ;
141+ ws . data . cancel = replacementCancel ;
142+ await stalePump ;
143+ expect ( ws . data . cancel ) . toBe ( replacementCancel ) ;
144+ } ) ;
145+
146+ test ( "invalid upstream SSE JSON emits one standalone protocol error and cancels" , async ( ) => {
147+ const { ws, sent } = mockWs ( ) ;
148+ let cancelled = false ;
149+ await pumpResponsesSseToWebSocket ( ws , sseStream ( [
150+ "event: response.created\ndata: {not-json}\n\n" ,
151+ 'event: response.completed\ndata: {"type":"response.completed"}\n\n' ,
152+ ] , ( ) => { cancelled = true ; } ) ) ;
153+ expect ( sent ) . toHaveLength ( 1 ) ;
154+ expect ( JSON . parse ( sent [ 0 ] ) ) . toMatchObject ( {
155+ type : "error" ,
156+ status : 502 ,
157+ error : { code : "websocket_protocol_error" } ,
158+ } ) ;
159+ expect ( cancelled ) . toBe ( true ) ;
160+ } ) ;
161+
134162 test ( "converts successful Responses JSON into output_item.done plus response.completed frames" , ( ) => {
135163 const { ws, sent } = mockWs ( ) ;
136164 sendResponsesJsonAsEvents ( ws , {
0 commit comments