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 CHANGED
@@ -6,7 +6,7 @@
6
6
  "url": "git+https://github.com/44billion/nappup.git"
7
7
  },
8
8
  "license": "MIT",
9
- "version": "1.7.0",
9
+ "version": "1.7.1",
10
10
  "description": "Nostr App Uploader",
11
11
  "type": "module",
12
12
  "scripts": {
@@ -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 NostrSigner from '#services/nostr-signer.js'
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 = NostrSigner.prototype.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
- if (this.relays) return this.relays
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 #initRelays () {
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: await this.getPublicKey(),
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, ...this.relays.write].map(r => r.trim().replace(/\/$/, '')))])
98
- return this.relays
99
- }
76
+ await nostrRelays.sendEvent(relayList, [...new Set([...seedRelays, ...relays].map(r => r.trim().replace(/\/$/, '')))])
100
77
 
101
- async #initSk () {
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
- const writeRelays = (await this.getRelays()).write
114
- await nostrRelays.sendEvent(profile, writeRelays)
88
+ await nostrRelays.sendEvent(profile, relays)
115
89
  }
116
90
 
117
91
  // hex