@@ -20,7 +20,6 @@ import (
2020 "github.com/alanshaw/ucantone/varsig/common"
2121 cid "github.com/ipfs/go-cid"
2222 multihash "github.com/multiformats/go-multihash/core"
23- cbg "github.com/whyrusleeping/cbor-gen"
2423)
2524
2625// UCAN Invocation defines a format for expressing the intention to execute
@@ -200,12 +199,63 @@ func (inv *Invocation) UnmarshalCBOR(r io.Reader) error {
200199 return nil
201200}
202201
202+ func (inv * Invocation ) MarshalDagJSON (w io.Writer ) error {
203+ return inv .Model ().MarshalDagJSON (w )
204+ }
205+
206+ func (inv * Invocation ) UnmarshalDagJSON (r io.Reader ) error {
207+ * inv = Invocation {}
208+ model := idm.EnvelopeModel {}
209+ err := model .UnmarshalDagJSON (r )
210+ if err != nil {
211+ return fmt .Errorf ("unmarshaling invocation envelope JSON: %w" , err )
212+ }
213+ if model .SigPayload .TokenPayload1_0_0_rc1 == nil {
214+ return errors .New ("invalid or unsupported invocation token payload" )
215+ }
216+ header , err := varsig .Decode (model .SigPayload .Header )
217+ if err != nil {
218+ return fmt .Errorf ("decoding varsig header: %w" , err )
219+ }
220+ sig := signature .NewSignature (header , model .Signature )
221+ task , err := NewTask (
222+ model .SigPayload .TokenPayload1_0_0_rc1 .Sub ,
223+ model .SigPayload .TokenPayload1_0_0_rc1 .Cmd ,
224+ model .SigPayload .TokenPayload1_0_0_rc1 .Args ,
225+ model .SigPayload .TokenPayload1_0_0_rc1 .Nonce ,
226+ )
227+ if err != nil {
228+ return fmt .Errorf ("creating new task: %w" , err )
229+ }
230+ // marshal to CBOR so we can calculate canonical CID
231+ var w bytes.Buffer
232+ err = model .MarshalCBOR (& w )
233+ if err != nil {
234+ return fmt .Errorf ("marshaling to CBOR: %w" , err )
235+ }
236+ root , err := cid.V1Builder {
237+ Codec : dagcbor .Code ,
238+ MhType : multihash .SHA2_256 ,
239+ }.Sum (w .Bytes ())
240+ if err != nil {
241+ return fmt .Errorf ("hashing invocation bytes: %w" , err )
242+ }
243+ inv .link = root
244+ inv .bytes = w .Bytes ()
245+ inv .sig = sig
246+ inv .model = & model
247+ inv .task = task
248+ return nil
249+ }
250+
203251var _ ucan.Invocation = (* Invocation )(nil )
204252
253+ // Encode invocation to CBOR.
205254func Encode (inv ucan.Invocation ) ([]byte , error ) {
206255 return inv .Bytes (), nil
207256}
208257
258+ // Decode invocation from CBOR.
209259func Decode (b []byte ) (* Invocation , error ) {
210260 inv := Invocation {}
211261 err := inv .UnmarshalCBOR (bytes .NewReader (b ))
@@ -343,15 +393,6 @@ func VerifySignature(inv ucan.Invocation, verifier ucan.Verifier) (bool, error)
343393 aud = & a
344394 }
345395
346- var args cbg.Deferred
347- argsMap := datamodel .NewMap (datamodel .WithEntries (inv .Arguments ().All ()))
348- var argsBuf bytes.Buffer
349- err := argsMap .MarshalCBOR (& argsBuf )
350- if err != nil {
351- return false , fmt .Errorf ("marshaling arguments CBOR: %w" , err )
352- }
353- args .Raw = argsBuf .Bytes ()
354-
355396 var meta * datamodel.Map
356397 if inv .Metadata () != nil {
357398 meta = datamodel .NewMap (datamodel .WithEntries (inv .Metadata ().All ()))
0 commit comments