@@ -284,4 +284,50 @@ describe("WebRTCSession onconnectionstatechange", () => {
284284 // closeChannels SHOULD have been called, channels map should be empty
285285 expect ( session . channels . has ( 1 ) ) . toBe ( false ) ;
286286 } ) ;
287+
288+ describe ( "null-guard: openCDC rejects when pc is null" , ( ) => {
289+ it ( "openCDC rejects with 'peer connection closed' when pc is null" , async ( ) => {
290+ session . pc = null ;
291+ await expect ( session . openCDC ( ) ) . rejects . toBe (
292+ "peer connection closed" ,
293+ ) ;
294+ } ) ;
295+
296+ it ( "openCDC resolves normally when pc is not null" , async ( ) => {
297+ await session . connect ( undefined , true ) ;
298+ // Spy on createDataChannel to simulate CDC open
299+ const createDcSpy = vi . spyOn (
300+ session . pc as MockRTCPeerConnection ,
301+ "createDataChannel" ,
302+ ) ;
303+ const openCDCPromise = session . openCDC ( ) ;
304+ // Simulate the CDC opening
305+ const cdc = createDcSpy . mock . results [ 0 ] . value as MockRTCDataChannel ;
306+ cdc . readyState = "open" ;
307+ cdc . onopen ! ( ) ;
308+ await expect ( openCDCPromise ) . resolves . toBeUndefined ( ) ;
309+ } ) ;
310+ } ) ;
311+
312+ describe ( "null-guard: sendCTRLMsg rejects when pc is null" , ( ) => {
313+ it ( "sendCTRLMsg rejects with 'peer connection closed' when pc is null" , async ( ) => {
314+ session . pc = null ;
315+ const msg = { type : "resize" , args : { } } ;
316+ await expect ( session . sendCTRLMsg ( msg as any ) ) . rejects . toBe (
317+ "peer connection closed" ,
318+ ) ;
319+ } ) ;
320+
321+ it ( "sendCTRLMsg does not queue message when pc is null" , async ( ) => {
322+ session . pc = null ;
323+ const msg = { type : "resize" , args : { } } ;
324+ try {
325+ await session . sendCTRLMsg ( msg as any ) ;
326+ } catch {
327+ // expected rejection
328+ }
329+ // No message should be queued
330+ expect ( session . pendingCDCMsgs . length ) . toBe ( 0 ) ;
331+ } ) ;
332+ } ) ;
287333} ) ;
0 commit comments