41 lines
1.2 KiB
JavaScript
41 lines
1.2 KiB
JavaScript
|
import { HtmlStream } from '~/streaming/html_stream';
|
||
|
|
||
|
async function pipeStreams(domWriter, streamPromises) {
|
||
|
try {
|
||
|
for await (const stream of streamPromises.slice(0, -1)) {
|
||
|
await stream.pipeTo(domWriter, { preventClose: true });
|
||
|
}
|
||
|
const stream = await streamPromises[streamPromises.length - 1];
|
||
|
await stream.pipeTo(domWriter);
|
||
|
} catch (error) {
|
||
|
domWriter.abort(error);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// this function (and the rest of the pipeline) expects polyfilled streams
|
||
|
// do not pass native streams here unless our browser support allows for it
|
||
|
// TODO: remove this notice when our WebStreams API support reaches 100%
|
||
|
export function renderHtmlStreams(streamPromises, element, config) {
|
||
|
if (streamPromises.length === 0) return Promise.resolve();
|
||
|
|
||
|
const chunkedHtmlStream = new HtmlStream(element).withChunkWriter(config);
|
||
|
|
||
|
return new Promise((resolve, reject) => {
|
||
|
const domWriter = new WritableStream({
|
||
|
write(chunk) {
|
||
|
return chunkedHtmlStream.write(chunk);
|
||
|
},
|
||
|
close() {
|
||
|
chunkedHtmlStream.close();
|
||
|
resolve();
|
||
|
},
|
||
|
abort(error) {
|
||
|
chunkedHtmlStream.abort();
|
||
|
reject(error);
|
||
|
},
|
||
|
});
|
||
|
|
||
|
pipeStreams(domWriter, streamPromises);
|
||
|
});
|
||
|
}
|