feat: add ZSTD decode/encode support #59
This commit is contained in:
parent
ff8da4ca60
commit
694214bedf
|
@ -9,4 +9,5 @@ const DECODE_NONE = "None"
|
||||||
const DECODE_BASE64 = "Base64"
|
const DECODE_BASE64 = "Base64"
|
||||||
const DECODE_GZIP = "GZip"
|
const DECODE_GZIP = "GZip"
|
||||||
const DECODE_DEFLATE = "Deflate"
|
const DECODE_DEFLATE = "Deflate"
|
||||||
|
const DECODE_ZSTD = "ZStd"
|
||||||
const DECODE_BROTLI = "Brotli"
|
const DECODE_BROTLI = "Brotli"
|
||||||
|
|
|
@ -2,14 +2,15 @@ package strutil
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"compress/flate"
|
|
||||||
"compress/gzip"
|
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/andybalholm/brotli"
|
"github.com/andybalholm/brotli"
|
||||||
|
"github.com/klauspost/compress/flate"
|
||||||
|
"github.com/klauspost/compress/gzip"
|
||||||
|
"github.com/klauspost/compress/zstd"
|
||||||
"io"
|
"io"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
@ -70,8 +71,17 @@ func decodeWith(str, decodeType string) (value, resultDecode string) {
|
||||||
return
|
return
|
||||||
|
|
||||||
case types.DECODE_DEFLATE:
|
case types.DECODE_DEFLATE:
|
||||||
if gzipStr, ok := decodeDeflate(str); ok {
|
if falteStr, ok := decodeDeflate(str); ok {
|
||||||
value = gzipStr
|
value = falteStr
|
||||||
|
} else {
|
||||||
|
value = str
|
||||||
|
}
|
||||||
|
resultDecode = decodeType
|
||||||
|
return
|
||||||
|
|
||||||
|
case types.DECODE_ZSTD:
|
||||||
|
if zstdStr, ok := decodeZStd(str); ok {
|
||||||
|
value = zstdStr
|
||||||
} else {
|
} else {
|
||||||
value = str
|
value = str
|
||||||
}
|
}
|
||||||
|
@ -79,8 +89,8 @@ func decodeWith(str, decodeType string) (value, resultDecode string) {
|
||||||
return
|
return
|
||||||
|
|
||||||
case types.DECODE_BROTLI:
|
case types.DECODE_BROTLI:
|
||||||
if gzipStr, ok := decodeBrotli(str); ok {
|
if brotliStr, ok := decodeBrotli(str); ok {
|
||||||
value = gzipStr
|
value = brotliStr
|
||||||
} else {
|
} else {
|
||||||
value = str
|
value = str
|
||||||
}
|
}
|
||||||
|
@ -112,6 +122,11 @@ func autoDecode(str string) (value, resultDecode string) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if value, ok = decodeZStd(str); ok {
|
||||||
|
resultDecode = types.DECODE_ZSTD
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
if value, ok = decodeBrotli(str); ok {
|
if value, ok = decodeBrotli(str); ok {
|
||||||
resultDecode = types.DECODE_BROTLI
|
resultDecode = types.DECODE_BROTLI
|
||||||
return
|
return
|
||||||
|
@ -244,6 +259,16 @@ func decodeDeflate(str string) (string, bool) {
|
||||||
return str, false
|
return str, false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func decodeZStd(str string) (string, bool) {
|
||||||
|
if reader, err := zstd.NewReader(strings.NewReader(str)); err == nil {
|
||||||
|
defer reader.Close()
|
||||||
|
if decompressed, err := io.ReadAll(reader); err == nil {
|
||||||
|
return string(decompressed), true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return str, false
|
||||||
|
}
|
||||||
|
|
||||||
func decodeBrotli(str string) (string, bool) {
|
func decodeBrotli(str string) (string, bool) {
|
||||||
reader := brotli.NewReader(strings.NewReader(str))
|
reader := brotli.NewReader(strings.NewReader(str))
|
||||||
if decompressed, err := io.ReadAll(reader); err == nil {
|
if decompressed, err := io.ReadAll(reader); err == nil {
|
||||||
|
@ -304,6 +329,14 @@ func SaveAs(str, viewType, decodeType string) (value string, err error) {
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
|
|
||||||
|
case types.DECODE_ZSTD:
|
||||||
|
if zstdStr, ok := encodeZStd(str); ok {
|
||||||
|
value = zstdStr
|
||||||
|
} else {
|
||||||
|
err = errors.New("fail to build zstd")
|
||||||
|
}
|
||||||
|
return
|
||||||
|
|
||||||
case types.DECODE_BROTLI:
|
case types.DECODE_BROTLI:
|
||||||
if brotliStr, ok := encodeBrotli(str); ok {
|
if brotliStr, ok := encodeBrotli(str); ok {
|
||||||
value = brotliStr
|
value = brotliStr
|
||||||
|
@ -391,6 +424,26 @@ func encodeDeflate(str string) (string, bool) {
|
||||||
return str, false
|
return str, false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func encodeZStd(str string) (string, bool) {
|
||||||
|
var compress = func(b []byte) (string, error) {
|
||||||
|
var buf bytes.Buffer
|
||||||
|
writer, err := zstd.NewWriter(&buf)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
if _, err = writer.Write([]byte(str)); err != nil {
|
||||||
|
writer.Close()
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
writer.Close()
|
||||||
|
return string(buf.Bytes()), nil
|
||||||
|
}
|
||||||
|
if zstdStr, err := compress([]byte(str)); err == nil {
|
||||||
|
return zstdStr, true
|
||||||
|
}
|
||||||
|
return str, false
|
||||||
|
}
|
||||||
|
|
||||||
func encodeBrotli(str string) (string, bool) {
|
func encodeBrotli(str string) (string, bool) {
|
||||||
var compress = func(b []byte) (string, error) {
|
var compress = func(b []byte) (string, error) {
|
||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
|
|
|
@ -20,6 +20,7 @@ export const decodeTypes = {
|
||||||
BASE64: 'Base64',
|
BASE64: 'Base64',
|
||||||
GZIP: 'GZip',
|
GZIP: 'GZip',
|
||||||
DEFLATE: 'Deflate',
|
DEFLATE: 'Deflate',
|
||||||
|
ZSTD: 'ZStd',
|
||||||
BROTLI: 'Brotli',
|
BROTLI: 'Brotli',
|
||||||
// PHP: 'PHP',
|
// PHP: 'PHP',
|
||||||
// Java: 'Java',
|
// Java: 'Java',
|
||||||
|
|
Loading…
Reference in New Issue