Module: IO::Stream
- Defined in:
- lib/io/stream/duplex.rb,
lib/io/stream/generic.rb,
lib/io/stream/version.rb,
lib/io/stream/buffered.rb,
lib/io/stream/readable.rb,
lib/io/stream/writable.rb,
lib/io/stream/string_buffer.rb,
lib/io/stream/connection_reset_error.rb
Overview
Released under the MIT License. Copyright, 2025-2026, by Samuel Williams.
Defined Under Namespace
Modules: Readable, Writable Classes: Buffered, ConnectionResetError, Duplex, Generic, StringBuffer
Constant Summary collapse
- VERSION =
"0.13.0"- BLOCK_SIZE =
The default block size for IO buffers. Defaults to 256KB (optimized for modern SSDs and networks).
ENV.fetch("IO_STREAM_BLOCK_SIZE", 1024*256).to_i
- MINIMUM_READ_SIZE =
The minimum read size for efficient I/O operations. Defaults to the same as BLOCK_SIZE.
ENV.fetch("IO_STREAM_MINIMUM_READ_SIZE", BLOCK_SIZE).to_i
- MAXIMUM_READ_SIZE =
The maximum read size for a single read operation. This limit exists because:
-
System calls like read() cannot handle requests larger than SSIZE_MAX
-
Very large reads can cause memory pressure and poor interactive performance
-
Most socket buffers and pipe capacities are much smaller anyway
On 64-bit systems SSIZE_MAX is ~8.8 million MB, on 32-bit it’s ~2GB. Our default of 16MB provides a good balance of throughput and responsiveness, and is page aligned. It is also a multiple of the minimum read size, so that we can read in chunks without exceeding the maximum.
-
ENV.fetch("IO_STREAM_MAXIMUM_READ_SIZE", MINIMUM_READ_SIZE * 64).to_i
- MINIMUM_WRITE_SIZE =
The minimum write size before flushing. Defaults to 64KB.
ENV.fetch("IO_STREAM_MINIMUM_WRITE_SIZE", BLOCK_SIZE).to_i
Class Method Summary collapse
-
.Duplex(input, output = nil, **options) ⇒ Object
Construct a buffered stream from either one duplex IO-like object or two separate endpoints.
Class Method Details
.Duplex(input, output = nil, **options) ⇒ Object
Construct a buffered stream from either one duplex IO-like object or two separate endpoints.
115 116 117 118 119 120 121 |
# File 'lib/io/stream/duplex.rb', line 115 def self.Duplex(input, output = nil, **) if output Buffered.wrap(Duplex.new(input, output), **) else ::IO.Stream(input) end end |