@unicitylabs/nostr-js-sdk 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +86 -5
- package/dist/browser/index.js +1650 -75
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/index.min.js +7 -6
- package/dist/browser/index.min.js.map +1 -1
- package/dist/browser/index.umd.js +1659 -80
- package/dist/browser/index.umd.js.map +1 -1
- package/dist/browser/index.umd.min.js +7 -6
- package/dist/browser/index.umd.min.js.map +1 -1
- package/dist/cjs/NostrKeyManager.js +57 -0
- package/dist/cjs/NostrKeyManager.js.map +1 -1
- package/dist/cjs/client/NostrClient.js +46 -0
- package/dist/cjs/client/NostrClient.js.map +1 -1
- package/dist/cjs/crypto/index.js +4 -2
- package/dist/cjs/crypto/index.js.map +1 -1
- package/dist/cjs/crypto/nip04.js +14 -3
- package/dist/cjs/crypto/nip04.js.map +1 -1
- package/dist/cjs/crypto/nip44.js +297 -0
- package/dist/cjs/crypto/nip44.js.map +1 -0
- package/dist/cjs/index.js +27 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/messaging/index.js +24 -0
- package/dist/cjs/messaging/index.js.map +1 -0
- package/dist/cjs/messaging/nip17.js +267 -0
- package/dist/cjs/messaging/nip17.js.map +1 -0
- package/dist/cjs/messaging/types.js +20 -0
- package/dist/cjs/messaging/types.js.map +1 -0
- package/dist/cjs/nametag/NametagUtils.js +1 -1
- package/dist/cjs/nametag/NametagUtils.js.map +1 -1
- package/dist/cjs/payment/PaymentRequestProtocol.js +2 -0
- package/dist/cjs/payment/PaymentRequestProtocol.js.map +1 -1
- package/dist/cjs/protocol/EventKinds.js +13 -1
- package/dist/cjs/protocol/EventKinds.js.map +1 -1
- package/dist/esm/NostrKeyManager.js +57 -0
- package/dist/esm/NostrKeyManager.js.map +1 -1
- package/dist/esm/client/NostrClient.js +46 -0
- package/dist/esm/client/NostrClient.js.map +1 -1
- package/dist/esm/crypto/index.js +3 -1
- package/dist/esm/crypto/index.js.map +1 -1
- package/dist/esm/crypto/nip04.js +14 -3
- package/dist/esm/crypto/nip04.js.map +1 -1
- package/dist/esm/crypto/nip44.js +283 -0
- package/dist/esm/crypto/nip44.js.map +1 -0
- package/dist/esm/index.js +4 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/messaging/index.js +8 -0
- package/dist/esm/messaging/index.js.map +1 -0
- package/dist/esm/messaging/nip17.js +229 -0
- package/dist/esm/messaging/nip17.js.map +1 -0
- package/dist/esm/messaging/types.js +16 -0
- package/dist/esm/messaging/types.js.map +1 -0
- package/dist/esm/nametag/NametagUtils.js +1 -1
- package/dist/esm/nametag/NametagUtils.js.map +1 -1
- package/dist/esm/payment/PaymentRequestProtocol.js +2 -0
- package/dist/esm/payment/PaymentRequestProtocol.js.map +1 -1
- package/dist/esm/protocol/EventKinds.js +12 -0
- package/dist/esm/protocol/EventKinds.js.map +1 -1
- package/dist/types/NostrKeyManager.d.ts +36 -0
- package/dist/types/NostrKeyManager.d.ts.map +1 -1
- package/dist/types/client/NostrClient.d.ts +31 -0
- package/dist/types/client/NostrClient.d.ts.map +1 -1
- package/dist/types/crypto/index.d.ts +1 -1
- package/dist/types/crypto/index.d.ts.map +1 -1
- package/dist/types/crypto/nip04.d.ts.map +1 -1
- package/dist/types/crypto/nip44.d.ts +78 -0
- package/dist/types/crypto/nip44.d.ts.map +1 -0
- package/dist/types/index.d.ts +4 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/messaging/index.d.ts +8 -0
- package/dist/types/messaging/index.d.ts.map +1 -0
- package/dist/types/messaging/nip17.d.ts +42 -0
- package/dist/types/messaging/nip17.d.ts.map +1 -0
- package/dist/types/messaging/types.d.ts +59 -0
- package/dist/types/messaging/types.d.ts.map +1 -0
- package/dist/types/payment/PaymentRequestProtocol.d.ts.map +1 -1
- package/dist/types/protocol/EventKinds.d.ts +6 -0
- package/dist/types/protocol/EventKinds.d.ts.map +1 -1
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -4,8 +4,10 @@ A TypeScript SDK for Nostr protocol with Unicity extensions. Works in both Node.
|
|
|
4
4
|
|
|
5
5
|
## Features
|
|
6
6
|
|
|
7
|
+
- **NIP-17 Private Messages** - Gift-wrapped private direct messages with sender anonymity
|
|
8
|
+
- **NIP-44 Encryption** - Modern ChaCha20-Poly1305 AEAD encryption with HKDF
|
|
7
9
|
- **BIP-340 Schnorr Signatures** - Full support for secp256k1 Schnorr signatures
|
|
8
|
-
- **NIP-04 Encryption** - AES-256-CBC encryption with ECDH key agreement
|
|
10
|
+
- **NIP-04 Encryption** - Legacy AES-256-CBC encryption with ECDH key agreement
|
|
9
11
|
- **GZIP Compression** - Automatic compression for large messages (>1KB)
|
|
10
12
|
- **Multi-Relay Support** - Connect to multiple relays with automatic reconnection
|
|
11
13
|
- **Token Transfers** - Encrypted Unicity token transfers over Nostr
|
|
@@ -73,7 +75,7 @@ const event = Event.create(keyManager, {
|
|
|
73
75
|
const eventId = await client.publishEvent(event);
|
|
74
76
|
```
|
|
75
77
|
|
|
76
|
-
### Encrypted Direct Messages
|
|
78
|
+
### Encrypted Direct Messages (NIP-04 Legacy)
|
|
77
79
|
|
|
78
80
|
```typescript
|
|
79
81
|
// Send encrypted DM
|
|
@@ -85,6 +87,67 @@ const encrypted = await keyManager.encryptHex('Hello!', recipientPubkey);
|
|
|
85
87
|
const decrypted = await keyManager.decryptHex(encrypted, senderPubkey);
|
|
86
88
|
```
|
|
87
89
|
|
|
90
|
+
### NIP-17 Private Messages (Recommended)
|
|
91
|
+
|
|
92
|
+
NIP-17 provides enhanced privacy using gift-wrapping with ephemeral keys:
|
|
93
|
+
|
|
94
|
+
```typescript
|
|
95
|
+
// Send private message by nametag (auto-resolves to pubkey)
|
|
96
|
+
const eventId = await client.sendPrivateMessageToNametag(
|
|
97
|
+
'alice', // recipient nametag
|
|
98
|
+
'Hello, this is a private message!'
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
// Or send by pubkey directly
|
|
102
|
+
const recipientPubkey = '...';
|
|
103
|
+
const eventId = await client.sendPrivateMessage(
|
|
104
|
+
recipientPubkey,
|
|
105
|
+
'Hello, this is a private message!'
|
|
106
|
+
);
|
|
107
|
+
|
|
108
|
+
// Send reply to a previous message
|
|
109
|
+
const eventId = await client.sendPrivateMessage(
|
|
110
|
+
recipientPubkey,
|
|
111
|
+
'This is a reply!',
|
|
112
|
+
{ replyToEventId: originalEventId }
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
// Send read receipt
|
|
116
|
+
await client.sendReadReceipt(senderPubkey, messageEventId);
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
Receive and unwrap private messages:
|
|
120
|
+
|
|
121
|
+
```typescript
|
|
122
|
+
import { Filter, EventKinds } from '@unicitylabs/nostr-sdk';
|
|
123
|
+
|
|
124
|
+
// Subscribe to gift-wrapped messages
|
|
125
|
+
const filter = Filter.builder()
|
|
126
|
+
.kinds(EventKinds.GIFT_WRAP)
|
|
127
|
+
.pTags(keyManager.getPublicKeyHex())
|
|
128
|
+
.build();
|
|
129
|
+
|
|
130
|
+
client.subscribe(filter, {
|
|
131
|
+
onEvent: (event) => {
|
|
132
|
+
try {
|
|
133
|
+
const message = client.unwrapPrivateMessage(event);
|
|
134
|
+
|
|
135
|
+
if (message.kind === EventKinds.CHAT_MESSAGE) {
|
|
136
|
+
console.log('From:', message.senderPubkey);
|
|
137
|
+
console.log('Content:', message.content);
|
|
138
|
+
|
|
139
|
+
// Send read receipt
|
|
140
|
+
client.sendReadReceipt(message.senderPubkey, message.eventId);
|
|
141
|
+
} else if (message.kind === EventKinds.READ_RECEIPT) {
|
|
142
|
+
console.log('Read receipt for:', message.replyToEventId);
|
|
143
|
+
}
|
|
144
|
+
} catch (e) {
|
|
145
|
+
// Message not for us or decryption failed
|
|
146
|
+
}
|
|
147
|
+
},
|
|
148
|
+
});
|
|
149
|
+
```
|
|
150
|
+
|
|
88
151
|
### Subscriptions
|
|
89
152
|
|
|
90
153
|
```typescript
|
|
@@ -350,7 +413,9 @@ const parsed = await PaymentRequestProtocol.parsePaymentRequest(event, keyManage
|
|
|
350
413
|
|
|
351
414
|
- **Bech32** - Bech32 encoding/decoding (npub, nsec)
|
|
352
415
|
- **SchnorrSigner** - BIP-340 Schnorr signatures
|
|
353
|
-
- **NIP04** - NIP-04 encryption/decryption
|
|
416
|
+
- **NIP04** - NIP-04 encryption/decryption (legacy)
|
|
417
|
+
- **NIP44** - NIP-44 encryption/decryption (ChaCha20-Poly1305)
|
|
418
|
+
- **NIP17** - NIP-17 private direct messages with gift-wrapping
|
|
354
419
|
- **EventKinds** - Event kind constants
|
|
355
420
|
- **NametagUtils** - Nametag normalization and hashing
|
|
356
421
|
- **NametagBinding** - Nametag binding event creation
|
|
@@ -363,7 +428,11 @@ const parsed = await PaymentRequestProtocol.parsePaymentRequest(event, keyManage
|
|
|
363
428
|
|------|------|-------------|
|
|
364
429
|
| 0 | PROFILE | User profile metadata |
|
|
365
430
|
| 1 | TEXT_NOTE | Short text note |
|
|
366
|
-
| 4 | ENCRYPTED_DM | Encrypted direct message |
|
|
431
|
+
| 4 | ENCRYPTED_DM | Encrypted direct message (NIP-04) |
|
|
432
|
+
| 13 | SEAL | Encrypted seal for gift-wrapping (NIP-17) |
|
|
433
|
+
| 14 | CHAT_MESSAGE | Private direct message rumor (NIP-17) |
|
|
434
|
+
| 15 | READ_RECEIPT | Read receipt rumor (NIP-17) |
|
|
435
|
+
| 1059 | GIFT_WRAP | Gift-wrapped message (NIP-17) |
|
|
367
436
|
| 30078 | APP_DATA | Application-specific data (nametag bindings) |
|
|
368
437
|
| 31111 | AGENT_PROFILE | Agent profile information |
|
|
369
438
|
| 31112 | AGENT_LOCATION | Agent GPS location |
|
|
@@ -392,6 +461,18 @@ npm run lint
|
|
|
392
461
|
|
|
393
462
|
## E2E Testing with Relay
|
|
394
463
|
|
|
464
|
+
### NIP-17 Private Messages
|
|
465
|
+
|
|
466
|
+
```bash
|
|
467
|
+
# Run NIP-17 E2E tests against real relay
|
|
468
|
+
npm test tests/integration/nip17-relay.test.ts
|
|
469
|
+
|
|
470
|
+
# Use a custom relay
|
|
471
|
+
NOSTR_TEST_RELAY=wss://your-relay.com npm test tests/integration/nip17-relay.test.ts
|
|
472
|
+
```
|
|
473
|
+
|
|
474
|
+
### Payment Requests (Manual)
|
|
475
|
+
|
|
395
476
|
To test payment requests against a real wallet:
|
|
396
477
|
|
|
397
478
|
```bash
|
|
@@ -407,7 +488,7 @@ TARGET_NAMETAG=mp-6 npm test -- --testNamePattern="full payment request flow"
|
|
|
407
488
|
|
|
408
489
|
Environment variables:
|
|
409
490
|
- `TARGET_NAMETAG` - Nametag of the wallet to send requests to (required)
|
|
410
|
-
- `
|
|
491
|
+
- `NOSTR_TEST_RELAY` - Relay URL (default: `wss://nostr-relay.testnet.unicity.network`)
|
|
411
492
|
- `AMOUNT` - Amount in smallest units (default: `1000000`)
|
|
412
493
|
- `TIMEOUT` - Timeout in seconds for full flow test (default: `120`)
|
|
413
494
|
|