@@ -54,10 +54,31 @@ vi.mock("openclaw/plugin-sdk/provider-http", async () => {
5454
5555function releasedJson ( value : unknown ) {
5656 return {
57- response : {
58- json : async ( ) => value ,
57+ response : new Response ( JSON . stringify ( value ) , {
58+ status : 200 ,
59+ headers : { "content-type" : "application/json" } ,
60+ } ) ,
61+ release : vi . fn ( async ( ) => { } ) ,
62+ } ;
63+ }
64+
65+ function releasedOversizedJsonStream ( ) {
66+ let canceled = false ;
67+ const stream = new ReadableStream < Uint8Array > ( {
68+ start ( controller ) {
69+ controller . enqueue ( new Uint8Array ( 16 * 1024 * 1024 + 1 ) ) ;
5970 } ,
71+ cancel ( ) {
72+ canceled = true ;
73+ } ,
74+ } ) ;
75+ return {
76+ response : new Response ( stream , {
77+ status : 200 ,
78+ headers : { "content-type" : "application/json" } ,
79+ } ) ,
6080 release : vi . fn ( async ( ) => { } ) ,
81+ wasCanceled : ( ) => canceled ,
6182 } ;
6283}
6384
@@ -292,6 +313,40 @@ describe("openrouter video generation provider", () => {
292313 } ) ;
293314 } ) ;
294315
316+ it ( "cancels oversized OpenRouter video catalog success bodies" , async ( ) => {
317+ const oversized = releasedOversizedJsonStream ( ) ;
318+ fetchWithTimeoutGuardedMock . mockResolvedValueOnce ( oversized ) ;
319+
320+ await expect (
321+ listOpenRouterVideoModelCatalog ( {
322+ config : {
323+ models : {
324+ providers : {
325+ openrouter : {
326+ baseUrl : "https://custom.openrouter.test/openrouter/api/v1" ,
327+ } ,
328+ } ,
329+ } ,
330+ } as never ,
331+ env : { } ,
332+ resolveProviderApiKey : ( ) => ( {
333+ apiKey : "OPENROUTER_API_KEY" ,
334+ discoveryApiKey : "resolved-openrouter-key" ,
335+ } ) ,
336+ resolveProviderAuth : ( ) => ( {
337+ apiKey : "OPENROUTER_API_KEY" ,
338+ discoveryApiKey : "resolved-openrouter-key" ,
339+ mode : "api_key" ,
340+ source : "env" ,
341+ } ) ,
342+ } ) ,
343+ ) . rejects . toThrow (
344+ "OpenRouter video models request failed: JSON response exceeds 16777216 bytes" ,
345+ ) ;
346+ expect ( oversized . wasCanceled ( ) ) . toBe ( true ) ;
347+ expect ( oversized . release ) . toHaveBeenCalledOnce ( ) ;
348+ } ) ;
349+
295350 it ( "skips live OpenRouter video catalog discovery without an API key" , async ( ) => {
296351 await expect (
297352 listOpenRouterVideoModelCatalog ( {
0 commit comments