Skip to content
This repository was archived by the owner on Mar 13, 2025. It is now read-only.

Commit 25c2edc

Browse files
authored
Make process exits/server stops more aggressive to prevent test hangs (#590)
1 parent b25cfe2 commit 25c2edc

File tree

3 files changed

+15
-13
lines changed

3 files changed

+15
-13
lines changed

packages/miniflare/src/index.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -465,9 +465,7 @@ export class Miniflare {
465465
verbose: this.#sharedOpts.core.verbose,
466466
};
467467
this.#runtime = new Runtime(opts);
468-
this.#removeRuntimeExitHook = exitHook(
469-
() => void this.#runtime?.dispose(/* force */ true)
470-
);
468+
this.#removeRuntimeExitHook = exitHook(() => void this.#runtime?.dispose());
471469

472470
// Update config and wait for runtime to start
473471
await this.#assembleAndUpdateConfig(/* initial */ true);
@@ -673,7 +671,10 @@ export class Miniflare {
673671
hostname?: string
674672
): Promise<StoppableServer> {
675673
return new Promise((resolve) => {
676-
const server = stoppable(http.createServer(this.#handleLoopback));
674+
const server = stoppable(
675+
http.createServer(this.#handleLoopback),
676+
/* grace */ 0
677+
);
677678
server.on("upgrade", this.#handleLoopbackUpgrade);
678679
server.listen(port as any, hostname, () => resolve(server));
679680
});

packages/miniflare/src/runtime/index.ts

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -130,18 +130,14 @@ export class Runtime {
130130
return waitForPort(SOCKET_ENTRY, controlPipe, options);
131131
}
132132

133-
get exitPromise(): Promise<void> | undefined {
134-
return this.#processExitPromise;
135-
}
136-
137-
dispose(force = false): Awaitable<void> {
133+
dispose(): Awaitable<void> {
138134
// `kill()` uses `SIGTERM` by default. In `workerd`, this waits for HTTP
139135
// connections to close before exiting. Notably, Chrome sometimes keeps
140136
// connections open for about 10s, blocking exit. We'd like `dispose()`/
141137
// `setOptions()` to immediately terminate the existing process.
142-
// Therefore, use `SIGINT` which force closes all connections.
138+
// Therefore, use `SIGKILL` which force closes all connections.
143139
// See https://github.com/cloudflare/workerd/pull/244.
144-
this.#process?.kill(force ? "SIGKILL" : "SIGINT");
140+
this.#process?.kill("SIGKILL");
145141
return this.#processExitPromise;
146142
}
147143
}

packages/miniflare/test/test-shared/http.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import http from "http";
22
import { AddressInfo } from "net";
33
import { URL } from "url";
44
import { ExecutionContext } from "ava";
5+
import stoppable from "stoppable";
56
import NodeWebSocket, { WebSocketServer } from "ws";
67

78
export async function useServer(
@@ -10,15 +11,19 @@ export async function useServer(
1011
webSocketListener?: (socket: NodeWebSocket, req: http.IncomingMessage) => void
1112
): Promise<{ http: URL; ws: URL }> {
1213
return new Promise((resolve) => {
13-
const server = http.createServer(listener);
14+
const server = stoppable(http.createServer(listener), /* grace */ 0);
1415
// Only setup web socket server if listener provided
1516
if (webSocketListener) {
1617
const wss = new WebSocketServer({ server });
1718
wss.on("connection", webSocketListener);
1819
}
1920
// 0 binds to random unused port
2021
server.listen(0, () => {
21-
t.teardown(() => server.close());
22+
t.teardown(() => {
23+
return new Promise((resolve, reject) =>
24+
server.stop((err) => (err ? reject(err) : resolve()))
25+
);
26+
});
2227
const port = (server.address() as AddressInfo).port;
2328
resolve({
2429
http: new URL(`http://localhost:${port}`),

0 commit comments

Comments
 (0)