Je suis assez nouveau dans Buffers et ReadableStreams, alors peut-être que c'est une question stupide. J'ai une bibliothèque qui prend en entrée un ReadableStream
, mais mon entrée n'est qu'une image au format base64. Je pourrais convertir les données que j'ai dans un Buffer
comme ceci:
var img = new Buffer(img_string, 'base64');
Mais je ne sais pas comment le convertir en ReadableStream
ou convertir le Buffer
que j'ai obtenu en ReadableStream
.
Y a-t-il un moyen de le faire ou est-ce que j'essaie de réaliser l'impossible?
Merci.
Vous pouvez créer un ReadableStream en utilisant Node Stream Buffers comme ceci:
// 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");
La fréquence ne peut pas être 0, ce qui entraînera un certain retard.
Node Stream Buffer est évidemment conçu pour être utilisé dans les tests; l'incapacité à éviter un retard en fait un mauvais choix pour une utilisation en production.
Gabriel Llamas suggère streamifier dans cette réponse: Comment envelopper un tampon comme un flux lisible stream2?
quelque chose comme ça...
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
Dans le cours général, un flux lisible _read
la fonction doit collecter les données de la source sous-jacente et Push
en s'assurant de manière incrémentielle que vous ne récoltez pas une énorme source en mémoire avant qu'elle ne soit nécessaire.
Dans ce cas, bien que vous ayez déjà la source en mémoire, donc _read
n'est pas requis.
Pousser tout le tampon l'enveloppe simplement dans l'api du flux lisible.
Voici une solution simple utilisant le module streamifier.
const streamifier = require('streamifier');
streamifier.createReadStream(new Buffer ([97, 98, 99])).pipe(process.stdout);
Vous pouvez utiliser Strings, Buffer et Object comme arguments.
Vous n'avez pas besoin d'ajouter une bibliothèque npm entière pour un seul fichier. je l'ai refactorisé en 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;
};
}
basé sur node-streamifier (la meilleure option comme dit ci-dessus).