tlv.go raw

   1  // Package tlv implements a simple Type Length Value encoder for nostr NIP-19
   2  // bech32 encoded entities. The format is generic and could also be used for any
   3  // TLV use case where fields are less than 255 bytes.
   4  package tlv
   5  
   6  import (
   7  	"io"
   8  )
   9  
  10  const (
  11  	Default byte = iota
  12  	Relay
  13  	Author
  14  	Kind
  15  )
  16  
  17  // ReadEntry reads a TLV value from a bech32 encoded nostr entity.
  18  func ReadEntry(buf io.Reader) (typ uint8, value []byte) {
  19  	var err error
  20  	t := make([]byte, 1)
  21  	if _, err = buf.Read(t); err != nil {
  22  		return
  23  	}
  24  	typ = t[0]
  25  	l := make([]byte, 1)
  26  	if _, err = buf.Read(l); err != nil {
  27  		return
  28  	}
  29  	length := int(l[0])
  30  	value = make([]byte, length)
  31  	if _, err = buf.Read(value); err != nil {
  32  		// nil value signals end of data or error
  33  		value = nil
  34  	}
  35  	return
  36  }
  37  
  38  // WriteEntry writes a TLV value for a bech32 encoded nostr entity.
  39  func WriteEntry(buf io.Writer, typ uint8, value []byte) {
  40  	buf.Write(append([]byte{typ, byte(len(value))}, value...))
  41  }
  42