Documentation
¶
Overview ¶
Package io implements convenience objects for working with the ipfs unixfs data format.
Index ¶
- Constants
- Variables
- func GetMetaDataFromDagRoot(ctx context.Context, root ipld.Node, ds ipld.DAGService) ([]byte, error)
- func ResolveUnixfsOnce(ctx context.Context, ds ipld.NodeGetter, nd ipld.Node, names []string) (*ipld.Link, []string, error)
- type BaseNode
- type BasicDirectory
- func (d *BasicDirectory) AddChild(ctx context.Context, name string, node ipld.Node) error
- func (d *BasicDirectory) EnumLinksAsync(ctx context.Context) <-chan format.LinkResult
- func (d *BasicDirectory) Find(ctx context.Context, name string) (ipld.Node, error)
- func (d *BasicDirectory) ForEachLink(_ context.Context, f func(*ipld.Link) error) error
- func (d *BasicDirectory) GetCidBuilder() cid.Builder
- func (d *BasicDirectory) GetNode() (ipld.Node, error)
- func (d *BasicDirectory) Links(ctx context.Context) ([]*ipld.Link, error)
- func (d *BasicDirectory) RemoveChild(ctx context.Context, name string) error
- func (d *BasicDirectory) SetCidBuilder(builder cid.Builder)
- type DagReader
- type DirNode
- type Directory
- type DynamicDirectory
- type FileNode
- type HAMTDirectory
- func (d *HAMTDirectory) AddChild(ctx context.Context, name string, nd ipld.Node) error
- func (d *HAMTDirectory) EnumLinksAsync(ctx context.Context) <-chan format.LinkResult
- func (d *HAMTDirectory) Find(ctx context.Context, name string) (ipld.Node, error)
- func (d *HAMTDirectory) ForEachLink(ctx context.Context, f func(*ipld.Link) error) error
- func (d *HAMTDirectory) GetCidBuilder() cid.Builder
- func (d *HAMTDirectory) GetNode() (ipld.Node, error)
- func (d *HAMTDirectory) Links(ctx context.Context) ([]*ipld.Link, error)
- func (d *HAMTDirectory) RemoveChild(ctx context.Context, name string) error
- func (d *HAMTDirectory) SetCidBuilder(builder cid.Builder)
- type Node
- type ReadSeekCloser
- type ReedSolomonDagReader
- type ReedSolomonDirectory
- type SymlinkNode
Constants ¶
const ( DirNodeType = 1 FileNodeType = 2 SymlinkNodeType = 3 )
const ( // SmallestString is used for metadata name to be the smallest // possible string value. SmallestString = "\u0000" )
Variables ¶
var ( ErrIsDir = errors.New("this dag node is a directory") ErrCantReadSymlinks = errors.New("cannot currently read symlinks") ErrUnkownNodeType = errors.New("unknown node type") ErrSeekNotSupported = errors.New("file does not support seeking") )
Common errors
var DefaultShardWidth = 256
DefaultShardWidth is the default value used for hamt sharding width. Needs to be a power of two (shard entry size) and multiple of 8 (bitfield size).
var ErrNotADir = fmt.Errorf("merkledag node was not a directory or shard")
ErrNotADir implies that the given node was not a unixfs directory
var HAMTShardingSize = int(256 * units.KiB)
HAMTShardingSize is a global option that allows switching to a HAMTDirectory when the BasicDirectory grows above the size (in bytes) signalled by this flag. The default size of 0 disables the option. The size is not the *exact* block size of the encoded BasicDirectory but just the estimated size based byte length of links name and CID (BasicDirectory's ProtoNode doesn't use the Data field so this estimate is pretty accurate).
var UseHAMTSharding = false
UseHAMTSharding is a global flag that signifies whether or not to use the HAMT sharding scheme for directory creation
Functions ¶
func GetMetaDataFromDagRoot ¶
func GetMetaDataFromDagRoot(ctx context.Context, root ipld.Node, ds ipld.DAGService) ([]byte, error)
GetMetaDataFromDagRoot returns the full metadata bytes if available. This function is unixfs/io instead of unixfs because of `NewDagReader` dependency to read all the bytes.
Types ¶
type BaseNode ¶
type BasicDirectory ¶
type BasicDirectory struct {
// contains filtered or unexported fields
}
BasicDirectory is the basic implementation of `Directory`. All the entries are stored in a single node.
func (*BasicDirectory) AddChild ¶
AddChild implements the `Directory` interface. It adds (or replaces) a link to the given `node` under `name`.
func (*BasicDirectory) EnumLinksAsync ¶
func (d *BasicDirectory) EnumLinksAsync(ctx context.Context) <-chan format.LinkResult
EnumLinksAsync returns a channel which will receive Links in the directory as they are enumerated, where order is not gauranteed
func (*BasicDirectory) ForEachLink ¶
ForEachLink implements the `Directory` interface.
func (*BasicDirectory) GetCidBuilder ¶
func (d *BasicDirectory) GetCidBuilder() cid.Builder
GetCidBuilder implements the `Directory` interface.
func (*BasicDirectory) GetNode ¶
func (d *BasicDirectory) GetNode() (ipld.Node, error)
GetNode implements the `Directory` interface.
func (*BasicDirectory) RemoveChild ¶
func (d *BasicDirectory) RemoveChild(ctx context.Context, name string) error
RemoveChild implements the `Directory` interface.
func (*BasicDirectory) SetCidBuilder ¶
func (d *BasicDirectory) SetCidBuilder(builder cid.Builder)
SetCidBuilder implements the `Directory` interface.
type DagReader ¶
type DagReader interface { ReadSeekCloser Mode() os.FileMode ModTime() time.Time Size() uint64 CtxReadFull(context.Context, []byte) (int, error) }
A DagReader provides read-only read and seek acess to a unixfs file. Different implementations of readers are used for the different types of unixfs/protobuf-encoded nodes.
func NewDagReader ¶
NewDagReader creates a new reader object that reads the data represented by the given node, using the passed in DAGService for data retrieval.
func NewReedSolomonDagReader ¶
func NewReedSolomonDagReader(ctx context.Context, n ipld.Node, serv ipld.NodeGetter, numData, numParity, size uint64, isDir bool, missingShards []cid.Cid) (DagReader, []io.Reader, *bytes.Buffer, error)
A ReedSolomonDagReader wraps M DagReaders and reads N (data) out of M (data + parity) concurrently to decode the original file shards for the returned DagReader to use. Optionally, accepts a list of missing shard hashes for repair and returns the buffered data readers on any missing shards (nil for already existing).
type Directory ¶
type Directory interface { // SetCidBuilder sets the CID Builder of the root node. SetCidBuilder(cid.Builder) // AddChild adds a (name, key) pair to the root node. AddChild(context.Context, string, ipld.Node) error // ForEachLink applies the given function to Links in the directory. ForEachLink(context.Context, func(*ipld.Link) error) error // EnumLinksAsync returns a channel which will receive Links in the directory // as they are enumerated, where order is not gauranteed EnumLinksAsync(context.Context) <-chan format.LinkResult // Links returns the all the links in the directory node. Links(context.Context) ([]*ipld.Link, error) // Find returns the root node of the file named 'name' within this directory. // In the case of HAMT-directories, it will traverse the tree. // // Returns os.ErrNotExist if the child does not exist. Find(context.Context, string) (ipld.Node, error) // RemoveChild removes the child with the given name. // // Returns os.ErrNotExist if the child doesn't exist. RemoveChild(context.Context, string) error // GetNode returns the root of this directory. GetNode() (ipld.Node, error) // GetCidBuilder returns the CID Builder used. GetCidBuilder() cid.Builder }
Directory defines a UnixFS directory. It is used for creating, reading and editing directories. It allows to work with different directory schemes, like the basic or the HAMT implementation.
It just allows to perform explicit edits on a single directory, working with directory trees is out of its scope, they are managed by the MFS layer (which is the main consumer of this interface).
func NewDirectory ¶
func NewDirectory(dserv ipld.DAGService) Directory
NewDirectory returns a Directory implemented by DynamicDirectory containing a BasicDirectory that can be converted to a HAMTDirectory.
func NewDirectoryFromNode ¶
NewDirectoryFromNode loads a unixfs directory from the given IPLD node and DAGService.
type DynamicDirectory ¶
type DynamicDirectory struct {
Directory
}
DynamicDirectory wraps a Directory interface and provides extra logic to switch from BasicDirectory to HAMTDirectory and backwards based on size.
func (*DynamicDirectory) AddChild ¶
AddChild implements the `Directory` interface. We check when adding new entries if we should switch to HAMTDirectory according to global option(s).
func (*DynamicDirectory) RemoveChild ¶
func (d *DynamicDirectory) RemoveChild(ctx context.Context, name string) error
RemoveChild implements the `Directory` interface. Used in the case where we wrap a HAMTDirectory that might need to be downgraded to a BasicDirectory. The upgrade path is in AddChild.
type HAMTDirectory ¶
type HAMTDirectory struct {
// contains filtered or unexported fields
}
HAMTDirectory is the HAMT implementation of `Directory`. (See package `hamt` for more information.)
func (*HAMTDirectory) EnumLinksAsync ¶
func (d *HAMTDirectory) EnumLinksAsync(ctx context.Context) <-chan format.LinkResult
EnumLinksAsync returns a channel which will receive Links in the directory as they are enumerated, where order is not gauranteed
func (*HAMTDirectory) ForEachLink ¶
ForEachLink implements the `Directory` interface.
func (*HAMTDirectory) GetCidBuilder ¶
func (d *HAMTDirectory) GetCidBuilder() cid.Builder
GetCidBuilder implements the `Directory` interface.
func (*HAMTDirectory) GetNode ¶
func (d *HAMTDirectory) GetNode() (ipld.Node, error)
GetNode implements the `Directory` interface.
func (*HAMTDirectory) RemoveChild ¶
func (d *HAMTDirectory) RemoveChild(ctx context.Context, name string) error
RemoveChild implements the `Directory` interface.
func (*HAMTDirectory) SetCidBuilder ¶
func (d *HAMTDirectory) SetCidBuilder(builder cid.Builder)
SetCidBuilder implements the `Directory` interface.
type ReadSeekCloser ¶
A ReadSeekCloser implements interfaces to read, copy, seek and close.
type ReedSolomonDagReader ¶
type ReedSolomonDagReader struct { *bytes.Reader // for Reader, Seeker, and WriteTo // contains filtered or unexported fields }
reedSolomonDagReader reads a dag by concurrently merging N shards in a N/M encoded UnixFS dag file. Due to reed solomon requiring N shards to exist, we cannot perform stream Read or Seek on this reader. Everything will be pre-filled in memory before supporting DagReader operations from a []byte reader.
func (*ReedSolomonDagReader) Close ¶
func (rsdr *ReedSolomonDagReader) Close() error
Close has no effect since the underlying reader is a buffer.
func (*ReedSolomonDagReader) CtxReadFull ¶
CtxReadFull is just a Read since there is no context for buffer.
func (*ReedSolomonDagReader) ModTime ¶ added in v0.8.0
func (f *ReedSolomonDagReader) ModTime() time.Time
func (*ReedSolomonDagReader) Mode ¶ added in v0.8.0
func (f *ReedSolomonDagReader) Mode() os.FileMode
func (*ReedSolomonDagReader) Size ¶
func (rsdr *ReedSolomonDagReader) Size() uint64
Size returns the total size of the data from the decoded DAG structured file using reed solomon algorithm.
type ReedSolomonDirectory ¶
type ReedSolomonDirectory struct { DNode *DirNode // contains filtered or unexported fields }
ReedSolomonDirectory is the implementation of `Directory for Reed-Solomon BTFS file. All the entries are stored in a single node.
func NewReedSolomonDirectory ¶
func NewReedSolomonDirectory(dserv ipld.DAGService) *ReedSolomonDirectory
func NewReedSolomonDirectoryFromNode ¶
func NewReedSolomonDirectoryFromNode(dserv ipld.DAGService, dn *DirNode) (*ReedSolomonDirectory, error)
NewReedSolomonDirectoryFromNode loads a ReedSolomon directory from the given DirNode and DAGService.
func (*ReedSolomonDirectory) ForEachLink ¶
func (d *ReedSolomonDirectory) ForEachLink(ctx context.Context, f func(interface{}) error) error
ForEachLink implements the `Directory` interface.
func (*ReedSolomonDirectory) Links ¶
func (d *ReedSolomonDirectory) Links(ctx context.Context) []interface{}
Links implements the `Directory` interface.