We understand this work is not directly related to the network objectives, but we believe it is important to application developers: js-libp2p is the networking layer their browser and JavaScript apps depend on, and the foundation IPFS Helia, the standard JavaScript IPFS implementation, is built on.
How Helia depends on js-libp2p, from Helia's own manifest and docs:
> "The core of Helia will be very focused on use as a library: just js-libp2p, a datastore, and a blockstore that transparently uses js-bitswap to load any requested blocks not already in the blockstore from the network and/or to transfer them to network peers." ([Helia Manifesto](https://github.com/ipfs/helia/wiki/Manifesto))
The core `helia` package depends directly on `libp2p` and its modules:
```
IPFS Helia (npm: helia)
│
├─ libp2p the p2p node every Helia node runs on
├─ @libp2p/interface the libp2p API Helia is written against
│
├─ security @chainsafe/libp2p-noise noise() ◀ grant M2 (noise)
│ @libp2p/tls tls() (Node)
├─ muxing @chainsafe/libp2p-yamux yamux() ◀ grant M1 (yamux)
│ @libp2p/mplex mplex()
├─ transports @libp2p/tcp @libp2p/websockets @libp2p/webrtc ◀ grant M3 (WebRTC-Direct v2)
├─ routing @libp2p/kad-dht @libp2p/bootstrap @libp2p/mdns
├─ NAT/relay @libp2p/circuit-relay-v2 @libp2p/autonat @libp2p/dcutr @libp2p/upnp-nat
├─ identity @libp2p/identify @libp2p/ping @libp2p/keychain
└─ misc @libp2p/http @libp2p/config
```
Helia's default libp2p config wires these up (`connectionEncrypters: [noise(), tls()]`, `streamMuxers: [yamux(), mplex()]`), and its Bitswap block exchange runs over libp2p streams. Sources: [helia package.json](https://github.com/ipfs/helia/blob/main/packages/helia/package.json), default config [node](https://github.com/ipfs/helia/blob/main/packages/helia/src/utils/libp2p-defaults.ts) / [browser](https://github.com/ipfs/helia/blob/main/packages/helia/src/utils/libp2p-defaults.browser.ts), [IPFS docs](https://docs.ipfs.tech/concepts/libp2p/).