Преобразование буфера в ReadableStream в Node.js
Я новичок в Buffers и ReadableStreams, так что, возможно, это глупый вопрос. У меня есть библиотека, которая принимает в качестве входных данных ReadableStream
, но мой ввод - это просто изображение в формате base64. Я мог бы преобразовать данные в Buffer
следующим образом:
var img = new Buffer(img_string, 'base64');
Но я понятия не имею, как преобразовать его в ReadableStream
или преобразовать полученный мной Buffer
в ReadableStream
.
Есть ли способ сделать это или я пытаюсь достичь невозможного?
Благодарю.
Ответы
Ответ 1
Вы можете создать ReadableStream с помощью Node Stream Buffers следующим образом:
// Initialize stream
var myReadableStreamBuffer = new streamBuffers.ReadableStreamBuffer({
frequency: 10, // in milliseconds.
chunkSize: 2048 // in bytes.
});
// With a buffer
myReadableStreamBuffer.put(aBuffer);
// Or with a string
myReadableStreamBuffer.put("A String", "utf8");
Частота не может быть 0, поэтому это приведет к некоторой задержке.
Ответ 2
Node Stream Buffer явно предназначен для использования в тестировании; невозможность избежать задержки делает его плохим выбором для производственного использования.
Габриэль Ламас предлагает в этом ответе использовать потоковое преобразование: как обернуть буфер как поток, читаемый потоком 2?
Ответ 3
что-то вроде этого...
import { Readable } from 'stream'
const buffer = new Buffer(img_string, 'base64')
const readable = new Readable()
readable._read = () => {} // _read is required but you can noop it
readable.push(buffer)
readable.push(null)
readable.pipe(consumer) // consume the stream
В общем, конечно, считываемый поток _read
функция должна собирать данные из базового источника и push
его постепенно гарантируя, что вы не собрать огромный источник в памяти прежде, чем это необходимо.
В этом случае, хотя у вас уже есть источник в памяти, поэтому _read
не требуется.
Выдвижение всего буфера просто оборачивает его в читаемый поток API.
Ответ 4
Вот простое решение с использованием модуля Streamifier.
const streamifier = require('streamifier');
streamifier.createReadStream(new Buffer ([97, 98, 99])).pipe(process.stdout);
Вы можете использовать Strings, Buffer и Object в качестве аргументов.
Ответ 5
Вам не нужно добавлять целую библиотеку npm для одного файла. я рефакторинг его для машинописи:
import { Readable, ReadableOptions } from "stream";
export class MultiStream extends Readable {
_object: any;
constructor(object: any, options: ReadableOptions) {
super(object instanceof Buffer || typeof object === "string" ? options : { objectMode: true });
this._object = object;
}
_read = () => {
this.push(this._object);
this._object = null;
};
}
на основе узла-потокового преобразователя (лучший вариант, как указано выше).