web-dev-qa-db-fra.com

Conversion d'un tampon en un ReadableStream dans Node.js

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.

57
Masiar

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.

18
vanthome

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?

35
Bryan Larsen

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.

30
Mr5o1

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.

4
Shwetabh Shekhar

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).

3
Joel Harkes