Преобразование буфера в ReadableStream в nodejs

Я довольно новичок в Buffers и ReadableStreams, так что, возможно, это глупый вопрос. У меня есть библиотека, которая принимает в качестве входных данных ReadableStream, но мой ввод - это просто изображение в формате base64. Я мог бы преобразовать данные, которые у меня есть в буфере, примерно так:

var img = new Buffer(img_string, 'base64');

Но я понятия не имею, как преобразовать его в ReadableStream или преобразовать полученный мной буфер в ReadableStream.

Есть ли способ сделать это или я пытаюсь достичь невозможного?

Благодарю.

9 ответов

Решение

Вы можете создать 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, поэтому это приведет к определенной задержке.

Для nodejs 10.17.0 и выше:

const stream = Readable.from(myBuffer.toString());

Что -то вроде этого...

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.

Node Stream Buffer явно предназначен для использования в тестировании; невозможность избежать задержки делает его плохим выбором для производственного использования.

Gabriel Llamas предлагает в этом ответе использовать потоковое преобразование: как обернуть буфер как поток, читаемый потоком 2?

Для этого вы можете использовать стандартный потоковый API NodeJS — stream.Readable.from

      const { Readable } = require('stream');
const stream = Readable.from(buffer);

Примечание. Не преобразовывайте буфер в строку ( buffer.toString()), если буфер содержит двоичные данные. Это приведет к повреждению двоичных файлов.

Вам не нужно добавлять целую библиотеку 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;
  };
}

на основе узла-потокового преобразователя (лучший вариант, как указано выше).

Это мой простой код для этого.

import { Readable } from 'stream';

const newStream = new Readable({
                    read() {
                      this.push(someBuffer);
                    },
                  })

Вот простое решение с использованием модуля Streamifier.

const streamifier = require('streamifier'); streamifier.createReadStream(new Buffer ([97, 98, 99])).pipe(process.stdout);

Вы можете использовать Strings, Buffer и Object в качестве аргументов.

Попробуй это:

const Duplex = require('stream').Duplex;  // core NodeJS API
function bufferToStream(buffer) {  
  let stream = new Duplex();
  stream.push(buffer);
  stream.push(null);
  return stream;
}

Источник: Брайан Манчини -> http://derpturkey.com/buffer-to-stream-in-node/

Другие вопросы по тегам