Feature #20105
Updated by ioquatix (Samuel Williams) 8 months ago
Ruby's IO class has a general model for streaming IO, including some hidden classes like `IO::generic_readable` and `IO::generic_writable`. As Ruby's core IO classes evolve, gems like `openssl` (see `OpenSSL::Buffering`) need to be updated to support changes to the interface. As it stands, there are changes in `IO` which are not copied to `OpenSSL::Buffering`. I'd like to propose we introduce some shared interface for streams that is used by `IO`, `Socket`, and `OpenSSL` to start with. The general interface would be similar to `IO` and allow code like `OpenSSL` to avoid re-implementing the `IO` interface. I don't have a strong idea for the interface yet, but it would probably look something like this: ```ruby class IO::Stream def initialize(io, buffered: true) end def read(size, buffer=nil) buffer) end def write(size, buffer=nil) buffer) end # Include general operations from IO, like gets, puts, etc end ``` I think ideally we'd try implement with pure Ruby and a first goal would be to replace `OpenSSL::Buffering`.