We are getting ready to launch the 0.23 release of js-ipfs, which will be one of my all time favorites! This release comes timely after go-ipfs 0.4.7 as it marks the start of full interop, that is right, no more stream-muxing issues
.dagThe new DAG API (available through ipfs.dag) offers a new way to create and operate over any MerkleGraph, today it has support for the IPFS MerkleDAG (referenced as dag-cbor), the new dag-cbor (which lets you drop json into IPFS seamlessly) and a preview of Ethereum.
You can learn how to use it through:
If you are new to the Merkle Forest, make sure to watch @jbenet's talk "Enter the Merkle Forest"
This took us more time than what we had initially expected, however, now it is a thing of the past, you can dial to a go-ipfs node and exchange files without going through complicated set ups, it just worksβ’
If you would like to know more about the issue we faced, you can find more info here: "Stream Muxing issues between go-ipfs and js-ipfs are a thing of the past"
Note: Interop is only fully available with go-ipfs 0.4.7 and onwards, if you haven't updated yet, please do so by visiting http://dist.ipfs.io/.
Same way that go-ipfs does, now your jsipfs daemon will bootstrap itself with the bootstraper nodes. This was easy once we had the Stream Muxing figured out.
> jsipfs swarm peers
/ip4/104.131.131.82/tcp/4001/ipfs/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ
/ip4/104.236.176.52/tcp/4001/ipfs/QmSoLnSGccFuZQJzRadHn95W2CrSFmZuTdDWP8HXaHca9z
/ip4/104.236.179.241/tcp/4001/ipfs/QmSoLPppuBtQSGwKDZT2M73ULpjvfd3aZ6ha4oFGL1KrGM
/ip4/162.243.248.213/tcp/4001/ipfs/QmSoLueR4xBeUbY9WZ9xGUUxunbKWcrNFTDAadQJmocnWm
/ip4/128.199.219.111/tcp/4001/ipfs/QmSoLSafTMBsPKadTEgaXctDQVcqN88CNLHXMkTNwMKPnu
/ip4/104.236.76.40/tcp/4001/ipfs/QmSoLV4Bbm51jM9C4gDYZQ9Cy3U6aXMJDAbzgu2fzaDs64
/ip4/178.62.158.247/tcp/4001/ipfs/QmSoLer265NRgSp2LA3dPaeykiS1J6DifTC88f5uVQKNAd
/ip4/178.62.61.185/tcp/4001/ipfs/QmSoLMeWqB7YGVLJN3pNLQpmmEk35v6wYtsMGLzSr5QBU3
/ip4/104.236.151.122/tcp/4001/ipfs/QmSoLju6m7xTh3DuokvT3886QRYqxAzb1kShaanJgW36yx
We've heard you, starting an ipfs instance was cumbersome 3 step process, but not anymore!
Now, all you need to do to start an instance is:
const IPFS = require('ipfs')
const node = new IPFS()
node.on('start', () => {
// Your node is now ready to use \o/
})
That's it! See more Usage examples in the README
We've migrated away from pull-blob-store/blob-store to datastore, the storage interface that is used in go-ipfs. This was a requirement towards implementing the DHT on js-ipfs.
We've build a new Tutorial in how to use js-ipfs that explain how to interact with other nodes, from connecting, discovering and exchanging files. The tutorial is the most bare bones possible (i.e no frameworks) so that it focus on IPFS.
Find this tutorial at our examples folder
Thanks to @harshjv, now you can add files wrapped in a directory just like go-ipfs. Example:
> jsipfs add <filename> --wrap-with-directory
> jsipfs add <filename -w # alias
Here is a quick list of things that we will be heads down after this release
@haadcode I already know that orbitdb, orbit-core and ipfs-log tests will fail because the "Improving Init endeavor" has happened, see the updated one here: https://github.com/ipfs/js-ipfs#ipfs-core-use-ipfs-as-a-module. Could you timely update orbit to check everything is working fine? Thank you :)
@lgierth, once you have deployed bootstrapers with 0.4.7, could you list their multiaddrs here. Thank you.
__BLOCKER__: https://github.com/ipfs/js-ipfs/pull/797#issuecomment-287722223 we need to fix the new init process before we can release it
tldr: I won't be able to update Orbit and its modules to use the new init quickly.
I don't think I can change Orbit just yet to use the new init. As Orbit uses both, js-ipfs and js-ipfs-api, it expects to have the same API regardless of the module. I might be able to hack it so that ipfs-daemon uses two different APIs under the hood, but I'd rather avoid that. Furthermore, since the constructor options object is slightly different in ipfs-daemon (which is what Orbit uses) than how it is for js-ipfs, I will have to update all modules to use the different keys. I'll take a look what I can do in ipfs-daemon and perhaps there's a quick way to conform to the new init, but I won't be able to do that until mid/end of the week.
@diasdavid if you need to move fast with this, go ahead and leave Orbit tests out of the release. We know they're broken (as you said) and I'll make sure on Orbit side that once it uses [email protected], it all works.
As Orbit uses both, js-ipfs and js-ipfs-api, it expects to have the same API regardless of the module
In terms of API, it remains exactly the same, the only thing that is different is the 'init->load->goOnline' step, which was exclusive to js-ipfs.
UPDATE: I've checked your code and what you have to change is only this function https://github.com/haadcode/ipfs-daemon/blob/master/src/ipfs-node-daemon.js#L38-L95 to:
const node = new IPFS({
repo: <repopath>,
start: false
config: { // overload the default config
Addresses: {
Swarm: [
'/libp2p-webrtc-star/dns4/star-signal.cloud.ipfs.team/wss'
]
}
}
})
node.on('init', () => {
// node has init'ed
})
And then on your https://github.com/haadcode/ipfs-daemon/blob/master/src/ipfs-node-daemon.js#L97-L119
node.start(callback)
answer to @dignifiedquire's 'blocker' - https://github.com/ipfs/js-ipfs/compare/fix/race?expand=1
In terms of API, it remains exactly the same, the only thing that is different is the 'init->load->goOnline' step, which was exclusive to js-ipfs.
Understood. What I meant was that ipfs-daemon has been a way for Orbit to have one (same) API for both ipfs modules and I'll need to re-write the node.js/browser part to use the new init API. My original plan was that once both modules (js-ipfs and js-ipfs-api/js-ipfsd-ctl) support the same user facing API, I'd be able to just switch the modules with (no or) minimal work and eventually make ipfs-daemon obsolete and disappear completely.
Any thoughts on putting this into ipfsd-ctl as well? How do you see the transition happen? I'm assuming here that we agree they both should have the same API :)
I wonder, do we know how many other isomorphic apps are out there that use both modules?
Any thoughts on putting this into ipfsd-ctl as well? How do you see the transition happen? I'm assuming here that we agree they both should have the same API :)
See:
tl;dr; Yeah, I want that too :)
Interop tests are passing https://github.com/ipfs/js-ipfs/commit/ae4bb9d9de089f5ea672f10de471174c59cc152c
And so are unit and sharding
Bootstrapers are on by default now too \o/
@haadcode I wanted to PR an update to ipfs-daemon, but I got lost. What is the branch you use today? Master seems out of date for a while and it is not the version that is published on npm.
As per your suggestion, going to drop orbit tests for this release.
Updated the first post to include all the highlights and a Future section :)
All right, all remaining tasks are done π
Fellow InterPlanetary Citizens, prepare for the launch, we will make this release in 24~48 Hours, unless there is a major issue found. Now is the time to test it and provide as much feedback as possible. Thank you, godspeed!
\o/
Ok, last bits to get in for this release:
To enable it, simply:
const node = new IPFS({
EXPERIMENTAL: {
sharding: true // enable dir sharding
}
})
If you are not familiar with sharding, you can read more about it here: https://github.com/ipfs/notes/issues/76. It essentially enables you to add directories with many entries without causing a single node in the graph to become really large due to having lots of links and clogging the bitswap wire protocol.
Big thank you to @pgte for reviewing the Sharding implementation in go-ipfs and implementing this in JavaScript as well π

+ [email protected]
[12:02:33] Published to npm.
looks like this isnt on github: https://github.com/ipfs/js-ipfs/releases~~ nvm it is.
was hidden. is not latest release

Seems aegir stopped doing this automatically for us. Will investigate. Thanks for the catch!
@diasdavid it used to work for me, but maybe you were missing the right gh token?
@dignifiedquire I just refreshed it, let's see
Most helpful comment