logging.go 2.42 KB
Newer Older
Adin Schmahmann's avatar
Adin Schmahmann committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
package dht

import (
	"fmt"
	"github.com/multiformats/go-multibase"
	"github.com/multiformats/go-multihash"
	"strings"

	"github.com/ipfs/go-cid"
	"github.com/multiformats/go-base32"
)

func tryFormatLoggableRecordKey(k string) (string, error) {
	if len(k) == 0 {
		return "", fmt.Errorf("loggableRecordKey is empty")
	}
	var proto, cstr string
	if k[0] == '/' {
		// it's a path (probably)
		protoEnd := strings.IndexByte(k[1:], '/')
		if protoEnd < 0 {
			return "", fmt.Errorf("loggableRecordKey starts with '/' but is not a path: %s", base32.RawStdEncoding.EncodeToString([]byte(k)))
		}
		proto = k[1 : protoEnd+1]
		cstr = k[protoEnd+2:]

		var encStr string
		c, err := cid.Cast([]byte(cstr))
		if err == nil {
			encStr = c.String()
		} else {
			encStr = base32.RawStdEncoding.EncodeToString([]byte(cstr))
		}

		return fmt.Sprintf("/%s/%s", proto, encStr), nil
	}

	return "", fmt.Errorf("loggableRecordKey is not a path: %s", base32.RawStdEncoding.EncodeToString([]byte(k)))
}

type loggableRecordKeyString string

func (lk loggableRecordKeyString) String() string {
	k := string(lk)
	newKey, err := tryFormatLoggableRecordKey(k)
	if err == nil {
		return newKey
	}
	return err.Error()
}

type loggableRecordKeyBytes []byte

func (lk loggableRecordKeyBytes) String() string {
	k := string(lk)
	newKey, err := tryFormatLoggableRecordKey(k)
	if err == nil {
		return newKey
	}
	return err.Error()
}

type loggableProviderRecordBytes []byte

func (lk loggableProviderRecordBytes) String() string {
	k := string(lk)
	newKey, err := tryFormatLoggableProviderKey(k)
	if err == nil {
		return newKey
	}
	return err.Error()
}

func tryFormatLoggableProviderKey(k string) (string, error) {
	if len(k) == 0 {
		return "", fmt.Errorf("loggableProviderKey is empty")
	}

	h, err := multihash.Cast([]byte(k))
	if err == nil {
		c := cid.NewCidV1(cid.Raw, h)
		encStr, err := c.StringOfBase(multibase.Base32)
		if err != nil {
			panic(fmt.Errorf("should be impossible to reach here : %w", err))
		}
		return encStr, nil
	}

	// The DHT used to provide CIDs, but now provides multihashes
	// TODO: Drop this when enough of the network has upgraded
	c, err := cid.Cast([]byte(k))
	if err == nil {
		encStr, err := c.StringOfBase(multibase.Base32)
		if err != nil {
			panic(fmt.Errorf("should be impossible to reach here : %w", err))
		}
		return encStr, nil
	}

	return "", fmt.Errorf("invalid provider record: %s : err %w", base32.RawStdEncoding.EncodeToString([]byte(k)), err)
}