nappup 1.7.0 → 1.7.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.
- package/package.json +1 -1
- package/src/helpers/signer.js +27 -0
- package/src/index.js +2 -2
- package/src/services/nostr-signer.js +9 -35
package/package.json
CHANGED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import nostrRelays, { seedRelays, freeRelays } from '#services/nostr-relays.js'
|
|
2
|
+
|
|
3
|
+
export async function getRelays () {
|
|
4
|
+
if (this.relays) return this.relays
|
|
5
|
+
|
|
6
|
+
const relayLists = (await nostrRelays.getEvents({ authors: [await this.getPublicKey()], kinds: [10002], limit: 1 }, seedRelays)).result
|
|
7
|
+
const relayList = relayLists.sort((a, b) => b.created_at - a.created_at)[0]
|
|
8
|
+
const rTags = (relayList?.tags ?? []).filter(v => v[0] === 'r' && /^wss?:\/\//.test(v[1]))
|
|
9
|
+
if (rTags.length === 0) {
|
|
10
|
+
const defaults = freeRelays.slice(0, 2)
|
|
11
|
+
return (this.relays = { read: defaults, write: defaults })
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
let keys
|
|
15
|
+
const keyAllowList = { read: true, write: true }
|
|
16
|
+
const relays = rTags.reduce((r, v) => {
|
|
17
|
+
keys = [v[2]].filter(v2 => keyAllowList[v2])
|
|
18
|
+
if (keys.length === 0) keys = ['read', 'write']
|
|
19
|
+
keys.forEach(k => r[k].push(v[1].trim().replace(/\/$/, '')))
|
|
20
|
+
return r
|
|
21
|
+
}, { read: [], write: [] })
|
|
22
|
+
for (const k in relays) {
|
|
23
|
+
if (relays[k].length === 0) relays[k].push(...freeRelays)
|
|
24
|
+
relays[k] = [...new Set(relays[k])]
|
|
25
|
+
}
|
|
26
|
+
return (this.relays = relays)
|
|
27
|
+
}
|
package/src/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import NMMR from 'nmmr'
|
|
2
2
|
import { appEncode } from '#helpers/nip19.js'
|
|
3
3
|
import nostrRelays, { nappRelays } from '#services/nostr-relays.js'
|
|
4
|
-
import
|
|
4
|
+
import { getRelays } from '#helpers/signer.js'
|
|
5
5
|
import { streamToChunks, streamToText } from '#helpers/stream.js'
|
|
6
6
|
import { isNostrAppDTagSafe, deriveNostrAppDTag } from '#helpers/app.js'
|
|
7
7
|
import { extractHtmlMetadata, findFavicon, findIndexFile } from '#helpers/app-metadata.js'
|
|
@@ -72,7 +72,7 @@ export async function toApp (fileList, nostrSigner, { log = () => {}, onEvent =
|
|
|
72
72
|
if (!nostrSigner && typeof window !== 'undefined') nostrSigner = window.nostr
|
|
73
73
|
if (!nostrSigner) throw new Error('No Nostr signer found')
|
|
74
74
|
if (typeof window !== 'undefined' && nostrSigner === window.nostr) {
|
|
75
|
-
nostrSigner.getRelays =
|
|
75
|
+
nostrSigner.getRelays = getRelays
|
|
76
76
|
}
|
|
77
77
|
const writeRelays = [...new Set((await nostrSigner.getRelays()).write.map(r => r.trim().replace(/\/$/, '')))]
|
|
78
78
|
log(`Found ${writeRelays.length} outbox relays for pubkey ${nostrSigner.getPublicKey()}:\n${writeRelays.join(', ')}`)
|
|
@@ -5,6 +5,7 @@ import * as dotenv from 'dotenv'
|
|
|
5
5
|
import { getPublicKey } from 'nostr-tools/pure'
|
|
6
6
|
import { getConversationKey, encrypt, decrypt } from 'nostr-tools/nip44'
|
|
7
7
|
import nostrRelays, { seedRelays, freeRelays } from '#services/nostr-relays.js'
|
|
8
|
+
import { getRelays } from '#helpers/signer.js'
|
|
8
9
|
import { bytesToBase16, base16ToBytes } from '#helpers/base16.js'
|
|
9
10
|
import { finalizeEvent } from '#helpers/nip01.js'
|
|
10
11
|
import { nsecDecode, nsecEncode } from '#helpers/nip19.js'
|
|
@@ -59,50 +60,24 @@ export default class NostrSigner {
|
|
|
59
60
|
}
|
|
60
61
|
|
|
61
62
|
async getRelays () {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
const relayLists = (await nostrRelays.getEvents({ authors: [await this.getPublicKey()], kinds: [10002], limit: 1 }, seedRelays)).result
|
|
65
|
-
const relayList = relayLists.sort((a, b) => b.created_at - a.created_at)[0]
|
|
66
|
-
const rTags = (relayList?.tags ?? []).filter(v => v[0] === 'r' && /^wss?:\/\//.test(v[1]))
|
|
67
|
-
if (rTags.length === 0) return (this.relays = await this.#initRelays())
|
|
68
|
-
|
|
69
|
-
let keys
|
|
70
|
-
const keyAllowList = { read: true, write: true }
|
|
71
|
-
const relays = rTags.reduce((r, v) => {
|
|
72
|
-
keys = [v[2]].filter(v2 => keyAllowList[v2])
|
|
73
|
-
if (keys.length === 0) keys = ['read', 'write']
|
|
74
|
-
keys.forEach(k => r[k].push(v[1].trim().replace(/\/$/, '')))
|
|
75
|
-
return r
|
|
76
|
-
}, { read: [], write: [] })
|
|
77
|
-
for (const k in relays) {
|
|
78
|
-
if (relays[k].length === 0) relays[k].push(...freeRelays)
|
|
79
|
-
relays[k] = [...new Set(relays[k])]
|
|
80
|
-
}
|
|
81
|
-
return (this.relays = relays)
|
|
63
|
+
return getRelays.call(this)
|
|
82
64
|
}
|
|
83
65
|
|
|
84
|
-
async #
|
|
66
|
+
async #initSk () {
|
|
85
67
|
const relays = freeRelays.slice(0, 2)
|
|
86
|
-
this.relays = {
|
|
87
|
-
read: relays,
|
|
88
|
-
write: relays
|
|
89
|
-
}
|
|
68
|
+
this.relays = { read: relays, write: relays }
|
|
90
69
|
const relayList = await this.signEvent({
|
|
91
70
|
kind: 10002,
|
|
92
|
-
pubkey:
|
|
71
|
+
pubkey: this.getPublicKey(),
|
|
93
72
|
tags: relays.map(v => ['r', v]),
|
|
94
73
|
content: '',
|
|
95
74
|
created_at: Math.floor(Date.now() / 1000)
|
|
96
75
|
})
|
|
97
|
-
await nostrRelays.sendEvent(relayList, [...new Set([...seedRelays, ...
|
|
98
|
-
return this.relays
|
|
99
|
-
}
|
|
76
|
+
await nostrRelays.sendEvent(relayList, [...new Set([...seedRelays, ...relays].map(r => r.trim().replace(/\/$/, '')))])
|
|
100
77
|
|
|
101
|
-
|
|
102
|
-
const pubkey = this.getPublicKey()
|
|
103
|
-
const profile = this.signEvent({
|
|
78
|
+
const profile = await this.signEvent({
|
|
104
79
|
kind: 0,
|
|
105
|
-
pubkey,
|
|
80
|
+
pubkey: this.getPublicKey(),
|
|
106
81
|
tags: [],
|
|
107
82
|
content: JSON.stringify({
|
|
108
83
|
name: `Publisher #${Math.random().toString(36).slice(2)}`,
|
|
@@ -110,8 +85,7 @@ export default class NostrSigner {
|
|
|
110
85
|
}),
|
|
111
86
|
created_at: Math.floor(Date.now() / 1000)
|
|
112
87
|
})
|
|
113
|
-
|
|
114
|
-
await nostrRelays.sendEvent(profile, writeRelays)
|
|
88
|
+
await nostrRelays.sendEvent(profile, relays)
|
|
115
89
|
}
|
|
116
90
|
|
|
117
91
|
// hex
|