refactor(core): migrate to Bun and converge acquisition policies and Agent boundaries

This commit is contained in:
root committed 2026-10-13 14:37:03 +08:00
1 parent 3f1c6d02f6
commit 27c0f27434
268 files changed
+7468 -7852

No files matched your search

@@ -1,4 +1,5 @@
import { DEFAULT_SETTINGS } from "@umt/contracts";
import { type HttpServer, serve } from "@umt/runtime";
import { afterAll, beforeAll, describe, expect, it } from "vitest";
import {
directHttpClient,
@@ -27,66 +28,58 @@ const PROXY_KEYS = [
];
describe("出口选择(直连 / 代理)", () => {
let proxy: Deno.HttpServer<Deno.NetAddr>;
let target: Deno.HttpServer<Deno.NetAddr>;
let proxy: HttpServer;
let target: HttpServer;
let proxyUrl = "";
let targetUrl = "";
const proxied: string[] = [];
const saved = new Map<string, string | undefined>();
beforeAll(() => {
proxy = Deno.serve({ hostname: "127.0.0.1", port: 0, onListen() {} }, (req) => {
proxy = serve({ hostname: "127.0.0.1", port: 0, onListen() {} }, (req) => {
proxied.push(req.url);
return new Response("via-proxy");
});
target = Deno.serve({ hostname: "127.0.0.1", port: 0, onListen() {} }, () => new Response("direct"));
target = serve({ hostname: "127.0.0.1", port: 0, onListen() {} }, () => new Response("direct"));
proxyUrl = `http://127.0.0.1:${proxy.addr.port}`;
targetUrl = `http://127.0.0.1:${target.addr.port}/x`;
for (const k of PROXY_KEYS) {
saved.set(k, Deno.env.get(k));
Deno.env.delete(k);
saved.set(k, process.env[k]);
delete process.env[k];
}
// 模拟容器环境:HTTP_PROXY 指向"中继",没有 NO_PROXY
Deno.env.set("HTTP_PROXY", proxyUrl);
process.env.HTTP_PROXY = proxyUrl;
});
afterAll(async () => {
for (const [k, v] of saved) {
if (v === undefined) Deno.env.delete(k);
else Deno.env.set(k, v);
if (v === undefined) delete process.env[k];
else process.env[k] = v;
}
await proxy.shutdown();
await target.shutdown();
});
const body = async (f: typeof fetch) => (await f(targetUrl)).text();
it("Deno 2.9 语义:createHttpClient({}) 仍会读 HTTP_PROXY(所以直连要显式做)", async () => {
const implicit = Deno.createHttpClient({});
try {
expect(await body(fetchVia(implicit))).toBe("via-proxy");
} finally {
implicit.close();
}
});
const body = async (f: (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>) =>
(await f(targetUrl)).text();
it("directHttpClient:环境变量里有代理也直连;创建后环境变量原样还原", async () => {
proxied.length = 0;
expect(await body(fetchVia(directHttpClient()))).toBe("direct");
expect(proxied).toEqual([]);
expect(Deno.env.get("HTTP_PROXY")).toBe(proxyUrl);
expect(process.env.HTTP_PROXY).toBe(proxyUrl);
});
it("proxyHttpClient:只走给定代理(NO_PROXY 命中也不绕过)", async () => {
Deno.env.set("NO_PROXY", "127.0.0.1");
process.env.NO_PROXY = "127.0.0.1";
try {
proxied.length = 0;
const client = proxyHttpClient(proxyUrl);
expect(await body(fetchVia(client))).toBe("via-proxy");
expect(proxied).toHaveLength(1);
expect(Deno.env.get("NO_PROXY")).toBe("127.0.0.1");
expect(process.env.NO_PROXY).toBe("127.0.0.1");
} finally {
Deno.env.delete("NO_PROXY");
delete process.env.NO_PROXY;
}
});