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/false)
end
def read(size, buffer)
end
def write(size, 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`.