A high-level wrapper around mininet for testing Hyperswarm and HyperDHT applications in simulated network conditions.
npm install hypermininet
const Hypermininet = require('hypermininet')
const hypermininet = new Hypermininet({
debug: true,
mininet: { clean: true },
network: {
hosts: 10,
link: {
bandwidth: 1, // 1 Mbit link
delay: '100ms', // 100ms latency
loss: 10, // 10% packet loss
htb: true
}
}
})
await hypermininet.ready()
// Define a function to run on hosts
const helloWorld = hypermininet.add(({ data, bootstrap, controller }) => {
const Hyperswarm = require('hyperswarm')
const swarm = new Hyperswarm({ bootstrap })
console.log('Running on host with data:', data)
controller.on('data', (msg) => {
console.log('Received:', msg)
})
})
// Boot the hypermininet (starts the DHT bootstrapper)
await hypermininet.boot(async () => {
for (const host of hypermininet.hosts) {
await helloWorld(host, { hello: 'world' })
}
})
// Cleanup
await hypermininet.close()
Your switch (which the hosts link to) can be given internet access automatically.
const Hypermininet = require('hypermininet')
const hypermininet = new Hypermininet({
debug: true,
mininet: { clean: true, internet: true },
network: {
hosts: 10,
link: {
bandwidth: 1, // 1 Mbit link
delay: '100ms', // 100ms latency
loss: 10, // 10% packet loss
htb: true
}
}
})
Hosts can be run with different runtimes by passing exec: <your executable>.
This will be used when running JS on the hosts, so it must still be compatible.
const Hypermininet = require('hypermininet')
const hypermininet = new Hypermininet({
debug: true,
mininet: { clean: true, internet: true },
network: {
exec: 'bare',
hosts: 10,
link: {
bandwidth: 1, // 1 Mbit link
delay: '100ms', // 100ms latency
loss: 10, // 10% packet loss
htb: true
}
}
})
As well as creating multiple hosts with a single link config (controlling speed, delay etc.); this can also be controlled per host.
The example will create 3 hosts, with 3 different preset configs used
const Hypermininet = require('hypermininet')
const hypermininet = new Hypermininet({
debug: true,
mininet: { clean: true },
network: {
hosts: [Hypermininet.NetworkPotato, Hypermininet.NetworkOK, Hypermininet.Network3GRural]
}
})
new Hypermininet(opts)Create a new Hypermininet instance.
Options:
debug (boolean): Enable debug logging. Default: falsemininet (object): Options passed to the underlying Mininet instance
clean (boolean): Clean up existing Mininet state on startnetwork (object): Network configuration
hosts (number): Number of hosts to create. Default: 10link (object): Link configuration applied to all host connections
bandwidth (number): Bandwidth in Mbit/sdelay (string): Latency (e.g., '100ms')loss (number): Packet loss percentagehtb (boolean): Use HTB qdiscbootstrap (object): Bootstrap node configuration
port (number): Port for the DHT bootstrapper. Default: 49737await hypermininet.ready()Initialize the swarm. Creates the virtual network with the configured number of hosts.
hypermininet.hostsArray of available hosts (excluding the bootstrap host). Each host has an ip property.
hypermininet.add(callback)Register a function to run on hosts. Returns an async function that spawns the callback on a specific host.
The callback receives an object with:
data: Custom data passed when invoking the returned functionbootstrap: Array of bootstrap nodes ([{ host, port }])controller: The mininet/host controller for IPC with the parent processconst runTask = hypermininet.add(({ data, bootstrap, controller }) => {
// This code runs in a separate process on the virtual host
controller.send('done')
})
const proc = await runTask(host, { customData: 123 })
proc.on('message:done', () => console.log('Task completed'))
await hypermininet.boot(callback)Start the DHT bootstrapper and execute the callback. The bootstrapper runs on the first host and is automatically configured.
await hypermininet.boot(async () => {
// Bootstrap is ready, spawn your application hosts here
})
await hypermininet.close()Stop all processes and clean up the virtual network.
MIT