web-dev-qa-db-ja.com

Node.jsでバッファーをReadableStreamに変換する

私はBuffersとReadableStreamsにかなり慣れていないので、これは愚かな質問かもしれません。入力としてReadableStreamを受け取るライブラリがありますが、入力は単なるbase64形式の画像です。 Bufferにあるデータを次のように変換できます。

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

しかし、それをReadableStreamに変換する方法や、取得したBufferReadableStreamに変換する方法がわかりません。

これを行う方法はありますか、不可能を達成しようとしていますか?

ありがとう。

57
Masiar

Node Stream Buffers を使用してReadableStreamを作成できます:

// 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にすることはできないため、これにより一定の遅延が生じます。

18
vanthome

Node Stream Buffer は、テストで使用するために設計されていることは明らかです。遅延を回避できないため、実稼働での使用には適していません。

Gabriel Llamas 提案 streamifier この回答: バッファをstream2読み取り可能ストリームとしてラップする方法?

35
Bryan Larsen

このようなもの...

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にラップされます。

30
Mr5o1

以下はstreamifierモジュールを使用した簡単なソリューションです。

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

引数として文字列、バッファ、オブジェクトを使用できます。

4

単一のファイルにnpm lib全体を追加する必要はありません。私はそれをTypeScriptにリファクタリングしました:

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;
  };
}

node-streamifier (上記の最適なオプション)に基づいています。

3
Joel Harkes