Write and Run

it's a simple way, but the only way.

続: Stream2のモヤモヤ

追記で書くほどの分量でもなくなってきたので別にしました。

まず結論からいうと、

ドキュメントが追いついてない

だけだったようです。このコミット streams: Support objects other than Buffers · 444bbd4 · joyent/node · GitHub での変更が、ドキュメントに反映されてないようです。ドキュメントは the entire buffer とか言ってるけど、ソースコード的には objectMode のときには size 1 なのね……

If we are in "objectMode" mode then howMuchToRead will
always return 1, state.length will always have 1 appended
to it when there is a new item and fromList always takes
the first value from the list.

俺の半日を返せと。

本題

さて、謎の原因がわかったところで本題。

現状の stream2 は buffer, string, object を chunk としてサポートしている。しかし、他の2つとくらべて object は特殊。どれくらい特殊か、下の表にまとめてみた。

length プロパティ 連結の可否 任意の型のデータの格納の可否
string ある concat メソッドで可能 不可
buffer ある concat メソッドで可能 不可
object 意味ない object の連結? なにそれ 可能

圧倒的に浮いてる。同列に並べちゃいけない。それに対して array はどうか。

length プロパティ 連結の可否 任意の型のデータの格納の可否
string ある concat メソッドで可能 不可
buffer ある concat メソッドで可能 不可
array ある concat メソッドで可能 可能

これでしょ。サポートするなら。

ストリームの chunk は joinable で size(length) を持つべきだと思うんです。どこで切ってもよく、どこでつなげてもいい、そういうデータが chunk であるべきだと思うんですよ。

結論

object のサポートなんてやめて、array をサポートすべき。

とはいえ

「過去のモジュールでは object を chunk として流すものも多い。互換性はどうするんだ」とかいう反論があるかもしれない。でも個人的には stream2 は stream と決別して進化して欲しいし「歴史的経緯」なんてもので汚れてほしくない。stream1 は生かしつつ、stream2 が別に生まれるくらいでいいんじゃないかとも思う。

引数なし read() が返すデータのサイズについて

とか言われたのでちょっと考えてみたけれど、適切なバッファサイズとか流量とか、まだよくわかってない……。なのでもう少し流量制限について調べて、触ってみて、なにかわかったらまた記事書こうと思う。