Skip to content

Commit f7becd9

Browse files
author
root
committed
Guarding openCDC and sendCTRLMsg against null pc #490
1 parent d1984a8 commit f7becd9

2 files changed

Lines changed: 53 additions & 0 deletions

File tree

src/webrtc_session.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,9 @@ export class WebRTCSession extends BaseSession {
281281
} else return this.getPayload();
282282
}
283283
openCDC(): Promise<void> {
284+
if (!this.pc) {
285+
return Promise.reject("peer connection closed");
286+
}
284287
// stop listening for messages
285288
if (this.cdc) {
286289
this.cdc.onmessage = undefined;
@@ -329,6 +332,10 @@ export class WebRTCSession extends BaseSession {
329332
}
330333
sendCTRLMsg(msg: ControlMessage): Promise<string> {
331334
return new Promise((resolve, reject) => {
335+
if (!this.pc) {
336+
reject("peer connection closed");
337+
return;
338+
}
332339
const timeout = terminal7.run(() => {
333340
terminal7.log("timeout on ctrl message", msg);
334341
reject(Failure.TimedOut);

tests/webrtc_session.test.ts

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)