私はBuffersとReadableStreamsにかなり慣れていないので、これは愚かな質問かもしれません。入力としてReadableStream
を受け取るライブラリがありますが、入力は単なるbase64形式の画像です。 Buffer
にあるデータを次のように変換できます。
var img = new Buffer(img_string, 'base64');
しかし、それをReadableStream
に変換する方法や、取得したBuffer
をReadableStream
に変換する方法がわかりません。
これを行う方法はありますか、不可能を達成しようとしていますか?
ありがとう。
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にすることはできないため、これにより一定の遅延が生じます。
Node Stream Buffer は、テストで使用するために設計されていることは明らかです。遅延を回避できないため、実稼働での使用には適していません。
Gabriel Llamas 提案 streamifier この回答: バッファをstream2読み取り可能ストリームとしてラップする方法?
このようなもの...
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にラップされます。
以下はstreamifierモジュールを使用した簡単なソリューションです。
const streamifier = require('streamifier');
streamifier.createReadStream(new Buffer ([97, 98, 99])).pipe(process.stdout);
引数として文字列、バッファ、オブジェクトを使用できます。
単一のファイルに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 (上記の最適なオプション)に基づいています。