package util import ( "basic.com/valib/deliver.git" "context" "errors" "github.com/pierrec/lz4" "taskpubsub/logger" ) type SocketContext struct { Sock deliver.Deliver Context context.Context Cancel context.CancelFunc } // 1. oldstring element is not in new : abandon(delete) // 2. new element is not in oldstring : add(add) func Difference(oldstring []string, newstring []string) map[string]string { var diff = make(map[string]string) // Loop two times, first to find oldstring strings not in newstring, // second loop to find newstring strings not in oldstring for i := 0; i < 2; i++ { for _, s1 := range oldstring { found := false for _, s2 := range newstring { if s1 == s2 { found = true break } } // String not found. We add it to return slice if !found && i == 0 { diff[s1] = "delete" } if !found && i != 0 { diff[s1] = "add" } } // Swap the slices, only if it was the first loop if i == 0 { oldstring, newstring = newstring, oldstring } } return diff } // UnCompress uncompress func UnCompress(in []byte) ([]byte, error) { out := make([]byte, 10*len(in)) n, err := lz4.UncompressBlock(in, out) if err != nil { logger.Error("uncompress error: ", err) return nil, err } out = out[:n] // uncompressed data return out, nil } // Compress compress func Compress(in []byte) ([]byte, error) { out := make([]byte, len(in)) ht := make([]int, 64<<10) // buffer for the compression table n, err := lz4.CompressBlock(in, out, ht) if err != nil { logger.Error("compress: ", err) return nil, err } if n >= len(in) { logger.Error("image is not compressible") } out = out[:n] // compressed data return out, nil } // create server func NewSocketListen(mode int, url string) (socket SocketContext, err error) { logger.Info("url is: ", url) ctx, cancel := context.WithCancel(context.Background()) socket.Context = ctx socket.Cancel = cancel socket.Sock = deliver.NewServer(deliver.Mode(mode), url) if socket.Sock == nil { return socket, errors.New("create listen error") } return socket, nil } func NewSocketDial(mode int, url string) (socket SocketContext, err error) { logger.Info("url is: ", url) ctx, cancel := context.WithCancel(context.Background()) socket.Context = ctx socket.Cancel = cancel socket.Sock = deliver.NewClient(deliver.Mode(mode), url) if socket.Sock == nil { return socket, errors.New("create listen error") } return socket, nil }