stario/pipe.go
starainrt c8facb5a03
stario: 提升 Go 1.20 基线与交互/队列稳定性
- 提升 go.mod 基线到 Go 1.20,并补齐对应测试
  - 修正 Passwd / PasswdResponseSignal 语义,Ctrl+C 默认退出当前流程
  - 优化 raw terminal redraw、Restore 与 StopUntil 的边界行为
  - 新增 StarPipe、FrameReader/FrameWriter、ReadFullContext/WriteFullContext/CopyContext、IsTerminal/ReadPasswordContext
  - 收口 StarQueue / StarBuffer 语义,删除 EndWrite,统一 Close / Abort 行为
  - 补齐 signal、timeout、queue、terminal、pipe、buffer 的回归测试与 race 覆盖
2026-04-15 14:35:19 +08:00

72 lines
1.8 KiB
Go

package stario
import "io"
// StarPipeReader is the read side returned by NewStarPipe.
type StarPipeReader struct {
buf *StarBuffer
}
// StarPipeWriter is the write side returned by NewStarPipe.
type StarPipeWriter struct {
buf *StarBuffer
}
// NewStarPipe creates a buffered in-memory pipe backed by StarBuffer.
//
// The writer side uses Close to signal a graceful end-of-stream and Abort to
// fail both sides immediately.
func NewStarPipe(capacity uint64) (*StarPipeReader, *StarPipeWriter, error) {
buf, err := NewStarBuffer(capacity)
if err != nil {
return nil, nil, err
}
return &StarPipeReader{buf: buf}, &StarPipeWriter{buf: buf}, nil
}
// Read reads buffered bytes from the pipe.
func (reader *StarPipeReader) Read(p []byte) (int, error) {
if reader == nil || reader.buf == nil {
return 0, io.ErrClosedPipe
}
return reader.buf.Read(p)
}
// Close aborts the pipe from the read side and wakes blocked writers.
func (reader *StarPipeReader) Close() error {
if reader == nil || reader.buf == nil {
return io.ErrClosedPipe
}
return reader.buf.Abort()
}
// Abort aborts the pipe from the read side and wakes blocked writers.
func (reader *StarPipeReader) Abort() error {
return reader.Close()
}
// Write writes bytes into the pipe buffer.
func (writer *StarPipeWriter) Write(p []byte) (int, error) {
if writer == nil || writer.buf == nil {
return 0, io.ErrClosedPipe
}
return writer.buf.Write(p)
}
// Close gracefully closes the write side. Buffered bytes remain readable until
// drained.
func (writer *StarPipeWriter) Close() error {
if writer == nil || writer.buf == nil {
return io.ErrClosedPipe
}
return writer.buf.Close()
}
// Abort aborts the pipe immediately.
func (writer *StarPipeWriter) Abort() error {
if writer == nil || writer.buf == nil {
return io.ErrClosedPipe
}
return writer.buf.Abort()
}