@unicitylabs/nostr-js-sdk 0.0.1

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.
Files changed (124) hide show
  1. package/README.md +290 -0
  2. package/dist/browser/index.js +8444 -0
  3. package/dist/browser/index.js.map +1 -0
  4. package/dist/browser/index.min.js +12 -0
  5. package/dist/browser/index.min.js.map +1 -0
  6. package/dist/browser/index.umd.js +8524 -0
  7. package/dist/browser/index.umd.js.map +1 -0
  8. package/dist/browser/index.umd.min.js +12 -0
  9. package/dist/browser/index.umd.min.js.map +1 -0
  10. package/dist/cjs/NostrKeyManager.js +265 -0
  11. package/dist/cjs/NostrKeyManager.js.map +1 -0
  12. package/dist/cjs/client/NostrClient.js +518 -0
  13. package/dist/cjs/client/NostrClient.js.map +1 -0
  14. package/dist/cjs/client/NostrEventListener.js +31 -0
  15. package/dist/cjs/client/NostrEventListener.js.map +1 -0
  16. package/dist/cjs/client/WebSocketAdapter.js +90 -0
  17. package/dist/cjs/client/WebSocketAdapter.js.map +1 -0
  18. package/dist/cjs/client/index.js +18 -0
  19. package/dist/cjs/client/index.js.map +1 -0
  20. package/dist/cjs/crypto/bech32.js +201 -0
  21. package/dist/cjs/crypto/bech32.js.map +1 -0
  22. package/dist/cjs/crypto/index.js +49 -0
  23. package/dist/cjs/crypto/index.js.map +1 -0
  24. package/dist/cjs/crypto/nip04.js +327 -0
  25. package/dist/cjs/crypto/nip04.js.map +1 -0
  26. package/dist/cjs/crypto/schnorr.js +101 -0
  27. package/dist/cjs/crypto/schnorr.js.map +1 -0
  28. package/dist/cjs/index.js +57 -0
  29. package/dist/cjs/index.js.map +1 -0
  30. package/dist/cjs/nametag/NametagBinding.js +196 -0
  31. package/dist/cjs/nametag/NametagBinding.js.map +1 -0
  32. package/dist/cjs/nametag/NametagUtils.js +156 -0
  33. package/dist/cjs/nametag/NametagUtils.js.map +1 -0
  34. package/dist/cjs/nametag/index.js +47 -0
  35. package/dist/cjs/nametag/index.js.map +1 -0
  36. package/dist/cjs/protocol/Event.js +209 -0
  37. package/dist/cjs/protocol/Event.js.map +1 -0
  38. package/dist/cjs/protocol/EventKinds.js +126 -0
  39. package/dist/cjs/protocol/EventKinds.js.map +1 -0
  40. package/dist/cjs/protocol/Filter.js +202 -0
  41. package/dist/cjs/protocol/Filter.js.map +1 -0
  42. package/dist/cjs/protocol/index.js +50 -0
  43. package/dist/cjs/protocol/index.js.map +1 -0
  44. package/dist/cjs/token/TokenTransferProtocol.js +196 -0
  45. package/dist/cjs/token/TokenTransferProtocol.js.map +1 -0
  46. package/dist/cjs/token/index.js +45 -0
  47. package/dist/cjs/token/index.js.map +1 -0
  48. package/dist/esm/NostrKeyManager.js +228 -0
  49. package/dist/esm/NostrKeyManager.js.map +1 -0
  50. package/dist/esm/client/NostrClient.js +481 -0
  51. package/dist/esm/client/NostrClient.js.map +1 -0
  52. package/dist/esm/client/NostrEventListener.js +27 -0
  53. package/dist/esm/client/NostrEventListener.js.map +1 -0
  54. package/dist/esm/client/WebSocketAdapter.js +52 -0
  55. package/dist/esm/client/WebSocketAdapter.js.map +1 -0
  56. package/dist/esm/client/index.js +7 -0
  57. package/dist/esm/client/index.js.map +1 -0
  58. package/dist/esm/crypto/bech32.js +193 -0
  59. package/dist/esm/crypto/bech32.js.map +1 -0
  60. package/dist/esm/crypto/index.js +10 -0
  61. package/dist/esm/crypto/index.js.map +1 -0
  62. package/dist/esm/crypto/nip04.js +286 -0
  63. package/dist/esm/crypto/nip04.js.map +1 -0
  64. package/dist/esm/crypto/schnorr.js +93 -0
  65. package/dist/esm/crypto/schnorr.js.map +1 -0
  66. package/dist/esm/index.js +32 -0
  67. package/dist/esm/index.js.map +1 -0
  68. package/dist/esm/nametag/NametagBinding.js +155 -0
  69. package/dist/esm/nametag/NametagBinding.js.map +1 -0
  70. package/dist/esm/nametag/NametagUtils.js +149 -0
  71. package/dist/esm/nametag/NametagUtils.js.map +1 -0
  72. package/dist/esm/nametag/index.js +8 -0
  73. package/dist/esm/nametag/index.js.map +1 -0
  74. package/dist/esm/protocol/Event.js +172 -0
  75. package/dist/esm/protocol/Event.js.map +1 -0
  76. package/dist/esm/protocol/EventKinds.js +119 -0
  77. package/dist/esm/protocol/EventKinds.js.map +1 -0
  78. package/dist/esm/protocol/Filter.js +197 -0
  79. package/dist/esm/protocol/Filter.js.map +1 -0
  80. package/dist/esm/protocol/index.js +8 -0
  81. package/dist/esm/protocol/index.js.map +1 -0
  82. package/dist/esm/token/TokenTransferProtocol.js +154 -0
  83. package/dist/esm/token/TokenTransferProtocol.js.map +1 -0
  84. package/dist/esm/token/index.js +6 -0
  85. package/dist/esm/token/index.js.map +1 -0
  86. package/dist/types/NostrKeyManager.d.ts +150 -0
  87. package/dist/types/NostrKeyManager.d.ts.map +1 -0
  88. package/dist/types/client/NostrClient.d.ts +154 -0
  89. package/dist/types/client/NostrClient.d.ts.map +1 -0
  90. package/dist/types/client/NostrEventListener.d.ts +40 -0
  91. package/dist/types/client/NostrEventListener.d.ts.map +1 -0
  92. package/dist/types/client/WebSocketAdapter.d.ts +55 -0
  93. package/dist/types/client/WebSocketAdapter.d.ts.map +1 -0
  94. package/dist/types/client/index.d.ts +9 -0
  95. package/dist/types/client/index.d.ts.map +1 -0
  96. package/dist/types/crypto/bech32.d.ts +51 -0
  97. package/dist/types/crypto/bech32.d.ts.map +1 -0
  98. package/dist/types/crypto/index.d.ts +10 -0
  99. package/dist/types/crypto/index.d.ts.map +1 -0
  100. package/dist/types/crypto/nip04.d.ts +56 -0
  101. package/dist/types/crypto/nip04.d.ts.map +1 -0
  102. package/dist/types/crypto/schnorr.d.ts +47 -0
  103. package/dist/types/crypto/schnorr.d.ts.map +1 -0
  104. package/dist/types/index.d.ts +31 -0
  105. package/dist/types/index.d.ts.map +1 -0
  106. package/dist/types/nametag/NametagBinding.d.ts +68 -0
  107. package/dist/types/nametag/NametagBinding.d.ts.map +1 -0
  108. package/dist/types/nametag/NametagUtils.d.ts +44 -0
  109. package/dist/types/nametag/NametagUtils.d.ts.map +1 -0
  110. package/dist/types/nametag/index.d.ts +8 -0
  111. package/dist/types/nametag/index.d.ts.map +1 -0
  112. package/dist/types/protocol/Event.d.ts +112 -0
  113. package/dist/types/protocol/Event.d.ts.map +1 -0
  114. package/dist/types/protocol/EventKinds.d.ts +62 -0
  115. package/dist/types/protocol/EventKinds.d.ts.map +1 -0
  116. package/dist/types/protocol/Filter.d.ts +146 -0
  117. package/dist/types/protocol/Filter.d.ts.map +1 -0
  118. package/dist/types/protocol/index.d.ts +10 -0
  119. package/dist/types/protocol/index.d.ts.map +1 -0
  120. package/dist/types/token/TokenTransferProtocol.d.ts +67 -0
  121. package/dist/types/token/TokenTransferProtocol.d.ts.map +1 -0
  122. package/dist/types/token/index.d.ts +6 -0
  123. package/dist/types/token/index.d.ts.map +1 -0
  124. package/package.json +89 -0
