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 +1 -0
- package/.github/workflows/npm-publish.yml +5 -3
- package/README.md +62 -8
- package/build.js +0 -6
- package/event.ts +6 -6
- package/index.ts +1 -0
- package/keys.ts +2 -3
- package/lib/nostr.bundle.js +6496 -18012
- package/lib/nostr.bundle.js.map +4 -4
- package/lib/nostr.cjs.js +179 -91
- package/lib/nostr.cjs.js.map +4 -4
- package/lib/nostr.esm.js +177 -89
- package/lib/nostr.esm.js.map +4 -4
- package/nip04.test.js +5 -4
- package/nip04.ts +45 -24
- package/nip05.test.js +20 -0
- package/nip05.ts +20 -3
- package/nip06.ts +4 -3
- package/nip19.test.js +36 -0
- package/nip19.ts +104 -8
- package/package.json +6 -5
- package/relay.test.js +89 -92
- package/relay.ts +12 -61
- package/utils.ts +2 -0
- package/lib/nostr.js.map +0 -7
package/.eslintrc.json
CHANGED
|
@@ -14,6 +14,8 @@ jobs:
|
|
|
14
14
|
node-version: 18
|
|
15
15
|
- run: yarn --ignore-engines
|
|
16
16
|
- run: node build.js
|
|
17
|
-
- run:
|
|
18
|
-
|
|
19
|
-
|
|
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 {
|
|
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,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(
|
|
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/index.ts
CHANGED
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
|
}
|