diff --git a/extensions/browser/src/browser/server-context.loopback-direct-ws.test.ts b/extensions/browser/src/browser/server-context.loopback-direct-ws.test.ts index 22a3b69711d..210e519da84 100644 --- a/extensions/browser/src/browser/server-context.loopback-direct-ws.test.ts +++ b/extensions/browser/src/browser/server-context.loopback-direct-ws.test.ts @@ -1,5 +1,5 @@ import { afterEach, describe, expect, it, vi } from "vitest"; -import { withFetchPreconnect } from "../../test-support.js"; +import { withBrowserFetchPreconnect } from "../../test-fetch.js"; import * as cdpModule from "./cdp.js"; import { BrowserCdpEndpointBlockedError } from "./errors.js"; import { createBrowserRouteContext } from "./server-context.js"; @@ -33,7 +33,7 @@ describe("browser server-context loopback direct WebSocket profiles", () => { } as unknown as Response; }); - global.fetch = withFetchPreconnect(fetchMock); + global.fetch = withBrowserFetchPreconnect(fetchMock); const state = makeState("openclaw"); state.resolved.ssrfPolicy = {}; state.resolved.profiles.openclaw = { @@ -78,7 +78,7 @@ describe("browser server-context loopback direct WebSocket profiles", () => { throw new Error(`unexpected fetch: ${u}`); }); - global.fetch = withFetchPreconnect(fetchMock); + global.fetch = withBrowserFetchPreconnect(fetchMock); const state = makeState("openclaw"); state.resolved.ssrfPolicy = {}; state.resolved.profiles.openclaw = { @@ -127,7 +127,7 @@ describe("browser server-context loopback direct WebSocket profiles", () => { throw new Error(`unexpected fetch: ${u}`); }); - global.fetch = withFetchPreconnect(fetchMock); + global.fetch = withBrowserFetchPreconnect(fetchMock); const state = makeState("openclaw"); state.resolved.profiles.openclaw = { cdpUrl: "wss://127.0.0.1:18800/cdp?token=abc", @@ -148,7 +148,7 @@ describe("browser server-context loopback direct WebSocket profiles", () => { throw new Error("unexpected fetch"); }); - global.fetch = withFetchPreconnect(fetchMock); + global.fetch = withBrowserFetchPreconnect(fetchMock); const state = makeState("openclaw"); state.resolved.ssrfPolicy = { dangerouslyAllowPrivateNetwork: false, diff --git a/extensions/browser/src/browser/server-context.remote-tab-ops.harness.ts b/extensions/browser/src/browser/server-context.remote-tab-ops.harness.ts index 824f122f34a..6d339a9db3f 100644 --- a/extensions/browser/src/browser/server-context.remote-tab-ops.harness.ts +++ b/extensions/browser/src/browser/server-context.remote-tab-ops.harness.ts @@ -1,5 +1,5 @@ import { vi } from "vitest"; -import { withFetchPreconnect } from "../../test-support.js"; +import { withBrowserFetchPreconnect } from "../../test-fetch.js"; import type { BrowserServerState } from "./server-context.js"; import { createBrowserRouteContext } from "./server-context.js"; @@ -50,7 +50,7 @@ export function makeUnexpectedFetchMock() { export function createRemoteRouteHarness(fetchMock?: (url: unknown) => Promise) { const activeFetchMock = fetchMock ?? makeUnexpectedFetchMock(); - global.fetch = withFetchPreconnect(activeFetchMock); + global.fetch = withBrowserFetchPreconnect(activeFetchMock); const state = makeState("remote"); const ctx = createBrowserRouteContext({ getState: () => state }); return { state, remote: ctx.forProfile("remote"), fetchMock: activeFetchMock }; diff --git a/extensions/browser/src/browser/server-context.tab-selection-state.test.ts b/extensions/browser/src/browser/server-context.tab-selection-state.test.ts index 03354909abf..953360c6733 100644 --- a/extensions/browser/src/browser/server-context.tab-selection-state.test.ts +++ b/extensions/browser/src/browser/server-context.tab-selection-state.test.ts @@ -1,5 +1,5 @@ import { afterEach, describe, expect, it, vi } from "vitest"; -import { withFetchPreconnect } from "../../test-support.js"; +import { withBrowserFetchPreconnect } from "../../test-fetch.js"; vi.hoisted(() => { vi.resetModules(); @@ -82,7 +82,7 @@ async function openManagedTabWithRunningProfile(params: { fetchMock: ReturnType; url?: string; }) { - global.fetch = withFetchPreconnect(params.fetchMock); + global.fetch = withBrowserFetchPreconnect(params.fetchMock); const state = makeState("openclaw"); seedRunningProfileState(state); const ctx = createBrowserRouteContext({ getState: () => state }); @@ -115,7 +115,7 @@ describe("browser server-context tab selection state", () => { } as unknown as Response; }); - global.fetch = withFetchPreconnect(fetchMock); + global.fetch = withBrowserFetchPreconnect(fetchMock); const state = makeState("openclaw"); const ctx = createBrowserRouteContext({ getState: () => state }); const openclaw = ctx.forProfile("openclaw"); @@ -159,7 +159,7 @@ describe("browser server-context tab selection state", () => { } as unknown as Response; }); - global.fetch = withFetchPreconnect(fetchMock); + global.fetch = withBrowserFetchPreconnect(fetchMock); const state = makeState("openclaw"); state.resolved.ssrfPolicy = {}; const ctx = createBrowserRouteContext({ getState: () => state }); @@ -225,7 +225,7 @@ describe("browser server-context tab selection state", () => { throw new Error(`unexpected fetch: ${value}`); }); - global.fetch = withFetchPreconnect(fetchMock); + global.fetch = withBrowserFetchPreconnect(fetchMock); const state = makeState("openclaw"); seedRunningProfileState(state); const ctx = createBrowserRouteContext({ getState: () => state }); @@ -245,7 +245,7 @@ describe("browser server-context tab selection state", () => { }, }); - global.fetch = withFetchPreconnect(fetchMock); + global.fetch = withBrowserFetchPreconnect(fetchMock); const state = makeState("openclaw"); state.resolved.attachOnly = true; const ctx = createBrowserRouteContext({ getState: () => state }); @@ -287,7 +287,7 @@ describe("browser server-context tab selection state", () => { throw new Error("unexpected fetch"); }); - global.fetch = withFetchPreconnect(fetchMock); + global.fetch = withBrowserFetchPreconnect(fetchMock); const state = makeState("openclaw"); const ctx = createBrowserRouteContext({ getState: () => state }); const openclaw = ctx.forProfile("openclaw"); diff --git a/extensions/browser/test-fetch.ts b/extensions/browser/test-fetch.ts new file mode 100644 index 00000000000..b8926a65502 --- /dev/null +++ b/extensions/browser/test-fetch.ts @@ -0,0 +1,22 @@ +type FetchPreconnectOptions = { + dns?: boolean; + tcp?: boolean; + http?: boolean; + https?: boolean; +}; + +type FetchWithPreconnect = { + preconnect: (url: string | URL, options?: FetchPreconnectOptions) => void; + __openclawAcceptsDispatcher: true; +}; + +export function withBrowserFetchPreconnect(fn: T): T & FetchWithPreconnect; +export function withBrowserFetchPreconnect( + fn: T, +): T & FetchWithPreconnect & typeof fetch; +export function withBrowserFetchPreconnect(fn: object) { + return Object.assign(fn, { + preconnect: (_url: string | URL, _options?: FetchPreconnectOptions) => {}, + __openclawAcceptsDispatcher: true as const, + }); +}