npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@yz-social/kdht

v0.1.8

Published

Pure Kademlia base, for testing variations.

Readme

KDHT

A Kademlia Distributed Hash Table See paper and wikipedia

This repo allows us to experiment with a pure kdht, to see the effects of changes and and optimizations. For example, there is a class that implements connections to nodes running on the same computer, so that tests can be run without any networking at all (as long as the CPU isn't overwhelmed from running too many nodes). There is a repeatable test suite that can be used to confirm behavior as changes are made.

Classes

A Node is an actor in the DHT, and it has a key - a BigInt of Node.keySize bits:

  • A typical client will have one Node instance through which it interacts with one DHT.
  • A server or simulation might have many Node instances to each interact with the same DHT. A Node has a Contact object to represent itself to another Node. A Node maintains KBuckets, which each have a list of Contacts to other Nodes.

A Contact is the means through which a Node interacts with another Node instance:

  • When sending an RPC request, the Contact will "serialize" the sender Nodes's contact.
  • When receiving an RPC response, the sender "deserializes" a string (maybe using a cache) to produce the Contact instance to be noted in the receiver's KBuckets.
  • In classic UDP Kademlia, a Contact would serialize as {key, ip, port}.
  • In a simulation, a Contact could "serialize" as just itself.
  • In our system, I imagine that it will serialize as signature so that keys cannot be forged.

While a Node maintains several Contacts in its KBuckets, these are organized based on the distance from the Contact's key to the Node's key. However, each network-probing operation requires the ephermal creation of Contact information that is based on the distance to the target key being probed for. For this purpose, we wrap the Contacts in a Helper object that caches the distance to the target.

TODO

  • Get rid of sname. Unnecessary.
  • Use a uniform RPC dispatcher everywhere, isntead of bespoke inFlight promises to await, and the like.
  • In WebRTC, We wrap each signal in an array with a leading type: [['offer', offerObject], ...['icecandidate', iceCandidateObject]]. We don't need to do that, as the objects are all either of the form {type: 'offer', ..}, or {candidate: ...} (with no 'type' property).