@@ -108,6 +108,21 @@ describe("createProxyHandler", () => {
108108 expect ( mock . closeCode ) . toBe ( CloseCodes . BACKEND_UNAVAILABLE ) ;
109109 } ) ;
110110
111+ it ( "rejects binary frames" , ( ) => {
112+ const handler = createProxyHandler ( makePrincipal ( ) , makeDeps ( ) ) ;
113+ const mock = createMockWs ( ) ;
114+
115+ const msgEvent = new MessageEvent ( "message" , {
116+ data : new ArrayBuffer ( 8 ) ,
117+ } ) ;
118+
119+ // biome-ignore lint/suspicious/noExplicitAny: test mock
120+ handler . onMessage ?.( msgEvent , mock . ws as any ) ;
121+
122+ expect ( mock . closed ) . toBe ( true ) ;
123+ expect ( mock . closeCode ) . toBe ( 1003 ) ;
124+ } ) ;
125+
111126 it ( "handles oversized messages" , ( ) => {
112127 const handler = createProxyHandler ( makePrincipal ( ) , makeDeps ( ) ) ;
113128 const mock = createMockWs ( ) ;
@@ -181,6 +196,25 @@ describe("concurrent connection limit", () => {
181196
182197// --- Rate limiting ---
183198
199+ describe ( "pending message buffer" , ( ) => {
200+ it ( "closes connection when pending buffer overflows" , ( ) => {
201+ const handler = createProxyHandler ( makePrincipal ( ) , makeDeps ( ) ) ;
202+ const mock = createMockWs ( ) ;
203+
204+ // Don't call onOpen — connection stays in "connecting" state
205+ for ( let i = 0 ; i <= 20 ; i ++ ) {
206+ const msgEvent = new MessageEvent ( "message" , {
207+ data : JSON . stringify ( { type : "req" , method : "test" , i } ) ,
208+ } ) ;
209+ // biome-ignore lint/suspicious/noExplicitAny: test mock
210+ handler . onMessage ?.( msgEvent , mock . ws as any ) ;
211+ }
212+
213+ expect ( mock . closed ) . toBe ( true ) ;
214+ expect ( mock . closeCode ) . toBe ( CloseCodes . RATE_LIMITED ) ;
215+ } ) ;
216+ } ) ;
217+
184218describe ( "message rate limiting" , ( ) => {
185219 it ( "closes connection after exceeding rate limit" , ( ) => {
186220 const handler = createProxyHandler ( makePrincipal ( ) , makeDeps ( ) ) ;
0 commit comments