61 lines
1.8 KiB
JavaScript
61 lines
1.8 KiB
JavaScript
'use strict';
|
|
|
|
const parseChunked = require('./parse-chunked.cjs');
|
|
const stringifyChunked = require('./stringify-chunked.cjs');
|
|
const utils = require('./utils.cjs');
|
|
|
|
/* eslint-env browser */
|
|
|
|
function parseFromWebStream(stream) {
|
|
// 2024/6/17: currently, an @@asyncIterator on a ReadableStream is not widely supported,
|
|
// therefore use a fallback using a reader
|
|
// https://caniuse.com/mdn-api_readablestream_--asynciterator
|
|
return parseChunked.parseChunked(utils.isIterable(stream) ? stream : async function*() {
|
|
const reader = stream.getReader();
|
|
|
|
try {
|
|
while (true) {
|
|
const { value, done } = await reader.read();
|
|
|
|
if (done) {
|
|
break;
|
|
}
|
|
|
|
yield value;
|
|
}
|
|
} finally {
|
|
reader.releaseLock();
|
|
}
|
|
});
|
|
}
|
|
|
|
function createStringifyWebStream(value, replacer, space) {
|
|
// 2024/6/17: the ReadableStream.from() static method is supported
|
|
// in Node.js 20.6+ and Firefox only
|
|
if (typeof ReadableStream.from === 'function') {
|
|
return ReadableStream.from(stringifyChunked.stringifyChunked(value, replacer, space));
|
|
}
|
|
|
|
// emulate ReadableStream.from()
|
|
return new ReadableStream({
|
|
start() {
|
|
this.generator = stringifyChunked.stringifyChunked(value, replacer, space);
|
|
},
|
|
pull(controller) {
|
|
const { value, done } = this.generator.next();
|
|
|
|
if (done) {
|
|
controller.close();
|
|
} else {
|
|
controller.enqueue(value);
|
|
}
|
|
},
|
|
cancel() {
|
|
this.generator = null;
|
|
}
|
|
});
|
|
}
|
|
|
|
exports.createStringifyWebStream = createStringifyWebStream;
|
|
exports.parseFromWebStream = parseFromWebStream;
|