Project

General

Profile

Feature #20105

Updated by ioquatix (Samuel Williams) 4 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`.

Back