From 7f5290b6946fececec5ec3acd85e67cd16960b8e Mon Sep 17 00:00:00 2001 From: Matt Mastracci Date: Fri, 19 May 2023 15:14:40 -0600 Subject: feat(ext/http): ref/unref for server (#19197) Add `ref` and `unref` to return value from `Deno.serve`. Unblocks #3326. --- ext/http/00_serve.js | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) (limited to 'ext/http') 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; -- cgit v1.2.3