react-native-fast-io
Version:
Modern IO for React Native, built on top of Nitro and Web standards
73 lines (72 loc) • 1.96 kB
JavaScript
import { ReadableStream, TransformStream, WritableStream } from 'web-streams-polyfill';
import { CompressorFactory, DuplexStream } from "../native/streams.nitro.js";
export const toReadableStream = inputStream => {
const stream = new ReadableStream({
start() {
inputStream.open();
},
async pull(controller) {
const buffer = await inputStream.read();
if (buffer.byteLength == 0) {
controller.close();
return;
}
const chunk = new Uint8Array(buffer);
controller.enqueue(chunk);
},
cancel() {
inputStream.close();
}
});
return stream;
};
export const toWritableStream = outputStream => {
return new WritableStream({
start() {
outputStream.open();
},
async write(chunk) {
if (chunk.byteLength === 0) {
return;
}
await outputStream.write(chunk.buffer);
},
close() {
outputStream.close();
},
abort() {
outputStream.close();
}
});
};
export const fromReadableStream = stream => {
const duplexStream = new DuplexStream();
const writableStream = toWritableStream(duplexStream.outputStream);
stream.pipeTo(writableStream);
return duplexStream.inputStream;
};
export class CompressionStream {
constructor(format) {
const compressor = CompressorFactory.create(format);
const {
readable,
writable
} = new TransformStream({
transform(chunk, controller) {
const compressedData = compressor.compress(chunk.buffer);
controller.enqueue(new Uint8Array(compressedData));
},
flush(controller) {
const finalData = compressor.finalize();
if (finalData.byteLength > 0) {
controller.enqueue(new Uint8Array(finalData));
}
}
});
this.readable = readable;
this.writable = writable;
}
}
export { ReadableStream, TransformStream, WritableStream };
//# sourceMappingURL=streams.js.map
;