Skip to content

Commit 9c70649

Browse files
authored
fix(qmux): silence application abort warnings (#362)
1 parent fc61d25 commit 9c70649

4 files changed

Lines changed: 35 additions & 6 deletions

File tree

bun.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

js/qmux/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@moq/qmux",
33
"author": "Luke Curley <kixelated@gmail.com>",
4-
"version": "0.3.2",
4+
"version": "0.3.3",
55
"description": "QMux protocol (draft-ietf-quic-qmux-02) over WebSockets",
66
"type": "module",
77
"license": "(MIT OR Apache-2.0)",

js/qmux/src/session.test.ts

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { afterEach, beforeEach, describe, expect, test } from "bun:test";
1+
import { afterEach, beforeEach, describe, expect, spyOn, test } from "bun:test";
22
import type { WebSocketLike, WebSocketStreamLike } from "@moq/web-socket-stream";
33
import { SessionError, StreamError } from "./error.ts";
44
import * as Frame from "./frame.ts";
@@ -308,6 +308,38 @@ describe("Session integration (scripted peer)", () => {
308308
session.close();
309309
});
310310

311+
test("application aborts do not log warnings", async () => {
312+
const warn = spyOn(console, "warn").mockImplementation(() => {});
313+
const { session, peer } = connect();
314+
315+
try {
316+
await session.ready;
317+
peer.send({ type: "transport_parameters", params: peerParams() });
318+
319+
const uni = await session.createUnidirectionalStream();
320+
await uni.abort(new Error("application closed uni stream"));
321+
322+
const bidi = await session.createBidirectionalStream();
323+
await bidi.writable.abort(new Error("application closed local bidi stream"));
324+
325+
peer.send({
326+
type: "stream",
327+
id: Stream.Id.create(0n, Stream.Dir.Bi, true),
328+
data: new Uint8Array([1]),
329+
fin: false,
330+
});
331+
const incoming = await session.incomingBidirectionalStreams.getReader().read();
332+
if (!incoming.value) throw new Error("expected an incoming bidirectional stream");
333+
await incoming.value.writable.abort(new Error("application closed incoming bidi stream"));
334+
335+
await waitFor(() => peer.count("reset_stream") === 3);
336+
expect(warn).not.toHaveBeenCalled();
337+
} finally {
338+
session.close();
339+
warn.mockRestore();
340+
}
341+
});
342+
311343
test("cancelling with a WebTransportError sends its streamErrorCode as STOP_SENDING", async () => {
312344
const { session, peer } = connect();
313345
await session.ready;

js/qmux/src/session.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1375,7 +1375,6 @@ export default class Session implements WebTransport {
13751375
await this.#sendStreamData(frame.id, chunk);
13761376
},
13771377
abort: (e) => {
1378-
console.warn("abort", e);
13791378
this.#scheduler?.dropStream(streamId, e instanceof Error ? e : new Error("stream aborted"));
13801379
this.#sendPriorityFrame({
13811380
type: "reset_stream",
@@ -1711,7 +1710,6 @@ export default class Session implements WebTransport {
17111710
await this.#sendStreamData(streamId, chunk);
17121711
},
17131712
abort: (e) => {
1714-
console.warn("abort", e);
17151713
this.#scheduler?.dropStream(streamIdVal, e instanceof Error ? e : new Error("stream aborted"));
17161714
this.#sendPriorityFrame({
17171715
type: "reset_stream",
@@ -1791,7 +1789,6 @@ export default class Session implements WebTransport {
17911789
await session.#sendStreamData(streamId, chunk);
17921790
},
17931791
abort(e) {
1794-
console.warn("abort", e);
17951792
session.#scheduler?.dropStream(streamIdVal, e instanceof Error ? e : new Error("stream aborted"));
17961793
session.#sendPriorityFrame({
17971794
type: "reset_stream",

0 commit comments

Comments
 (0)