



























@@ -16,6 +16,20 @@ const { agentCtor, envHttpProxyAgentCtor, proxyAgentCtor } = vi.hoisted(() => ({
1616}),
1717}));
181819+const { getDefaultAutoSelectFamily, isWSL2SyncMock } = vi.hoisted(() => ({
20+getDefaultAutoSelectFamily: vi.fn(() => true as boolean | undefined),
21+isWSL2SyncMock: vi.fn(() => false),
22+}));
23+24+vi.mock("node:net", async (importOriginal) => ({
25+ ...(await importOriginal<typeof import("node:net")>()),
26+ getDefaultAutoSelectFamily,
27+}));
28+29+vi.mock("../wsl.js", () => ({
30+isWSL2Sync: isWSL2SyncMock,
31+}));
32+1933import type { PinnedHostname } from "./ssrf.js";
20342135let createPinnedDispatcher: typeof import("./ssrf.js").createPinnedDispatcher;
@@ -28,6 +42,8 @@ beforeEach(() => {
2842agentCtor.mockClear();
2943envHttpProxyAgentCtor.mockClear();
3044proxyAgentCtor.mockClear();
45+getDefaultAutoSelectFamily.mockReturnValue(true);
46+isWSL2SyncMock.mockReturnValue(false);
3147(globalThis as Record<string, unknown>)[TEST_UNDICI_RUNTIME_DEPS_KEY] = {
3248Agent: agentCtor,
3349EnvHttpProxyAgent: envHttpProxyAgentCtor,
@@ -62,7 +78,7 @@ function createDispatcherWithPinnedOverride(lookup: PinnedHostname["lookup"]) {
6278}
63796480describe("createPinnedDispatcher", () => {
65-it("uses pinned lookup without overriding global family policy", () => {
81+it("uses pinned lookup and inherits the shared undici family policy", () => {
6682const lookup = vi.fn() as unknown as PinnedHostname["lookup"];
6783const pinned: PinnedHostname = {
6884hostname: "api.telegram.org",
@@ -76,13 +92,36 @@ describe("createPinnedDispatcher", () => {
7692expect(agentCtor).toHaveBeenCalledWith({
7793connect: {
7894 lookup,
95+autoSelectFamily: true,
96+autoSelectFamilyAttemptTimeout: 300,
7997},
8098allowH2: false,
8199});
82100const firstCallArg = agentCtor.mock.calls[0]?.[0] as
83101| { connect?: Record<string, unknown> }
84102| undefined;
85-expect(firstCallArg?.connect?.autoSelectFamily).toBeUndefined();
103+expect(firstCallArg?.connect?.autoSelectFamily).toBe(true);
104+});
105+106+it("reuses the global WSL2 autoSelectFamily policy for pinned dispatchers", () => {
107+isWSL2SyncMock.mockReturnValue(true);
108+const lookup = vi.fn() as unknown as PinnedHostname["lookup"];
109+const pinned: PinnedHostname = {
110+hostname: "api.telegram.org",
111+addresses: ["149.154.167.220"],
112+ lookup,
113+};
114+115+createPinnedDispatcher(pinned);
116+117+expect(agentCtor).toHaveBeenCalledWith({
118+connect: {
119+ lookup,
120+autoSelectFamily: false,
121+autoSelectFamilyAttemptTimeout: 300,
122+},
123+allowH2: false,
124+});
86125});
8712688127it("preserves caller transport hints while overriding lookup", () => {
@@ -113,6 +152,32 @@ describe("createPinnedDispatcher", () => {
113152});
114153});
115154155+it("preserves explicit family-selection opt-outs", () => {
156+const lookup = vi.fn() as unknown as PinnedHostname["lookup"];
157+const pinned: PinnedHostname = {
158+hostname: "api.telegram.org",
159+addresses: ["149.154.167.220"],
160+ lookup,
161+};
162+163+createPinnedDispatcher(pinned, {
164+mode: "direct",
165+connect: {
166+autoSelectFamily: false,
167+autoSelectFamilyAttemptTimeout: 50,
168+},
169+});
170+171+expect(agentCtor).toHaveBeenCalledWith({
172+connect: {
173+autoSelectFamily: false,
174+autoSelectFamilyAttemptTimeout: 50,
175+ lookup,
176+},
177+allowH2: false,
178+});
179+});
180+116181it("applies stream timeouts to pinned direct dispatchers", () => {
117182const lookup = vi.fn() as unknown as PinnedHostname["lookup"];
118183const pinned: PinnedHostname = {
@@ -126,6 +191,8 @@ describe("createPinnedDispatcher", () => {
126191expect(agentCtor).toHaveBeenCalledWith({
127192connect: {
128193 lookup,
194+autoSelectFamily: true,
195+autoSelectFamilyAttemptTimeout: 300,
129196timeout: 123_456,
130197},
131198allowH2: false,
@@ -204,11 +271,13 @@ describe("createPinnedDispatcher", () => {
204271expect(envHttpProxyAgentCtor).toHaveBeenCalledWith({
205272connect: {
206273autoSelectFamily: true,
274+autoSelectFamilyAttemptTimeout: 300,
207275 lookup,
208276},
209277allowH2: false,
210278proxyTls: {
211279autoSelectFamily: true,
280+autoSelectFamilyAttemptTimeout: 300,
212281},
213282});
214283});
@@ -231,6 +300,10 @@ describe("createPinnedDispatcher", () => {
231300232301expect(proxyAgentCtor).toHaveBeenCalledWith({
233302uri: "http://127.0.0.1:7890",
303+proxyTls: {
304+autoSelectFamily: true,
305+autoSelectFamilyAttemptTimeout: 300,
306+},
234307allowH2: false,
235308requestTls: {
236309autoSelectFamily: false,
@@ -266,7 +339,9 @@ describe("createPinnedDispatcher", () => {
266339autoSelectFamily: false,
267340 lookup,
268341},
269-connect: {
342+proxyTls: {
343+autoSelectFamily: true,
344+autoSelectFamilyAttemptTimeout: 300,
270345timeout: 654_321,
271346},
272347allowH2: false,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。