Cómo transmitir datos a través de socket.io al cliente

Tengo socket.io enviando un objeto básico del servidor al cliente. Este bit funciona bien.

Ahora desea enviar una secuencia de un servidor a otro, usando una secuencia de eventos (específicamente los resultados de una consulta de cadena de bloques). Estoy obteniendo resultados inesperados en la consola del navegador.

var io = require('socket.io')(server); var dsteem = require('dsteem') var es = require('event-stream') var util = require('util') var client = new dsteem.Client('https://api.steemit.com') var stream = client.blockchain.getBlockStream() /* This sends results to stdout, fine io.on('connection', function(socket){ stream.pipe(es.map(function(block, callback) { callback(null, util.inspect(block) + '\n') })).pipe(process.stdout); // And this sends a simple object to the client socket.emit('blockchainOps', {"Foo!":"Doo!"} ); }); */ // Putting both together sends strange connection data to client io.on('connection', function(socket){ socket.emit('blockchainOps', function() { stream.pipe(es.map(function(block, callback) { callback(null, util.inspect(block) + '\n'); })) }) }); 

Lo que obtengo en la consola del cliente parece ser algún tipo de función de socket TCP,

ƒ (){if(!n){n=!0;var r=a(arguments);u("sending ack %j",r),e.packet({type:i.ACK,id:t,data:r})}}

¿Alguien puede ayudarme a entender qué está pasando y qué estoy haciendo mal?

== ACTUALIZAR EDITAR ==

Como se sugiere en los comentarios, he intentado socket.io-stream para boost la secuencia de eventos .

 var es = require('event-stream') var util = require('util') var ss = require('socket.io-stream'); var stream = ss.createStream(); io.on('connection', function(socket){ ss(socket).emit('blockchainOps', stream, function(){ client.blockchain.getBlockStream() .pipe(es.map(function(block, callback) { callback(null, util.inspect(block) + '\n') })) .pipe(process.stdout) }()); }); 

Esta vez, obtengo un objeto de socket devuelto en la consola del navegador que no parece ser el flujo de datos que esperaba.

introduzca la descripción de la imagen aquí

Está utilizando socket.emit mal, está pasando la callback ACK al cliente en lugar de a su flujo. Eche un vistazo a la firma socket.emit : socket.emit(eventName[, ...args][, ack]) .

Probablemente quieras algo como

 socket.emit('blockchainOps', client.blockchain.getBlockStream()); 

Sin embargo, no creo que socket simple io admita pasar un Stream de esa manera. Para canalizar un flujo al cliente, puede usar socketio-stream . Se vería así:

 var ss = require('socket.io-stream'); var stream = ss.createStream(); ss(socket).emit('blockchainOps', stream); client.blockchain.getBlockStream().pipe(stream); 

EDITAR:

En el cliente, deberías poder leer tu flujo de esta manera:

    ... ss(socket).on('blockchainOps', function(stream) { var binaryString = ""; stream.on('data', function(data) { for(var i=0;i 
    Intereting Posts