UNPKG

peer-emitter

Version:

acknowledgeable events

67 lines (48 loc) 1.19 kB
var streams = require('stream'); var Readable = streams.Readable; var PassThrough = streams.PassThrough; module.exports = ReadStream; function ReadStream(emitter, name) { var stream = new Readable({ objectMode: true }); var ackStream; var handler; var queue = []; stream._read = listen; var started; function listen(n) { if (started) return; started = true; if (handler) return; handler = ackStream ? handlerWithAck : simpleHandler; emitter.on(name, handler); } function simpleHandler(d) { stream.push(d); } function handlerWithAck(d, ack) {6 queue.push({data:d, ack:ack}); stream.push(d); } stream.AckStream = createAckStream; function createAckStream() { if (ackStream) throw Error('already created'); ackStream = new PassThrough({ objectMode: true }); ackStream.on('data', function(d) { var pair = queue.shift(); pair.ack(); }); if (handler === simpleHandler) { emitter.removeListener(name, simpleHandler); handler = undefined; } if (! handler) emitter.on(name, handlerWithAck); return ackStream; } return stream; }