github.com/storacha/go-ucanto@v0.7.2/ucan/formatter/formatter.go (about)

     1  package formatter
     2  
     3  import (
     4  	"encoding/base64"
     5  	"fmt"
     6  
     7  	"github.com/ipld/go-ipld-prime"
     8  	"github.com/ipld/go-ipld-prime/codec/dagjson"
     9  	"github.com/storacha/go-ucanto/ucan/crypto/signature"
    10  	hdm "github.com/storacha/go-ucanto/ucan/datamodel/header"
    11  	pdm "github.com/storacha/go-ucanto/ucan/datamodel/payload"
    12  )
    13  
    14  func FormatSignPayload(payload pdm.PayloadModel, version string, algorithm string) (string, error) {
    15  	hdr, err := FormatHeader(version, algorithm)
    16  	if err != nil {
    17  		return "", fmt.Errorf("formatting header: %s", hdr)
    18  	}
    19  	pld, err := FormatPayload(payload)
    20  	if err != nil {
    21  		return "", fmt.Errorf("formatting payload: %w", err)
    22  	}
    23  	return fmt.Sprintf("%s.%s", hdr, pld), nil
    24  }
    25  
    26  func FormatHeader(version string, algorithm string) (string, error) {
    27  	header := hdm.HeaderModel{
    28  		Alg: algorithm,
    29  		Ucv: version,
    30  		Typ: "JWT",
    31  	}
    32  	bytes, err := ipld.Marshal(dagjson.Encode, &header, hdm.Type())
    33  	if err != nil {
    34  		return "", fmt.Errorf("dag-json encoding header: %w", err)
    35  	}
    36  	return base64.RawURLEncoding.EncodeToString(bytes), nil
    37  }
    38  
    39  func FormatPayload(payload pdm.PayloadModel) (string, error) {
    40  	bytes, err := ipld.Marshal(dagjson.Encode, &payload, pdm.Type())
    41  	if err != nil {
    42  		return "", fmt.Errorf("dag-json encoding payload: %w", err)
    43  	}
    44  	return base64.RawURLEncoding.EncodeToString(bytes), nil
    45  }
    46  
    47  func FormatSignature(s signature.Signature) (string, error) {
    48  	return base64.RawURLEncoding.EncodeToString(s.Raw()), nil
    49  }