Documentation
¶
Overview ¶
Package streambuf provides append-only buffers and read-only streams with independent readers that can block until more data is available or the instance is closed.
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var ( // ErrSeekEndNotSupported is returned when seeking relative to the end. // Reader-backed seeks currently support only SeekStart and SeekCurrent. ErrSeekEndNotSupported = errors.New("seek end is not currently supported") // ErrInvalidWhence is returned when Seek receives an unsupported whence value. ErrInvalidWhence = errors.New("invalid seek whence") // ErrNegativeIndex is returned when a seek would move before byte index 0. // The reader position is clamped to 0 in this case. ErrNegativeIndex = errors.New("invalid index, cannot be less than 0") // ErrCannotWriteToReadOnly is returned when a write is attempted on a read-only backend. ErrCannotWriteToReadOnly = errors.New("cannot write to read-only backend") // ErrIsClosed is returned when an action is attempted on a closed instance. ErrIsClosed = errors.New("cannot perform action on closed instance") )
Functions ¶
This section is empty.
Types ¶
type Buffer ¶
type Buffer struct {
// contains filtered or unexported fields
}
Buffer is a thread-safe byte buffer with reader support.
func New ¶
New constructs a new file Buffer.
Example ¶
var err error
if exampleBuffer, err = New("path/to/file"); err != nil {
log.Fatal(err)
}
func NewMemory ¶ added in v0.2.0
func NewMemory() (out *Buffer)
NewMemory constructs a new in-memory Buffer.
Example ¶
exampleBuffer = NewMemory()
func (*Buffer) Close ¶
Close closes the writer side of the buffer and signals waiting readers. It does not wait for readers to call Close.
Example ¶
// Close closes the backend immediately and does not wait for readers to finish.
if err := exampleBuffer.Close(); err != nil {
log.Fatal(err)
}
func (*Buffer) CloseAndWait ¶ added in v0.2.0
CloseAndWait closes the writer side of the buffer and signals waiting readers. It waits for readers to close until ctx is canceled. Once called, future Reader and Write calls return ErrIsClosed. ctx must be non-nil. If ctx is canceled before readers close, this call still returns and the buffer remains closed; readers should still be closed to complete internal wait cleanup.
Example ¶
// CloseAndWait blocks until the backend is closed and all readers are closed,
// or until the provided context is done.
if err := exampleBuffer.CloseAndWait(context.Background()); err != nil {
log.Fatal(err)
}
func (Buffer) Reader ¶
func (s Buffer) Reader() (r io.ReadSeekCloser, err error)
Reader returns a new io.ReadSeekCloser that streams data from the stream. Each reader tracks its own read offset and supports seeking relative to the start or current position. It returns ErrIsClosed if the stream is closed.
Example ¶
var err error
if _, err = exampleBuffer.Write([]byte("hello world")); err != nil {
log.Fatal(err)
}
var (
r1 io.ReadSeekCloser
r2 io.ReadSeekCloser
r3 io.ReadSeekCloser
)
if r1, err = exampleBuffer.Reader(); err != nil {
log.Fatal(err)
}
defer r1.Close()
if r2, err = exampleBuffer.Reader(); err != nil {
log.Fatal(err)
}
defer r2.Close()
if r3, err = exampleBuffer.Reader(); err != nil {
log.Fatal(err)
}
defer r3.Close()
// Each reader is independent and maintains its own read offset.
// Reads or seeks on r1 do not affect r2 or r3.
type Stream ¶ added in v0.6.0
type Stream struct {
// contains filtered or unexported fields
}
Stream is a thread-safe read-only stream with reader support.
func NewMemoryStream ¶ added in v0.6.0
NewMemoryStream constructs a read-only memory-backed Stream over bs.
Example ¶
bs := []byte("hello world")
exampleStream = NewMemoryStream(bs)
func NewStream ¶ added in v0.6.0
NewStream constructs a read-only file-backed Stream.
Example ¶
var err error
// NewStream constructs a read-only file-backed stream.
if exampleStream, err = NewStream("path/to/file"); err != nil {
log.Fatal(err)
}
func (Stream) Close ¶ added in v0.6.0
func (s Stream) Close() (err error)
Close closes the stream and signals waiting readers. It does not wait for readers to call Close.
Example ¶
// Close closes the readable backend immediately and does not wait for readers.
if err := exampleStream.Close(); err != nil {
log.Fatal(err)
}
func (Stream) CloseAndWait ¶ added in v0.6.0
CloseAndWait closes the stream and signals waiting readers. It waits for readers to close until ctx is canceled. Once called, future Reader calls return ErrIsClosed. ctx must be non-nil. If ctx is canceled before readers close, this call still returns and the stream remains closed; readers should still be closed to complete internal wait cleanup.
Example ¶
// CloseAndWait blocks until the readable backend is closed and all readers are
// closed, or until the provided context is done.
if err := exampleStream.CloseAndWait(context.Background()); err != nil {
log.Fatal(err)
}
func (Stream) Reader ¶ added in v0.6.0
func (s Stream) Reader() (r io.ReadSeekCloser, err error)
Reader returns a new io.ReadSeekCloser that streams data from the stream. Each reader tracks its own read offset and supports seeking relative to the start or current position. It returns ErrIsClosed if the stream is closed.
Example ¶
var (
r1 io.ReadSeekCloser
r2 io.ReadSeekCloser
r3 io.ReadSeekCloser
err error
)
if r1, err = exampleStream.Reader(); err != nil {
log.Fatal(err)
}
defer r1.Close()
if r2, err = exampleStream.Reader(); err != nil {
log.Fatal(err)
}
defer r2.Close()
if r3, err = exampleStream.Reader(); err != nil {
log.Fatal(err)
}
defer r3.Close()
// Each reader is independent and maintains its own read offset.
// Reads or seeks on r1 do not affect r2 or r3.

