12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- package ncutils
- import (
- "fmt"
- "strings"
- "time"
- )
- // BackOff - back off any function while there is an error
- func BackOff(isExponential bool, maxTime int, f interface{}) (interface{}, error) {
- // maxTime seconds
- startTime := time.Now()
- sleepTime := time.Second
- for time.Now().Before(startTime.Add(time.Second * time.Duration(maxTime))) {
- if result, err := f.(func() (interface{}, error))(); err == nil {
- return result, nil
- }
- time.Sleep(sleepTime)
- if isExponential {
- sleepTime = sleepTime << 1
- }
- PrintLog("retrying...", 1)
- }
- return nil, fmt.Errorf("could not find result")
- }
- // DestructMessage - reconstruct original message through chunks
- func DestructMessage(builtMsg string, senderPublicKey *[32]byte, recipientPrivateKey *[32]byte) ([]byte, error) {
- var chunks = strings.Split(builtMsg, splitKey)
- var totalMessage = make([]byte, len(builtMsg))
- for _, chunk := range chunks {
- var bytes, decErr = BoxDecrypt([]byte(chunk), senderPublicKey, recipientPrivateKey)
- if decErr != nil || bytes == nil {
- return nil, decErr
- }
- totalMessage = append(totalMessage, bytes...)
- }
- return totalMessage, nil
- }
- // BuildMessage Build a message for publishing
- func BuildMessage(originalMessage []byte, recipientPubKey *[32]byte, senderPrivateKey *[32]byte) (string, error) {
- chunks := getSliceChunks(originalMessage, 16128)
- var sb strings.Builder
- for i := 0; i < len(chunks); i++ {
- var encryptedText, encryptErr = BoxEncrypt(chunks[i], recipientPubKey, senderPrivateKey)
- if encryptErr != nil {
- return "", encryptErr
- }
- sb.Write(encryptedText)
- if i < len(chunks)-1 {
- sb.WriteString(splitKey)
- }
- }
- return sb.String(), nil
- }
- var splitKey = "<|#|>"
- func getSliceChunks(slice []byte, chunkSize int) [][]byte {
- var chunks [][]byte
- for i := 0; i < len(slice); i += chunkSize {
- lastByte := i + chunkSize
- if lastByte > len(slice) {
- lastByte = len(slice)
- }
- chunks = append(chunks, slice[i:lastByte])
- }
- return chunks
- }
|