Skip to content

Commit

Permalink
fix(node): add http.Server.unref() (#19201)
Browse files Browse the repository at this point in the history
Closes #19113
  • Loading branch information
bartlomieju authored May 21, 2023
1 parent 9ec4989 commit 40bda07
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 2 deletions.
19 changes: 19 additions & 0 deletions cli/tests/unit_node/http_test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import { deferred } from "../../../test_util/std/async/deferred.ts";
import { gzip } from "node:zlib";
import { Buffer } from "node:buffer";
import { serve } from "../../../test_util/std/http/server.ts";
import { execCode } from "../unit/test_util.ts";

Deno.test("[node/http listen]", async () => {
{
Expand Down Expand Up @@ -461,3 +462,21 @@ Deno.test("[node/http] ServerResponse _implicitHeader", async () => {

await d;
});

Deno.test("[node/http] server unref", async () => {
const [statusCode, _output] = await execCode(`
import http from "node:http";
const server = http.createServer((_req, res) => {
res.statusCode = status;
res.end("");
});
// This should let the program to exit without waiting for the
// server to close.
server.unref();
server.listen(async () => {
});
`);
assertEquals(statusCode, 0);
});
25 changes: 23 additions & 2 deletions ext/node/polyfills/http.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1500,6 +1500,8 @@ class ServerImpl extends EventEmitter {

#addr: Deno.NetAddr;
#hasClosed = false;
#server: Deno.Server;
#unref = false;
#ac?: AbortController;
#servePromise: Deferred<void>;
listening = false;
Expand Down Expand Up @@ -1566,7 +1568,7 @@ class ServerImpl extends EventEmitter {
return;
}
this.#ac = ac;
serve(
this.#server = serve(
{
handler: handler as Deno.ServeHandler,
...this.#addr,
Expand All @@ -1577,13 +1579,31 @@ class ServerImpl extends EventEmitter {
this.emit("listening");
},
},
).finished.then(() => this.#servePromise!.resolve());
);
if (this.#unref) {
this.#server.unref();
}
this.#server.finished.then(() => this.#servePromise!.resolve());
}

setTimeout() {
console.error("Not implemented: Server.setTimeout()");
}

ref() {
if (this.#server) {
this.#server.ref();
}
this.#unref = false;
}

unref() {
if (this.#server) {
this.#server.unref();
}
this.#unref = true;
}

close(cb?: (err?: Error) => void): this {
const listening = this.listening;
this.listening = false;
Expand All @@ -1606,6 +1626,7 @@ class ServerImpl extends EventEmitter {
this.#servePromise!.resolve();
}

this.#server = undefined;
return this;
}

Expand Down

0 comments on commit 40bda07

Please sign in to comment.