• cody-wang-cb's avatar
    Fjord: Add Brotli channel compression support (#10358) · 4b8f6f4f
    cody-wang-cb authored
    * wip
    
    * wip
    
    * fix
    
    * fix
    
    * fix
    
    * fix
    
    * address some of the bots comments
    
    * use version bit of 1
    
    * fix lint
    
    * adding compression type
    
    * update batch reader
    
    * abstract span channel compressor
    
    * test and singular batch compressor
    
    * fix
    
    * lint
    
    * move channel compressor as interface
    
    * add base class
    
    * fix go mod
    
    * test fixes
    
    * address comments
    
    * fix
    
    * fix
    
    * revert channel builder test
    
    * revert ratio compressor test
    
    * add checks to accept brotli only post fjord
    
    * revemo unnecessary in test
    
    * fix forge-std
    
    * gofmt
    
    * address comments
    
    * remove methods in compressor
    
    * fix error msg
    
    * add compression algo flag to optional flags
    
    * add Clone() function
    
    ---------
    Co-authored-by: default avatarRoberto Bayardo <roberto.bayardo@coinbase.com>
    4b8f6f4f
types.go 1.21 KB
package derive

import (
	"fmt"
	"regexp"
)

type CompressionAlgo string

const (
	// compression algo types
	Zlib     CompressionAlgo = "zlib"
	Brotli9  CompressionAlgo = "brotli-9"
	Brotli10 CompressionAlgo = "brotli-10"
	Brotli11 CompressionAlgo = "brotli-11"
)

var CompressionAlgoTypes = []CompressionAlgo{
	Zlib,
	Brotli9,
	Brotli10,
	Brotli11,
}

var brotliRegexp = regexp.MustCompile(`^brotli-(9|10|11)$`)

func (algo CompressionAlgo) String() string {
	return string(algo)
}

func (algo *CompressionAlgo) Set(value string) error {
	if !ValidCompressionAlgoType(CompressionAlgo(value)) {
		return fmt.Errorf("unknown compression algo type: %q", value)
	}
	*algo = CompressionAlgo(value)
	return nil
}

func (algo *CompressionAlgo) Clone() any {
	cpy := *algo
	return &cpy
}

func (algo *CompressionAlgo) IsBrotli() bool {
	return brotliRegexp.MatchString(algo.String())
}

func GetBrotliLevel(algo CompressionAlgo) int {
	switch algo {
	case Brotli9:
		return 9
	case Brotli10:
		return 10
	case Brotli11:
		return 11
	default:
		panic("Unsupported brotli level")
	}
}

func ValidCompressionAlgoType(value CompressionAlgo) bool {
	for _, k := range CompressionAlgoTypes {
		if k == value {
			return true
		}
	}
	return false
}