wire the DID resolution options

This commit is contained in:
Michael Muré
2025-07-31 17:49:01 +02:00
parent 33e8a8a821
commit e7edccdd71
3 changed files with 52 additions and 51 deletions

View File

@@ -3,6 +3,7 @@ package delegation
import ( import (
"io" "io"
"github.com/MetaMask/go-did-it"
"github.com/MetaMask/go-did-it/crypto" "github.com/MetaMask/go-did-it/crypto"
"github.com/ipfs/go-cid" "github.com/ipfs/go-cid"
"github.com/ipld/go-ipld-prime" "github.com/ipld/go-ipld-prime"
@@ -46,8 +47,8 @@ func (t *Token) ToSealedWriter(w io.Writer, privKey crypto.PrivateKeySigningByte
// verifies that the envelope's signature is correct based on the public // verifies that the envelope's signature is correct based on the public
// key taken from the issuer (iss) field and calculates the CID of the // key taken from the issuer (iss) field and calculates the CID of the
// incoming data. // incoming data.
func FromSealed(data []byte) (*Token, cid.Cid, error) { func FromSealed(data []byte, resolvOpts ...did.ResolutionOption) (*Token, cid.Cid, error) {
tkn, err := FromDagCbor(data) tkn, err := FromDagCbor(data, resolvOpts...)
if err != nil { if err != nil {
return nil, cid.Undef, err return nil, cid.Undef, err
} }
@@ -61,10 +62,10 @@ func FromSealed(data []byte) (*Token, cid.Cid, error) {
} }
// FromSealedReader is the same as Unseal but accepts an io.Reader. // FromSealedReader is the same as Unseal but accepts an io.Reader.
func FromSealedReader(r io.Reader) (*Token, cid.Cid, error) { func FromSealedReader(r io.Reader, resolvOpts ...did.ResolutionOption) (*Token, cid.Cid, error) {
cidReader := envelope.NewCIDReader(r) cidReader := envelope.NewCIDReader(r)
tkn, err := FromDagCborReader(cidReader) tkn, err := FromDagCborReader(cidReader, resolvOpts...)
if err != nil { if err != nil {
return nil, cid.Undef, err return nil, cid.Undef, err
} }
@@ -123,29 +124,29 @@ func (t *Token) ToDagJsonWriter(w io.Writer, privKey crypto.PrivateKeySigningByt
// //
// An error is returned if the conversion fails, or if the resulting // An error is returned if the conversion fails, or if the resulting
// Token is invalid. // Token is invalid.
func Decode(b []byte, decFn codec.Decoder) (*Token, error) { func Decode(b []byte, decFn codec.Decoder, resolvOpts ...did.ResolutionOption) (*Token, error) {
node, err := ipld.Decode(b, decFn) node, err := ipld.Decode(b, decFn)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return FromIPLD(node) return FromIPLD(node, resolvOpts...)
} }
// DecodeReader is the same as Decode, but accept an io.Reader. // DecodeReader is the same as Decode, but accept an io.Reader.
func DecodeReader(r io.Reader, decFn codec.Decoder) (*Token, error) { func DecodeReader(r io.Reader, decFn codec.Decoder, resolvOpts ...did.ResolutionOption) (*Token, error) {
node, err := ipld.DecodeStreaming(r, decFn) node, err := ipld.DecodeStreaming(r, decFn)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return FromIPLD(node) return FromIPLD(node, resolvOpts...)
} }
// FromDagCbor unmarshals the input data into a Token. // FromDagCbor unmarshals the input data into a Token.
// //
// An error is returned if the conversion fails, or if the resulting // An error is returned if the conversion fails, or if the resulting
// Token is invalid. // Token is invalid.
func FromDagCbor(data []byte) (*Token, error) { func FromDagCbor(data []byte, resolvOpts ...did.ResolutionOption) (*Token, error) {
pay, err := envelope.FromDagCbor[*tokenPayloadModel](data) pay, err := envelope.FromDagCbor[*tokenPayloadModel](data, resolvOpts...)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -159,26 +160,26 @@ func FromDagCbor(data []byte) (*Token, error) {
} }
// FromDagCborReader is the same as FromDagCbor, but accept an io.Reader. // FromDagCborReader is the same as FromDagCbor, but accept an io.Reader.
func FromDagCborReader(r io.Reader) (*Token, error) { func FromDagCborReader(r io.Reader, resolvOpts ...did.ResolutionOption) (*Token, error) {
return DecodeReader(r, dagcbor.Decode) return DecodeReader(r, dagcbor.Decode, resolvOpts...)
} }
// FromDagJson unmarshals the input data into a Token. // FromDagJson unmarshals the input data into a Token.
// //
// An error is returned if the conversion fails, or if the resulting // An error is returned if the conversion fails, or if the resulting
// Token is invalid. // Token is invalid.
func FromDagJson(data []byte) (*Token, error) { func FromDagJson(data []byte, resolvOpts ...did.ResolutionOption) (*Token, error) {
return Decode(data, dagjson.Decode) return Decode(data, dagjson.Decode, resolvOpts...)
} }
// FromDagJsonReader is the same as FromDagJson, but accept an io.Reader. // FromDagJsonReader is the same as FromDagJson, but accept an io.Reader.
func FromDagJsonReader(r io.Reader) (*Token, error) { func FromDagJsonReader(r io.Reader, resolvOpts ...did.ResolutionOption) (*Token, error) {
return DecodeReader(r, dagjson.Decode) return DecodeReader(r, dagjson.Decode, resolvOpts...)
} }
// FromIPLD decode the given IPLD representation into a Token. // FromIPLD decode the given IPLD representation into a Token.
func FromIPLD(node datamodel.Node) (*Token, error) { func FromIPLD(node datamodel.Node, resolvOpts ...did.ResolutionOption) (*Token, error) {
pay, err := envelope.FromIPLD[*tokenPayloadModel](node) pay, err := envelope.FromIPLD[*tokenPayloadModel](node, resolvOpts...)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@@ -70,56 +70,56 @@ type Tokener interface {
// //
// An error is returned if the conversion fails, or if the resulting // An error is returned if the conversion fails, or if the resulting
// Tokener is invalid. // Tokener is invalid.
func Decode[T Tokener](b []byte, decFn codec.Decoder) (T, error) { func Decode[T Tokener](b []byte, decFn codec.Decoder, resolvOpts ...did.ResolutionOption) (T, error) {
node, err := ipld.Decode(b, decFn) node, err := ipld.Decode(b, decFn)
if err != nil { if err != nil {
return *new(T), err return *new(T), err
} }
return FromIPLD[T](node) return FromIPLD[T](node, resolvOpts...)
} }
// DecodeReader is the same as Decode, but accept an io.Reader. // DecodeReader is the same as Decode, but accept an io.Reader.
func DecodeReader[T Tokener](r io.Reader, decFn codec.Decoder) (T, error) { func DecodeReader[T Tokener](r io.Reader, decFn codec.Decoder, resolvOpts ...did.ResolutionOption) (T, error) {
node, err := ipld.DecodeStreaming(r, decFn) node, err := ipld.DecodeStreaming(r, decFn)
if err != nil { if err != nil {
return *new(T), err return *new(T), err
} }
return FromIPLD[T](node) return FromIPLD[T](node, resolvOpts...)
} }
// FromDagCbor unmarshals the input data into a Tokener. // FromDagCbor unmarshals the input data into a Tokener.
// //
// An error is returned if the conversion fails, or if the resulting // An error is returned if the conversion fails, or if the resulting
// Tokener is invalid. // Tokener is invalid.
func FromDagCbor[T Tokener](b []byte) (T, error) { func FromDagCbor[T Tokener](b []byte, resolvOpts ...did.ResolutionOption) (T, error) {
return Decode[T](b, dagcbor.Decode) return Decode[T](b, dagcbor.Decode, resolvOpts...)
} }
// FromDagCborReader is the same as FromDagCbor, but accept an io.Reader. // FromDagCborReader is the same as FromDagCbor, but accept an io.Reader.
func FromDagCborReader[T Tokener](r io.Reader) (T, error) { func FromDagCborReader[T Tokener](r io.Reader, resolvOpts ...did.ResolutionOption) (T, error) {
return DecodeReader[T](r, dagcbor.Decode) return DecodeReader[T](r, dagcbor.Decode, resolvOpts...)
} }
// FromDagJson unmarshals the input data into a Tokener. // FromDagJson unmarshals the input data into a Tokener.
// //
// An error is returned if the conversion fails, or if the resulting // An error is returned if the conversion fails, or if the resulting
// Tokener is invalid. // Tokener is invalid.
func FromDagJson[T Tokener](b []byte) (T, error) { func FromDagJson[T Tokener](b []byte, resolvOpts ...did.ResolutionOption) (T, error) {
return Decode[T](b, dagjson.Decode) return Decode[T](b, dagjson.Decode, resolvOpts...)
} }
// FromDagJsonReader is the same as FromDagJson, but accept an io.Reader. // FromDagJsonReader is the same as FromDagJson, but accept an io.Reader.
func FromDagJsonReader[T Tokener](r io.Reader) (T, error) { func FromDagJsonReader[T Tokener](r io.Reader, resolvOpts ...did.ResolutionOption) (T, error) {
return DecodeReader[T](r, dagjson.Decode) return DecodeReader[T](r, dagjson.Decode, resolvOpts...)
} }
// FromIPLD unwraps a Tokener from the provided IPLD datamodel.Node. // FromIPLD unwraps a Tokener from the provided IPLD datamodel.Node.
// //
// An error is returned if the conversion fails, or if the resulting // An error is returned if the conversion fails, or if the resulting
// Tokener is invalid. // Tokener is invalid.
func FromIPLD[T Tokener](node datamodel.Node) (T, error) { func FromIPLD[T Tokener](node datamodel.Node, resolvOpts ...did.ResolutionOption) (T, error) {
zero := *new(T) zero := *new(T)
info, err := Inspect(node) info, err := Inspect(node)
@@ -173,8 +173,7 @@ func FromIPLD[T Tokener](node datamodel.Node) (T, error) {
return zero, err return zero, err
} }
// TODO: pass resolution options issuerDoc, err := issuerDID.Document(resolvOpts...)
issuerDoc, err := issuerDID.Document()
if err != nil { if err != nil {
return zero, err return zero, err
} }

View File

@@ -3,6 +3,7 @@ package invocation
import ( import (
"io" "io"
"github.com/MetaMask/go-did-it"
"github.com/MetaMask/go-did-it/crypto" "github.com/MetaMask/go-did-it/crypto"
"github.com/ipfs/go-cid" "github.com/ipfs/go-cid"
"github.com/ipld/go-ipld-prime" "github.com/ipld/go-ipld-prime"
@@ -46,8 +47,8 @@ func (t *Token) ToSealedWriter(w io.Writer, privKey crypto.PrivateKeySigningByte
// verifies that the envelope's signature is correct based on the public // verifies that the envelope's signature is correct based on the public
// key taken from the issuer (iss) field and calculates the CID of the // key taken from the issuer (iss) field and calculates the CID of the
// incoming data. // incoming data.
func FromSealed(data []byte) (*Token, cid.Cid, error) { func FromSealed(data []byte, resolvOpts ...did.ResolutionOption) (*Token, cid.Cid, error) {
tkn, err := FromDagCbor(data) tkn, err := FromDagCbor(data, resolvOpts...)
if err != nil { if err != nil {
return nil, cid.Undef, err return nil, cid.Undef, err
} }
@@ -61,10 +62,10 @@ func FromSealed(data []byte) (*Token, cid.Cid, error) {
} }
// FromSealedReader is the same as Unseal but accepts an io.Reader. // FromSealedReader is the same as Unseal but accepts an io.Reader.
func FromSealedReader(r io.Reader) (*Token, cid.Cid, error) { func FromSealedReader(r io.Reader, resolvOpts ...did.ResolutionOption) (*Token, cid.Cid, error) {
cidReader := envelope.NewCIDReader(r) cidReader := envelope.NewCIDReader(r)
tkn, err := FromDagCborReader(cidReader) tkn, err := FromDagCborReader(cidReader, resolvOpts...)
if err != nil { if err != nil {
return nil, cid.Undef, err return nil, cid.Undef, err
} }
@@ -123,29 +124,29 @@ func (t *Token) ToDagJsonWriter(w io.Writer, privKey crypto.PrivateKeySigningByt
// //
// An error is returned if the conversion fails, or if the resulting // An error is returned if the conversion fails, or if the resulting
// Token is invalid. // Token is invalid.
func Decode(b []byte, decFn codec.Decoder) (*Token, error) { func Decode(b []byte, decFn codec.Decoder, resolvOpts ...did.ResolutionOption) (*Token, error) {
node, err := ipld.Decode(b, decFn) node, err := ipld.Decode(b, decFn)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return FromIPLD(node) return FromIPLD(node, resolvOpts...)
} }
// DecodeReader is the same as Decode, but accept an io.Reader. // DecodeReader is the same as Decode, but accept an io.Reader.
func DecodeReader(r io.Reader, decFn codec.Decoder) (*Token, error) { func DecodeReader(r io.Reader, decFn codec.Decoder, resolvOpts ...did.ResolutionOption) (*Token, error) {
node, err := ipld.DecodeStreaming(r, decFn) node, err := ipld.DecodeStreaming(r, decFn)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return FromIPLD(node) return FromIPLD(node, resolvOpts...)
} }
// FromDagCbor unmarshals the input data into a Token. // FromDagCbor unmarshals the input data into a Token.
// //
// An error is returned if the conversion fails, or if the resulting // An error is returned if the conversion fails, or if the resulting
// Token is invalid. // Token is invalid.
func FromDagCbor(data []byte) (*Token, error) { func FromDagCbor(data []byte, resolvOpts ...did.ResolutionOption) (*Token, error) {
pay, err := envelope.FromDagCbor[*tokenPayloadModel](data) pay, err := envelope.FromDagCbor[*tokenPayloadModel](data, resolvOpts...)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -159,26 +160,26 @@ func FromDagCbor(data []byte) (*Token, error) {
} }
// FromDagCborReader is the same as FromDagCbor, but accept an io.Reader. // FromDagCborReader is the same as FromDagCbor, but accept an io.Reader.
func FromDagCborReader(r io.Reader) (*Token, error) { func FromDagCborReader(r io.Reader, resolvOpts ...did.ResolutionOption) (*Token, error) {
return DecodeReader(r, dagcbor.Decode) return DecodeReader(r, dagcbor.Decode, resolvOpts...)
} }
// FromDagJson unmarshals the input data into a Token. // FromDagJson unmarshals the input data into a Token.
// //
// An error is returned if the conversion fails, or if the resulting // An error is returned if the conversion fails, or if the resulting
// Token is invalid. // Token is invalid.
func FromDagJson(data []byte) (*Token, error) { func FromDagJson(data []byte, resolvOpts ...did.ResolutionOption) (*Token, error) {
return Decode(data, dagjson.Decode) return Decode(data, dagjson.Decode, resolvOpts...)
} }
// FromDagJsonReader is the same as FromDagJson, but accept an io.Reader. // FromDagJsonReader is the same as FromDagJson, but accept an io.Reader.
func FromDagJsonReader(r io.Reader) (*Token, error) { func FromDagJsonReader(r io.Reader, resolvOpts ...did.ResolutionOption) (*Token, error) {
return DecodeReader(r, dagjson.Decode) return DecodeReader(r, dagjson.Decode, resolvOpts...)
} }
// FromIPLD decode the given IPLD representation into a Token. // FromIPLD decode the given IPLD representation into a Token.
func FromIPLD(node datamodel.Node) (*Token, error) { func FromIPLD(node datamodel.Node, resolvOpts ...did.ResolutionOption) (*Token, error) {
pay, err := envelope.FromIPLD[*tokenPayloadModel](node) pay, err := envelope.FromIPLD[*tokenPayloadModel](node, resolvOpts...)
if err != nil { if err != nil {
return nil, err return nil, err
} }