はじめてのWritable Stream + Readable/Writable(Both?) Stream

昨日に引き続き、Streamを書いてました。ReadableもしくはWritable単体だと理解してるつもりなんだけど、両方を扱うStreamを書いてると、途端に???って感じになる……
そしてWritable Streamのソースコードをなくしたw

Readable/Writable Stream

line_stream.js

LineStreamとか言う名前だけどなにもしないw

var stream = require('stream'),
    util = require('util');

function LineStream() {
  stream.Stream.call(this);

  this.readable = true;
  this.writable = true;

  this.ended = false;
  this.paused = false;

  this.encoding = '';
  this.buffer = '';
}

util.inherits(LineStream, stream.Stream);

/** stream */

LineStream.prototype.destroy = function() {
  this.readable = false;
  this.writable = false;
};

/** readable stream */

LineStream.prototype.setEncoding = function(encoding) {
  this.encoding = encoding;
};

LineStream.prototype.pause = function() {
  this.paused = true;
};

LineStream.prototype.resume = function() {
  this.paused = false;
};

/** writable stream */

LineStream.prototype.write = function(data, encoding) {
  if (this.ended || this.paused) {
    return;
  }

  this.emit('data',
      (Buffer.isBuffer(data)) ? data.toString(encoding) : data);

  return true;
};

LineStream.prototype.end = function(data, encoding) {
  if (data) {
    this.write(data, encoding);
  }
  this.emit('end');
  this.destroy();
  this.ended = true;
};

LineStream.prototype.destroySoon = function() {
  this.destroy();
};

module.exports = {
  create: function() {
    return new LineStream;
  }
};


LineStreamを扱うスクリプトを二種類書いてみたけど、とりあえず両方とも想定通りに動くみたい。

index.js - 1
var linestream = require('./line_stream'),
    l = linestream.create();

require('fs')
  .createReadStream('./line_stream.js', {
    bufferSize: 16
  })
  .pipe(l)
  .pipe(process.stdout);
index.js - 2
var linestream = require('./line_stream'),
    l = linestream.create();

l.on('data', function(data) {
  console.log(data);
});
l.on('end', function() {
  console.log('end');
});

require('fs')
  .createReadStream('./line_stream.js', {
    bufferSize: 16
  })
  .pipe(l);


むむむむ。むずかしい……