diff --git a/unixfs/io/bufdagreader.go b/unixfs/io/bufdagreader.go new file mode 100644 index 00000000000..2f73586407a --- /dev/null +++ b/unixfs/io/bufdagreader.go @@ -0,0 +1,41 @@ +package io + +import ( + "bytes" + "context" + "io" +) + +type bufDagReader struct { + *bytes.Reader +} + +func NewBufDagReader(b []byte) *bufDagReader { + return &bufDagReader{bytes.NewReader(b)} +} + +var _ DagReader = (*bufDagReader)(nil) + +func (*bufDagReader) Close() error { + return nil +} + +func (rd *bufDagReader) CtxReadFull(ctx context.Context, b []byte) (int, error) { + return rd.Read(b) +} + +func (rd *bufDagReader) Offset() int64 { + of, err := rd.Seek(0, io.SeekCurrent) + if err != nil { + panic("this should never happen " + err.Error()) + } + return of +} + +func (rd *bufDagReader) Size() uint64 { + s := rd.Reader.Size() + if s < 0 { + panic("size smaller than 0 (impossible!!)") + } + return uint64(s) +} diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index f893de80246..8da86b92460 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -37,9 +37,7 @@ type ReadSeekCloser interface { func NewDagReader(ctx context.Context, n node.Node, serv mdag.DAGService) (DagReader, error) { switch n := n.(type) { case *mdag.RawNode: - return &pbDagReader{ - buf: NewRSNCFromBytes(n.RawData()), - }, nil + return NewBufDagReader(n.RawData()), nil case *mdag.ProtoNode: pb := new(ftpb.Data) if err := proto.Unmarshal(n.Data(), pb); err != nil { diff --git a/unixfs/io/pbdagreader.go b/unixfs/io/pbdagreader.go index 34f622bd628..b2724e1041b 100644 --- a/unixfs/io/pbdagreader.go +++ b/unixfs/io/pbdagreader.go @@ -45,6 +45,8 @@ type pbDagReader struct { cancel func() } +var _ DagReader = (*pbDagReader)(nil) + func NewPBFileReader(ctx context.Context, n *mdag.ProtoNode, pb *ftpb.Data, serv mdag.DAGService) *pbDagReader { fctx, cancel := context.WithCancel(ctx) promises := mdag.GetDAG(fctx, serv, n)