fix(cidlink): check for byte buffer
@@ -30,8 +30,15 @@ func (lnk Link) Load(ctx context.Context, lnkCtx ipld.LinkContext, na ipld.NodeA
if !exists {
return fmt.Errorf("no decoder registered for multicodec %d", lnk.Prefix().Codec)
}
+ var hasherBytes []byte
+ var decodeErr error
+ byteBuf, ok := r.(*bytes.Buffer)
+ if ok {
+ hasherBytes = byteBuf.Bytes()
+ decodeErr = mcDecoder(na, r)
+ } else {
var hasher bytes.Buffer // multihash only exports bulk use, which is... really inefficient and should be fixed.
- decodeErr := mcDecoder(na, io.TeeReader(r, &hasher))
+ decodeErr = mcDecoder(na, io.TeeReader(r, &hasher))
// Error checking order here is tricky.
// If decoding errored out, we should still run the reader to the end, to check the hash.
// (We still don't implement this by running the hash to the end first, because that would increase the high-water memory requirement.)
@@ -43,7 +50,10 @@ func (lnk Link) Load(ctx context.Context, lnkCtx ipld.LinkContext, na ipld.NodeA
return err
}
}
- cid, err := lnk.Prefix().Sum(hasher.Bytes())
+ hasherBytes = hasher.Bytes()
+ }
+
+ cid, err := lnk.Prefix().Sum(hasherBytes)
if err != nil {
return err
}
