nostr-websocket-utils

npm version License Build Status Documentation TypeScript code style: prettier

A TypeScript library for building Nostr protocol WebSocket clients and servers.

Features

NIPs Support Status

🟒 Fully implemented 🟑 Partially implemented πŸ”΄ Not implemented

NIP Status Description
01 🟒 Basic protocol flow & WebSocket connections
02 🟒 Contact List and Petnames
11 🟒 Relay Information Document
15 🟒 End of Stored Events Notice
16 🟒 Event Treatment
20 🟒 Command Results
42 🟒 Authentication of clients to relays

WebSocket Protocol Implementation Details

This package implements the Nostr WebSocket protocol with full support for the core NIPs that define WebSocket behavior. Here’s how it works:

Key Features & Compliance

  1. Protocol Implementation:
    • Full implementation of Nostr WebSocket protocol
    • Support for all standard message types (EVENT, REQ, CLOSE, etc.)
    • Robust error handling and status reporting
  2. Connection Management:
    • Automatic reconnection with configurable backoff
    • Heartbeat mechanism for connection health
    • Connection pooling and load balancing
  3. Message Handling:
    • Type-safe message processing
    • Support for subscription management
    • Efficient event filtering
  4. Security & Best Practices:
    • Secure WebSocket connections (WSS)
    • Implementation of authentication protocols
    • Rate limiting and protection mechanisms

Interoperability

This implementation ensures compatibility with:

Validation & Testing

The package includes:

Installation

npm install nostr-websocket-utils

Quick Start

Creating a Nostr WebSocket Client

import { NostrWSClient } from 'nostr-websocket-utils';

const client = new NostrWSClient('wss://relay.example.com', {
  logger: console,
  heartbeatInterval: 30000,
  handlers: {
    message: async (msg) => console.log('Received:', msg),
    error: (err) => console.error('Error:', err),
    close: () => console.log('Connection closed')
  }
});

await client.connect();

Creating a Nostr WebSocket Server

import { createNostrServer } from '@humanjavaenterprises/nostr-websocket-utils';

const server = await createNostrServer(8080, {
  logger: console,
  heartbeatInterval: 30000,
  handlers: {
    message: async (ws, msg) => {
      console.log('Received message:', msg);
      // Handle the message
    }
  }
});

Browser Usage

This library now supports direct browser usage! You can use it in your client-side applications in two ways:

import { NostrWSClient } from 'nostr-websocket-utils';

const client = new NostrWSClient({
  url: 'wss://relay.damus.io',
  options: {
    autoReconnect: true,
    maxRetries: 3
  }
});

client.onMessage((message) => {
  console.log('Received:', message);
});

client.connect();

Via CDN

<script src="https://unpkg.com/nostr-websocket-utils/dist/browser/nostr-websocket-utils.min.js"></script>
<script>
  const client = new NostrWebSocketUtils.NostrWSClient({
    url: 'wss://relay.damus.io',
    options: {
      autoReconnect: true,
      maxRetries: 3
    }
  });

  client.onMessage((message) => {
    console.log('Received:', message);
  });

  client.connect();
</script>

Features in Browser Environment

See the examples/browser.html file for a complete example of browser usage.

Dependencies

This package uses:

Documentation

Comprehensive API documentation is available in our documentation site. Here’s what you’ll find:

Core Components

Types and Interfaces

Utility Functions

Type Definitions

Examples

Subscribe to a Channel

client.subscribe('my-channel', {
  filter: {
    authors: ['pubkey1', 'pubkey2'],
    kinds: [1]
  }
});

Broadcast a Message

server.broadcast({
  type: 'event',
  data: {
    content: 'Hello everyone!',
    kind: 1
  }
});

Contributing

Contributions are welcome! Please read our Contributing Guide for details on our code of conduct and the process for submitting pull requests.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Support

If you have any questions or need help, please:

  1. Check the documentation
  2. Open an issue