Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/cmdruid/nostr-emitter
An end-to-end group encrypted event emitter, built on the Nostr protocol.
https://github.com/cmdruid/nostr-emitter
e2e event-emitter nostr p2p peer-to-peer pubsub realtime websockets
Last synced: about 1 month ago
JSON representation
An end-to-end group encrypted event emitter, built on the Nostr protocol.
- Host: GitHub
- URL: https://github.com/cmdruid/nostr-emitter
- Owner: cmdruid
- License: cc0-1.0
- Created: 2022-08-21T19:50:14.000Z (over 2 years ago)
- Default Branch: master
- Last Pushed: 2023-02-05T00:54:51.000Z (almost 2 years ago)
- Last Synced: 2024-05-16T08:44:50.801Z (7 months ago)
- Topics: e2e, event-emitter, nostr, p2p, peer-to-peer, pubsub, realtime, websockets
- Language: JavaScript
- Homepage: https://cmdruid.github.io/nostr-emitter/examples/nostr-chat
- Size: 267 KB
- Stars: 42
- Watchers: 3
- Forks: 5
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-nostr - NostrEmitter - emitter.svg?style=social) - Simple E2E encrypted client and EventEmitter object (Clients / Relay lists)
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.```html
```
```js
// 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.
```js
// 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