summaryrefslogtreecommitdiff
path: root/ext/flash/01_http.js
diff options
context:
space:
mode:
authorDivy Srivastava <dj.srivastava23@gmail.com>2022-10-19 16:41:47 +0530
committerGitHub <noreply@github.com>2022-10-19 16:41:47 +0530
commit743fcc0668f553c7902c44b1f6a484db42c1cfd0 (patch)
treeebd71545dbb0f3402ac50fc663ed04c73db3a50b /ext/flash/01_http.js
parent36307c45e95b599eb01bf53df161973a7ef8b58e (diff)
perf(ext/flash): optimize path response streams (#16284)
Regression caused by https://github.com/denoland/deno/pull/15591
Diffstat (limited to 'ext/flash/01_http.js')
-rw-r--r--ext/flash/01_http.js40
1 files changed, 29 insertions, 11 deletions
diff --git a/ext/flash/01_http.js b/ext/flash/01_http.js
index 17f99ca98..c7dce421d 100644
--- a/ext/flash/01_http.js
+++ b/ext/flash/01_http.js
@@ -365,6 +365,8 @@
}
} else {
const reader = respBody.getReader();
+ const { value, done } = await reader.read();
+ // Best case: sends headers + first chunk in a single go.
writeFixedResponse(
serverId,
i,
@@ -379,14 +381,21 @@
false,
respondFast,
);
- while (true) {
- const { value, done } = await reader.read();
- await respondChunked(
- i,
- value,
- done,
- );
- if (done) break;
+ await respondChunked(
+ i,
+ value,
+ done,
+ );
+ if (!done) {
+ while (true) {
+ const chunk = await reader.read();
+ await respondChunked(
+ i,
+ chunk.value,
+ chunk.done,
+ );
+ if (chunk.done) break;
+ }
}
}
}
@@ -591,13 +600,22 @@
});
function respondChunked(token, chunk, shutdown) {
- return core.opAsync(
- "op_flash_respond_chuncked",
+ const nwritten = core.ops.op_try_flash_respond_chuncked(
serverId,
token,
- chunk,
+ chunk ?? new Uint8Array(),
shutdown,
);
+ if (nwritten > 0) {
+ return core.opAsync(
+ "op_flash_respond_chuncked",
+ serverId,
+ token,
+ chunk,
+ shutdown,
+ nwritten,
+ );
+ }
}
const fastOp = prepareFastCalls();