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 }