From cb04997a03cb551dd7b8217657f6b7968be5df75 Mon Sep 17 00:00:00 2001 From: Rod Vagg Date: Sat, 25 Jun 2022 17:00:29 +1000 Subject: [PATCH] feat(ipld): use bindnode/registry (#340) * chore(deps): update libp2p v0.19.4 (#341) * feat(ipld): use bindnode/registry Co-authored-by: Hannah Howard --- go.mod | 6 +- go.sum | 19 +- impl/integration_test.go | 12 +- ipldutils/ipldutils.go | 183 ------------------- message.go | 2 +- message/message1_1prime/message.go | 6 +- message/message1_1prime/transfer_message.go | 29 ++- message/message1_1prime/transfer_request.go | 19 +- message/message1_1prime/transfer_response.go | 19 +- transport/graphsync/extension/gsextension.go | 5 +- transport/graphsync/graphsync_test.go | 9 +- 11 files changed, 52 insertions(+), 257 deletions(-) delete mode 100644 ipldutils/ipldutils.go diff --git a/go.mod b/go.mod index 8154ae1..ea25b21 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e github.com/ipfs/go-block-format v0.0.3 github.com/ipfs/go-blockservice v0.2.1 - github.com/ipfs/go-cid v0.1.0 + github.com/ipfs/go-cid v0.2.0 github.com/ipfs/go-datastore v0.5.1 github.com/ipfs/go-ds-badger v0.3.0 github.com/ipfs/go-graphsync v0.13.1 @@ -24,7 +24,7 @@ require ( github.com/ipfs/go-log/v2 v2.5.1 github.com/ipfs/go-merkledag v0.5.1 github.com/ipfs/go-unixfs v0.3.1 - github.com/ipld/go-ipld-prime v0.16.1-0.20220519105356-1f1151b69dba + github.com/ipld/go-ipld-prime v0.17.1-0.20220624062450-534ccf82237d github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c github.com/jpillora/backoff v1.0.0 github.com/libp2p/go-libp2p v0.19.4 @@ -105,7 +105,7 @@ require ( github.com/multiformats/go-multiaddr-dns v0.3.1 // indirect github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect github.com/multiformats/go-multibase v0.0.3 // indirect - github.com/multiformats/go-multicodec v0.4.1 // indirect + github.com/multiformats/go-multicodec v0.5.0 // indirect github.com/multiformats/go-multihash v0.1.0 // indirect github.com/multiformats/go-multistream v0.3.0 // indirect github.com/multiformats/go-varint v0.0.6 // indirect diff --git a/go.sum b/go.sum index 4edd246..34d3a7c 100644 --- a/go.sum +++ b/go.sum @@ -219,8 +219,9 @@ github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVB github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= -github.com/frankban/quicktest v1.14.2 h1:SPb1KFFmM+ybpEjPUhCCkZOM5xlovT5UbrMvWnXyBns= github.com/frankban/quicktest v1.14.2/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= +github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= @@ -312,8 +313,9 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -415,8 +417,9 @@ github.com/ipfs/go-cid v0.0.4/go.mod h1:4LLaPOQwmk5z9LBgQnpkivrx8BJjUyGwTXCd5Xfj github.com/ipfs/go-cid v0.0.5/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67FexhXog= github.com/ipfs/go-cid v0.0.6/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= -github.com/ipfs/go-cid v0.1.0 h1:YN33LQulcRHjfom/i25yoOZR4Telp1Hr/2RU3d0PnC0= github.com/ipfs/go-cid v0.1.0/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o= +github.com/ipfs/go-cid v0.2.0 h1:01JTiihFq9en9Vz0lc0VDWvZe/uBonGpzo4THP0vcQ0= +github.com/ipfs/go-cid v0.2.0/go.mod h1:P+HXFDF4CVhaVayiEb4wkAy7zBHxBwsJyt0Y5U6MLro= github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-datastore v0.1.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= github.com/ipfs/go-datastore v0.4.0/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= @@ -519,8 +522,8 @@ github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db/go.mod h1:KvB github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8= github.com/ipld/go-ipld-prime v0.14.0/go.mod h1:9ASQLwUFLptCov6lIYc70GRB4V7UTyLD0IJtrDJe6ZM= github.com/ipld/go-ipld-prime v0.16.0/go.mod h1:axSCuOCBPqrH+gvXr2w9uAOulJqBPhHPT2PjoiiU1qA= -github.com/ipld/go-ipld-prime v0.16.1-0.20220519105356-1f1151b69dba h1:1eimQ/EpBUnxyhvSQ9gxzokN9EiDYHCeZ2URkhADIGQ= -github.com/ipld/go-ipld-prime v0.16.1-0.20220519105356-1f1151b69dba/go.mod h1:/bZAYlzT7SJS4UV0al4q67xgKvenm5hKrPCa2wNGN1U= +github.com/ipld/go-ipld-prime v0.17.1-0.20220624062450-534ccf82237d h1:aY4pwcHVHonF+edc4gzRr3HA7vAaindLXz7InFIUgiY= +github.com/ipld/go-ipld-prime v0.17.1-0.20220624062450-534ccf82237d/go.mod h1:aYcKm5TIvGfY8P3QBKz/2gKcLxzJ1zDaD+o0bOowhgs= github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73/go.mod h1:2PJ0JgxyB08t0b2WKrcuqI3di0V+5n6RS/LTUJhkoxY= github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= @@ -969,8 +972,9 @@ github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPw github.com/multiformats/go-multicodec v0.3.0/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= github.com/multiformats/go-multicodec v0.3.1-0.20211210143421-a526f306ed2c/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= -github.com/multiformats/go-multicodec v0.4.1 h1:BSJbf+zpghcZMZrwTYBGwy0CPcVZGWiC72Cp8bBd4R4= github.com/multiformats/go-multicodec v0.4.1/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= +github.com/multiformats/go-multicodec v0.5.0 h1:EgU6cBe/D7WRwQb1KmnBvU7lrcFGMggZVTPtOW9dDHs= +github.com/multiformats/go-multicodec v0.5.0/go.mod h1:DiY2HFaEp5EhEXb/iYzVAunmyX/aSFMxq2KMKfWEues= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= @@ -1205,8 +1209,9 @@ github.com/urfave/cli/v2 v2.0.0 h1:+HU9SCbu8GnEUFtIBfuUNXN39ofWViIEJIp6SURMpCg= github.com/urfave/cli/v2 v2.0.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= -github.com/warpfork/go-testmark v0.3.0 h1:Q81c4u7hT+BR5kNfNQhEF0VT2pmL7+Kk0wD+ORYl7iA= github.com/warpfork/go-testmark v0.3.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0= +github.com/warpfork/go-testmark v0.10.0 h1:E86YlUMYfwIacEsQGlnTvjk1IgYkyTGjPhF0RnwTCmw= +github.com/warpfork/go-testmark v0.10.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0= github.com/warpfork/go-wish v0.0.0-20180510122957-5ad1f5abf436/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= github.com/warpfork/go-wish v0.0.0-20190328234359-8b3e70f8e830/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= github.com/warpfork/go-wish v0.0.0-20200122115046-b9ea61034e4a h1:G++j5e0OC488te356JvdhaM8YS6nMsjLAYF7JxCv07w= diff --git a/impl/integration_test.go b/impl/integration_test.go index 659c59a..af447ba 100644 --- a/impl/integration_test.go +++ b/impl/integration_test.go @@ -1807,8 +1807,7 @@ func TestRespondingToPushGraphsyncRequests(t *testing.T) { response, err := message.NewResponse(requestReceived.TransferID(), true, false, &voucherResult) require.NoError(t, err) - nd, err := response.ToIPLD() - require.NoError(t, err) + nd := response.ToIPLD() request := gsmsg.NewRequest(graphsync.NewRequestID(), link.(cidlink.Link).Cid, gsData.AllSelector, graphsync.Priority(rand.Int31()), graphsync.ExtensionData{ Name: extension.ExtensionDataTransfer1_1, Data: nd, @@ -1826,8 +1825,7 @@ func TestRespondingToPushGraphsyncRequests(t *testing.T) { t.Run("when no request is initiated", func(t *testing.T) { response, err := message.NewResponse(datatransfer.TransferID(rand.Uint32()), true, false, &voucher) require.NoError(t, err) - nd, err := response.ToIPLD() - require.NoError(t, err) + nd := response.ToIPLD() request := gsmsg.NewRequest(graphsync.NewRequestID(), link.(cidlink.Link).Cid, gsData.AllSelector, graphsync.Priority(rand.Int31()), graphsync.ExtensionData{ Name: extension.ExtensionDataTransfer1_1, Data: nd, @@ -1920,8 +1918,7 @@ func TestRespondingToPullGraphsyncRequests(t *testing.T) { voucher := testutil.NewTestTypedVoucher() request, err := message.NewRequest(id, false, true, &voucher, testutil.GenerateCids(1)[0], gsData.AllSelector) require.NoError(t, err) - nd, err := request.ToIPLD() - require.NoError(t, err) + nd := request.ToIPLD() gsRequest := gsmsg.NewRequest(graphsync.NewRequestID(), link.(cidlink.Link).Cid, gsData.AllSelector, graphsync.Priority(rand.Int31()), graphsync.ExtensionData{ Name: extension.ExtensionDataTransfer1_1, Data: nd, @@ -1949,8 +1946,7 @@ func TestRespondingToPullGraphsyncRequests(t *testing.T) { dtRequest, err := message.NewRequest(id, false, true, &voucher, testutil.GenerateCids(1)[0], gsData.AllSelector) require.NoError(t, err) - nd, err := dtRequest.ToIPLD() - require.NoError(t, err) + nd := dtRequest.ToIPLD() request := gsmsg.NewRequest(graphsync.NewRequestID(), link.(cidlink.Link).Cid, gsData.AllSelector, graphsync.Priority(rand.Int31()), graphsync.ExtensionData{ Name: extension.ExtensionDataTransfer1_1, Data: nd, diff --git a/ipldutils/ipldutils.go b/ipldutils/ipldutils.go deleted file mode 100644 index 1b5b0be..0000000 --- a/ipldutils/ipldutils.go +++ /dev/null @@ -1,183 +0,0 @@ -package shared - -import ( - "bytes" - "fmt" - "io" - "reflect" - - "github.com/ipld/go-ipld-prime" - "github.com/ipld/go-ipld-prime/codec/dagcbor" - "github.com/ipld/go-ipld-prime/datamodel" - "github.com/ipld/go-ipld-prime/node/bindnode" - "github.com/ipld/go-ipld-prime/schema" - cbg "github.com/whyrusleeping/cbor-gen" -) - -type typeWithBindnodeSchema interface { - BindnodeSchema() string -} - -// TODO: remove this I think -type typeWithBindnodePostDecode interface { - BindnodePostDecode() error -} - -// We use the prototype map to store TypedPrototype and Type information -// mapped against Go type names so we only have to run the schema parse once. -// Currently there's not much additional benefit of storing this but there -// may be in the future. -var prototype map[string]schema.TypedPrototype = make(map[string]schema.TypedPrototype) - -var bindnodeOptions = []bindnode.Option{} - -func typeName(ptrValue interface{}) string { - val := reflect.ValueOf(ptrValue).Type() - for val.Kind() == reflect.Ptr { - val = val.Elem() - } - return val.Name() -} - -// lookup of cached TypedPrototype (and therefore Type) for a Go type, if not -// found, initial parse and setup and caching of the TypedPrototype will happen -func prototypeFor(typeName string, ptrType interface{}) (schema.TypedPrototype, error) { - proto, ok := prototype[typeName] - if !ok { - schemaType, err := schemaTypeFor(typeName, ptrType) - if err != nil { - return nil, err - } - if schemaType == nil { - return nil, fmt.Errorf("could not find type [%s] in schema", typeName) - } - proto = bindnode.Prototype(ptrType, schemaType, bindnodeOptions...) - prototype[typeName] = proto - } - return proto, nil -} - -// load the schema for a Go type, which must have a BindnodeSchema() method -// attached to it -func schemaTypeFor(typeName string, ptrType interface{}) (schema.Type, error) { - tws, ok := ptrType.(typeWithBindnodeSchema) - if !ok { - return nil, fmt.Errorf("attempted to perform IPLD mapping on type without BindnodeSchema(): %T", ptrType) - } - schema := tws.BindnodeSchema() - typeSystem, err := ipld.LoadSchemaBytes([]byte(schema)) - if err != nil { - return nil, err - } - schemaType := typeSystem.TypeByName(typeName) - if schemaType == nil { - if !ok { - return nil, fmt.Errorf("schema for [%T] does not contain that named type [%s]", ptrType, typeName) - } - } - return schemaType, nil -} - -// FromReader deserializes DAG-CBOR from a Reader and instantiates the Go type -// that's provided as a pointer via the ptrValue argument. -func FromReader(r io.Reader, ptrValue interface{}) (interface{}, error) { - name := typeName(ptrValue) - proto, err := prototypeFor(name, ptrValue) - if err != nil { - return nil, err - } - node, err := ipld.DecodeStreamingUsingPrototype(r, dagcbor.Decode, proto) - if err != nil { - return nil, err - } - typ := bindnode.Unwrap(node) - if twpd, ok := typ.(typeWithBindnodePostDecode); ok { - // we have some more work to do - if err = twpd.BindnodePostDecode(); err != nil { - return nil, err - } - } - return typ, nil -} - -// FromNode converts an datamodel.Node into an appropriate Go type that's provided as -// a pointer via the ptrValue argument -func FromNode(node datamodel.Node, ptrValue interface{}) (interface{}, error) { - name := typeName(ptrValue) - proto, err := prototypeFor(name, ptrValue) - if err != nil { - return nil, err - } - if tn, ok := node.(schema.TypedNode); ok { - node = tn.Representation() - } - builder := proto.Representation().NewBuilder() - err = builder.AssignNode(node) - if err != nil { - return nil, err - } - typ := bindnode.Unwrap(builder.Build()) - if twpd, ok := typ.(typeWithBindnodePostDecode); ok { - // we have some more work to do - if err = twpd.BindnodePostDecode(); err != nil { - return nil, err - } - } - return typ, nil -} - -// ToNode converts a Go type that's provided as a pointer via the ptrValue -// argument to an datamodel.Node. -func ToNode(ptrValue interface{}) (schema.TypedNode, error) { - name := typeName(ptrValue) - proto, err := prototypeFor(name, ptrValue) - if err != nil { - return nil, err - } - return bindnode.Wrap(ptrValue, proto.Type(), bindnodeOptions...), err -} - -// NodeToWriter is a utility method that serializes an datamodel.Node as DAG-CBOR to -// a Writer -func NodeToWriter(node datamodel.Node, w io.Writer) error { - return ipld.EncodeStreaming(w, node, dagcbor.Encode) -} - -// NodeToBytes is a utility method that serializes an datamodel.Node as DAG-CBOR to -// a []byte -func NodeToBytes(node datamodel.Node) ([]byte, error) { - var buf bytes.Buffer - err := NodeToWriter(node, &buf) - if err != nil { - return nil, err - } - return buf.Bytes(), nil -} - -// NodeFromBytes is a utility method that deserializes an untyped datamodel.Node -// from DAG-CBOR format bytes -func NodeFromBytes(b []byte) (datamodel.Node, error) { - return ipld.Decode(b, dagcbor.Decode) -} - -// TypeToWriter is a utility method that serializes a Go type that's provided as a -// pointer via the ptrValue argument as DAG-CBOR to a Writer -func TypeToWriter(ptrValue interface{}, w io.Writer) error { - node, err := ToNode(ptrValue) - if err != nil { - return err - } - return ipld.EncodeStreaming(w, node, dagcbor.Encode) -} - -func NodeToDeferred(node datamodel.Node) (*cbg.Deferred, error) { - byts, err := NodeToBytes(node) - if err != nil { - return nil, err - } - return &cbg.Deferred{Raw: byts}, nil -} - -func DeferredToNode(def *cbg.Deferred) (datamodel.Node, error) { - return NodeFromBytes(def.Raw) -} diff --git a/message.go b/message.go index d54eabb..93ea17d 100644 --- a/message.go +++ b/message.go @@ -25,7 +25,7 @@ type Message interface { IsCancel() bool TransferID() TransferID ToNet(w io.Writer) error - ToIPLD() (datamodel.Node, error) + ToIPLD() datamodel.Node MessageForProtocol(targetProtocol protocol.ID) (newMsg Message, err error) } diff --git a/message/message1_1prime/message.go b/message/message1_1prime/message.go index b740bc0..4d85297 100644 --- a/message/message1_1prime/message.go +++ b/message/message1_1prime/message.go @@ -5,12 +5,12 @@ import ( "github.com/ipfs/go-cid" "github.com/ipld/go-ipld-prime" + "github.com/ipld/go-ipld-prime/codec/dagcbor" "github.com/ipld/go-ipld-prime/datamodel" "github.com/ipld/go-ipld-prime/schema" xerrors "golang.org/x/xerrors" datatransfer "github.com/filecoin-project/go-data-transfer/v2" - ipldutils "github.com/filecoin-project/go-data-transfer/v2/ipldutils" "github.com/filecoin-project/go-data-transfer/v2/message/types" ) @@ -192,7 +192,7 @@ func CompleteResponse(id datatransfer.TransferID, isAccepted bool, isPaused bool // FromNet can read a network stream to deserialize a GraphSyncMessage func FromNet(r io.Reader) (datatransfer.Message, error) { - tm, err := ipldutils.FromReader(r, &TransferMessage1_1{}) + tm, err := bindnodeRegistry.TypeFromReader(r, &TransferMessage1_1{}, dagcbor.Decode) if err != nil { return nil, err } @@ -213,7 +213,7 @@ func FromIPLD(node datamodel.Node) (datatransfer.Message, error) { if tn, ok := node.(schema.TypedNode); ok { // shouldn't need this if from Graphsync node = tn.Representation() } - tm, err := ipldutils.FromNode(node, &TransferMessage1_1{}) + tm, err := bindnodeRegistry.TypeFromNode(node, &TransferMessage1_1{}) if err != nil { return nil, err } diff --git a/message/message1_1prime/transfer_message.go b/message/message1_1prime/transfer_message.go index 0944212..5f1f628 100644 --- a/message/message1_1prime/transfer_message.go +++ b/message/message1_1prime/transfer_message.go @@ -4,13 +4,16 @@ import ( _ "embed" "io" + "github.com/ipld/go-ipld-prime/codec/dagcbor" "github.com/ipld/go-ipld-prime/datamodel" + bindnoderegistry "github.com/ipld/go-ipld-prime/node/bindnode/registry" "github.com/ipld/go-ipld-prime/schema" datatransfer "github.com/filecoin-project/go-data-transfer/v2" - ipldutils "github.com/filecoin-project/go-data-transfer/v2/ipldutils" ) +var bindnodeRegistry = bindnoderegistry.NewRegistry() + //go:embed schema.ipldsch var embedSchema []byte @@ -22,10 +25,6 @@ type TransferMessage1_1 struct { Response *TransferResponse1_1 } -func (tm *TransferMessage1_1) BindnodeSchema() string { - return string(embedSchema) -} - // ========= datatransfer.Message interface // TransferID returns the TransferID of this message @@ -36,24 +35,22 @@ func (tm *TransferMessage1_1) TransferID() datatransfer.TransferID { return tm.Response.TransferID() } -func (tm *TransferMessage1_1) toIPLD() (schema.TypedNode, error) { - return ipldutils.ToNode(tm) +func (tm *TransferMessage1_1) toIPLD() schema.TypedNode { + return bindnodeRegistry.TypeToNode(tm) } // ToIPLD converts a transfer message type to an ipld Node func (tm *TransferMessage1_1) ToIPLD() (datamodel.Node, error) { - node, err := tm.toIPLD() - if err != nil { - return nil, err - } - return node.Representation(), nil + return tm.toIPLD().Representation(), nil } // ToNet serializes a transfer message type. func (tm *TransferMessage1_1) ToNet(w io.Writer) error { - i, err := tm.toIPLD() - if err != nil { - return err + return bindnodeRegistry.TypeToWriter(tm.toIPLD(), w, dagcbor.Encode) +} + +func init() { + if err := bindnodeRegistry.RegisterType((*TransferMessage1_1)(nil), string(embedSchema), "TransferMessage1_1"); err != nil { + panic(err.Error()) } - return ipldutils.NodeToWriter(i, w) } diff --git a/message/message1_1prime/transfer_request.go b/message/message1_1prime/transfer_request.go index a01e245..3600329 100644 --- a/message/message1_1prime/transfer_request.go +++ b/message/message1_1prime/transfer_request.go @@ -4,13 +4,14 @@ import ( "io" "github.com/ipfs/go-cid" + "github.com/ipld/go-ipld-prime" + "github.com/ipld/go-ipld-prime/codec/dagcbor" "github.com/ipld/go-ipld-prime/datamodel" "github.com/ipld/go-ipld-prime/schema" "github.com/libp2p/go-libp2p-core/protocol" xerrors "golang.org/x/xerrors" datatransfer "github.com/filecoin-project/go-data-transfer/v2" - ipldutils "github.com/filecoin-project/go-data-transfer/v2/ipldutils" "github.com/filecoin-project/go-data-transfer/v2/message/types" ) @@ -138,7 +139,7 @@ func (trq *TransferRequest1_1) IsPartial() bool { return trq.Partial } -func (trq *TransferRequest1_1) toIPLD() (schema.TypedNode, error) { +func (trq *TransferRequest1_1) toIPLD() schema.TypedNode { msg := TransferMessage1_1{ IsRequest: true, Request: trq, @@ -147,19 +148,11 @@ func (trq *TransferRequest1_1) toIPLD() (schema.TypedNode, error) { return msg.toIPLD() } -func (trq *TransferRequest1_1) ToIPLD() (datamodel.Node, error) { - msg, err := trq.toIPLD() - if err != nil { - return nil, err - } - return msg.Representation(), nil +func (trq *TransferRequest1_1) ToIPLD() datamodel.Node { + return trq.toIPLD().Representation() } // ToNet serializes a transfer request. func (trq *TransferRequest1_1) ToNet(w io.Writer) error { - i, err := trq.toIPLD() - if err != nil { - return err - } - return ipldutils.NodeToWriter(i, w) + return ipld.EncodeStreaming(w, trq.toIPLD(), dagcbor.Encode) } diff --git a/message/message1_1prime/transfer_response.go b/message/message1_1prime/transfer_response.go index 1431ff7..69c19f2 100644 --- a/message/message1_1prime/transfer_response.go +++ b/message/message1_1prime/transfer_response.go @@ -3,13 +3,14 @@ package message1_1 import ( "io" + "github.com/ipld/go-ipld-prime" + "github.com/ipld/go-ipld-prime/codec/dagcbor" "github.com/ipld/go-ipld-prime/datamodel" "github.com/ipld/go-ipld-prime/schema" "github.com/libp2p/go-libp2p-core/protocol" xerrors "golang.org/x/xerrors" datatransfer "github.com/filecoin-project/go-data-transfer/v2" - ipldutils "github.com/filecoin-project/go-data-transfer/v2/ipldutils" "github.com/filecoin-project/go-data-transfer/v2/message/types" ) @@ -96,7 +97,7 @@ func (trsp *TransferResponse1_1) MessageForProtocol(targetProtocol protocol.ID) } } -func (trsp *TransferResponse1_1) toIPLD() (schema.TypedNode, error) { +func (trsp *TransferResponse1_1) toIPLD() schema.TypedNode { msg := TransferMessage1_1{ IsRequest: false, Request: nil, @@ -105,19 +106,11 @@ func (trsp *TransferResponse1_1) toIPLD() (schema.TypedNode, error) { return msg.toIPLD() } -func (trsp *TransferResponse1_1) ToIPLD() (datamodel.Node, error) { - msg, err := trsp.toIPLD() - if err != nil { - return nil, err - } - return msg.Representation(), nil +func (trsp *TransferResponse1_1) ToIPLD() datamodel.Node { + return trsp.toIPLD().Representation() } // ToNet serializes a transfer response. func (trsp *TransferResponse1_1) ToNet(w io.Writer) error { - i, err := trsp.toIPLD() - if err != nil { - return err - } - return ipldutils.NodeToWriter(i, w) + return ipld.EncodeStreaming(w, trsp.toIPLD(), dagcbor.Encode) } diff --git a/transport/graphsync/extension/gsextension.go b/transport/graphsync/extension/gsextension.go index a8c34c3..532cb39 100644 --- a/transport/graphsync/extension/gsextension.go +++ b/transport/graphsync/extension/gsextension.go @@ -39,10 +39,7 @@ func ToExtensionData(msg datatransfer.Message, supportedExtensions []graphsync.E if err != nil { continue } - nd, err := versionedMsg.ToIPLD() - if err != nil { - return nil, err - } + nd := versionedMsg.ToIPLD() exts = append(exts, graphsync.ExtensionData{ Name: supportedExtension, Data: nd, diff --git a/transport/graphsync/graphsync_test.go b/transport/graphsync/graphsync_test.go index c2a7146..c5bb4a0 100644 --- a/transport/graphsync/graphsync_test.go +++ b/transport/graphsync/graphsync_test.go @@ -1287,8 +1287,7 @@ func (dtc *dtConfig) extensions(t *testing.T, transferID datatransfer.TransferID } else { msg = testutil.NewDTRequest(t, transferID) } - nd, err := msg.ToIPLD() - require.NoError(t, err) + nd := msg.ToIPLD() extensions[extName] = nd } } @@ -1335,8 +1334,7 @@ func assertDecodesToMessage(t *testing.T, data datamodel.Node, expected datatran } func assertHasOutgoingMessage(t *testing.T, extensions []graphsync.ExtensionData, expected datatransfer.Message) { - nd, err := expected.ToIPLD() - require.NoError(t, err) + nd := expected.ToIPLD() found := false for _, e := range extensions { if e.Name == extension.ExtensionDataTransfer1_1 { @@ -1350,8 +1348,7 @@ func assertHasOutgoingMessage(t *testing.T, extensions []graphsync.ExtensionData } func assertHasExtensionMessage(t *testing.T, name graphsync.ExtensionName, extensions []graphsync.ExtensionData, expected datatransfer.Message) { - nd, err := expected.ToIPLD() - require.NoError(t, err) + nd := expected.ToIPLD() found := false for _, e := range extensions { if e.Name == name {