From 4e213a12e41ad0f3dcd360ebb288ca4a58375974 Mon Sep 17 00:00:00 2001 From: Ciro Spaciari Date: Fri, 6 Sep 2024 14:42:16 -0700 Subject: [PATCH] flush first chunk on nextTick --- src/js/node/http.ts | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/js/node/http.ts b/src/js/node/http.ts index 0d72ccde78..997cb34652 100644 --- a/src/js/node/http.ts +++ b/src/js/node/http.ts @@ -1248,10 +1248,43 @@ ServerResponse.prototype._implicitHeader = function () { this.writeHead(this.statusCode); }; +function flushFirstWrite(self) { + const thisController = self[controllerSymbol]; + if (thisController) return; + self.headersSent = true; + let firstWrite = self[firstWriteSymbol]; + self[controllerSymbol] = undefined; + self._reply( + new Response( + new ReadableStream({ + type: "direct", + pull: controller => { + self[controllerSymbol] = controller; + if (firstWrite) controller.write(firstWrite); + firstWrite = undefined; + if (!self[finishedSymbol]) { + const { promise, resolve } = $newPromiseCapability(GlobalPromise); + self[deferredSymbol] = resolve; + return promise; + } + }, + }), + { + headers: self[headersSymbol], + status: self.statusCode, + statusText: self.statusMessage ?? STATUS_CODES[self.statusCode], + }, + ), + ); +} ServerResponse.prototype._write = function (chunk, encoding, callback) { if (this[firstWriteSymbol] === undefined && !this.headersSent) { this[firstWriteSymbol] = chunk; callback(); + + // we still wanna to flush if the user await some time before writing again + // keeping the first write is a good performance optimization + process.nextTick(flushFirstWrite, this); return; }