Diversión con Streams

Hugo Zapata

@hugozap

Breve repaso

¿Qué es un Stream?

Streams

Mecanismo simple para conectar programas.

program1 | program2 | program3

UNIX Pipes

Su poder está en la facilidad con que se pueden encadenar pequeños programas para resolver problemas complejos.

 

//Conectar stdin a stdout 
process.stdin.pipe(process.stdout);

Básicos

Derivados de Transform (Ejemplos)

DataSource

paquete para crear/ manipular streams

npm install event-stream

Casos especiales

Ej: Socket

Mux-Demux

var randomNumberStream  = require('./randomNumberStream.js')

randomNumberStream.pipe(process.stdout);

Creando nuestros propios Streams

/**
 * Retorna un stream que genera
 * números aleatorios de manera infinita
 */
var Readable = require('readable-stream').Readable;

module.exports = function(){

	var rs = new Readable({encoding:'utf8'});

	/* Solo generamos un valor cuando estamos leyendo
	del stream */
	rs._read = function(){

		var num = 1+Math.floor(Math.random()*100);
		setTimeout(function(){
			rs.push(num.toString(),'utf8');

		},100);
	}

	return rs
};

Implementación básica Readable Stream

Ej "Fake Japonés"

 

var fakeJapanesse = require('./fakeJapanesseStream.js');
var es = require('event-stream');
var fs = require('fs');

process.stdin
	.pipe(es.split(/[\r\s\n]/))
	.pipe(fakeJapanesse)
	.pipe(es.join(' '))
	.pipe(process.stdout);
 curl -sS http://norvig.com/big.txt | node translate

translate.js

/**
 * Creación de un Stream (transform) básico
 * usando through
 */
var through = require('through');

//------ Definición del nuevo stream -----//

var myStream = through(function write(bufferPalabra){

	var opts = [

		'iroki',
		'aka',
		'hari',
		'tago',
		'ichiwa',
		'asai',
		'anata',
		'suka',
		'maki'
	]

	this.push(bufferPalabra.toString() + opts[Math.floor(Math.random()*opts.length)]);
})

module.exports = myStream;

fakeJapanesseStream.js

Algunas herramientas útiles

Demo

Recursos 

https://github.com/substack/stream-handbook

https://github.com/sindresorhus/awesome-nodejs#streams

http://hugozap.com/development/2015/11/01/nodejs-streams-intro-diagrams/

http://hugozap.com/software/2014/12/21/shoe-mux-demux-example/

https://github.com/hugozap/bogotajs-fun-with-streams-workshop

Made with Slides.com