nostr-tools 1.0.0-beta → 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 +1 -0
- package/README.md +18 -8
- package/build.js +0 -6
- package/event.ts +6 -6
- package/keys.ts +2 -3
- package/lib/nostr.bundle.js +153 -11201
- package/lib/nostr.bundle.js.map +4 -4
- package/lib/nostr.cjs.js +65 -96
- package/lib/nostr.cjs.js.map +4 -4
- package/lib/nostr.esm.js +63 -94
- package/lib/nostr.esm.js.map +4 -4
- package/nip04.test.js +5 -4
- package/nip04.ts +45 -24
- package/nip06.ts +4 -3
- package/nip19.ts +2 -3
- package/package.json +5 -6
- package/relay.test.js +89 -92
- package/relay.ts +12 -61
- package/utils.ts +2 -0
package/.eslintrc.json
CHANGED
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 {
|
|
12
|
+
import {generatePrivateKey, getPublicKey} from 'nostr-tools'
|
|
11
13
|
|
|
12
|
-
let sk = generatePrivateKey()
|
|
13
|
-
let pk = getPublicKey(sk)
|
|
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
|
|
36
|
+
event.id = getEventHash(event)
|
|
35
37
|
event.pubkey = getPublicKey(privateKey)
|
|
36
38
|
event.sig = await signEvent(event, privateKey)
|
|
37
39
|
|
|
@@ -112,6 +114,12 @@ 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
|
+
|
|
115
123
|
### Querying profile data from a NIP-05 address
|
|
116
124
|
|
|
117
125
|
```js
|
|
@@ -122,8 +130,11 @@ console.log(profile.pubkey)
|
|
|
122
130
|
// prints: 32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245
|
|
123
131
|
console.log(profile.relays)
|
|
124
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:
|
|
125
136
|
|
|
126
|
-
|
|
137
|
+
```js
|
|
127
138
|
nip05.useFetchImplementation(require('node-fetch'))
|
|
128
139
|
```
|
|
129
140
|
|
|
@@ -171,7 +182,7 @@ let pk2 = getPublicKey(sk2)
|
|
|
171
182
|
|
|
172
183
|
// on the sender side
|
|
173
184
|
let message = 'hello'
|
|
174
|
-
let ciphertext = nip04.encrypt(sk1, pk2, 'hello')
|
|
185
|
+
let ciphertext = await nip04.encrypt(sk1, pk2, 'hello')
|
|
175
186
|
|
|
176
187
|
let event = {
|
|
177
188
|
kind: 4,
|
|
@@ -184,11 +195,10 @@ let event = {
|
|
|
184
195
|
sendEvent(event)
|
|
185
196
|
|
|
186
197
|
// on the receiver side
|
|
187
|
-
|
|
188
198
|
sub.on('event', (event) => {
|
|
189
199
|
let sender = event.tags.find(([k, v]) => k === 'p' && && v && v !== '')[1]
|
|
190
200
|
pk1 === sender
|
|
191
|
-
let plaintext = nip04.decrypt(sk2, pk1, event.content)
|
|
201
|
+
let plaintext = await nip04.decrypt(sk2, pk1, event.content)
|
|
192
202
|
})
|
|
193
203
|
```
|
|
194
204
|
|
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(
|
|
39
|
-
return
|
|
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
|
|
66
|
+
return secp256k1.utils.bytesToHex(
|
|
67
67
|
await secp256k1.schnorr.sign(event.id || getEventHash(event), key)
|
|
68
|
-
)
|
|
68
|
+
)
|
|
69
69
|
}
|
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
|
|
4
|
+
return secp256k1.utils.bytesToHex(secp256k1.utils.randomPrivateKey())
|
|
6
5
|
}
|
|
7
6
|
|
|
8
7
|
export function getPublicKey(privateKey: string): string {
|
|
9
|
-
return
|
|
8
|
+
return secp256k1.utils.bytesToHex(secp256k1.schnorr.getPublicKey(privateKey))
|
|
10
9
|
}
|