@suaveplan/network-discovery-webtorrent - Browser-tier WebTorrent DiscoveryStrategy: WebTorrent-tracker-driven WebRTC peer discovery via p2pt. Tracker list REQUIRED — no public-tracker fallback. AbortSignal + EventBusLike + ServiceRegistry + OTel + Zod boundaries.
Summary
Browser-tier DiscoveryStrategy for @suaveplan/network-bootstrap chains.
Wraps a p2pt instance —
WebTorrent-tracker-driven WebRTC peer discovery — and exposes a deduped,
capped peer set to the bootstrap pipeline.
Documentation tree
- webtorrent-discovery — (no submodules)
- webtorrent-discovery — (no submodules)
- errors — (no submodules)
- errors — (no submodules)
- otel — (no submodules)
- otel — (no submodules)
- plugin — (no submodules)
- plugin — (no submodules)
- transport — (no submodules)
- transport — (no submodules)
- types — (no submodules)
- types — (no submodules)
Why this package
- Plug-and-play
DiscoveryStrategyslot for network bootstrap chains. Works alongside@suaveplan/network-discovery-peerjs,@suaveplan/network-discovery-trystero, and@suaveplan/network-discovery-crdt. - Tracker list REQUIRED. Upstream's hard-coded public-tracker fallback was removed. Callers must supply their own tracker infrastructure.
- Injectable
p2ptFactory— production wires the realp2pt; tests bind a deterministicP2PTLikefake (novi.mockever used). - Typed
EventBusLike<WebTorrentEventMap>integration. - Optional
@suaveplan/service-discoveryServiceRegistrymirroring. - OTel surface:
disc_webtorrent.startspan;peers_discovered_total{outcome},tracker_errors_total{tracker},tracker_announce_duration_msinstruments. - AbortSignal honoured on every async public method.
- 100% test + branch + function + line coverage.
Basic example
import { WebTorrentDiscovery } from "@suaveplan/network-discovery-webtorrent";
const discovery = new WebTorrentDiscovery({
trackers: ["wss://my-tracker.example.com"],
p2ptFactory: async (trackers, announceId) => {
const { default: P2PT } = await import("p2pt");
return new P2PT(trackers as string[], announceId);
},
});
await discovery.start();
const peers = await discovery.discover(5_000);
console.log(`found ${peers.length} peers`);
await discovery.stop();
Advanced example
import { EventBus } from "@suaveplan/events";
import { ServiceRegistry } from "@suaveplan/service-discovery";
import { DiscoveryChain } from "@suaveplan/network-bootstrap";
import {
WebTorrentDiscovery,
type WebTorrentEventMap,
} from "@suaveplan/network-discovery-webtorrent";
const bus = new EventBus<WebTorrentEventMap>();
const registry = new ServiceRegistry();
bus.on("webtorrent:peer-discovered", ({ peer }) => {
console.log("peer:", peer.id, peer.addresses);
});
bus.on("webtorrent:tracker-error", ({ reason }) => {
console.warn("tracker:", reason);
});
const discovery = new WebTorrentDiscovery({
trackers: [
"wss://my-tracker-a.example.com",
"wss://my-tracker-b.example.com",
],
announceId: "my-app/v1",
maxPeers: 256,
p2ptFactory: async (trackers, id) => {
const { default: P2PT } = await import("p2pt");
return new P2PT(trackers as string[], id);
},
bus,
registry,
});
const chain = new DiscoveryChain([discovery]);
const peers = await chain.discover(5_000);
API
See sibling co-located markdown:
src/types/types.mdsrc/errors/errors.mdsrc/otel/otel.mdsrc/core/webtorrent-discovery/webtorrent-discovery.md
License
MIT