Référence rapide

Aide-mémoire Streams Node.js

Un guide de reference complet pour les Streams Node.js : flux Readable, Writable, Transform et Duplex, pipeline, gestion d'evenements et mode flowing.

· Publié le

Les Streams sont des flux de donnees consommes par morceaux, permettant de traiter de gros fichiers sans epuiser la memoire.

Aperçu des Types de Streams

Type Direction Description
Readable Lecture seule Source depuis laquelle les donnees peuvent etre lues
Writable Écriture seule Destination vers laquelle les donnees peuvent etre ecrites
Transform Lecture et écriture Transforme ou modifie les donnees au fil de leur passage
Duplex Lecture et écriture A la fois lisible et inscriptible avec des canaux independants (ex. socket TCP)

Pipeline et le module moderne stream/promises

Node.js moderne fournit pipeline pour relier des flux en toute securite avec gestion automatique des erreurs :

const { pipeline } = require('stream/promises');
const fs = require('fs');
const zlib = require('zlib');

async function compressFile() {
  await pipeline(
    fs.createReadStream('source.tar'),
    zlib.createGzip(),
    fs.createWriteStream('source.tar.gz')
  );
  console.log('Compression terminee');
}

Création de Streams Personnalisés

1. Flux Readable Personnalisé

const { Readable } = require('stream');

function createTimestampStream() {
  let count = 0;
  return new Readable({
    objectMode: true,
    read() {
      if (count >= 5) {
        this.push(null); // Fin du flux
      } else {
        this.push({ id: ++count, time: new Date() });
      }
    }
  });
}

2. Flux Transform Personnalisé

const { Transform } = require('stream');

const uppercaseTransformer = new Transform({
  transform(chunk, encoding, callback) {
    const transformed = chunk.toString().toUpperCase();
    callback(null, transformed);
  }
});

3. Flux Writable Personnalisé

const { Writable } = require('stream');

const consoleWriter = new Writable({
  objectMode: true,
  write(chunk, encoding, callback) {
    console.log('Écriture du morceau :', chunk);
    callback();
  }
});

Mode Flowing vs Mode Paused

Les flux en lecture fonctionnent soit en mode pause (paused), soit en mode continu (flowing) :

const stream = fs.createReadStream('data.csv');

// Attacher un ecouteur 'data' active automatiquement le mode flowing
stream.on('data', (chunk) => {
  console.log(`Recu ${chunk.length} octets`);
});

// Controle explicite du debit
stream.pause();  // Suspendre temporairement les evenements
stream.resume(); // Reprendre le flux d'evenements

Événements des Streams

Événement Applicable à Condition de Déclenchement
data Readable Emis lorsqu'un morceau de donnees est pret a etre consomme
end Readable Emis lorsqu'il n'y a plus de donnees a lire
finish Writable Emis lorsque toutes les donnees ecrites ont ete transmises
error All Emis lorsqu'une erreur non geree survient sur le flux
close All Emis lorsque la ressource sous-jacente est fermee

References

Sujets associés