package/README.md ADDED
@@ -0,0 +1,290 @@
1
+ # Unicity Nostr SDK
2
+
3
+ A TypeScript SDK for Nostr protocol with Unicity extensions. Works in both Node.js and browser environments.
4
+
5
+ ## Features
6
+
7
+ - **BIP-340 Schnorr Signatures** - Full support for secp256k1 Schnorr signatures
8
+ - **NIP-04 Encryption** - AES-256-CBC encryption with ECDH key agreement
9
+ - **GZIP Compression** - Automatic compression for large messages (>1KB)
10
+ - **Multi-Relay Support** - Connect to multiple relays with automatic reconnection
11
+ - **Token Transfers** - Encrypted Unicity token transfers over Nostr
12
+ - **Nametag Bindings** - Privacy-preserving identity bindings (phone numbers, usernames)
13
+ - **Cross-Platform** - Works in Node.js 18+ and modern browsers
14
+
15
+ ## Installation
16
+
17
+ ```bash
18
+ npm install @unicitylabs/nostr-sdk
19
+ ```
20
+
21
+ ## Quick Start
22
+
23
+ ### Key Management
24
+
25
+ ```typescript
26
+ import { NostrKeyManager } from '@unicitylabs/nostr-sdk';
27
+
28
+ // Generate new keys
29
+ const keyManager = NostrKeyManager.generate();
30
+
31
+ // Or import existing keys
32
+ const keyManager = NostrKeyManager.fromPrivateKeyHex('...');
33
+ const keyManager = NostrKeyManager.fromNsec('nsec1...');
34
+
35
+ // Export keys
36
+ console.log(keyManager.getNpub()); // npub1...
37
+ console.log(keyManager.getNsec()); // nsec1...
38
+ console.log(keyManager.getPublicKeyHex());
39
+ ```
40
+
41
+ ### Connecting to Relays
42
+
43
+ ```typescript
44
+ import { NostrClient, NostrKeyManager } from '@unicitylabs/nostr-sdk';
45
+
46
+ const keyManager = NostrKeyManager.generate();
47
+ const client = new NostrClient(keyManager);
48
+
49
+ // Connect to relays
50
+ await client.connect(
51
+ 'wss://relay.damus.io',
52
+ 'wss://nos.lol'
53
+ );
54
+
55
+ // Check connection status
56
+ console.log(client.isConnected());
57
+ console.log(client.getConnectedRelays());
58
+ ```
59
+
60
+ ### Publishing Events
61
+
62
+ ```typescript
63
+ import { Event, EventKinds } from '@unicitylabs/nostr-sdk';
64
+
65
+ // Create and publish a text note
66
+ const event = Event.create(keyManager, {
67
+ kind: EventKinds.TEXT_NOTE,
68
+ tags: [['t', 'unicity']],
69
+ content: 'Hello, Nostr!',
70
+ });
71
+
72
+ const eventId = await client.publishEvent(event);
73
+ ```
74
+
75
+ ### Encrypted Direct Messages
76
+
77
+ ```typescript
78
+ // Send encrypted DM
79
+ const recipientPubkey = '...';
80
+ await client.publishEncryptedMessage(recipientPubkey, 'Secret message');
81
+
82
+ // Or encrypt manually
83
+ const encrypted = await keyManager.encryptHex('Hello!', recipientPubkey);
84
+ const decrypted = await keyManager.decryptHex(encrypted, senderPubkey);
85
+ ```
86
+
87
+ ### Subscriptions
88
+
89
+ ```typescript
90
+ import { Filter } from '@unicitylabs/nostr-sdk';
91
+
92
+ // Create a filter
93
+ const filter = Filter.builder()
94
+ .kinds(EventKinds.TEXT_NOTE)
95
+ .authors('pubkey1', 'pubkey2')
96
+ .limit(10)
97
+ .build();
98
+
99
+ // Subscribe
100
+ const subId = client.subscribe(filter, {
101
+ onEvent: (event) => {
102
+ console.log('Received event:', event.content);
103
+ },
104
+ onEndOfStoredEvents: (subId) => {
105
+ console.log('All stored events received');
106
+ },
107
+ });
108
+
109
+ // Unsubscribe
110
+ client.unsubscribe(subId);
111
+ ```
112
+
113
+ ### Token Transfers
114
+
115
+ ```typescript
116
+ import { TokenTransferProtocol } from '@unicitylabs/nostr-sdk';
117
+
118
+ // Create token transfer event
119
+ const event = await TokenTransferProtocol.createTokenTransferEvent(
120
+ keyManager,
121
+ recipientPubkey,
122
+ JSON.stringify({ tokenId: '...', amount: 100 }),
123
+ 100n, // amount (optional metadata)
124
+ 'UNIT' // symbol (optional metadata)
125
+ );
126
+
127
+ await client.publishEvent(event);
128
+
129
+ // Parse received token transfer
130
+ const tokenJson = await TokenTransferProtocol.parseTokenTransfer(event, keyManager);
131
+ ```
132
+
133
+ ### Nametag Bindings
134
+
135
+ ```typescript
136
+ import { NametagBinding, NametagUtils } from '@unicitylabs/nostr-sdk';
137
+
138
+ // Hash a nametag (privacy-preserving)
139
+ const hash = NametagUtils.hashNametag('+14155551234', 'US');
140
+
141
+ // Create binding event
142
+ const event = await NametagBinding.createBindingEvent(
143
+ keyManager,
144
+ '+14155551234',
145
+ 'unicity_address_...'
146
+ );
147
+
148
+ await client.publishEvent(event);
149
+
150
+ // Query pubkey by nametag
151
+ const pubkey = await client.queryPubkeyByNametag('+14155551234');
152
+ ```
153
+
154
+ ## Token Transfer Format
155
+
156
+ Token transfers use Nostr event kind 31113 with NIP-04 encryption.
157
+
158
+ ### Event Structure
159
+
160
+ ```json
161
+ {
162
+ "id": "<sha256_event_hash>",
163
+ "pubkey": "<sender_pubkey_hex>",
164
+ "created_at": 1234567890,
165
+ "kind": 31113,
166
+ "tags": [
167
+ ["p", "<recipient_pubkey_hex>"],
168
+ ["type", "token_transfer"],
169
+ ["amount", "1000000000000000000"],
170
+ ["symbol", "UNIT"]
171
+ ],
172
+ "content": "<NIP-04 encrypted content>",
173
+ "sig": "<schnorr_signature_hex>"
174
+ }
175
+ ```
176
+
177
+ ### Tags
178
+
179
+ | Tag | Required | Description |
180
+ |-----|----------|-------------|
181
+ | `p` | Yes | Recipient's public key (hex) |
182
+ | `type` | Yes | Always `"token_transfer"` |
183
+ | `amount` | No | Transfer amount (metadata for filtering) |
184
+ | `symbol` | No | Token symbol (metadata for filtering) |
185
+
186
+ ### Encrypted Content
187
+
188
+ The `content` field is NIP-04 encrypted. When decrypted, it contains:
189
+
190
+ ```
191
+ token_transfer:<token_transfer_package_json>
192
+ ```
193
+
194
+ The **Token Transfer Package** is a JSON structure containing the source token and the transaction, passed to `createTokenTransferEvent()`.
195
+
196
+ For payloads >1KB, GZIP compression is automatically applied before encryption:
197
+
198
+ ```
199
+ gz:<base64_ciphertext>?iv=<base64_iv>
200
+ ```
201
+
202
+ ### Helper Functions
203
+
204
+ ```typescript
205
+ // Check if event is a token transfer
206
+ TokenTransferProtocol.isTokenTransfer(event); // boolean
207
+
208
+ // Get metadata from tags
209
+ TokenTransferProtocol.getAmount(event); // bigint | undefined
210
+ TokenTransferProtocol.getSymbol(event); // string | undefined
211
+ TokenTransferProtocol.getRecipient(event); // string | undefined
212
+ TokenTransferProtocol.getSender(event); // string
213
+ ```
214
+
215
+ ## Browser Usage
216
+
217
+ ### ES Modules
218
+
219
+ ```html
220
+ <script type="module">
221
+ import { NostrKeyManager, NostrClient } from '@unicitylabs/nostr-sdk';
222
+
223
+ const keyManager = NostrKeyManager.generate();
224
+ console.log(keyManager.getNpub());
225
+ </script>
226
+ ```
227
+
228
+ ### UMD (Script Tag)
229
+
230
+ ```html
231
+ <script src="node_modules/@unicitylabs/nostr-sdk/dist/browser/index.umd.min.js"></script>
232
+ <script>
233
+ const { NostrKeyManager, NostrClient } = UnicityNostr;
234
+
235
+ const keyManager = NostrKeyManager.generate();
236
+ console.log(keyManager.getNpub());
237
+ </script>
238
+ ```
239
+
240
+ ## API Reference
241
+
242
+ ### Classes
243
+
244
+ - **NostrKeyManager** - Key pair management, signing, encryption
245
+ - **NostrClient** - Relay connections, event publishing, subscriptions
246
+ - **Event** - Nostr event creation, signing, verification
247
+ - **Filter** - Subscription filter building
248
+
249
+ ### Modules
250
+
251
+ - **Bech32** - Bech32 encoding/decoding (npub, nsec)
252
+ - **SchnorrSigner** - BIP-340 Schnorr signatures
253
+ - **NIP04** - NIP-04 encryption/decryption
254
+ - **EventKinds** - Event kind constants
255
+ - **NametagUtils** - Nametag normalization and hashing
256
+ - **NametagBinding** - Nametag binding event creation
257
+ - **TokenTransferProtocol** - Token transfer protocol
258
+
259
+ ## Event Kinds
260
+
261
+ | Kind | Name | Description |
262
+ |------|------|-------------|
263
+ | 0 | PROFILE | User profile metadata |
264
+ | 1 | TEXT_NOTE | Short text note |
265
+ | 4 | ENCRYPTED_DM | Encrypted direct message |
266
+ | 30078 | APP_DATA | Application-specific data |
267
+ | 31113 | TOKEN_TRANSFER | Unicity token transfer |
268
+
269
+ ## Development
270
+
271
+ ```bash
272
+ # Install dependencies
273
+ npm install
274
+
275
+ # Type checking
276
+ npm run build:check
277
+
278
+ # Run tests
279
+ npm test
280
+
281
+ # Build all bundles
282
+ npm run build
283
+
284
+ # Lint
285
+ npm run lint
286
+ ```
287
+
288
+ ## License
289
+
290
+ MIT