zstd.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. // Copyright 2023-2023 EMQ Technologies Co., Ltd.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package zstd
  15. import (
  16. "bytes"
  17. "io"
  18. "github.com/klauspost/compress/zstd"
  19. )
  20. func NewZstdCompressor() (*zstdCompressor, error) {
  21. zstdWriter, err := zstd.NewWriter(nil)
  22. if err != nil {
  23. return nil, err
  24. }
  25. return &zstdCompressor{
  26. writer: zstdWriter,
  27. }, nil
  28. }
  29. type zstdCompressor struct {
  30. writer *zstd.Encoder
  31. buffer bytes.Buffer
  32. }
  33. func (g *zstdCompressor) Compress(data []byte) ([]byte, error) {
  34. g.buffer.Reset()
  35. g.writer.Reset(&g.buffer)
  36. _, err := g.writer.Write(data)
  37. if err != nil {
  38. return nil, err
  39. }
  40. err = g.writer.Close()
  41. if err != nil {
  42. return nil, err
  43. }
  44. return g.buffer.Bytes(), nil
  45. }
  46. func NewzstdDecompressor() (*zstdDecompressor, error) {
  47. r, err := zstd.NewReader(nil, zstd.WithDecoderConcurrency(0))
  48. if err != nil {
  49. return nil, err
  50. }
  51. return &zstdDecompressor{decoder: r}, nil
  52. }
  53. type zstdDecompressor struct {
  54. decoder *zstd.Decoder
  55. }
  56. func (z *zstdDecompressor) Decompress(data []byte) ([]byte, error) {
  57. return z.decoder.DecodeAll(data, nil)
  58. }
  59. func NewReader(r io.Reader) (io.ReadCloser, error) {
  60. result, err := zstd.NewReader(r)
  61. if err != nil {
  62. return nil, err
  63. }
  64. return result.IOReadCloser(), nil
  65. }
  66. func NewWriter(w io.Writer) (io.Writer, error) {
  67. return zstd.NewWriter(w)
  68. }