From 50b51bb68f3ec8e524d3105cf161e9206fc12b24 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Sun, 19 May 2019 22:44:43 +0100 Subject: [PATCH 01/10] chore: update ipld formats and cid versions May need merging with or replacing by #468. --- package.json | 9 +- src/dag/get.js | 97 +++++++++++----------- src/dag/put.js | 23 +++--- src/dag/tree.js | 32 +++---- src/files-mfs/read-readable-stream.js | 1 + src/files-regular/cat.js | 4 +- src/object/get.js | 115 ++++++++++++-------------- src/object/links.js | 91 +++++++++++++++----- src/object/patch/add-link.js | 44 ++++++---- src/object/patch/set-data.js | 4 +- src/object/put.js | 86 ++++++++++--------- src/object/stat.js | 36 ++++---- src/object/utils.js | 29 +++++-- 13 files changed, 321 insertions(+), 250 deletions(-) diff --git a/package.json b/package.json index 286558f47..e72b2add6 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "bl": "^3.0.0", "bs58": "^4.0.1", "chai": "^4.2.0", - "cids": "~0.5.8", + "cids": "~0.7.1", "concat-stream": "^2.0.0", "dirty-chai": "^2.0.1", "es6-promisify": "^6.0.1", @@ -49,9 +49,9 @@ "ipfs-block": "~0.8.0", "ipfs-unixfs": "~0.1.16", "ipfs-utils": "~0.0.3", - "ipld-dag-cbor": "~0.13.1", - "ipld-dag-pb": "~0.15.3", - "is-ipfs": "~0.6.0", + "ipld-dag-cbor": "~0.15.0", + "ipld-dag-pb": "ipld/js-ipld-dag-pb#support-size-property", + "is-ipfs": "~0.5.1", "is-plain-object": "^3.0.0", "libp2p-crypto": "~0.16.0", "multiaddr": "^6.0.0", @@ -62,7 +62,6 @@ "peer-info": "~0.15.0", "pull-stream": "^3.6.11", "pump": "^3.0.0", - "randombytes": "^2.0.6", "readable-stream": "^3.1.1", "through2": "^3.0.0" }, diff --git a/src/dag/get.js b/src/dag/get.js index 03855b784..5822fffd1 100644 --- a/src/dag/get.js +++ b/src/dag/get.js @@ -48,29 +48,33 @@ module.exports = (createCommon, options) => { (cb) => { const someData = Buffer.from('some other data') - DAGNode.create(someData, (err, node) => { - expect(err).to.not.exist() - pbNode = node - cb() - }) + try { + pbNode = DAGNode.create(someData) + } catch (err) { + return cb(err) + } cborNode = { data: someData } + + cb() }, (cb) => { - dagPB.DAGNode.create(Buffer.from('I am inside a Protobuf'), (err, node) => { - expect(err).to.not.exist() - nodePb = node - cb() - }) + try { + nodePb = DAGNode.create(Buffer.from('I am inside a Protobuf')) + } catch (err) { + return cb(err) + } + + cb() }, (cb) => { - dagPB.util.cid(nodePb, (err, cid) => { - expect(err).to.not.exist() - cidPb = cid - cb() - }) + dagPB.util.cid(dagPB.util.serialize(nodePb)) + .then(cid => { + cidPb = cid + cb() + }, cb) }, (cb) => { nodeCbor = { @@ -78,11 +82,11 @@ module.exports = (createCommon, options) => { pb: cidPb } - dagCBOR.util.cid(nodeCbor, (err, cid) => { - expect(err).to.not.exist() - cidCbor = cid - cb() - }) + dagCBOR.util.cid(dagCBOR.util.serialize(nodeCbor)) + .then(cid => { + cidCbor = cid + cb() + }, cb) }, (cb) => { eachSeries([ @@ -135,11 +139,12 @@ module.exports = (createCommon, options) => { const node = result.value - dagPB.util.cid(node, (err, cid) => { - expect(err).to.not.exist() - expect(cid).to.eql(cidPb) - done() - }) + dagPB.util.cid(dagPB.util.serialize(node)) + .then(cid => { + expect(cid).to.eql(cidPb) + done() + }) + .catch(done) }) }) @@ -160,11 +165,12 @@ module.exports = (createCommon, options) => { const node = result.value - dagCBOR.util.cid(node, (err, cid) => { - expect(err).to.not.exist() - expect(cid).to.eql(cidCbor) - done() - }) + dagCBOR.util.cid(dagCBOR.util.serialize(node)) + .then(cid => { + expect(cid).to.eql(cidCbor) + done() + }) + .catch(done) }) }) @@ -196,11 +202,12 @@ module.exports = (createCommon, options) => { const node = result.value - dagCBOR.util.cid(node, (err, cid) => { - expect(err).to.not.exist() - expect(cid).to.eql(cidCbor) - done() - }) + dagCBOR.util.cid(dagCBOR.util.serialize(node)) + .then(cid => { + expect(cid).to.eql(cidCbor) + done() + }) + .catch(done) }) }) @@ -225,20 +232,18 @@ module.exports = (createCommon, options) => { it('should get a node added as CIDv0 with a CIDv1', done => { const input = Buffer.from(`TEST${Date.now()}`) - dagPB.DAGNode.create(input, (err, node) => { - expect(err).to.not.exist() + const node = dagPB.DAGNode.create(input) - ipfs.dag.put(node, { format: 'dag-pb', hashAlg: 'sha2-256' }, (err, cid) => { - expect(err).to.not.exist() - expect(cid.version).to.equal(0) + ipfs.dag.put(node, { format: 'dag-pb', hashAlg: 'sha2-256' }, (err, cid) => { + expect(err).to.not.exist() + expect(cid.version).to.equal(0) - const cidv1 = cid.toV1() + const cidv1 = cid.toV1() - ipfs.dag.get(cidv1, (err, output) => { - expect(err).to.not.exist() - expect(output.value.data).to.eql(input) - done() - }) + ipfs.dag.get(cidv1, (err, output) => { + expect(err).to.not.exist() + expect(output.value.data).to.eql(input) + done() }) }) }) diff --git a/src/dag/put.js b/src/dag/put.js index 1e4a561c7..41fca0b62 100644 --- a/src/dag/put.js +++ b/src/dag/put.js @@ -41,15 +41,17 @@ module.exports = (createCommon, options) => { before((done) => { const someData = Buffer.from('some data') - DAGNode.create(someData, (err, node) => { - expect(err).to.not.exist() - pbNode = node - done() - }) + try { + pbNode = DAGNode.create(someData) + } catch (err) { + return done(err) + } cborNode = { data: someData } + + done() }) it('should put dag-pb with default hash func (sha2-256)', (done) => { @@ -88,11 +90,12 @@ module.exports = (createCommon, options) => { expect(err).to.not.exist() expect(cid).to.exist() expect(CID.isCID(cid)).to.equal(true) - dagCBOR.util.cid(cborNode, (err, _cid) => { - expect(err).to.not.exist() - expect(cid.buffer).to.eql(_cid.buffer) - done() - }) + dagCBOR.util.cid(dagCBOR.util.serialize(cborNode)) + .then(_cid => { + expect(cid.buffer).to.eql(_cid.buffer) + done() + }) + .catch(done) }) }) diff --git a/src/dag/tree.js b/src/dag/tree.js index d4444dfdb..99d5cde0c 100644 --- a/src/dag/tree.js +++ b/src/dag/tree.js @@ -42,18 +42,20 @@ module.exports = (createCommon, options) => { before(function (done) { series([ (cb) => { - dagPB.DAGNode.create(Buffer.from('I am inside a Protobuf'), (err, node) => { - expect(err).to.not.exist() - nodePb = node - cb() - }) + try { + nodePb = dagPB.DAGNode.create(Buffer.from('I am inside a Protobuf')) + } catch (err) { + return cb(err) + } + + cb() }, (cb) => { - dagPB.util.cid(nodePb, (err, cid) => { - expect(err).to.not.exist() - cidPb = cid - cb() - }) + dagPB.util.cid(dagPB.util.serialize(nodePb)) + .then(cid => { + cidPb = cid + cb() + }, cb) }, (cb) => { nodeCbor = { @@ -61,11 +63,11 @@ module.exports = (createCommon, options) => { pb: cidPb } - dagCBOR.util.cid(nodeCbor, (err, cid) => { - expect(err).to.not.exist() - cidCbor = cid - cb() - }) + dagCBOR.util.cid(dagCBOR.util.serialize(nodeCbor)) + .then(cid => { + cidCbor = cid + cb() + }, cb) }, (cb) => { eachSeries([ diff --git a/src/files-mfs/read-readable-stream.js b/src/files-mfs/read-readable-stream.js index d31d8fd6a..d4f525339 100644 --- a/src/files-mfs/read-readable-stream.js +++ b/src/files-mfs/read-readable-stream.js @@ -37,6 +37,7 @@ module.exports = (createCommon, options) => { const testDir = `/test-${hat()}` const stream = ipfs.files.readReadableStream(`${testDir}/404`) + stream.on('data', () => {}) stream.once('error', (err) => { expect(err).to.exist() diff --git a/src/files-regular/cat.js b/src/files-regular/cat.js index 6b0e8d58a..25c988f8e 100644 --- a/src/files-regular/cat.js +++ b/src/files-regular/cat.js @@ -189,9 +189,7 @@ module.exports = (createCommon, options) => { return ipfs.cat(fixtures.smallFile.cid + '/does-not-exist') .catch((err) => { expect(err).to.exist() - expect(err.message).to.oneOf([ - 'No such file', - 'no link named "does-not-exist" under Qma4hjFTnCasJ8PVp3mZbZK5g2vGDT4LByLJ7m8ciyRFZP']) + expect(err.message).to.include('file does not exist') }) }) diff --git a/src/object/get.js b/src/object/get.js index 438459ae2..74ae9412f 100644 --- a/src/object/get.js +++ b/src/object/get.js @@ -7,7 +7,7 @@ const series = require('async/series') const hat = require('hat') const { getDescribe, getIt, expect } = require('../utils/mocha') const UnixFs = require('ipfs-unixfs') -const randomBytes = require('randombytes') +const crypto = require('crypto') const { asDAGLink } = require('./utils') module.exports = (createCommon, options) => { @@ -63,19 +63,21 @@ module.exports = (createCommon, options) => { (cb) => { ipfs.object.get(node1Cid, (err, node) => { expect(err).to.not.exist() - node2 = node // because js-ipfs-api can't infer if the // returned Data is Buffer or String - if (typeof node2.data === 'string') { - node2.data = Buffer.from(node2.data) + if (typeof node.Data === 'string') { + node = DAGNode.create(Buffer.from(node.Data), node.Links, node.size) } + + node2 = node + cb() }) }, (cb) => { - expect(node1.data).to.eql(node2.data) - expect(node1.links).to.eql(node2.links) + expect(node1.Data).to.eql(node2.Data) + expect(node1.Links).to.eql(node2.Links) cb() } ], done) @@ -89,16 +91,16 @@ module.exports = (createCommon, options) => { const node1Cid = await ipfs.object.put(testObj) const node1 = await ipfs.object.get(node1Cid) - const node2 = await ipfs.object.get(node1Cid) + let node2 = await ipfs.object.get(node1Cid) // because js-ipfs-api can't infer if the // returned Data is Buffer or String - if (typeof node2.data === 'string') { - node2.data = Buffer.from(node2.data) + if (typeof node2.Data === 'string') { + node2 = DAGNode.create(Buffer.from(node2.Data), node2.Links, node2.size) } - expect(node1.data).to.deep.equal(node2.data) - expect(node1.links).to.deep.equal(node2.links) + expect(node1.Data).to.deep.equal(node2.Data) + expect(node1.Links).to.deep.equal(node2.Links) }) it('should get object by multihash string', (done) => { @@ -130,16 +132,17 @@ module.exports = (createCommon, options) => { expect(err).to.not.exist() // because js-ipfs-api can't infer if the // returned Data is Buffer or String - if (typeof node.data === 'string') { - node.data = Buffer.from(node.data) + if (typeof node.Data === 'string') { + node = DAGNode.create(Buffer.from(node.Data), node.Links, node.size) } + node2 = node cb() }) }, (cb) => { - expect(node1.data).to.eql(node2.data) - expect(node1.links).to.eql(node2.links) + expect(node1.Data).to.eql(node2.Data) + expect(node1.Links).to.eql(node2.Links) cb() } ], done) @@ -153,16 +156,16 @@ module.exports = (createCommon, options) => { const node1Cid = await ipfs.object.put(obj) const node1 = await ipfs.object.get(node1Cid) - const node2 = await ipfs.object.get(node1Cid.toBaseEncodedString()) + let node2 = await ipfs.object.get(node1Cid.toBaseEncodedString()) // because js-ipfs-api can't infer if the // returned Data is Buffer or String - if (typeof node2.data === 'string') { - node2.data = Buffer.from(node2.data) + if (typeof node2.Data === 'string') { + node2 = DAGNode.create(Buffer.from(node2.Data), node2.Links, node2.size) } - expect(node1.data).to.deep.equal(node2.data) - expect(node1.links).to.deep.equal(node2.links) + expect(node1.Data).to.deep.equal(node2.Data) + expect(node1.Links).to.deep.equal(node2.Links) }) it('should get object with links by multihash string', (done) => { @@ -174,30 +177,32 @@ module.exports = (createCommon, options) => { series([ (cb) => { - DAGNode.create(Buffer.from('Some data 1'), (err, node) => { - expect(err).to.not.exist() - node1a = node + try { + node1a = DAGNode.create(Buffer.from('Some data 1')) + } catch (err) { + return cb(err) + } - cb() - }) + cb() }, (cb) => { - DAGNode.create(Buffer.from('Some data 2'), (err, node) => { - expect(err).to.not.exist() - node2 = node + try { + node2 = DAGNode.create(Buffer.from('Some data 2')) + } catch (err) { + return cb(err) + } - cb() - }) + cb() }, (cb) => { asDAGLink(node2, 'some-link', (err, link) => { expect(err).to.not.exist() - DAGNode.addLink(node1a, link, (err, node) => { - expect(err).to.not.exist() - node1b = node - cb() - }) + DAGNode.addLink(node1a, link) + .then(node => { + node1b = node + cb() + }, cb) }) }, (cb) => { @@ -213,8 +218,8 @@ module.exports = (createCommon, options) => { // because js-ipfs-api can't infer if the // returned Data is Buffer or String - if (typeof node.data === 'string') { - node.data = Buffer.from(node.data) + if (typeof node.Data === 'string') { + node = DAGNode.create(Buffer.from(node.Data), node.Links, node.size) } node1c = node @@ -222,7 +227,7 @@ module.exports = (createCommon, options) => { }) }, (cb) => { - expect(node1a.data).to.eql(node1c.data) + expect(node1a.Data).to.eql(node1c.Data) cb() } ], done) @@ -256,16 +261,16 @@ module.exports = (createCommon, options) => { expect(err).to.not.exist() // because js-ipfs-api can't infer if the // returned Data is Buffer or String - if (typeof node.data === 'string') { - node.data = Buffer.from(node.data) + if (typeof node.Data === 'string') { + node = DAGNode.create(Buffer.from(node.Data), node.Links, node.size) } node1b = node cb() }) }, (cb) => { - expect(node1a.data).to.eql(node1b.data) - expect(node1a.links).to.eql(node1b.links) + expect(node1a.Data).to.eql(node1b.Data) + expect(node1a.Links).to.eql(node1b.Links) cb() } ], done) @@ -300,15 +305,15 @@ module.exports = (createCommon, options) => { // because js-ipfs-api can't infer if the // returned Data is Buffer or String if (typeof node.data === 'string') { - node.data = Buffer.from(node.data) + node = DAGNode.create(Buffer.from(node.Data), node.Links, node.size) } node1b = node cb() }) }, (cb) => { - expect(node1a.data).to.eql(node1b.data) - expect(node1a.links).to.eql(node1b.links) + expect(node1a.Data).to.eql(node1b.Data) + expect(node1a.Links).to.eql(node1b.Links) cb() } ], done) @@ -316,23 +321,7 @@ module.exports = (createCommon, options) => { it('should supply unaltered data', () => { // has to be big enough to span several DAGNodes - let required = 1024 * 3000 - - // can't just request `required` random bytes in the browser yet - // as it's more than 65536: - // https://github.com/crypto-browserify/randombytes/pull/15 - let data = Buffer.alloc(0) - const maxBytes = 65536 - let next = maxBytes - - while (data.length !== required) { - data = Buffer.concat([data, randomBytes(next)]) - next = maxBytes - - if (data.length + maxBytes > required) { - next = required - data.length - } - } + let data = crypto.randomBytes(1024 * 3000) return ipfs.add({ path: '', @@ -342,7 +331,7 @@ module.exports = (createCommon, options) => { return ipfs.object.get(result[0].hash) }) .then((node) => { - const meta = UnixFs.unmarshal(node.data) + const meta = UnixFs.unmarshal(node.Data) expect(meta.fileSize()).to.equal(data.length) }) diff --git a/src/object/links.js b/src/object/links.js index 04b757597..6cac58f96 100644 --- a/src/object/links.js +++ b/src/object/links.js @@ -8,6 +8,7 @@ const series = require('async/series') const hat = require('hat') const { getDescribe, getIt, expect } = require('../utils/mocha') const { asDAGLink } = require('./utils') +const CID = require('cids') module.exports = (createCommon, options) => { const describe = getDescribe(options) @@ -50,7 +51,7 @@ module.exports = (createCommon, options) => { ipfs.object.links(cid, (err, links) => { expect(err).to.not.exist() - expect(node.links).to.deep.equal(links) + expect(node.Links).to.deep.equal(links) done() }) }) @@ -67,7 +68,7 @@ module.exports = (createCommon, options) => { const node = await ipfs.object.get(cid) const links = await ipfs.object.links(cid) - expect(node.links).to.eql(links) + expect(node.Links).to.eql(links) }) it('should get links by multihash', (done) => { @@ -78,43 +79,52 @@ module.exports = (createCommon, options) => { series([ (cb) => { - DAGNode.create(Buffer.from('Some data 1'), (err, node) => { - expect(err).to.not.exist() - node1a = node + try { + node1a = DAGNode.create(Buffer.from('Some data 1')) + } catch (err) { + return cb(err) + } - cb() - }) + cb() }, (cb) => { - DAGNode.create(Buffer.from('Some data 2'), (err, node) => { - expect(err).to.not.exist() - node2 = node - cb() - }) + try { + node2 = DAGNode.create(Buffer.from('Some data 2')) + } catch (err) { + return cb(err) + } + + cb() }, (cb) => { asDAGLink(node2, 'some-link', (err, link) => { expect(err).to.not.exist() - DAGNode.addLink(node1a, link, (err, node) => { - expect(err).to.not.exist() - node1b = node + DAGNode.addLink(node1a, link) + .then(node => { + node1b = node - dagPB.util.cid(node, (err, cid) => { - expect(err).to.not.exist() + return dagPB.util.cid(dagPB.util.serialize(node1b)) + }) + .then(cid => { node1bCid = cid + cb() }) - }) + .catch(cb) }) }, (cb) => { - ipfs.object.put(node1b, (cb)) + ipfs.object.put(node1b, cb) }, (cb) => { ipfs.object.links(node1bCid, (err, links) => { expect(err).to.not.exist() - expect(node1b.links[0].toJSON()).to.eql(links[0].toJSON()) + expect(node1b.Links[0]).to.eql({ + Hash: links[0].Hash, + Tsize: links[0].Tsize, + Name: links[0].Name + }) cb() }) } @@ -135,7 +145,7 @@ module.exports = (createCommon, options) => { ipfs.object.links(cid.buffer, { enc: 'base58' }, (err, links) => { expect(err).to.not.exist() - expect(node.links).to.deep.equal(links) + expect(node.Links).to.deep.equal(links) done() }) }) @@ -156,11 +166,48 @@ module.exports = (createCommon, options) => { ipfs.object.links(cid.toBaseEncodedString(), { enc: 'base58' }, (err, links) => { expect(err).to.not.exist() - expect(node.links).to.deep.equal(links) + expect(node.Links).to.deep.equal(links) done() }) }) }) }) + + it('should get links from CBOR object', (done) => { + const hashes = [] + ipfs.add(Buffer.from('test data'), (err, res1) => { + expect(err).to.not.exist() + hashes.push(res1[0].hash) + ipfs.add(Buffer.from('more test data'), (err, res2) => { + hashes.push(res2[0].hash) + expect(err).to.not.exist() + const obj = { + some: 'data', + mylink: new CID(hashes[0]), + myobj: { + anotherLink: new CID(hashes[1]) + } + } + ipfs.dag.put(obj, (err, cid) => { + expect(err).to.not.exist() + ipfs.object.links(cid, (err, links) => { + expect(err).to.not.exist() + expect(links.length).to.eql(2) + + // TODO: js-ipfs succeeds but go returns empty strings for link name + // const names = [links[0].name, links[1].name] + // expect(names).includes('mylink') + // expect(names).includes('myobj/anotherLink') + + const cids = [links[0].Hash.toString(), links[1].Hash.toString()] + expect(cids).includes(hashes[0]) + expect(cids).includes(hashes[1]) + + done() + }) + }) + }) + }) + }) }) } diff --git a/src/object/patch/add-link.js b/src/object/patch/add-link.js index 5d8fc86ac..d944b9efa 100644 --- a/src/object/patch/add-link.js +++ b/src/object/patch/add-link.js @@ -60,18 +60,22 @@ module.exports = (createCommon, options) => { }) }, (cb) => { - DAGNode.create(obj.Data, obj.Links, (err, node) => { - expect(err).to.not.exist() - node1a = node - cb() - }) + try { + node1a = DAGNode.create(obj.Data, obj.Links) + } catch (err) { + return cb(err) + } + + cb() }, (cb) => { - DAGNode.create(Buffer.from('some other node'), (err, node) => { - expect(err).to.not.exist() - node2 = node - cb() - }) + try { + node2 = DAGNode.create(Buffer.from('some other node')) + } catch (err) { + return cb(err) + } + + cb() }, (cb) => { // note: we need to put the linked obj, otherwise IPFS won't @@ -87,19 +91,23 @@ module.exports = (createCommon, options) => { name: 'link-to-node', size: node2.toJSON().size, cid: node2Cid - }, (err, node) => { - expect(err).to.not.exist() - node1b = node + }) + .then(node => { + node1b = node - dagPB.util.cid(node, (err, cid) => { - expect(err).to.not.exist() + return dagPB.util.cid(dagPB.util.serialize(node), { + cidVersion: 0 + }) + }) + .then(cid => { node1bCid = cid + cb() }) - }) + .catch(cb) }, (cb) => { - ipfs.object.patch.addLink(testNodeCid, node1b.links[0], (err, cid) => { + ipfs.object.patch.addLink(testNodeCid, node1b.Links[0], (err, cid) => { expect(err).to.not.exist() expect(node1bCid).to.eql(cid) cb() @@ -153,7 +161,7 @@ module.exports = (createCommon, options) => { cid: childCid }) const newParentCid = await calculateCid(newParent) - const nodeFromObjectPatchCid = await ipfs.object.patch.addLink(parentCid, newParent.links[0]) + const nodeFromObjectPatchCid = await ipfs.object.patch.addLink(parentCid, newParent.Links[0]) expect(newParentCid).to.eql(nodeFromObjectPatchCid) }) diff --git a/src/object/patch/set-data.js b/src/object/patch/set-data.js index 6f7c58e82..621fc43e4 100644 --- a/src/object/patch/set-data.js +++ b/src/object/patch/set-data.js @@ -47,7 +47,7 @@ module.exports = (createCommon, options) => { ipfs.object.get(patchedNodeCid, (err, patchedNode) => { expect(err).to.not.exist() - expect(patchedNode.data).to.eql(patchData) + expect(patchedNode.Data).to.eql(patchData) done() }) }) @@ -66,7 +66,7 @@ module.exports = (createCommon, options) => { const patchedNode = await ipfs.object.get(patchedNodeCid) expect(nodeCid).to.not.deep.equal(patchedNodeCid) - expect(patchedNode.data).to.eql(patchData) + expect(patchedNode.Data).to.eql(patchData) }) }) } diff --git a/src/object/put.js b/src/object/put.js index b297e0cc3..6a04e917d 100644 --- a/src/object/put.js +++ b/src/object/put.js @@ -87,7 +87,7 @@ module.exports = (createCommon, options) => { ipfs.object.get(cid, (err, node) => { expect(err).to.not.exist() const nodeJSON = node.toJSON() - expect(nodeJSON.data).to.eql(node.data) + expect(nodeJSON.data).to.eql(node.Data) done() }) }) @@ -99,26 +99,30 @@ module.exports = (createCommon, options) => { series([ (cb) => { - DAGNode.create(Buffer.from(hat()), (err, _node) => { - expect(err).to.not.exist() - node = _node - cb() - }) + try { + node = DAGNode.create(Buffer.from(hat())) + } catch (err) { + return cb(err) + } + + cb() }, (cb) => { - dagPB.util.serialize(node, (err, _serialized) => { - expect(err).to.not.exist() - serialized = _serialized - cb() - }) + try { + serialized = dagPB.util.serialize(node) + } catch (err) { + return cb(err) + } + + cb() }, (cb) => { ipfs.object.put(serialized, { enc: 'protobuf' }, (err, cid) => { expect(err).to.not.exist() ipfs.object.get(cid, (err, node) => { expect(err).to.not.exist() - expect(node.data).to.deep.equal(node.data) - expect(node.links).to.deep.equal(node.links) + expect(node.data).to.deep.equal(node.Data) + expect(node.links).to.deep.equal(node.Links) cb() }) }) @@ -142,17 +146,16 @@ module.exports = (createCommon, options) => { }) it('should put a Protobuf DAGNode', (done) => { - DAGNode.create(Buffer.from(hat()), (err, dNode) => { + const dNode = DAGNode.create(Buffer.from(hat())) + + ipfs.object.put(dNode, (err, cid) => { expect(err).to.not.exist() - ipfs.object.put(dNode, (err, cid) => { - expect(err).to.not.exist() - ipfs.object.get(cid, (err, node) => { - expect(err).to.not.exist() - expect(dNode.data).to.deep.equal(node.data) - expect(dNode.links).to.deep.equal(node.links) - done() - }) + ipfs.object.get(cid, (err, node) => { + expect(err).to.not.exist() + expect(dNode.data).to.deep.equal(node.Data) + expect(dNode.links).to.deep.equal(node.Links) + done() }) }) }) @@ -171,28 +174,32 @@ module.exports = (createCommon, options) => { series([ (cb) => { - DAGNode.create(Buffer.from(hat()), (err, node) => { - expect(err).to.not.exist() - node1a = node - cb() - }) + try { + node1a = DAGNode.create(Buffer.from(hat())) + } catch (err) { + return cb(err) + } + + cb() }, (cb) => { - DAGNode.create(Buffer.from(hat()), (err, node) => { - expect(err).to.not.exist() - node2 = node - cb() - }) + try { + node2 = DAGNode.create(Buffer.from(hat())) + } catch (err) { + return cb(err) + } + + cb() }, (cb) => { asDAGLink(node2, 'some-link', (err, link) => { expect(err).to.not.exist() - DAGNode.addLink(node1a, link, (err, node) => { - expect(err).to.not.exist() - node1b = node - cb() - }) + DAGNode.addLink(node1a, link) + .then(node => { + node1b = node + cb() + }, cb) }) }, (cb) => { @@ -201,9 +208,8 @@ module.exports = (createCommon, options) => { ipfs.object.get(cid, (err, node) => { expect(err).to.not.exist() - expect(node1b.data).to.deep.equal(node.data) - expect(node1b.links.map((l) => l.toJSON())) - .to.deep.equal(node.links.map((l) => l.toJSON())) + expect(node1b.Data).to.deep.equal(node.Data) + expect(node1b.Links).to.deep.equal(node.Links) cb() }) }) diff --git a/src/object/stat.js b/src/object/stat.js index 6e1e867a2..285300bad 100644 --- a/src/object/stat.js +++ b/src/object/stat.js @@ -89,30 +89,32 @@ module.exports = (createCommon, options) => { series([ (cb) => { - DAGNode.create(Buffer.from('Some data 1'), (err, node) => { - expect(err).to.not.exist() - node1a = node - cb() - }) + try { + node1a = DAGNode.create(Buffer.from('Some data 1')) + } catch (err) { + return cb(err) + } + + cb() }, (cb) => { - DAGNode.create(Buffer.from('Some data 2'), (err, node) => { - expect(err).to.not.exist() - node2 = node - cb() - }) + try { + node2 = DAGNode.create(Buffer.from('Some data 2')) + } catch (err) { + return cb(err) + } + + cb() }, (cb) => { asDAGLink(node2, 'some-link', (err, link) => { expect(err).to.not.exist() - DAGNode.addLink(node1a, link, (err, node) => { - expect(err).to.not.exist() - - node1b = node - - cb() - }) + DAGNode.addLink(node1a, link) + .then(node => { + node1b = node + cb() + }, cb) }) }, (cb) => { diff --git a/src/object/utils.js b/src/object/utils.js index fb122a7d4..ead57bdad 100644 --- a/src/object/utils.js +++ b/src/object/utils.js @@ -4,29 +4,40 @@ const { promisify } = require('es6-promisify') const dagPB = require('ipld-dag-pb') const { DAGNode, DAGLink } = dagPB -module.exports.calculateCid = promisify((node, cb) => { - dagPB.util.cid(node, cb) +const calculateCid = promisify((node, cb) => { + dagPB.util.cid(dagPB.util.serialize(node), { + cidVersion: 0 + }) + .then(cid => cb(null, cid), cb) }) -module.exports.createDAGNode = promisify((data, links, cb) => { - DAGNode.create(data, links, cb) +const createDAGNode = promisify((data, links, cb) => { + cb(null, DAGNode.create(data, links)) }) -module.exports.addLinkToDAGNode = promisify((parent, link, cb) => { - DAGNode.addLink(parent, link, cb) +const addLinkToDAGNode = promisify((parent, link, cb) => { + DAGNode.addLink(parent, link) + .then(node => cb(null, node), cb) }) -module.exports.asDAGLink = promisify((node, name, cb) => { +const asDAGLink = promisify((node, name, cb) => { if (typeof name === 'function') { cb = name name = '' } - dagPB.util.cid(node, (err, nodeCid) => { + calculateCid(node, (err, cid) => { if (err) { return cb(err) } - DAGLink.create(name, node.size, nodeCid, cb) + cb(null, new DAGLink(name, node.size, cid)) }) }) + +module.exports = { + calculateCid, + createDAGNode, + addLinkToDAGNode, + asDAGLink +} From a12c34380f44951a205c0dd13b79c1c214def7aa Mon Sep 17 00:00:00 2001 From: Alan Shaw Date: Mon, 20 May 2019 11:07:00 +0100 Subject: [PATCH 02/10] fix: adding links with new IPLD formats License: MIT Signed-off-by: Alan Shaw --- src/files-regular/refs-tests.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/files-regular/refs-tests.js b/src/files-regular/refs-tests.js index f3f8dbbf1..a79ef24da 100644 --- a/src/files-regular/refs-tests.js +++ b/src/files-regular/refs-tests.js @@ -4,6 +4,7 @@ const mapSeries = require('async/mapSeries') const { getDescribe, getIt, expect } = require('../utils/mocha') const loadFixture = require('aegir/fixtures') +const CID = require('cids') module.exports = (createCommon, suiteName, ipfsRefs, options) => { const describe = getDescribe(options) @@ -365,7 +366,7 @@ function loadDagContent (ipfs, node, callback) { putLinks: (links, cb) => { const obj = {} for (const { name, cid } of links) { - obj[name] = { '/': cid } + obj[name] = new CID(cid) } ipfs.dag.put(obj, cb) } From 3eb398eed678c449aeb6a8bc838fa38d47eb1beb Mon Sep 17 00:00:00 2001 From: Alan Shaw Date: Mon, 20 May 2019 11:11:37 +0100 Subject: [PATCH 03/10] fix: data property name License: MIT Signed-off-by: Alan Shaw --- src/dag/get.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dag/get.js b/src/dag/get.js index 5822fffd1..0be5898eb 100644 --- a/src/dag/get.js +++ b/src/dag/get.js @@ -242,7 +242,7 @@ module.exports = (createCommon, options) => { ipfs.dag.get(cidv1, (err, output) => { expect(err).to.not.exist() - expect(output.value.data).to.eql(input) + expect(output.value.Data).to.eql(input) done() }) }) @@ -261,7 +261,7 @@ module.exports = (createCommon, options) => { ipfs.dag.get(cidv0, (err, output) => { expect(err).to.not.exist() - expect(Unixfs.unmarshal(output.value.data).data).to.eql(input) + expect(Unixfs.unmarshal(output.value.Data).data).to.eql(input) done() }) }) From b97544d7c3e48900f2e668afb592718996ef7ffa Mon Sep 17 00:00:00 2001 From: Alan Shaw Date: Mon, 20 May 2019 11:23:04 +0100 Subject: [PATCH 04/10] fix: object test property fixes License: MIT Signed-off-by: Alan Shaw --- src/object/get.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/object/get.js b/src/object/get.js index 74ae9412f..faef252f2 100644 --- a/src/object/get.js +++ b/src/object/get.js @@ -304,7 +304,7 @@ module.exports = (createCommon, options) => { expect(err).to.not.exist() // because js-ipfs-api can't infer if the // returned Data is Buffer or String - if (typeof node.data === 'string') { + if (typeof node.Data === 'string') { node = DAGNode.create(Buffer.from(node.Data), node.Links, node.size) } node1b = node From 0bc42e7644ebc12a5f89f18df85a74f86ae8670a Mon Sep 17 00:00:00 2001 From: Alan Shaw Date: Mon, 20 May 2019 12:09:24 +0100 Subject: [PATCH 05/10] fix: error message License: MIT Signed-off-by: Alan Shaw --- package.json | 2 +- src/files-regular/cat.js | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index e72b2add6..79e39d791 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "ipfs-unixfs": "~0.1.16", "ipfs-utils": "~0.0.3", "ipld-dag-cbor": "~0.15.0", - "ipld-dag-pb": "ipld/js-ipld-dag-pb#support-size-property", + "ipld-dag-pb": "~0.17.2", "is-ipfs": "~0.5.1", "is-plain-object": "^3.0.0", "libp2p-crypto": "~0.16.0", diff --git a/src/files-regular/cat.js b/src/files-regular/cat.js index 25c988f8e..0710e22ad 100644 --- a/src/files-regular/cat.js +++ b/src/files-regular/cat.js @@ -189,7 +189,9 @@ module.exports = (createCommon, options) => { return ipfs.cat(fixtures.smallFile.cid + '/does-not-exist') .catch((err) => { expect(err).to.exist() - expect(err.message).to.include('file does not exist') + expect(err.message).to.be.oneOf([ + 'file does not exist', + 'no link named "does-not-exist" under Qma4hjFTnCasJ8PVp3mZbZK5g2vGDT4LByLJ7m8ciyRFZP']) }) }) From aa19f95ac41d775dc7cd575ce29a88edd89a8075 Mon Sep 17 00:00:00 2001 From: Alan Shaw Date: Mon, 20 May 2019 12:27:26 +0100 Subject: [PATCH 06/10] fix: fixes for object.put License: MIT Signed-off-by: Alan Shaw --- src/object/put.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/object/put.js b/src/object/put.js index 6a04e917d..d550a0d10 100644 --- a/src/object/put.js +++ b/src/object/put.js @@ -119,10 +119,10 @@ module.exports = (createCommon, options) => { (cb) => { ipfs.object.put(serialized, { enc: 'protobuf' }, (err, cid) => { expect(err).to.not.exist() - ipfs.object.get(cid, (err, node) => { + ipfs.object.get(cid, (err, node2) => { expect(err).to.not.exist() - expect(node.data).to.deep.equal(node.Data) - expect(node.links).to.deep.equal(node.Links) + expect(node2.Data).to.deep.equal(node.Data) + expect(node2.Links).to.deep.equal(node.Links) cb() }) }) @@ -153,8 +153,8 @@ module.exports = (createCommon, options) => { ipfs.object.get(cid, (err, node) => { expect(err).to.not.exist() - expect(dNode.data).to.deep.equal(node.Data) - expect(dNode.links).to.deep.equal(node.Links) + expect(dNode.Data).to.deep.equal(node.Data) + expect(dNode.Links).to.deep.equal(node.Links) done() }) }) From e4309c8d290784856f3b06709de919c22aa56e8c Mon Sep 17 00:00:00 2001 From: Alan Shaw Date: Mon, 20 May 2019 13:25:12 +0100 Subject: [PATCH 07/10] chore: update is-ipfs dep License: MIT Signed-off-by: Alan Shaw --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 79e39d791..0451b1986 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "ipfs-utils": "~0.0.3", "ipld-dag-cbor": "~0.15.0", "ipld-dag-pb": "~0.17.2", - "is-ipfs": "~0.5.1", + "is-ipfs": "~0.6.1", "is-plain-object": "^3.0.0", "libp2p-crypto": "~0.16.0", "multiaddr": "^6.0.0", From 69642fd5d6b128ab7302683049a5e6844a07672d Mon Sep 17 00:00:00 2001 From: Alan Shaw Date: Mon, 20 May 2019 20:44:40 +0100 Subject: [PATCH 08/10] fix: convert refs CIDs to base58 License: MIT Signed-off-by: Alan Shaw --- src/files-regular/refs-tests.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/files-regular/refs-tests.js b/src/files-regular/refs-tests.js index a79ef24da..1c9728d99 100644 --- a/src/files-regular/refs-tests.js +++ b/src/files-regular/refs-tests.js @@ -111,10 +111,10 @@ module.exports = (createCommon, suiteName, ipfsRefs, options) => { 'QmdBcHbK7uDQav8YrHsfKju3EKn48knxjd96KRMFs3gtS9', 'QmeX96opBHZHLySMFoNiWS5msxjyX6rqtr3Rr1u7uxn7zJ', 'Qmf8MwTnY7VdcnF8WcoJ3GB24NmNd1HsGzuEWCtUYDP38x', - 'zdpuAkqPgGuEFBFLcixZyFezWw3bsGUWVS6W7c8YhV5sdAc6E', - 'zdpuArVVBgigTbs6FdyqFFWUSsXymdruTtCVoboc91L3WTXi1', - 'zdpuAsrruPqzPDYs9c1FGNR5Wuyx8on64no6z62SRPv3viHGL', - 'zdpuAxTXSfaHaZNed3JG2WvcYNgd64v27ztB2zknrz5noPhz5' + 'bafyreiagelcmhfn33zuslkdo7fkes3dzcr2nju6meh75zm6vqklfqiojam', + 'bafyreic2f6adq5tqnbrvwiqc3jkz2cf4tz3cz2rp6plpij2qaoufgsxwmi', + 'bafyreidoqtyvflv5v4c3gd3izxvpq4flke55ayurbrnhsxh7z5wwjc6v6e', + 'bafyreifs2ub2lnq6n2quqbi3zb5homs5iqlmm77b3am252cqzxiu7phwpy' ]) done() From bb289b1c2791c92e6980b9f56593548dd5d629fa Mon Sep 17 00:00:00 2001 From: Alan Shaw Date: Mon, 20 May 2019 21:43:57 +0100 Subject: [PATCH 09/10] chore: update dag-pb dep --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0451b1986..249f40223 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "ipfs-unixfs": "~0.1.16", "ipfs-utils": "~0.0.3", "ipld-dag-cbor": "~0.15.0", - "ipld-dag-pb": "~0.17.2", + "ipld-dag-pb": "~0.17.3", "is-ipfs": "~0.6.1", "is-plain-object": "^3.0.0", "libp2p-crypto": "~0.16.0", From a054866c374ee89890307818c0a30f0870f7bd98 Mon Sep 17 00:00:00 2001 From: Alan Shaw Date: Mon, 20 May 2019 23:07:04 +0100 Subject: [PATCH 10/10] fix: do not specify ordering License: MIT Signed-off-by: Alan Shaw --- src/dag/tree.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dag/tree.js b/src/dag/tree.js index 99d5cde0c..997f5c340 100644 --- a/src/dag/tree.js +++ b/src/dag/tree.js @@ -115,7 +115,7 @@ module.exports = (createCommon, options) => { it('should get tree with CID recursive (accross different formats)', (done) => { ipfs.dag.tree(cidCbor, { recursive: true }, (err, paths) => { expect(err).to.not.exist() - expect(paths).to.eql([ + expect(paths).to.have.members([ 'pb', 'someData', 'pb/Links', @@ -128,7 +128,7 @@ module.exports = (createCommon, options) => { it('should get tree with CID and path recursive', (done) => { ipfs.dag.tree(cidCbor, 'pb', { recursive: true }, (err, paths) => { expect(err).to.not.exist() - expect(paths).to.eql([ + expect(paths).to.have.members([ 'Links', 'Data' ])