Node.js Lectura Stream _read Uso

Entiendo cómo usar secuencias grabables en la nueva biblioteca Streams2 Node, pero no entiendo cómo usar secuencias legibles.

Tomemos, por ejemplo, una envoltura de flujo alrededor del módulo dgram :

 var dgram = require('dgram'); var thumbs = { twiddle: function() {} }; var defaults = { address: '0.0.0.0', type: 'udp4', port: 12345, broadcast: null, multicast: null, multicastTTL: 1 }; var UDPStream = function(options) { if (!(this instanceof UDPStream)) return new UDPStream(options); Duplex.call(this); options = options || {}; this.address = options.address || defaults.address; this.type = options.type || defaults.type; this.port = options.port || defaults.port; this.broadcast = options.broadcast || defaults.broadcast; this.multicast = options.multicast || defaults.multicast; this.multicastTTL = options.multicastTTL || defaults.multicastTTL; this._socket = dgram.createSocket(this.type, setup.bind(this)); this._socket.on('message', this.push.bind(this)); }; util.inherits(UDPStream, Duplex); var setup = function() { if (this.multicast) { this._socket.addMembership(this.multicast); this._socket.setMulticastTTL(this.multicastTTL); this.destination = this.multicast; } else { // default to using broadcast if multicast address is not specified. this._socket.setBroadcast(true); // TODO: get the default broadcast address from os.networkInterfaces() (not currently returned) this.destination = this.broadcast || '255.255.255.255'; } }; UDPStream.prototype._read = function(size) { thumbs.twiddle(); }; UDPStream.prototype._write = function(chunk, encoding, callback) { this._socket.send(chunk, 0, chunk.length, this.port, this.destination); callback(); }; module.exports = UDPStream; 

Todo tiene sentido a excepción de la implementación _read . Es, literalmente, girar los pulgares porque no entiendo lo que se supone que debo hacer allí. Mis datos se insertan cuando el socket udp emite un nuevo mensaje, pero no tengo forma de pausar o reanudar el recurso subyacente. ¿Cómo debería ser esto?

_read es parte del mecanismo de pausa de reanudación. De los documentos API de NodeJS

Cuando haya datos disponibles, póngalos en la cola de lectura llamando a readable.push (chunk). Si push devuelve false, deberías dejar de leer. Cuando se vuelve a llamar a _read, debes comenzar a enviar más datos.

Entonces, en su función _write, si la llamada socket.send falla ya sea devolviendo falso o llamando a una callback con un error, debe pausar su transmisión. _read entonces puede simplemente hacer esto. this._paused = false

Podría verse así.

 UDPStream.prototype._read = function() { this._paused = false; } UDPStream.prototype._write = function(chunk, encoding, callback) { if(!this._paused) this._socket.send(chunk, 0, chunk.length, this.port, this.destination); }; 

La respuesta es bastante sencilla: si realmente no hay manera de aplicar la contrapresión a su recurso subyacente, su implementación _read simplemente está vacía. La transmisión se encargará de highWaterMark cola sus datos highWaterMark hasta que highWaterMark , pero no garantiza nada más allá de ese punto. Los documentos dicen que debe “simplemente proporcionar datos cuando estén disponibles”.