diff --git a/ocf/codec.go b/ocf/codec.go index 8d0cab2..62bc64c 100644 --- a/ocf/codec.go +++ b/ocf/codec.go @@ -162,3 +162,14 @@ func (zstdCodec *ZStandardCodec) Encode(b []byte) []byte { defer zstdCodec.encoder.Reset(nil) return zstdCodec.encoder.EncodeAll(b, nil) } + +// Close closes the zstandard encoder and decoder, releasing resources. +func (zstdCodec *ZStandardCodec) Close() error { + if zstdCodec.decoder != nil { + zstdCodec.decoder.Close() + } + if zstdCodec.encoder != nil { + return zstdCodec.encoder.Close() + } + return nil +} diff --git a/ocf/ocf.go b/ocf/ocf.go index 4a1030e..09d7a93 100644 --- a/ocf/ocf.go +++ b/ocf/ocf.go @@ -176,6 +176,14 @@ func (d *Decoder) Error() error { return d.reader.Error } +// Close releases codec resources. +func (d *Decoder) Close() error { + if c, ok := d.codec.(io.Closer); ok { + return c.Close() + } + return nil +} + func (d *Decoder) readBlock() int64 { _ = d.reader.Peek() if errors.Is(d.reader.Error, io.EOF) { @@ -496,9 +504,15 @@ func (e *Encoder) Flush() error { return e.writer.Error } -// Close closes the encoder, flushing the writer. +// Close closes the encoder, flushing the writer and releasing codec resources. func (e *Encoder) Close() error { - return e.Flush() + err := e.Flush() + if c, ok := e.codec.(io.Closer); ok { + if cerr := c.Close(); cerr != nil && err == nil { + err = cerr + } + } + return err } func (e *Encoder) writerBlock() error {