diff --git a/importer/importer.go b/importer/importer.go new file mode 100644 index 0000000000000000000000000000000000000000..e1eac1e1c64d207f9760bc59d3082dfaaf2910dd --- /dev/null +++ b/importer/importer.go @@ -0,0 +1,40 @@ +package importer + +import ( + "fmt" + dag "github.com/jbenet/go-ipfs/merkledag" + "io" + "io/ioutil" +) + +var BlockSizeLimit = int64(1048576) // 1 MB +var SizeLimitExceeded = fmt.Errorf("object size limit exceeded") + +// todo: incremental construction with an ipfs node. dumping constructed +// objects into the datastore, to avoid buffering all in memory + +// size required for block construction +func NewDagFromReader(r io.Reader, size int64) (*dag.Node, error) { + // todo: block-splitting based on rabin fingerprinting + // todo: block-splitting with user-defined function + // todo: block-splitting at all. :P + + // totally just trusts the reported size. fix later. + if size > BlockSizeLimit { // 1 MB limit for now. + return nil, SizeLimitExceeded + } + + // we're doing it live! + buf, err := ioutil.ReadAll(r) + if err != nil { + return nil, err + } + + if int64(len(buf)) > BlockSizeLimit { + return nil, SizeLimitExceeded // lying punk. + } + + root := &dag.Node{Data: buf} + // no children for now because not block splitting yet + return root, nil +}