Files
scriptc/tests/corpus/2689-http-server-timeout-properties.ts
Chris TateandEli Sterling acf0a2b905 Support static HTTP server timeout properties (#127)
* 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>
2026-08-11 08:33:38 -05:00

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);
}
}