Make sure the Uint8Array has at least 4 bytes or you know that the stream isn't done.
e.g. https://codepen.io/okikio/pen/MWBjdNB?editors=0011
import { asCodePoints } from "uint8array-to-utf-8"
function later(delay) {
return new Promise(resolve => setTimeout(resolve, delay));
}
function createResponse(sliceLen = 12) {
return new Response(
new ReadableStream({
async start(controller) {
const buffer = new TextEncoder().encode(
`.c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€ .c\\π€ { color: blue; } /* π€π€π€`,
);
let i = sliceLen, len = buffer.length - sliceLen;
for (; i < len; i += sliceLen) {
controller.enqueue(buffer.slice(i - sliceLen, i));
await later(2);
}
controller.enqueue(buffer.slice(len));
controller.close();
},
}),
);
}
async function* getIterableStream(stream) {
const reader = stream.getReader();
try {
while (true) {
const { done, value } = await reader.read();
if (done) return;
yield value;
}
} finally {
reader.releaseLock();
}
}
async function main() {
const response = createResponse();
for await (const codePoint of asCodePoints(getIterableStream(response.body))) {
console.log(String.fromCodePoint(codePoint));
}
}
main();