storj.io/uplink@v1.13.0/private/storage/streams/splitter/encrypted_buffer.go (about) 1 // Copyright (C) 2023 Storj Labs, Inc. 2 // See LICENSE for copying information. 3 4 package splitter 5 6 import ( 7 "io" 8 "sync" 9 10 "github.com/zeebo/errs" 11 12 "storj.io/uplink/private/storage/streams/buffer" 13 ) 14 15 type encryptedBuffer struct { 16 sbuf *buffer.Buffer 17 wrc io.WriteCloser 18 19 mu sync.Mutex 20 plain int64 21 } 22 23 func newEncryptedBuffer(sbuf *buffer.Buffer, wrc io.WriteCloser) *encryptedBuffer { 24 return &encryptedBuffer{ 25 sbuf: sbuf, 26 wrc: wrc, 27 } 28 } 29 30 func (e *encryptedBuffer) Reader() io.Reader { return e.sbuf.Reader() } 31 func (e *encryptedBuffer) DoneReading(err error) { e.sbuf.DoneReading(err) } 32 33 func (e *encryptedBuffer) Write(p []byte) (int, error) { 34 e.mu.Lock() 35 defer e.mu.Unlock() 36 37 n, err := e.wrc.Write(p) 38 e.plain += int64(n) 39 return n, err 40 } 41 42 func (e *encryptedBuffer) PlainSize() int64 { 43 e.mu.Lock() 44 defer e.mu.Unlock() 45 46 return e.plain 47 } 48 49 func (e *encryptedBuffer) DoneWriting(err error) { 50 e.mu.Lock() 51 defer e.mu.Unlock() 52 53 cerr := e.wrc.Close() 54 e.sbuf.DoneWriting(errs.Combine(err, cerr)) 55 }