func encodePreambleToCBOR()

in internal/pkg/file/cbor/chunk.go [55:128]


func encodePreambleToCBOR(final bool, baseID string, chunkHash string, chunkSize int64) []byte {
	bidLen := len(baseID)
	hashLen := len(chunkHash)

	// if we know the size of the chunk stream, we will write the 4-byte uint32
	// descriptor of that length
	// otherwise it will be a *single* byte saying it is an unknown length
	// and we will write out lengths as the chunk is read
	chunkLen := 5 // space for describing sequence length. 1 byte to SAY 32-bit int (4byte), then 4 bytes
	if final {
		chunkLen = 1
	}

	preamble := make([]byte, 31+bidLen+2+5+hashLen+2+chunkLen+5)
	preamble[0] = 0xA5 // Object with 5 keys
	preamble[1] = 0x6a // string with 10 characters (@timestamp)
	preamble[2] = '@'
	preamble[3] = 't'
	preamble[4] = 'i'
	preamble[5] = 'm'
	preamble[6] = 'e'
	preamble[7] = 's'
	preamble[8] = 't'
	preamble[9] = 'a'
	preamble[10] = 'm'
	preamble[11] = 'p'
	preamble[12] = 0x1b // uint64 to follow
	// occupies 8 bytes, indexes 13-20
	binary.BigEndian.PutUint64(preamble[13:], uint64(time.Now().UnixMilli())) //nolint:gosec // disable G115
	preamble[21] = 0x64                                                       // string with 4 chars (key: last)
	preamble[22] = 'l'
	preamble[23] = 'a'
	preamble[24] = 's'
	preamble[25] = 't'
	if final {
		preamble[26] = 0xF5 // bool true
	} else {
		preamble[26] = 0xF4 // bool false
	}
	preamble[27] = 0x63 // string with 3 chars (key: bid)
	preamble[28] = 'b'
	preamble[29] = 'i'
	preamble[30] = 'd'
	i := 31
	if n, err := writeString(preamble[i:], baseID); err != nil {
		return nil
	} else {
		i += n
	}
	if n, err := writeKey(preamble[i:], "sha2"); err != nil {
		return nil
	} else {
		i += n
	}
	if n, err := writeString(preamble[i:], chunkHash); err != nil {
		return nil
	} else {
		i += n
	}
	if n, err := writeKey(preamble[i:], "data"); err != nil {
		return nil
	} else {
		i += n
	}
	if !final {
		// byte data should be precisely chunkSize long, otherwise malformed
		preamble[i] = 0x5A                                            // say length descriptor will be 32-bit int
		binary.BigEndian.PutUint32(preamble[i+1:], uint32(chunkSize)) //nolint:gosec // disable G115
	} else {
		// final chunk may be less than full size, will need to determine length
		preamble[i] = 0x5F // indeterminate-length byte sequence
	}
	return preamble
}