Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

⚡️ 0.27 RELEASE 🚀 The Async / Await refactor #487

Closed
jacobheun opened this issue Nov 29, 2019 · 6 comments
Closed

⚡️ 0.27 RELEASE 🚀 The Async / Await refactor #487

jacobheun opened this issue Nov 29, 2019 · 6 comments
Labels

Comments

@jacobheun
Copy link
Contributor

jacobheun commented Nov 29, 2019

The Async / Await Refactor and a whole lot more!

🔦 Highlights

📜 Improved docs

We've done an overhaul of our docs to make libp2p easier to use. Among other docs in the new doc folder, you can find a full list of exposed methods in the API.md, and a guide on how to configure libp2p in CONFIGURATION.md. We've also created a Getting Started guide for anyone starting out with libp2p.

⌚️ Async/Await instead of Callbacks

All callback APIs have been change to be async / await compliant. See the API.md readme for detailed usage. When migrating, you can leverage the migration guide to see samples on some of the common migrations you may need to make.

🚰 Streaming Iterables instead of Pull Streams

Now that readable streams are async iterable, we can leverage Streaming Iterables instead of Pull Streams to greatly simplify the internal stream logic of libp2p. Among other things, this makes debugging streams much easier. You can check out the it-awesome repo for a list of an increasing number of modules built for the streaming iterables ecosystem. This also includes modules to convert to and from pull streams if you need to refactor your applications over time. If you're having trouble migrating, please feel free to reach out on the discuss forums!

📞 Clearer Connections

We've created a whole new Connection Interface! Creating multiple streams off of a single connection is now much clearer, and every stream created is tracked in the Connection. This makes it much easier to keep track of every open stream, which greatly empowers resource management in js-libp2p.

// Was
libp2p.dialProtocol(remotePeerInfo, protocol, (error, stream) => { })

// Now
const connection = await libp2p.dial(remotePeerInfo)
const { stream, protocol } = connection.newStream(protocols)
const allStreams = connections.streams

⏹ Abortable Dials

We've reconstructed transports and connections from the ground up. This gives us the ability to pass an AbortSignal when dialing, so we can now properly terminate connections early. This also means we'll be able to add proper support for parallel dials to reduce connection times without running the risk of lingering dials.

const controller = new AbortController()
libp2p.dial(remotePeerInfo, { signal: controller.signal })
// after a short delay...
controller.abort()

🆔 The Identify Push Protocol

Identify Push is now available in js-libp2p. As a libp2p node changes its Multiaddrs (changes in networks) or protocols, it will broadcast those changes to all connected peers. Once support for AutoNAT and AutoRelay is added to js-libp2p, we will be able to broadcast those changes maximizing the effectiveness of those protocols.

🔍 Plaintext 2 for testing

We've upgraded from Plaintext 1 to 2. If you need to test things locally without encryption to see what's going on over the wire, Plaintext 2 makes this more viable. Public Keys are now exchanged, which is required by many protocols. This should NEVER be used in production, happy testing!

🙏 More polite connections

Currently when two nodes connect, they will actively ask each other what protocols they support. This ends up being multiple checks in parallel, rather than getting the information from a single Identify check. js-libp2p will now only use Identify. This greatly reduces network chatter. The peerStore, formerly peerBook to better match common libp2p terminology, will now emit change events for protocols. Applications that need to check for protocol support can now politely listen for updates, instead of actively checking every peer that connects.

libp2p.peerStore.on('change:protocols', ({ peerInfo, protocols }) => { ... })

📊Stats (now Metrics) can now be enabled/disabled

We're making stats disabled by default and they are now available at libp2p.metrics instead of libp2p.stats. You can enable metrics if you need them, but for performance reasons we have disabled them by default. Good news, if you need to run them they're more performant as we've moved away from event emitting in metrics. This greatly reduces the amount of processing that happens until you explicitly request something! You can read more about Metrics at METRICS.md.

🏗 API Changes

See the API.md readme for detailed usage on the new API. Significant breaking changes are detailed below.

  • Callbacks are no longer supported, async / await is now used for all asynchronous methods. See API.md for a full list of methods.
  • Pull streams have been replaced by Streaming Iterables
  • libp2p.peerBook is now libp2p.peerStore to match common libp2p terminology.
  • libp2p.stats is now libp2p.metrics.
  • libp2p.pubsub.ls is now libp2p.pubsub.getTopics.
  • libp2p.pubsub.peers is not libp2p.pubsub.getSubscribers.
  • libp2p.ping now simply returns the latency of the ping. See the migration guide for more details.

❤️ Huge thank you to everyone that made this release possible

In alphabetical order, here are the 60 humans that made 1241 contributions to this release:

🙌🏽 Want to contribute?

Would you like to contribute to the libp2p project and don't know how? Well, there are a few places you can get started:

⁉️ Do you have questions?

The best place to ask your questions about libp2p, how it works and what you can do with it is at discuss.libp2p.io. We are also available at the #libp2p channel on Freenode.

@jacobheun jacobheun pinned this issue Nov 29, 2019
@daviddias daviddias added the Epic label Dec 11, 2019
@jacobheun
Copy link
Contributor Author

🚢 The pre release, 0.27.0-pre.0, is out! You can install via the next tag:

npm install libp2p@next

We'll be working on testing, and finishing up a few more docs and a migration guide in preparation for an official RC.

If you start using the prerelease please let us know what your experience is like!

@jacobheun
Copy link
Contributor Author

When using the prerelease you will need to install the beta tag of modules, as these are the async await code bases. For example, adding when using libp2p-tcp, libp2p-mplex and libp2p-secio, you can install them with:

npm i libp2p@next libp2p-tcp@beta libp2p-mplex@beta libp2p-secio@beta

@jacobheun
Copy link
Contributor Author

We've published a new pre release, 0.27.0-pre.1. It includes some fixes and coalescing dial support. We're looking to get a Release Candidate out this week.

If you start testing the release early please let us know if you have any feedback!

@jacobheun
Copy link
Contributor Author

A new pre release has been published, 0.27.0-pre.2. As we've been working through some downstream integration testing we discovered a few bugs and added a few convenience methods and configurations. We are continuing testing this week as we push towards a stable RC. A full list of the changes will be included in the final change log.

@jacobheun
Copy link
Contributor Author

jacobheun commented Jan 24, 2020

The official Release Candidate is out! v0.27.0-rc.0. We'll be doing final testing against the RC to make sure everything is good and will follow with the official release of 0.27.0. 🚀

@jacobheun
Copy link
Contributor Author

The 0.27 release is out, https://github.com/libp2p/js-libp2p/releases/tag/v0.27.0! Blog post and social media announcements will be coming shortly.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants