У меня возникла проблема с ответом от моего сервера WebFlux с помощью нового API Streams.
Я вижу через Curl (с помощью --limit-rate
), что сервер замедляется, как ожидалось, но когда я пытаюсь уничтожить тело в Google Chrome (64.0.3282.140), он не замедляется, как он должен. На самом деле Chrome загружает и буферизирует около 32 мегабайт с сервера, хотя только около 187 кБ передается на write()
.
Что-то не так с моим JavaScript?
async function fetchStream(url, consumer) {
const response = await fetch(url, {
headers: {
"Accept": "application/stream+json"
}
});
const decoder = new TextDecoder("utf-8");
let buffer = "";
await response.body.pipeTo(new WritableStream({
async write(chunk) {
buffer += decoder.decode(chunk);
const blocks = buffer.split("\n");
if (blocks.length === 1) {
return;
}
const indexOfLastBlock = blocks.length - 1;
for (let index = 0; index < indexOfLastBlock; index ++) {
const block = blocks[index];
const item = JSON.parse(block);
await consumer(item);
}
buffer = blocks[indexOfLastBlock];
}
}));
}
В соответствии с спецификация для потоков,
Если стратегия не указана, поведение по умолчанию будет таким же, как и CountQueuingStrategy с отметкой высокой воды 1.
Так что это должно замедлить обещание, возвращаемое consumer(item)
, разрешается очень медленно, правильно?