nostr-tools 1.0.0-alpha2 → 1.0.0-beta2

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/.eslintrc.json CHANGED
@@ -24,6 +24,7 @@
24
24
  "document": false,
25
25
  "navigator": false,
26
26
  "window": false,
27
+ "crypto": false,
27
28
  "location": false,
28
29
  "URL": false,
29
30
  "URLSearchParams": false,
@@ -14,6 +14,8 @@ jobs:
14
14
  node-version: 18
15
15
  - run: yarn --ignore-engines
16
16
  - run: node build.js
17
- - run: npm publish
18
- env:
19
- NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}
17
+ - run: yarn test
18
+ - uses: JS-DevTools/npm-publish@v1
19
+ with:
20
+ token: ${{ secrets.NPM_TOKEN }}
21
+ greater-version-only: true
package/README.md CHANGED
@@ -2,15 +2,17 @@
2
2
 
3
3
  Tools for developing [Nostr](https://github.com/fiatjaf/nostr) clients.
4
4
 
5
+ Very lean on dependencies.
6
+
5
7
  ## Usage
6
8
 
7
9
  ### Generating a private key and a public key
8
10
 
9
11
  ```js
10
- import { generatePrivateKey, getPublicKey } from 'nostr-tools'
12
+ import {generatePrivateKey, getPublicKey} from 'nostr-tools'
11
13
 
12
- let sk = generatePrivateKey() # `sk` is a hex string
13
- let pk = getPublicKey(sk) # `pk` is a hex string
14
+ let sk = generatePrivateKey() // `sk` is a hex string
15
+ let pk = getPublicKey(sk) // `pk` is a hex string
14
16
  ```
15
17
 
16
18
  ### Creating, signing and verifying events
@@ -31,7 +33,7 @@ let event = {
31
33
  content: 'hello'
32
34
  }
33
35
 
34
- event.id = getEventHash(event.id)
36
+ event.id = getEventHash(event)
35
37
  event.pubkey = getPublicKey(privateKey)
36
38
  event.sig = await signEvent(event, privateKey)
37
39
 
@@ -112,6 +114,59 @@ pub.on('failed', reason => {
112
114
  await relay.close()
113
115
  ```
114
116
 
117
+ To use this on Node.js you first must install `websocket-polyfill` and import it:
118
+
119
+ ```js
120
+ import 'websocket-polyfill'
121
+ ```
122
+
123
+ ### Querying profile data from a NIP-05 address
124
+
125
+ ```js
126
+ import {nip05} from 'nostr-tools'
127
+
128
+ let profile = await nip05.queryProfile('jb55.com')
129
+ console.log(profile.pubkey)
130
+ // prints: 32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245
131
+ console.log(profile.relays)
132
+ // prints: [wss://relay.damus.io]
133
+ ```
134
+
135
+ To use this on Node.js you first must install `node-fetch@2` and call something like this:
136
+
137
+ ```js
138
+ nip05.useFetchImplementation(require('node-fetch'))
139
+ ```
140
+
141
+ ### Encoding and decoding NIP-19 codes
142
+
143
+ ```js
144
+ import {nip19, generatePrivateKey, getPublicKey} from 'nostr-tools'
145
+
146
+ let sk = generatePrivateKey()
147
+ let nsec = nip19.nsecEncode(sk)
148
+ let {type, data} = nip19.decode(nsec)
149
+ assert(type === 'nsec')
150
+ assert(data === sk)
151
+
152
+ let pk = getPublicKey(generatePrivateKey())
153
+ let npub = nip19.npubEncode(pk)
154
+ let {type, data} = nip19.decode(npub)
155
+ assert(type === 'npub')
156
+ assert(data === pk)
157
+
158
+ let pk = getPublicKey(generatePrivateKey())
159
+ let relays = [
160
+ 'wss://relay.nostr.example.mydomain.example.com',
161
+ 'wss://nostr.banana.com'
162
+ ]
163
+ let nprofile = nip19.nprofileEncode({pubkey: pk, relays})
164
+ let {type, data} = nip19.decode(nprofile)
165
+ assert(type === 'nprofile')
166
+ assert(data.pubkey === pk)
167
+ assert(data.relays.length === 2)
168
+ ```
169
+
115
170
  ### Encrypting and decrypting direct messages
116
171
 
117
172
  ```js
@@ -127,7 +182,7 @@ let pk2 = getPublicKey(sk2)
127
182
 
128
183
  // on the sender side
129
184
  let message = 'hello'
130
- let ciphertext = nip04.encrypt(sk1, pk2, 'hello')
185
+ let ciphertext = await nip04.encrypt(sk1, pk2, 'hello')
131
186
 
132
187
  let event = {
133
188
  kind: 4,
@@ -140,11 +195,10 @@ let event = {
140
195
  sendEvent(event)
141
196
 
142
197
  // on the receiver side
143
-
144
198
  sub.on('event', (event) => {
145
199
  let sender = event.tags.find(([k, v]) => k === 'p' && && v && v !== '')[1]
146
200
  pk1 === sender
147
- let plaintext = nip04.decrypt(sk2, pk1, event.content)
201
+ let plaintext = await nip04.decrypt(sk2, pk1, event.content)
148
202
  })
149
203
  ```
150
204
 
@@ -153,7 +207,7 @@ Please consult the tests or [the source code](https://github.com/fiatjaf/nostr-t
153
207
  ### Using from the browser (if you don't want to use a bundler)
154
208
 
155
209
  ```html
156
- <script src="https://unpkg.com/nostr-tools/nostr.bundle.js"></script>
210
+ <script src="https://unpkg.com/nostr-tools/lib/nostr.bundle.js"></script>
157
211
  <script>
158
212
  window.NostrTools.generatePrivateKey('...') // and so on
159
213
  </script>
package/build.js CHANGED
@@ -1,16 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  const esbuild = require('esbuild')
4
- const alias = require('esbuild-plugin-alias')
5
4
 
6
5
  let common = {
7
6
  entryPoints: ['index.ts'],
8
7
  bundle: true,
9
- plugins: [
10
- alias({
11
- stream: require.resolve('readable-stream')
12
- })
13
- ],
14
8
  sourcemap: 'external'
15
9
  }
16
10
 
package/event.ts CHANGED
@@ -1,8 +1,8 @@
1
- import {Buffer} from 'buffer'
2
- // @ts-ignore
3
1
  import * as secp256k1 from '@noble/secp256k1'
4
2
  import {sha256} from '@noble/hashes/sha256'
5
3
 
4
+ import {utf8Encoder} from './utils'
5
+
6
6
  export type Event = {
7
7
  id?: string
8
8
  sig?: string
@@ -35,8 +35,8 @@ export function serializeEvent(evt: Event): string {
35
35
  }
36
36
 
37
37
  export function getEventHash(event: Event): string {
38
- let eventHash = sha256(Buffer.from(serializeEvent(event)))
39
- return Buffer.from(eventHash).toString('hex')
38
+ let eventHash = sha256(utf8Encoder.encode(serializeEvent(event)))
39
+ return secp256k1.utils.bytesToHex(eventHash)
40
40
  }
41
41
 
42
42
  export function validateEvent(event: Event): boolean {
@@ -63,7 +63,7 @@ export function verifySignature(
63
63
  }
64
64
 
65
65
  export async function signEvent(event: Event, key: string): Promise<string> {
66
- return Buffer.from(
66
+ return secp256k1.utils.bytesToHex(
67
67
  await secp256k1.schnorr.sign(event.id || getEventHash(event), key)
68
- ).toString('hex')
68
+ )
69
69
  }
package/index.ts CHANGED
@@ -6,3 +6,4 @@ export * from './filter'
6
6
  export * as nip04 from './nip04'
7
7
  export * as nip05 from './nip05'
8
8
  export * as nip06 from './nip06'
9
+ export * as nip19 from './nip19'
package/keys.ts CHANGED
@@ -1,10 +1,9 @@
1
1
  import * as secp256k1 from '@noble/secp256k1'
2
- import {Buffer} from 'buffer'
3
2
 
4
3
  export function generatePrivateKey(): string {
5
- return Buffer.from(secp256k1.utils.randomPrivateKey()).toString('hex')
4
+ return secp256k1.utils.bytesToHex(secp256k1.utils.randomPrivateKey())
6
5
  }
7
6
 
8
7
  export function getPublicKey(privateKey: string): string {
9
- return Buffer.from(secp256k1.schnorr.getPublicKey(privateKey)).toString('hex')
8
+ return secp256k1.utils.bytesToHex(secp256k1.schnorr.getPublicKey(privateKey))
10
9
  }