From 1c73c208eac8f5d4c016956b56bdf3f3a20236f8 Mon Sep 17 00:00:00 2001 From: David Dias Date: Wed, 11 May 2016 13:16:46 +0100 Subject: [PATCH 1/5] stub all the methods, add object.new --- README.md | 171 +++++++++++++++++++++++++++++++- img/badge.sketch | Bin 0 -> 49152 bytes package.json | 25 +++++ src/index.js | 2 + src/object.js | 253 +++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 449 insertions(+), 2 deletions(-) create mode 100755 img/badge.sketch create mode 100644 package.json create mode 100644 src/index.js create mode 100644 src/object.js diff --git a/README.md b/README.md index 3f2f16e8c..ccd55b422 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,169 @@ -# interface-ipfs-core -A test suite and interface you can use to implement a IPFS core interface. +interface-ipfs-core +=================== + +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) +[![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) + +> A test suite and interface you can use to implement the IPFS Core API. + +The primary goal of this module is to define and ensure that both IPFS core implementations and their respective HTTP client libraries offer the same interface, so that developers can quickly change between a local and a remote node without having to change their applications. In addition to the definition of the expected interface, this module offers a suite of tests that can be run in order to check if the interface is used as described. + +The API is presented with both Node.js and Go primitives, however, there is not actual limitations for it to be extended for any other language, pushing forward the cross compatibility and interop through diferent stacks. + +# Modules that implement the interface + +- [JavaScript IPFS implementation](https://github.com/ipfs/js-ipfs) +- [JavaScript ipfs-api](https://github.com/ipfs/js-ipfs-api) +- Soon, go-ipfs, go-ipfs-api, java-ipfs-api, python-ipfs-api and others will implement it as well. + +Send a PR to add a new one if you happen to find or write one. + +# Badge + +Include this badge in your readme if you make a new module that uses interface-stream-muxer API. + +![](/img/badge.png) + +# How to use the battery tests + +## Node.js + +Install interface-ipfs-core as one of the dependencies of your project and as a test file, using `mocha` (for Node.js) or a test runner with compatible API, do: + +``` +var test = require('interface-ipfs-core') + +var common = { + setup: function (cb) { + cb(null, yourIPFSInstance) + }, + teardown: function (cb) { + cb() + } +} + +// use all of the test suits +test.all(common) +``` + +## Go + +> WIP + +# API + +A valid (read: that follows this interface) IPFS core implementation, must expose the following API. + +## Object + +### `object.new` + +> Create a new MerkleDAG node, using a specific layout. Caveat: So far, only UnixFS object layouts are supported. + +##### `Go` + +**WIP** + +##### `JavaScript` - ipfs.object.new(layout, callback) + +`layout` is the MerkleDAG node type, it can be: `null`, `unixfs-dir`, `unixfs-raw`, `unixfs-file`, `unixfs-metadata`, `unixfs-symlink`. + +`callback` that must follow `function (err, node) {}` signature, where `err` is an error if the operation was not successful and `node` is a MerkleDAG node of the type [DAGNode](https://github.com/vijayee/js-ipfs-merkle-dag/blob/master/src/dag-node.js) + +If no `callback` is passed, a promise is returned. + +### `object.put` + +> DESCRIPTION + +##### `Go` + +**WIP** + +##### `JavaScript` - ipfs.object.put + +### `object.get` + +> DESCRIPTION + +##### `Go` + +**WIP** + +##### `JavaScript` - ipfs.object.get + +### `object.data` + +> DESCRIPTION + +##### `Go` + +**WIP** + +##### `JavaScript` - ipfs.object.data + +### `object.links` + +> DESCRIPTION + +##### `Go` + +**WIP** + +##### `JavaScript` - ipfs.object.links + +### `object.stat` + +> DESCRIPTION + +##### `Go` + +**WIP** + +##### `JavaScript` - ipfs.object.stat + +### `object.patch` + +> `object.patch` exposes the available patch calls. + +#### `object.patch.addLink` + +> DESCRIPTION + +##### `Go` + +**WIP** + +##### `JavaScript` - ipfs.object.patch.addLink + + +#### `object.patch.rmLink` + +> DESCRIPTION + +##### `Go` + +**WIP** + +##### `JavaScript` - ipfs.object.patch.rmLink + +#### `object.patch.appendData` + +> DESCRIPTION + +##### `Go` + +**WIP** + +##### `JavaScript` - ipfs.object.patch.appendData + +#### `object.patch.setData` + +> DESCRIPTION + +##### `Go` + +**WIP** + +##### `JavaScript` - ipfs.object.patch.setData + diff --git a/img/badge.sketch b/img/badge.sketch new file mode 100755 index 0000000000000000000000000000000000000000..990ad1c5bf41d62134cb37a14df7086e62098dac GIT binary patch literal 49152 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 n6MYglCDaK+qC62z)F;Ly#wR9", + "license": "MIT", + "bugs": { + "url": "https://github.com/ipfs/interface-ipfs-core/issues" + }, + "homepage": "https://github.com/ipfs/interface-ipfs-core#readme", + "dependencies": { + "chai": "^3.5.0" + } +} diff --git a/src/index.js b/src/index.js new file mode 100644 index 000000000..fc20a1303 --- /dev/null +++ b/src/index.js @@ -0,0 +1,2 @@ +exports.all = () => {} +exports.object = require('./object') diff --git a/src/object.js b/src/object.js new file mode 100644 index 000000000..9b9d7af7f --- /dev/null +++ b/src/object.js @@ -0,0 +1,253 @@ +/* eslint-env mocha */ + +'use strict' + +const expect = require('chai').expect + +module.exports = (common) => { + let ipfs + + before((done) => { + common.setup((err, _ipfs) => { + expect(err).to.not.exist + ipfs = _ipfs + done() + }) + }) + + after((done) => { + common.teardown(done) + }) + + describe('.object', () => { + const testObject = Buffer(JSON.stringify({Data: 'testdata', Links: []})) + const testObjectHash = 'QmPTkMuuL6PD8L2SwTwbcs1NPg14U8mRzerB1ZrrBrkSDD' + const testPatchObject = Buffer(JSON.stringify({Data: 'new test data'})) + const testPatchObjectHash = 'QmWJDtdQWQSajQPx1UVAGWKaSGrHVWdjnrNhbooHP7LuF2' + + it('object.put', (done) => { + ipfs.object.put(testObject, 'json', (err, res) => { + expect(err).to.not.exist + expect(res).to.have.a.property('Hash', testObjectHash) + expect(res.Links).to.be.empty + done() + }) + }) + + it('object.get', (done) => { + ipfs.object.get(testObjectHash, (err, res) => { + expect(err).to.not.exist + expect(res).to.have.a.property('Data', 'testdata') + expect(res.Links).to.be.empty + done() + }) + }) + + it('object.data', (done) => { + ipfs.object.data(testObjectHash, (err, res) => { + expect(err).to.not.exist + + let buf = '' + res + .on('error', (err) => { + expect(err).to.not.exist + }) + .on('data', (data) => { + buf += data + }) + .on('end', () => { + expect(buf).to.equal('testdata') + done() + }) + }) + }) + + it('object.stat', (done) => { + ipfs.object.stat(testObjectHash, (err, res) => { + expect(err).to.not.exist + expect(res).to.be.eql({ + Hash: 'QmPTkMuuL6PD8L2SwTwbcs1NPg14U8mRzerB1ZrrBrkSDD', + NumLinks: 0, + BlockSize: 10, + LinksSize: 2, + DataSize: 8, + CumulativeSize: 10 + }) + done() + }) + }) + + it('object.links', (done) => { + ipfs.object.links(testObjectHash, (err, res) => { + expect(err).to.not.exist + + expect(res).to.be.eql({ + Hash: 'QmPTkMuuL6PD8L2SwTwbcs1NPg14U8mRzerB1ZrrBrkSDD' + }) + done() + }) + }) + + describe('object.patch', () => { + before((done) => { + ipfs.object.put(testPatchObject, 'json', (err, res) => { + expect(err).to.not.exist + done() + }) + }) + + it('.addLink', (done) => { + ipfs.object.patch + .addLink(testObjectHash, 'next', testPatchObjectHash, (err, res) => { + expect(err).to.not.exist + expect(res).to.be.eql({ + Hash: 'QmZFdJ3CQsY4kkyQtjoUo8oAzsEs5BNguxBhp8sjQMpgkd' + }) + ipfs.object.get(res.Hash, (err, res) => { + expect(err).to.not.exist + expect(res).to.be.eql({ + Data: 'testdata', + Links: [{ + Name: 'next', + Hash: 'QmWJDtdQWQSajQPx1UVAGWKaSGrHVWdjnrNhbooHP7LuF2', + Size: 15 + }] + }) + done() + }) + }) + }) + + it('.rmLink', (done) => { + ipfs.object.patch + .rmLink('QmZFdJ3CQsY4kkyQtjoUo8oAzsEs5BNguxBhp8sjQMpgkd', 'next', (err, res) => { + expect(err).to.not.exist + expect(res).to.be.eql({ + Hash: testObjectHash + }) + ipfs.object.get(res.Hash, (err, res) => { + expect(err).to.not.exist + expect(res).to.be.eql({ + Data: 'testdata', + Links: [] + }) + done() + }) + }) + }) + + it('.appendData', (done) => { + ipfs.object.patch + .appendData(testObjectHash, new Buffer(' hello'), (err, res) => { + expect(err).to.not.exist + expect(res).to.be.eql({ + Hash: 'Qmcjhr2QztQxCAoEf8tJPTGTVkTsUrTQ36JurH14DNYNsc' + }) + ipfs.object.get(res.Hash, (err, res) => { + expect(err).to.not.exist + expect(res).to.be.eql({ + Data: 'testdata hello', + Links: [] + }) + done() + }) + }) + }) + it('.setData', (done) => { + ipfs.object.patch + .setData(testObjectHash, new Buffer('hello world'), (err, res) => { + expect(err).to.not.exist + expect(res).to.be.eql({ + Hash: 'QmU1Sq1B7RPQD2XcQNLB58qJUyJffVJqihcxmmN1STPMxf' + }) + ipfs.object.get(res.Hash, (err, res) => { + expect(err).to.not.exist + expect(res).to.be.eql({ + Data: 'hello world', + Links: [] + }) + done() + }) + }) + }) + }) + + it('object.new', (done) => { + ipfs.object.new('unixfs-dir', (err, res) => { + expect(err).to.not.exist + expect(res).to.deep.equal({ + Hash: 'QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn' + }) + done() + }) + }) + + describe('promise', () => { + it('object.put', () => { + return ipfs.object.put(testObject, 'json') + .then((res) => { + expect(res).to.have.a.property('Hash', testObjectHash) + expect(res.Links).to.be.empty + }) + }) + + it('object.get', () => { + return ipfs.object.get(testObjectHash) + .then((res) => { + expect(res).to.have.a.property('Data', 'testdata') + expect(res.Links).to.be.empty + }) + }) + + it('object.data', (done) => { + return ipfs.object.data(testObjectHash) + .then((res) => { + let buf = '' + res + .on('error', (err) => { + throw err + }) + .on('data', (data) => { + buf += data + }) + .on('end', () => { + expect(buf).to.equal('testdata') + done() + }) + }) + }) + + it('object.stat', () => { + return ipfs.object.stat(testObjectHash) + .then((res) => { + expect(res).to.be.eql({ + Hash: 'QmPTkMuuL6PD8L2SwTwbcs1NPg14U8mRzerB1ZrrBrkSDD', + NumLinks: 0, + BlockSize: 10, + LinksSize: 2, + DataSize: 8, + CumulativeSize: 10 + }) + }) + }) + + it('object.links', () => { + return ipfs.object.links(testObjectHash) + .then((res) => { + expect(res).to.be.eql({ + Hash: 'QmPTkMuuL6PD8L2SwTwbcs1NPg14U8mRzerB1ZrrBrkSDD' + }) + }) + }) + + it('object.new', () => { + return ipfs.object.new('unixfs-dir') + .then((res) => { + expect(res).to.deep.equal({ + Hash: 'QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn' + }) + }) + }) + }) + }) +} From 7f08cafd6f456c2fedede238ec6e431d7391c63b Mon Sep 17 00:00:00 2001 From: David Dias Date: Wed, 11 May 2016 17:01:33 +0100 Subject: [PATCH 2/5] add remaining interfaces and descriptions --- README.md | 201 ++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 181 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index ccd55b422..f8da08595 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,6 @@ test.all(common) ## Go > WIP - # API A valid (read: that follows this interface) IPFS core implementation, must expose the following API. @@ -64,23 +63,45 @@ A valid (read: that follows this interface) IPFS core implementation, must expos **WIP** -##### `JavaScript` - ipfs.object.new(layout, callback) +##### `JavaScript` - ipfs.object.new(layout, [callback]) `layout` is the MerkleDAG node type, it can be: `null`, `unixfs-dir`, `unixfs-raw`, `unixfs-file`, `unixfs-metadata`, `unixfs-symlink`. -`callback` that must follow `function (err, node) {}` signature, where `err` is an error if the operation was not successful and `node` is a MerkleDAG node of the type [DAGNode](https://github.com/vijayee/js-ipfs-merkle-dag/blob/master/src/dag-node.js) +`callback` must follow `function (err, node) {}` signature, where `err` is an error if the operation was not successful and `node` is a MerkleDAG node of the type [DAGNode](https://github.com/vijayee/js-ipfs-merkle-dag/blob/master/src/dag-node.js) If no `callback` is passed, a promise is returned. + + + + ### `object.put` -> DESCRIPTION +> Store an MerkleDAG node. ##### `Go` **WIP** -##### `JavaScript` - ipfs.object.put +##### `JavaScript` - ipfs.object.put(obj, [options, callback]) + +`obj` is the MerkleDAG Node to be stored. Can of type: + +- Object, with format `{ Data: , Links: [] }` +- Buffer, requiring that the encoding is specified on the encoding +- [DAGNode](https://github.com/vijayee/js-ipfs-merkle-dag/blob/master/src/dag-node.js) + +`options` is a optional argument of type object, that can contain the following properties: + +- `enc`, the encoding of the Buffer (json, yml, etc), if passed a Buffer. + +`callback` must follow `function (err, node) {}` signature, where `err` is an error if the operation was not successful and `node` is a MerkleDAG node of the type [DAGNode](https://github.com/vijayee/js-ipfs-merkle-dag/blob/master/src/dag-node.js) + +If no `callback` is passed, a promise is returned. + + + + ### `object.get` @@ -90,37 +111,107 @@ If no `callback` is passed, a promise is returned. **WIP** -##### `JavaScript` - ipfs.object.get +##### `JavaScript` - ipfs.object.get(multihash, [options, callback]) + +`multihash` is a [multihash]() which can be passed as: + +- Buffer, the raw Buffer of the multihash (or of and encoded version) +- String, the toString version of the multihash (or of an encoded version) + +`options` is a optional argument of type object, that can contain the following properties: + +- `enc`, the encoding of multihash (base58, base64, etc), if any. + +`callback` must follow `function (err, node) {}` signature, where `err` is an error if the operation was not successful and `node` is a MerkleDAG node of the type [DAGNode](https://github.com/vijayee/js-ipfs-merkle-dag/blob/master/src/dag-node.js) + +If no `callback` is passed, a promise is returned. ### `object.data` -> DESCRIPTION +> Returns the Data field of an object ##### `Go` **WIP** -##### `JavaScript` - ipfs.object.data +##### `JavaScript` - ipfs.object.data(multihash, [options, callback]) +`multihash` is a [multihash]() which can be passed as: + +- Buffer, the raw Buffer of the multihash (or of and encoded version) +- String, the toString version of the multihash (or of an encoded version) + +`options` is a optional argument of type object, that can contain the following properties: + +- `enc`, the encoding of multihash (base58, base64, etc), if any. + +`callback` must follow `function (err, data) {}` signature, where `err` is an error if the operation was not successful and `data` is a Buffer with the data that the MerkleDAG node contained. + +If no `callback` is passed, a promise is returned. ### `object.links` -> DESCRIPTION +> Returns the Links field of an object ##### `Go` **WIP** -##### `JavaScript` - ipfs.object.links +##### `JavaScript` - ipfs.object.links(multihash, [options, callback]) + +`multihash` is a [multihash]() which can be passed as: + +- Buffer, the raw Buffer of the multihash (or of and encoded version) +- String, the toString version of the multihash (or of an encoded version) + +`options` is a optional argument of type object, that can contain the following properties: + +- `enc`, the encoding of multihash (base58, base64, etc), if any. + +`callback` must follow `function (err, links) {}` signature, where `err` is an error if the operation was not successful and `links` is an Array of [DAGLink](https://github.com/vijayee/js-ipfs-merkle-dag/blob/master/src/dag-node.js#L199-L203) objects. + +If no `callback` is passed, a promise is returned. + + + + ### `object.stat` -> DESCRIPTION +> Returns stats about an Object ##### `Go` **WIP** -##### `JavaScript` - ipfs.object.stat +##### `JavaScript` - ipfs.object.stat(multihash, [options, callback]) + +`multihash` is a [multihash]() which can be passed as: + +- Buffer, the raw Buffer of the multihash (or of and encoded version) +- String, the toString version of the multihash (or of an encoded version) + +`options` is a optional argument of type object, that can contain the following properties: + +- `enc`, the encoding of multihash (base58, base64, etc), if any. + +`callback` must follow `function (err, stats) {}` signature, where `err` is an error if the operation was not successful and `stats` is an Object with following format: + +```JavaScript +{ + Hash: 'QmPTkMuuL6PD8L2SwTwbcs1NPg14U8mRzerB1ZrrBrkSDD', + NumLinks: 0, + BlockSize: 10, + LinksSize: 2, + DataSize: 8, + CumulativeSize: 10 +} +``` + +If no `callback` is passed, a promise is returned. + + + + ### `object.patch` @@ -128,42 +219,112 @@ If no `callback` is passed, a promise is returned. #### `object.patch.addLink` -> DESCRIPTION +> Add a Link to an existing MerkleDAG Object ##### `Go` **WIP** -##### `JavaScript` - ipfs.object.patch.addLink +##### `JavaScript` - ipfs.object.patch.addLink(multihash, DAGLink, [options, callback]) + +`multihash` is a [multihash]() which can be passed as: + +- Buffer, the raw Buffer of the multihash (or of and encoded version) +- String, the toString version of the multihash (or of an encoded version) + +`DAGLink` is the new link to be added on the node that is identified by the `multihash` + +`options` is a optional argument of type object, that can contain the following properties: + +- `enc`, the encoding of multihash (base58, base64, etc), if any. + +`callback` must follow `function (err, node) {}` signature, where `err` is an error if the operation was not successful and `node` is a MerkleDAG node of the type [DAGNode](https://github.com/vijayee/js-ipfs-merkle-dag/blob/master/src/dag-node.js) that resulted by the operation of adding a Link. + +If no `callback` is passed, a promise is returned. + + + #### `object.patch.rmLink` -> DESCRIPTION +> Remove a Link from an existing MerkleDAG Object ##### `Go` **WIP** -##### `JavaScript` - ipfs.object.patch.rmLink +##### `JavaScript` - ipfs.object.patch.rmLink(multihash, DAGLink, [options, callback]) + +`multihash` is a [multihash]() which can be passed as: + +- Buffer, the raw Buffer of the multihash (or of and encoded version) +- String, the toString version of the multihash (or of an encoded version) + +`DAGLink` is the link to be removed on the node that is identified by the `multihash` + +`options` is a optional argument of type object, that can contain the following properties: + +- `enc`, the encoding of multihash (base58, base64, etc), if any. + +`callback` must follow `function (err, node) {}` signature, where `err` is an error if the operation was not successful and `node` is a MerkleDAG node of the type [DAGNode](https://github.com/vijayee/js-ipfs-merkle-dag/blob/master/src/dag-node.js) that resulted by the operation of adding a Link. + +If no `callback` is passed, a promise is returned. + + + + #### `object.patch.appendData` -> DESCRIPTION +> Append Data to the Data field of an existing node. ##### `Go` **WIP** -##### `JavaScript` - ipfs.object.patch.appendData +##### `JavaScript` - ipfs.object.patch.appendData(multihash, data, [options, callback]) + +`multihash` is a [multihash]() which can be passed as: + +- Buffer, the raw Buffer of the multihash (or of and encoded version) +- String, the toString version of the multihash (or of an encoded version) + +`data` is a Buffer containing Data to be appended to the existing node. + +`options` is a optional argument of type object, that can contain the following properties: + +- `enc`, the encoding of multihash (base58, base64, etc), if any. + +`callback` must follow `function (err, node) {}` signature, where `err` is an error if the operation was not successful and `node` is a MerkleDAG node of the type [DAGNode](https://github.com/vijayee/js-ipfs-merkle-dag/blob/master/src/dag-node.js) that resulted by the operation of adding a Link. + +If no `callback` is passed, a promise is returned. + + + + #### `object.patch.setData` -> DESCRIPTION +> Reset the Data field of a MerkleDAG Node to new Data ##### `Go` **WIP** -##### `JavaScript` - ipfs.object.patch.setData +##### `JavaScript` - ipfs.object.patch.setData(multihash, data, [options, callback]) + +`multihash` is a [multihash]() which can be passed as: +- Buffer, the raw Buffer of the multihash (or of and encoded version) +- String, the toString version of the multihash (or of an encoded version) + +`data` is a Buffer containing Data to replace the existing Data on the node. + +`options` is a optional argument of type object, that can contain the following properties: + +- `enc`, the encoding of multihash (base58, base64, etc), if any. + +`callback` must follow `function (err, node) {}` signature, where `err` is an error if the operation was not successful and `node` is a MerkleDAG node of the type [DAGNode](https://github.com/vijayee/js-ipfs-merkle-dag/blob/master/src/dag-node.js) that resulted by the operation of adding a Link. + +If no `callback` is passed, a promise is returned. From 4a1c34ed0b745f29f8a6c59e58e9c19ca0359cab Mon Sep 17 00:00:00 2001 From: David Dias Date: Wed, 11 May 2016 17:12:02 +0100 Subject: [PATCH 3/5] style --- README.md | 41 +++++++++++------------------------------ 1 file changed, 11 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index f8da08595..e8f61004a 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,7 @@ test.all(common) ## Go > WIP + # API A valid (read: that follows this interface) IPFS core implementation, must expose the following API. @@ -59,9 +60,7 @@ A valid (read: that follows this interface) IPFS core implementation, must expos > Create a new MerkleDAG node, using a specific layout. Caveat: So far, only UnixFS object layouts are supported. -##### `Go` - -**WIP** +##### `Go` **WIP** ##### `JavaScript` - ipfs.object.new(layout, [callback]) @@ -79,9 +78,7 @@ If no `callback` is passed, a promise is returned. > Store an MerkleDAG node. -##### `Go` - -**WIP** +##### `Go` **WIP** ##### `JavaScript` - ipfs.object.put(obj, [options, callback]) @@ -107,9 +104,7 @@ If no `callback` is passed, a promise is returned. > DESCRIPTION -##### `Go` - -**WIP** +##### `Go` **WIP** ##### `JavaScript` - ipfs.object.get(multihash, [options, callback]) @@ -130,9 +125,7 @@ If no `callback` is passed, a promise is returned. > Returns the Data field of an object -##### `Go` - -**WIP** +##### `Go` **WIP** ##### `JavaScript` - ipfs.object.data(multihash, [options, callback]) `multihash` is a [multihash]() which can be passed as: @@ -152,9 +145,7 @@ If no `callback` is passed, a promise is returned. > Returns the Links field of an object -##### `Go` - -**WIP** +##### `Go` **WIP** ##### `JavaScript` - ipfs.object.links(multihash, [options, callback]) @@ -179,9 +170,7 @@ If no `callback` is passed, a promise is returned. > Returns stats about an Object -##### `Go` - -**WIP** +##### `Go` **WIP** ##### `JavaScript` - ipfs.object.stat(multihash, [options, callback]) @@ -221,9 +210,7 @@ If no `callback` is passed, a promise is returned. > Add a Link to an existing MerkleDAG Object -##### `Go` - -**WIP** +##### `Go` **WIP** ##### `JavaScript` - ipfs.object.patch.addLink(multihash, DAGLink, [options, callback]) @@ -250,9 +237,7 @@ If no `callback` is passed, a promise is returned. > Remove a Link from an existing MerkleDAG Object -##### `Go` - -**WIP** +##### `Go` **WIP** ##### `JavaScript` - ipfs.object.patch.rmLink(multihash, DAGLink, [options, callback]) @@ -279,9 +264,7 @@ If no `callback` is passed, a promise is returned. > Append Data to the Data field of an existing node. -##### `Go` - -**WIP** +##### `Go` **WIP** ##### `JavaScript` - ipfs.object.patch.appendData(multihash, data, [options, callback]) @@ -308,9 +291,7 @@ If no `callback` is passed, a promise is returned. > Reset the Data field of a MerkleDAG Node to new Data -##### `Go` - -**WIP** +##### `Go` **WIP** ##### `JavaScript` - ipfs.object.patch.setData(multihash, data, [options, callback]) From d76aeb8f45fce2bffa0ce359b2764e583fea2405 Mon Sep 17 00:00:00 2001 From: David Dias Date: Wed, 11 May 2016 18:47:36 +0100 Subject: [PATCH 4/5] cr --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e8f61004a..a3c28fa94 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,7 @@ A valid (read: that follows this interface) IPFS core implementation, must expos ##### `JavaScript` - ipfs.object.new(layout, [callback]) -`layout` is the MerkleDAG node type, it can be: `null`, `unixfs-dir`, `unixfs-raw`, `unixfs-file`, `unixfs-metadata`, `unixfs-symlink`. +`layout` is the MerkleDAG node type, it can be: `null`, `'unixfs-dir'`, `'unixfs-raw'`, `'unixfs-file'`, `'unixfs-metadata'`, `'unixfs-symlink'`. `callback` must follow `function (err, node) {}` signature, where `err` is an error if the operation was not successful and `node` is a MerkleDAG node of the type [DAGNode](https://github.com/vijayee/js-ipfs-merkle-dag/blob/master/src/dag-node.js) @@ -102,7 +102,7 @@ If no `callback` is passed, a promise is returned. ### `object.get` -> DESCRIPTION +> Fetch a MerkleDAG node ##### `Go` **WIP** From 7caae396c12ecf62fcad03629990e51c7c856fbd Mon Sep 17 00:00:00 2001 From: David Dias Date: Thu, 12 May 2016 08:20:17 +0100 Subject: [PATCH 5/5] update according review --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a3c28fa94..178cde462 100644 --- a/README.md +++ b/README.md @@ -86,7 +86,7 @@ If no `callback` is passed, a promise is returned. - Object, with format `{ Data: , Links: [] }` - Buffer, requiring that the encoding is specified on the encoding -- [DAGNode](https://github.com/vijayee/js-ipfs-merkle-dag/blob/master/src/dag-node.js) +- [DAGNode](https://github.com/vijayee/js-ipfs-merkle-dag/blob/master/src/dag-node.js). If no encoding is specified, Buffer is treated as the Data field. `options` is a optional argument of type object, that can contain the following properties: