summaryrefslogtreecommitdiff
path: root/ext/http/00_serve.js
diff options
context:
space:
mode:
authorMatt Mastracci <matthew@mastracci.com>2023-05-19 15:14:40 -0600
committerGitHub <noreply@github.com>2023-05-19 15:14:40 -0600
commit7f5290b6946fececec5ec3acd85e67cd16960b8e (patch)
tree45e561e24f9dcf38b23b4ed88c3e14f56808c652 /ext/http/00_serve.js
parentaf72a9c6576cab16128a89d3c9cd5f57cd0d2504 (diff)
feat(ext/http): ref/unref for server (#19197)
Add `ref` and `unref` to return value from `Deno.serve`. Unblocks #3326.
Diffstat (limited to 'ext/http/00_serve.js')
-rw-r--r--ext/http/00_serve.js28
1 files changed, 26 insertions, 2 deletions
diff --git a/ext/http/00_serve.js b/ext/http/00_serve.js
index 7186da1fe..2fb36d044 100644
--- a/ext/http/00_serve.js
+++ b/ext/http/00_serve.js
@@ -43,6 +43,7 @@ const {
SetPrototypeAdd,
SetPrototypeDelete,
Symbol,
+ SymbolFor,
TypeError,
Uint8Array,
Uint8ArrayPrototype,
@@ -660,13 +661,22 @@ function serve(arg1, arg2) {
onListen({ port: listenOpts.port });
+ let ref = true;
+ let currentPromise = null;
+ const promiseIdSymbol = SymbolFor("Deno.core.internalPromiseId");
+
// Run the server
const finished = (async () => {
while (true) {
const rid = context.serverRid;
let req;
try {
- req = await op_http_wait(rid);
+ currentPromise = op_http_wait(rid);
+ if (!ref) {
+ core.unrefOp(currentPromise[promiseIdSymbol]);
+ }
+ req = await currentPromise;
+ currentPromise = null;
} catch (error) {
if (ObjectPrototypeIsPrototypeOf(BadResourcePrototype, error)) {
break;
@@ -691,7 +701,21 @@ function serve(arg1, arg2) {
}
})();
- return { finished };
+ return {
+ finished,
+ ref() {
+ ref = true;
+ if (currentPromise) {
+ core.refOp(currentPromise[promiseIdSymbol]);
+ }
+ },
+ unref() {
+ ref = false;
+ if (currentPromise) {
+ core.unrefOp(currentPromise[promiseIdSymbol]);
+ }
+ },
+ };
}
internals.addTrailers = addTrailers;