On Github Floby / nodejsparis-streams
Omniprésent dans la philosophie UNIX
http://blog.izs.me/post/48281998870/unix-philosophy-and-node-js
Appartient au super-pattern de Message-Passing
"message passing sends a message to a process and relies on the process to select and invoke the actual code to run" "The justifications for using an intermediate layer essentially falls into two categories: encapsulation and distribution"... 4 en réalité
var Readable = require('stream').Readable;
// ...
readable.on('readable', function () {
var chunk = readable.read();
});
readable.on('end', onEnd);
readable.on('data', function (data) {
// don't really use this please...
});
var Writable = require('stream').Writable;
// ...
writable.write(chunk);
writable.end();
var written = writable.write(chunk);
// written is true or false
var Duplex = require('stream').Duplex;
// ...
var socket = net.createConnection(80, 'google.com');
socket.write("GET /\r\n\r\n");
socket.on('readable', function () {
console.log(socket.read());
})
var Transform = require('stream').Transform;
// ...
var gzip = zlib.createGzip();
process.stdin
.pipe(gzip)
.pipe(process.stdout);
Avec un flux en écriture et en lecture, on peut chaîner les redirections de flux
http.createServer(function (req, res) {
var busboy = new Busboy({ headers: req.headers });
var pack = tar.pack();
var gzip = zlib.createGzip();
busboy
.on('file', function (field, stream, filename) {
var entry = tar.entry({name: filename});
filename.pipe(entry);
})
.on('finish', function () {
pack.finalize();
});
req.pipe(busboy);
pack.pipe(gzip).pipe(res);
}).listen(80);
En tant qu'utilisateur de la classe Stream :
Les streams peuvent en réalité aussi transporter des objets serialisés en JSON
Introduction du pattern A.pipe(B).pipe(A)
Utilisation du pattern A.pipe(B).pipe(A)
Florent Jaby @Floby