1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- package sarama
- import (
- "sync"
- "github.com/klauspost/compress/zstd"
- )
- type ZstdEncoderParams struct {
- Level int
- }
- type ZstdDecoderParams struct {
- }
- var zstdEncMap, zstdDecMap sync.Map
- func getEncoder(params ZstdEncoderParams) *zstd.Encoder {
- if ret, ok := zstdEncMap.Load(params); ok {
- return ret.(*zstd.Encoder)
- }
- // It's possible to race and create multiple new writers.
- // Only one will survive GC after use.
- encoderLevel := zstd.SpeedDefault
- if params.Level != CompressionLevelDefault {
- encoderLevel = zstd.EncoderLevelFromZstd(params.Level)
- }
- zstdEnc, _ := zstd.NewWriter(nil, zstd.WithZeroFrames(true),
- zstd.WithEncoderLevel(encoderLevel))
- zstdEncMap.Store(params, zstdEnc)
- return zstdEnc
- }
- func getDecoder(params ZstdDecoderParams) *zstd.Decoder {
- if ret, ok := zstdDecMap.Load(params); ok {
- return ret.(*zstd.Decoder)
- }
- // It's possible to race and create multiple new readers.
- // Only one will survive GC after use.
- zstdDec, _ := zstd.NewReader(nil)
- zstdDecMap.Store(params, zstdDec)
- return zstdDec
- }
- func zstdDecompress(params ZstdDecoderParams, dst, src []byte) ([]byte, error) {
- return getDecoder(params).DecodeAll(src, dst)
- }
- func zstdCompress(params ZstdEncoderParams, dst, src []byte) ([]byte, error) {
- return getEncoder(params).EncodeAll(src, dst), nil
- }
|