mirror of
https://github.com/vercel-labs/scriptc.git
synced 2026-10-23 06:10:02 +08:00
* Support static HTTP server timeout properties - Lower typed timeout property reads and writes through both native backends. - Store Node-compatible defaults independently on each HTTP/HTTPS server. - Cover defaults and assignments with differential corpus tests. Co-authored-by: Eli Sterling <240321107+eli-sterling@users.noreply.github.com> * Support keep-alive timeout buffer property * Fix HTTP server timeout property lowering * fix: scope HTTP server timeout handling * fix: preserve HTTP server timeout semantics --------- Co-authored-by: Eli Sterling <240321107+eli-sterling@users.noreply.github.com>
87 lines
2.8 KiB
TypeScript
87 lines
2.8 KiB
TypeScript
// The five writable numeric http.Server timeout fields: Node 24 defaults,
|
|
// independent per-server storage, constructor initialization, optional and
|
|
// dynamic access, and static reads/writes through a typed helper. Timer
|
|
// enforcement is a separate server behavior surface.
|
|
import { createServer, Server } from "node:http";
|
|
import { createServer as createNetServer } from "node:net";
|
|
|
|
function configure(server: Server): void {
|
|
server.timeout = 125;
|
|
server.keepAliveTimeout = 250;
|
|
server.keepAliveTimeoutBuffer = 300;
|
|
server.headersTimeout = 375;
|
|
server.requestTimeout = 500;
|
|
}
|
|
|
|
const configured = createServer();
|
|
const untouched = new Server();
|
|
const fromOption = createServer({ keepAliveTimeoutBuffer: 4321 });
|
|
const fromUndefined = createServer({ keepAliveTimeoutBuffer: undefined });
|
|
|
|
function serverFromMaybeBuffer(value: number | undefined): Server {
|
|
return createServer({ keepAliveTimeoutBuffer: value });
|
|
}
|
|
const fromMaybeUndefined = serverFromMaybeBuffer(undefined);
|
|
const fromMaybeNumber = serverFromMaybeBuffer(2468);
|
|
|
|
console.log(
|
|
configured.timeout,
|
|
configured.keepAliveTimeout,
|
|
configured.keepAliveTimeoutBuffer,
|
|
configured.headersTimeout,
|
|
configured.requestTimeout,
|
|
);
|
|
|
|
configure(configured);
|
|
console.log(
|
|
configured.timeout,
|
|
configured.keepAliveTimeout,
|
|
configured.keepAliveTimeoutBuffer,
|
|
configured.headersTimeout,
|
|
configured.requestTimeout,
|
|
);
|
|
console.log(
|
|
untouched.timeout,
|
|
untouched.keepAliveTimeout,
|
|
untouched.keepAliveTimeoutBuffer,
|
|
untouched.headersTimeout,
|
|
untouched.requestTimeout,
|
|
);
|
|
|
|
console.log("option", fromOption.keepAliveTimeoutBuffer);
|
|
console.log(
|
|
"optional-options",
|
|
fromUndefined.keepAliveTimeoutBuffer,
|
|
fromMaybeUndefined.keepAliveTimeoutBuffer,
|
|
fromMaybeNumber.keepAliveTimeoutBuffer,
|
|
);
|
|
|
|
function logOptional(server: Server | undefined): void {
|
|
console.log("optional", server?.keepAliveTimeoutBuffer);
|
|
}
|
|
logOptional(fromOption);
|
|
logOptional(undefined);
|
|
|
|
const dynamic: any = fromOption;
|
|
console.log("dynamic", dynamic.keepAliveTimeoutBuffer);
|
|
dynamic.keepAliveTimeoutBuffer = 8765;
|
|
console.log("dynamic-set", dynamic.keepAliveTimeoutBuffer, fromOption.keepAliveTimeoutBuffer);
|
|
dynamic.timeout = "disabled";
|
|
console.log("dynamic-string", typeof dynamic.timeout, dynamic.timeout);
|
|
dynamic.timeout = undefined;
|
|
console.log("dynamic-undefined", typeof dynamic.timeout, dynamic.timeout);
|
|
dynamic.timeout = 2468;
|
|
console.log("dynamic-number", dynamic.timeout, fromOption.timeout);
|
|
|
|
const plainNetDynamic: any = createNetServer();
|
|
console.log("plain-net-dynamic", plainNetDynamic.timeout, plainNetDynamic.keepAliveTimeoutBuffer);
|
|
|
|
try {
|
|
createServer({ keepAliveTimeoutBuffer: -1 });
|
|
} catch (err) {
|
|
if (err instanceof Error) {
|
|
const code = (err as NodeJS.ErrnoException).code;
|
|
console.log(err.name, code, err.message);
|
|
}
|
|
}
|