Nostr Emitter Save

An end-to-end group encrypted event emitter, built on the Nostr protocol.

Project README

nostr-emitter

A basic peer-to-peer event emitter, built on the Nostr protocol.

Installation

This package is designed to work in both the browser and nodejs.

<!-- Browser import -->
<script src='https://bundle.run/[email protected]'></script>
<script src="https://unpkg.com/@cmdcode/nostr-emitter"></script>
// Commonjs import.
const NostrEmitter = require('@cmdcode/nostr-emitter')

// ES6 import.
import NostrEmitter from '@cmdcode/nostr-emitter'

How to use

To get started, simply provide a relay server and shared secret to use, then run emitter.connect().

Once connected, the emitter behaves like a typical EventEmitter object.

// Declare a new event emitter object.
const emitter = new NostrEmitter()

// Connect your emitter to the relay.
await emitter.connect(
  'wss://nostr.zebedee.cloud',
  'secret-string'
)

// Register an event listener.
emitter.on('some-event', eventData => {
  console.log('Hello ', eventData)
})

// Publish events like any other emitter.
emitter.emit('some-event', 'world!')

// Self-published events are filtered out 
// by default, but you can enable them.
emitter.opt.selfsub = true

// Specify optional parameters.
const emitter = new NostrEmitter({
  version : 0,          // Nostr protocol version.
  kind    : 29001,      // Default event type (ephemeral).
  selfPub : false,      // Filter self-published events.
  socket  : WebSocket,  // Specify your own websocket object.
  tags    : [],         // Add your own tags to each message.
  filter  : {}          // Add your own subscription filters.
})

How it works

The contents of each event is end-to-end encrypted using a hash of the shared secret, then the event itself is tagged with a double-hash of the secret.

Events are filtered by this hash-tag, so each emitter will only see events tagged with the proper hash. Old events are also filtered out by default.

Everything else works like a basic event emitter API. Methods include 'on', 'once', 'emit' and 'remove'.

Some helpful tips:

  • For public channels, the shared secret can be something obvious, like 'general-chat'.
  • For organizing groups or channels, try using paths as a secret string: 'secret/topic/subtopic'
  • You can change the default emitter.filter before calling emitter.connect().
  • The main index.js file is less than 400 lines of code. Feel free to change it as you wish!

Resources

Noble-secp256k1 Library
Used for identity and signing events.
https://github.com/paulmillr/noble-secp256k1

Websockets (nodejs only)
Used for communicating over a websocket.
https://github.com/websockets/ws

Nostr Implementation Possibilities
https://github.com/nostr-protocol/nips

Nostr-tools
https://github.com/fiatjaf/nostr-tools

Contributions

All contributions are welcome!

Special Thanks

Special thanks to supertestnet for his help and guidance.
https://github.com/supertestnet

Open Source Agenda is not affiliated with "Nostr Emitter" Project. README Source: cmdruid/nostr-emitter

Open Source Agenda Badge

Open Source Agenda Rating