diff --git a/package.json b/package.json index 41b6a3b00..82bae3309 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "eslint-plugin-react": "^6.9.0", "gulp": "^3.9.1", "hapi": "^16.1.0", - "interface-ipfs-core": "^0.23.5", + "interface-ipfs-core": "^0.23.6", "ipfsd-ctl": "^0.18.2", "pre-commit": "^1.2.2", "socket.io": "^1.7.2", @@ -124,4 +124,4 @@ "url": "https://github.com/ipfs/js-ipfs-api/issues" }, "homepage": "https://github.com/ipfs/js-ipfs-api" -} \ No newline at end of file +} diff --git a/src/api/dag.js b/src/api/dag.js new file mode 100644 index 000000000..a1c4a3e93 --- /dev/null +++ b/src/api/dag.js @@ -0,0 +1,69 @@ +'use strict' + +const dagPB = require('ipld-dag-pb') +const DAGNode = dagPB.DAGNode +const DAGLink = dagPB.DAGLink +const promisify = require('promisify-es6') +const bs58 = require('bs58') +const streamToValue = require('../stream-to-value') +const cleanMultihash = require('../clean-multihash') +const LRU = require('lru-cache') + +const lruOptions = { + max: 128 +} + +const Unixfs = require('ipfs-unixfs') +const cache = LRU(lruOptions) + +module.exports = (send) => { + const api = { + get: promisify((cid, options, callback) => { + if (typeof options === 'function') { + callback = options + options = {} + } + + options = options || {} + + const node = cache.get(cid) + + if (node) { return callback(null, node) } + + send({ + path: 'dag/get', + args: cid + }, (err, result) => { + if (err) { + return callback(err) + } + + // TODO we need to get the raw bytes + }) + }), + + put: promisify((dagNode, multicodec, hashAlg, options, callback) => { + if (typeof options === 'function') { + callback = options + options = {} + } + + options = options || {} + + send({ + path: 'dag/put', + qs: { + format: multicodec, + inputenc: enc + }, + files: buf + }, (err, result) => { + if (err) { return callback(err) } + + // TODO should get the CID back + }) + }) + } + + return api +} diff --git a/src/load-commands.js b/src/load-commands.js index b69c197cb..b33d4570e 100644 --- a/src/load-commands.js +++ b/src/load-commands.js @@ -20,6 +20,7 @@ function requireCommands () { mount: require('./api/mount'), name: require('./api/name'), object: require('./api/object'), + dag: require('./api/dag'), pin: require('./api/pin'), ping: require('./api/ping'), refs: require('./api/refs'), @@ -31,7 +32,7 @@ function requireCommands () { // TODO: crowding the 'files' namespace temporarily for interface-ipfs-core // compatibility, until 'files vs mfs' naming decision is resolved. - cmds.files = function (send) { + cmds.files = (send) => { const files = require('./api/files')(send) files.add = require('./api/add')(send) files.createAddStream = require('./api/create-add-stream.js')(send) @@ -41,7 +42,7 @@ function requireCommands () { return files } - cmds.util = function (send) { + cmds.util = (send) => { const util = { addFromFs: require('./api/util/fs-add')(send), addFromStream: require('./api/add')(send), diff --git a/test/interface/dag.spec.js b/test/interface/dag.spec.js new file mode 100644 index 000000000..f9e709282 --- /dev/null +++ b/test/interface/dag.spec.js @@ -0,0 +1,20 @@ +/* eslint-env mocha */ + +'use strict' + +const test = require('interface-ipfs-core') +const FactoryClient = require('../ipfs-factory/client') + +let fc + +const common = { + setup: function (callback) { + fc = new FactoryClient() + callback(null, fc) + }, + teardown: function (callback) { + fc.dismantle(callback) + } +} + +test.dag(common)