Pp2pbuilders
learn › Storyteller & Pear Baby Rooms

10 min read · also at #/learn/rooms-baby-1

Pear Baby Rooms 1: your first room

Baby Rooms is our from-absolute-zero track: each lesson is one sitting, ends
with something alive on your screen, and introduces exactly one idea. Lesson
one: a room is just a topic two peers both joined.

Build it

mkdir baby-room && cd baby-room
npm init -y
npm i hyperswarm hypercore-crypto bare bare-process bare-readline

room.js:

const Hyperswarm = require('hyperswarm')
const crypto = require('hypercore-crypto')

const name = process.argv[2] || 'baby-room-hello'
const topic = crypto.hash(Buffer.from('baby-rooms:v1:' + name))

const swarm = new Hyperswarm()
const peers = new Set()

swarm.join(topic, { server: true, client: true })
swarm.on('connection', (socket) => {
  peers.add(socket)
  console.log('* peer joined (' + peers.size + ' online)')
  socket.on('data', (d) => console.log('them:', d.toString().trim()))
  socket.on('error', () => {})
  socket.on('close', () => { peers.delete(socket); console.log('* peer left') })
})

process.stdin.on('data', (line) => {
  for (const p of peers) p.write(line)
})

console.log('room "' + name + '" — waiting for peers…')

Run node room.js secret-club in two terminals (better: two machines, two
networks). When * peer joined prints, type. You are chatting through an
encrypted, holepunched, serverless connection.

What you just learned

topic and met at the hash. Unguessable name ⇒ unguessable room.

currently joined to the topic. Close both terminals and it does not exist.

claim any name. Fixing that is
lesson 2; making the room remember is
lesson 3.

« Autobase: many writers, one view Pear Baby Rooms 2: who said that? »