I agree with both suggestions.
When called by a Readable implementation, it is supposed to signal that the stream is done getting data from its upstream source, but there was no data to fetch. The Readable internals then ensure that another _read() loop is called (including checking first if the stream has been paused).
When in objectMode, though, this is ambiguous. .push('') Could mean that the implementation would like to push out the empty string, since that's a valid object.
I actually need to change this this week (break the spec?) in my browser-based implementation of objectMode streams3.
Currently, .push(), ie pushing undefined, is treated like .push(null), which signals EOF and ends the Readable. Instead, I'm going to make .push() be the equivalent of .push('') in non-objectMde streams.
This would actually be bad for your case. Just like you sometimes expect .read() to return null, theoretically some user may want to .push() the value 'undefined'. I'm kind of fine making that sacrifice, but curious if you or anyone has a better idea. It could be .push(readable.NULL) or something ( :/ ). Similarly, if you needed to be able to .read() out the value 'null', .read() could return something like readable.NULL. But these seem gross..