mirror of
https://github.com/oven-sh/bun
synced 2026-02-09 10:28:47 +00:00
### What does this PR do? ### How did you verify your code works? --------- Co-authored-by: Claude Bot <claude-bot@bun.sh> Co-authored-by: Claude <noreply@anthropic.com>
80 lines
4.3 KiB
JavaScript
Generated
80 lines
4.3 KiB
JavaScript
Generated
import { heapStats } from "bun:jsc";
|
|
|
|
const { SERVER } = process.env;
|
|
|
|
if (typeof SERVER === "undefined" || !SERVER?.length) {
|
|
throw new Error("SERVER environment variable is not set");
|
|
}
|
|
|
|
const COUNT = parseInt(process.env.COUNT || "50", 10);
|
|
var oks = 0;
|
|
var textLength = 0;
|
|
Bun.gc(true);
|
|
async function getBaseline() {
|
|
async function iterate() {
|
|
const tls =
|
|
process.env.NAME === "tls-with-client"
|
|
? {
|
|
cert: "-----BEGIN CERTIFICATE-----\nMIIDXTCCAkWgAwIBAgIJAKLdQVPy90jjMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV\nBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX\naWRnaXRzIFB0eSBMdGQwHhcNMTkwMjAzMTQ0OTM1WhcNMjAwMjAzMTQ0OTM1WjBF\nMQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50\nZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB\nCgKCAQEA7i7IIEdICTiSTVx+ma6xHxOtcbd6wGW3nkxlCkJ1UuV8NmY5ovMsGnGD\nhJJtUQ2j5ig5BcJUf3tezqCNW4tKnSOgSISfEAKvpn2BPvaFq3yx2Yjz0ruvcGKp\nDMZBXmB/AAtGyN/UFXzkrcfppmLHJTaBYGG6KnmU43gPkSDy4iw46CJFUOupc51A\nFIz7RsE7mbT1plCM8e75gfqaZSn2k+Wmy+8n1HGyYHhVISRVvPqkS7gVLSVEdTea\nUtKP1Vx/818/HDWk3oIvDVWI9CFH73elNxBkMH5zArSNIBTehdnehyAevjY4RaC/\nkK8rslO3e4EtJ9SnA4swOjCiqAIQEwIDAQABo1AwTjAdBgNVHQ4EFgQUv5rc9Smm\n9c4YnNf3hR49t4rH4yswHwYDVR0jBBgwFoAUv5rc9Smm9c4YnNf3hR49t4rH4ysw\nDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEATcL9CAAXg0u//eYUAlQa\nL+l8yKHS1rsq1sdmx7pvsmfZ2g8ONQGfSF3TkzkI2OOnCBokeqAYuyT8awfdNUtE\nEHOihv4ZzhK2YZVuy0fHX2d4cCFeQpdxno7aN6B37qtsLIRZxkD8PU60Dfu9ea5F\nDDynnD0TUabna6a0iGn77yD8GPhjaJMOz3gMYjQFqsKL252isDVHEDbpVxIzxPmN\nw1+WK8zRNdunAcHikeoKCuAPvlZ83gDQHp07dYdbuZvHwGj0nfxBLc9qt90XsBtC\n4IYR7c/bcLMmKXYf0qoQ4OzngsnPI5M+v9QEHvYWaKVwFY4CTcSNJEwfXw+BAeO5\nOA==\n-----END CERTIFICATE-----",
|
|
}
|
|
: null;
|
|
const resp = await fetch(SERVER, { tls });
|
|
textLength = Number(resp.headers.get("Content-Length"));
|
|
if (!textLength) {
|
|
throw new Error("Content-Length header is not set");
|
|
}
|
|
(await resp.arrayBuffer()).byteLength;
|
|
}
|
|
|
|
for (let i = 0; i < Math.max(Math.ceil(COUNT / 10), 1); i++) {
|
|
await iterate();
|
|
}
|
|
|
|
Bun.gc(true);
|
|
|
|
return process.memoryUsage.rss();
|
|
}
|
|
|
|
const baseline = await getBaseline();
|
|
|
|
for (let j = 0; j < COUNT; j++) {
|
|
await (async function runAll() {
|
|
const tls =
|
|
process.env.NAME === "tls-with-client"
|
|
? {
|
|
cert: "-----BEGIN CERTIFICATE-----\nMIIDXTCCAkWgAwIBAgIJAKLdQVPy90jjMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV\nBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX\naWRnaXRzIFB0eSBMdGQwHhcNMTkwMjAzMTQ0OTM1WhcNMjAwMjAzMTQ0OTM1WjBF\nMQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50\nZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB\nCgKCAQEA7i7IIEdICTiSTVx+ma6xHxOtcbd6wGW3nkxlCkJ1UuV8NmY5ovMsGnGD\nhJJtUQ2j5ig5BcJUf3tezqCNW4tKnSOgSISfEAKvpn2BPvaFq3yx2Yjz0ruvcGKp\nDMZBXmB/AAtGyN/UFXzkrcfppmLHJTaBYGG6KnmU43gPkSDy4iw46CJFUOupc51A\nFIz7RsE7mbT1plCM8e75gfqaZSn2k+Wmy+8n1HGyYHhVISRVvPqkS7gVLSVEdTea\nUtKP1Vx/818/HDWk3oIvDVWI9CFH73elNxBkMH5zArSNIBTehdnehyAevjY4RaC/\nkK8rslO3e4EtJ9SnA4swOjCiqAIQEwIDAQABo1AwTjAdBgNVHQ4EFgQUv5rc9Smm\n9c4YnNf3hR49t4rH4yswHwYDVR0jBBgwFoAUv5rc9Smm9c4YnNf3hR49t4rH4ysw\nDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEATcL9CAAXg0u//eYUAlQa\nL+l8yKHS1rsq1sdmx7pvsmfZ2g8ONQGfSF3TkzkI2OOnCBokeqAYuyT8awfdNUtE\nEHOihv4ZzhK2YZVuy0fHX2d4cCFeQpdxno7aN6B37qtsLIRZxkD8PU60Dfu9ea5F\nDDynnD0TUabna6a0iGn77yD8GPhjaJMOz3gMYjQFqsKL252isDVHEDbpVxIzxPmN\nw1+WK8zRNdunAcHikeoKCuAPvlZ83gDQHp07dYdbuZvHwGj0nfxBLc9qt90XsBtC\n4IYR7c/bcLMmKXYf0qoQ4OzngsnPI5M+v9QEHvYWaKVwFY4CTcSNJEwfXw+BAeO5\nOA==\n-----END CERTIFICATE-----",
|
|
}
|
|
: null;
|
|
oks += !!(
|
|
await fetch(SERVER, { tls }).then(r => {
|
|
r.body;
|
|
return r.arrayBuffer();
|
|
})
|
|
)?.byteLength;
|
|
})();
|
|
}
|
|
|
|
if (oks !== COUNT) {
|
|
throw new Error("Not all requests succeeded");
|
|
}
|
|
|
|
await Bun.sleep(10);
|
|
Bun.gc(true);
|
|
const delta = process.memoryUsage.rss() - baseline;
|
|
if ((heapStats().objectTypeCounts.Response ?? 0) > 5) {
|
|
throw new Error("Too many Response objects: " + heapStats().objectTypeCounts.Response);
|
|
}
|
|
|
|
const bodiesLeakedPerRequest = delta / textLength;
|
|
|
|
const threshold = textLength > 1024 * 1024 * 2 ? 20 : 1000;
|
|
|
|
console.log({ delta, count: COUNT, bodySize: textLength, bodiesLeakedPerRequest, threshold });
|
|
|
|
if (bodiesLeakedPerRequest > threshold) {
|
|
console.log("\n--fail--\n");
|
|
process.exit(1);
|
|
} else {
|
|
console.log("\n--pass--\n");
|
|
}
|