Files
pikasTech-HWLAB/internal/dev-entrypoint/http.test.mjs
T
2026-05-23 05:10:14 +00:00

104 lines
2.9 KiB
JavaScript

import assert from "node:assert/strict";
import { createServer } from "node:http";
import test from "node:test";
import { proxyHttpRequest } from "./http.mjs";
test("dev entrypoint proxy allows slow first response beyond legacy 4500ms", async () => {
const upstream = createServer((request, response) => {
request.resume();
setTimeout(() => {
response.writeHead(200, { "content-type": "application/json" });
response.end(JSON.stringify({
status: "completed",
traceId: request.headers["x-trace-id"] ?? null
}));
}, 4700);
});
await listen(upstream);
const proxy = createServer((request, response) => {
proxyHttpRequest({
request,
response,
upstream: serverUrl(upstream),
timeoutMs: 6000
});
});
await listen(proxy);
try {
const startedAt = Date.now();
const response = await fetch(`${serverUrl(proxy)}/v1/agent/chat`, {
method: "POST",
headers: {
"content-type": "application/json",
"x-trace-id": "trc_dev-entrypoint-proxy-slow-success"
},
body: JSON.stringify({ message: "列出你能使用的所有skill" })
});
assert.equal(response.status, 200);
assert.equal(Date.now() - startedAt >= 4500, true);
const payload = await response.json();
assert.equal(payload.status, "completed");
assert.equal(payload.traceId, "trc_dev-entrypoint-proxy-slow-success");
} finally {
await close(proxy);
await close(upstream);
}
});
test("dev entrypoint proxy returns 502 when hard timeout expires", async () => {
const upstream = createServer((request, response) => {
request.resume();
setTimeout(() => {
response.writeHead(200, { "content-type": "application/json" });
response.end(JSON.stringify({ status: "completed" }));
}, 250);
});
await listen(upstream);
const proxy = createServer((request, response) => {
proxyHttpRequest({
request,
response,
upstream: serverUrl(upstream),
timeoutMs: 50
});
});
await listen(proxy);
try {
const response = await fetch(`${serverUrl(proxy)}/v1/agent/chat`, {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({ message: "slow" })
});
assert.equal(response.status, 502);
const payload = await response.json();
assert.equal(payload.error, "upstream_unavailable");
assert.match(payload.message, /timed out after 50ms/u);
} finally {
await close(proxy);
await close(upstream);
}
});
function listen(server) {
return new Promise((resolve, reject) => {
server.once("error", reject);
server.listen(0, "127.0.0.1", resolve);
});
}
function close(server) {
return new Promise((resolve, reject) => {
server.close((error) => (error ? reject(error) : resolve()));
});
}
function serverUrl(server) {
const address = server.address();
return `http://127.0.0.1:${address.port}`;
}