



























@@ -2,10 +2,42 @@ import { expect } from "vitest";
22import { WebSocket } from "ws";
33import { connectOk, rpcReq, trackConnectChallengeNonce } from "./test-helpers.js";
445-export async function openAuthenticatedGatewayWs(port: number, token: string): Promise<WebSocket> {
5+export async function openAuthenticatedGatewayWs(
6+port: number,
7+token: string,
8+timeoutMs = 10_000,
9+): Promise<WebSocket> {
610const ws = new WebSocket(`ws://127.0.0.1:${port}`);
711trackConnectChallengeNonce(ws);
8-await new Promise<void>((resolve) => ws.once("open", resolve));
12+await new Promise<void>((resolve, reject) => {
13+const cleanup = () => {
14+clearTimeout(timer);
15+ws.off("open", onOpen);
16+ws.off("error", onError);
17+ws.off("close", onClose);
18+};
19+const onOpen = () => {
20+cleanup();
21+resolve();
22+};
23+const onError = (error: unknown) => {
24+cleanup();
25+reject(error instanceof Error ? error : new Error(String(error)));
26+};
27+const onClose = (code: number, reason: Buffer) => {
28+cleanup();
29+reject(new Error(`gateway websocket closed before open (${code}: ${reason.toString()})`));
30+};
31+const timer = setTimeout(() => {
32+cleanup();
33+ws.close();
34+reject(new Error(`gateway websocket did not open within ${timeoutMs}ms`));
35+}, timeoutMs);
36+timer.unref?.();
37+ws.once("open", onOpen);
38+ws.once("error", onError);
39+ws.once("close", onClose);
40+});
941await connectOk(ws, { token });
1042return ws;
1143}
@@ -17,8 +49,11 @@ export async function waitForGatewayWsClose(
1749return await new Promise((resolve, reject) => {
1850const timer = setTimeout(() => {
1951ws.off("close", onClose);
20-reject(new Error(`gateway websocket did not close within ${timeoutMs}ms`));
52+reject(
53+new Error(`gateway websocket did not close within ${timeoutMs}ms (state=${ws.readyState})`),
54+);
2155}, timeoutMs);
56+timer.unref?.();
2257const onClose = (code: number, reason: Buffer) => {
2358clearTimeout(timer);
2459resolve({ code, reason: reason.toString() });
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。