package logbuf import ( "bytes" "sync" ) const DefaultMax = 256 << 10 // 256 KiB // Buffer is a concurrency-safe, size-capped bytes.Buffer replacement for engine stderr. type Buffer struct { mu sync.Mutex buf bytes.Buffer max int } func New(max int) *Buffer { if max <= 0 { max = DefaultMax } return &Buffer{max: max} } func (b *Buffer) Write(p []byte) (int, error) { if b == nil { return len(p), nil } b.mu.Lock() defer b.mu.Unlock() if b.buf.Len()+len(p) > b.max { // Drop oldest half to keep recent diagnostics. keep := b.buf.Bytes() if len(keep) > b.max/2 { keep = keep[len(keep)-b.max/2:] } b.buf.Reset() _, _ = b.buf.Write(keep) _, _ = b.buf.WriteString("\n… log truncated …\n") } return b.buf.Write(p) } func (b *Buffer) String() string { if b == nil { return "" } b.mu.Lock() defer b.mu.Unlock() return b.buf.String() } func (b *Buffer) Len() int { if b == nil { return 0 } b.mu.Lock() defer b.mu.Unlock() return b.buf.Len() }