From a41ee1d6fc552d9b14fedfcfeae4e5489471ea61 Mon Sep 17 00:00:00 2001 From: David Dias Date: Tue, 31 Jan 2017 10:46:40 +0000 Subject: [PATCH] feat(dag): basics (get, put, rm) --- src/core/components/dag.js | 39 +++++++++++++++++++++++++++ src/core/index.js | 2 ++ test/core/interface/dag.js | 20 ++++++++++++++ test/core/interface/interface.spec.js | 1 + 4 files changed, 62 insertions(+) create mode 100644 src/core/components/dag.js create mode 100644 test/core/interface/dag.js diff --git a/src/core/components/dag.js b/src/core/components/dag.js new file mode 100644 index 0000000000..f8d17626a5 --- /dev/null +++ b/src/core/components/dag.js @@ -0,0 +1,39 @@ +'use strict' + +const promisify = require('promisify-es6') + +const dagPB = require('ipld-dag-pb') +const dagCBOR = require('ipld-dag-cbor') + +module.exports = function dag (self) { + return { + put: promisify((dagNode, multicodec, hashAlg, callback) => { + switch (multicodec) { + case 'dag-pb': dagPB.util.cid(dagNode, gotCid); break + case 'dag-cbor': dagCBOR.util.cid(dagNode, gotCid); break + default: callback(new Error('IPLD Format not supported')) + } + + function gotCid (err, cid) { + if (err) { + return callback(err) + } + self._ipldResolver.put({ + node: dagNode, + cid: cid + }, callback) + } + }), + get: promisify((cid, callback) => { + self._ipldResolver.get(cid, callback) + }), + rm: promisify((cid, callback) => { + // TODO once pinning is complete, this remove operation has to first + // verify that some pinning chain is not broken with the operation + self._ipldResolver.remove(cid, callback) + }), + resolve: promisify((cid, path, callback) => { + self._ipldResolver.resolve(cid, path, callback) + }) + } +} diff --git a/src/core/index.js b/src/core/index.js index fa4c2e8ae2..212429c864 100644 --- a/src/core/index.js +++ b/src/core/index.js @@ -18,6 +18,7 @@ const bootstrap = require('./components/bootstrap') const config = require('./components/config') const block = require('./components/block') const object = require('./components/object') +const dag = require('./components/dag') const libp2p = require('./components/libp2p') const swarm = require('./components/swarm') const ping = require('./components/ping') @@ -64,6 +65,7 @@ function IPFS (repoInstance) { this.config = config(this) this.block = block(this) this.object = object(this) + this.dag = dag(this) this.libp2p = libp2p(this) this.swarm = swarm(this) this.files = files(this) diff --git a/test/core/interface/dag.js b/test/core/interface/dag.js new file mode 100644 index 0000000000..1a617691c6 --- /dev/null +++ b/test/core/interface/dag.js @@ -0,0 +1,20 @@ +/* eslint-env mocha */ + +'use strict' + +const test = require('interface-ipfs-core') +const IPFSFactory = require('../../utils/factory-core') + +let factory + +const common = { + setup: function (cb) { + factory = new IPFSFactory() + cb(null, factory) + }, + teardown: function (cb) { + factory.dismantle(cb) + } +} + +test.dag(common) diff --git a/test/core/interface/interface.spec.js b/test/core/interface/interface.spec.js index a3cfae8350..bf749464d1 100644 --- a/test/core/interface/interface.spec.js +++ b/test/core/interface/interface.spec.js @@ -10,6 +10,7 @@ describe('interface-ipfs-core tests', () => { require('./files') require('./generic') require('./object') + require('./dag') if (isNode) { require('./swarm') require('./pubsub')