A TypeScript library for building Nostr protocol WebSocket clients and servers.
- 🚀 Full Nostr protocol support with nostr-crypto-utils integration
- đź”’ Secure WebSocket connections
♥️ Heartbeat mechanism for connection health- 🔄 Automatic reconnection handling
- đź“ť Comprehensive logging with Pino v8
- 🎯 Type-safe message handling
- 📦 Easy to use API
- 🧪 Vitest-powered test suite
🟢 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 |
This package implements the Nostr WebSocket protocol with full support for the core NIPs that define WebSocket behavior. Here's how it works:
-
Protocol Implementation:
- Full implementation of Nostr WebSocket protocol
- Support for all standard message types (EVENT, REQ, CLOSE, etc.)
- Robust error handling and status reporting
-
Connection Management:
- Automatic reconnection with configurable backoff
- Heartbeat mechanism for connection health
- Connection pooling and load balancing
-
Message Handling:
- Type-safe message processing
- Support for subscription management
- Efficient event filtering
-
Security & Best Practices:
- Secure WebSocket connections (WSS)
- Implementation of authentication protocols
- Rate limiting and protection mechanisms
This implementation ensures compatibility with:
- All major Nostr relays
- Other Nostr clients and libraries
- Standard WebSocket tooling and infrastructure
The package includes:
- Comprehensive test suites for protocol compliance
- Connection reliability testing
- Performance benchmarks for message handling
npm install nostr-websocket-utils
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();
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
}
}
});
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();
<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>
- Direct WebSocket connections to Nostr relays
- Automatic reconnection handling
- Message queueing
- Type-safe handlers
- Full compatibility with browser environments
- Source maps for better debugging
See the examples/browser.html
file for a complete example of browser usage.
This package uses:
- nostr-crypto-utils (^0.4.2) for cryptographic operations
- pino (^8.17.2) for logging
- ws (^8.16.0) for WebSocket functionality
- uuid (^9.0.0) for unique identifiers
Comprehensive API documentation is available in our documentation site. Here's what you'll find:
- NostrWSClient - WebSocket client implementation
- NostrWSServer - WebSocket server implementation
- NostrServer - High-level Nostr server
- NostrWSMessage - Message structure
- NostrWSOptions - Configuration options
- NostrWSSubscription - Subscription interface
- ExtendedWebSocket - Enhanced WebSocket interface
- createServer - Server creation helper
- getLogger - Logging utility
- MessageType - Message type enumeration
- Global Types - Global type definitions
client.subscribe('my-channel', {
filter: {
authors: ['pubkey1', 'pubkey2'],
kinds: [1]
}
});
server.broadcast({
type: 'event',
data: {
content: 'Hello everyone!',
kind: 1
}
});
Contributions are welcome! Please read our Contributing Guide for details on our code of conduct and the process for submitting pull requests.
This project is licensed under the MIT License - see the LICENSE file for details.
If you have any questions or need help, please:
- Check the documentation
- Open an issue