summaryrefslogtreecommitdiff
path: root/ext/flash/01_http.js
diff options
context:
space:
mode:
Diffstat (limited to 'ext/flash/01_http.js')
-rw-r--r--ext/flash/01_http.js51
1 files changed, 43 insertions, 8 deletions
diff --git a/ext/flash/01_http.js b/ext/flash/01_http.js
index 7a6b9bc47..2b0caff49 100644
--- a/ext/flash/01_http.js
+++ b/ext/flash/01_http.js
@@ -243,6 +243,7 @@
i,
respondFast,
respondChunked,
+ tryRespondChunked,
) {
// there might've been an HTTP upgrade.
if (resp === undefined) {
@@ -371,6 +372,9 @@
}
} else {
const reader = respBody.getReader();
+
+ // Best case: sends headers + first chunk in a single go.
+ const { value, done } = await reader.read();
writeFixedResponse(
serverId,
i,
@@ -385,14 +389,23 @@
false,
respondFast,
);
- while (true) {
- const { value, done } = await reader.read();
- await respondChunked(
- i,
- value,
- done,
- );
- if (done) break;
+
+ await tryRespondChunked(
+ i,
+ value,
+ done,
+ );
+
+ if (!done) {
+ while (true) {
+ const chunk = await reader.read();
+ await respondChunked(
+ i,
+ chunk.value,
+ chunk.done,
+ );
+ if (chunk.done) break;
+ }
}
}
}
@@ -572,6 +585,7 @@
i,
respondFast,
respondChunked,
+ tryRespondChunked,
),
),
onError,
@@ -589,6 +603,7 @@
i,
respondFast,
respondChunked,
+ tryRespondChunked,
)
).catch(onError);
continue;
@@ -607,6 +622,7 @@
i,
respondFast,
respondChunked,
+ tryRespondChunked,
);
}
@@ -623,6 +639,25 @@
once: true,
});
+ function tryRespondChunked(token, chunk, shutdown) {
+ const nwritten = core.ops.op_try_flash_respond_chuncked(
+ serverId,
+ token,
+ chunk ?? new Uint8Array(),
+ shutdown,
+ );
+ if (nwritten > 0) {
+ return core.opAsync(
+ "op_flash_respond_chuncked",
+ serverId,
+ token,
+ chunk,
+ shutdown,
+ nwritten,
+ );
+ }
+ }
+
function respondChunked(token, chunk, shutdown) {
return core.opAsync(
"op_flash_respond_chuncked",