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 }