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 |