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  }