C’est tout frais ça vient de sortir dans la 0.9.8, le support des objets autre que des String ou des Buffer dans les streams !
Tiens pour changer je vais mettre les exemples en coffee-script
(je n’aime pas particulièrement, mais c’est utile d’en voir de temps en temps, vue sa popularité il faut bien s’habituer).
Rappelez-vous, notre classe ArrayReadStream :
class ArrayReadStream extends stream.Readable constructor: (array) -> super {objectMode: true} @_array = array @_index = 0 _read: (n, cb) -> process.nextTick => if @_index < @_array.length cb null, @_array[@_index++] else cb null, null |
Imaginons qu’on l’utilise pour un tableau d’objet (exemple typique du résultat qu’on aurait voulu avoir avec un client SQL) :
array = [{name: 'John Smith'}, {name: 'John Williams'}, {name: {first: 'John', last: 'Rambo'}}] s = new ArrayReadStream array s.pipe process.stdout |
La nouveauté c'est l'option "objectMode" qui permet d'activer le support des objets directs.
Jusqu'à la 0.9.7 comprise, Ce code ne fait rien. En effet, les données retournée par _read n'étant ni des Buffer ni des String la lecture s'arrête (sans erreur, ce que je trouve un peu moche d'ailleurs…).
En 0.9.8 en revanche ce code va planter :
[…]
TypeError: invalid data
at WriteStream.Socket.write (net.js:565:11)
[…]
C'est parce que d'un coup process.stdout se prend dans la tête un truc qu'il ne sait pas écrire. Des objets autre qu'un Buffer ou une String ?
