はじめての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);
むむむむ。むずかしい……