diff --git a/README.md b/README.md index dbfcd979..5a213590 100644 --- a/README.md +++ b/README.md @@ -49,19 +49,18 @@ If you like Coracle and want to support its development, you can donate sats via ## Current - [x] Upgrade nostr-tools -- [ ] Publish user relays using nip 23 -- [ ] Use user relays for feeds +- [x] Publish user relays using nip 23 +- [x] Use user relays for feeds - [ ] Publish to user relays + target relays: - If a reply or reaction, publish to the parent event's best relay, which is: - e tag relay - p tag relay - or pubkey's recommended relays -- [ ] Add recommended relay to tags +- [ ] Add correct recommended relay to tags - [ ] Close connections that haven't been used in a while - [ ] Support some read/write config on relays page - [ ] Get real home relays for default pubkeys - [ ] Add settings storage -- [ ] Use hexToBech32 from nostr-tools - [ ] Warn that everything will be cleared on logout - [ ] Clear dexie on page load, we don't need any persistence other than people/relays - [ ] Clean up login page to prefer extension, make private key entry "advanced" diff --git a/package-lock.json b/package-lock.json index 6bf5bf3e..dc568510 100644 Binary files a/package-lock.json and b/package-lock.json differ diff --git a/package.json b/package.json index 168aa8bc..b7efa9aa 100644 --- a/package.json +++ b/package.json @@ -22,8 +22,6 @@ "dependencies": { "@fortawesome/fontawesome-free": "^6.2.1", "@noble/secp256k1": "^1.7.0", - "bech32": "^2.0.0", - "buffer": "^6.0.3", "classnames": "^2.3.2", "compressorjs": "^1.1.1", "dexie": "^3.2.2", diff --git a/src/App.svelte b/src/App.svelte index e60821b2..5c39c606 100644 --- a/src/App.svelte +++ b/src/App.svelte @@ -13,6 +13,7 @@ import {timedelta, now} from 'src/util/misc' import {user} from 'src/agent' import {modal, toast, settings, alerts, getRelays} from "src/app" + import {routes} from "src/app/ui" import Anchor from 'src/partials/Anchor.svelte' import NoteDetail from "src/views/NoteDetail.svelte" import PersonSettings from "src/views/PersonSettings.svelte" @@ -92,8 +93,8 @@ - - {#key params.pubkey} + + {#key params.npub} {/key} @@ -113,7 +114,7 @@ > {#if $user}
  • - +
    diff --git a/src/agent/data.js b/src/agent/data.js index da7f561c..85ac4d47 100644 --- a/src/agent/data.js +++ b/src/agent/data.js @@ -1,6 +1,6 @@ import Dexie from 'dexie' import {matchFilter} from 'nostr-tools' -import {writable, get} from 'svelte/store' +import {get} from 'svelte/store' import {groupBy, prop, flatten, pick} from 'ramda' import {ensurePlural, switcherFn} from 'hurdak/lib/hurdak' import {synced, now, timedelta} from 'src/util/misc' @@ -92,7 +92,7 @@ export const processEvents = async events => { 2: () => putPerson({relays: ($people[pubkey]?.relays || []).concat(content)}), 3: () => putPerson({petnames: tags}), 12165: () => putPerson({muffle: tags}), - 10001: () => putPerson({relays: tags}), + 10001: () => putPerson({relays: tags.map(t => t[0])}), default: () => { console.log(`Received unsupported event type ${event.kind}`) }, diff --git a/src/agent/pool.js b/src/agent/pool.js index feb58b69..17d90b27 100644 --- a/src/agent/pool.js +++ b/src/agent/pool.js @@ -44,7 +44,9 @@ const publish = async (urls, event) => { urls.map(async url => { const relay = await connect(url) - return relay.publish(event) + if (relay) { + return relay.publish(event) + } }) ) } diff --git a/src/app/index.js b/src/app/index.js index e353f050..8d095390 100644 --- a/src/app/index.js +++ b/src/app/index.js @@ -48,8 +48,10 @@ export const login = async ({privkey, pubkey}) => { export const logout = async () => { keys.clear() - await db.tags.clear() - await db.events.clear() + await Promise.all([ + db.tags.clear(), + db.events.clear(), + ]) } export const addRelay = async url => { diff --git a/src/app/query.js b/src/app/query.js index 89aa9213..13695dd1 100644 --- a/src/app/query.js +++ b/src/app/query.js @@ -4,6 +4,7 @@ import {ensurePlural, createMap, ellipsize} from 'hurdak/lib/hurdak' import {renderContent} from 'src/util/html' import {filterTags, displayPerson, getTagValues, findReply, findRoot} from 'src/util/nostr' import {db, people, getPerson} from 'src/agent' +import {routes} from "src/app/ui" const filterEvents = async ({limit, ...filter}) => { let events = db.events @@ -152,8 +153,9 @@ const renderNote = async (note, {showEntire = false}) => { const pubkey = note.tags[parseInt(i)][1] const person = peopleByPubkey[pubkey] || {pubkey} const name = displayPerson(person) + const path = routes.person(pubkey) - return `@${name}` + return `@${name}` }) return content diff --git a/src/app/ui.js b/src/app/ui.js index bfd9d5ec..1a323cb9 100644 --- a/src/app/ui.js +++ b/src/app/ui.js @@ -1,10 +1,17 @@ import {prop} from "ramda" import {uuid} from "hurdak/lib/hurdak" import {navigate} from "svelte-routing" +import {nip19} from 'nostr-tools' import {writable, get} from "svelte/store" import {globalHistory} from "svelte-routing/src/history" import {synced} from "src/util/misc" +// Routing + +export const routes = { + person: (pubkey, tab = 'notes') => `/people/${nip19.npubEncode(pubkey)}/${tab}`, +} + // Toast export const toast = writable(null) diff --git a/src/partials/Badge.svelte b/src/partials/Badge.svelte index 93e76aec..6beb6650 100644 --- a/src/partials/Badge.svelte +++ b/src/partials/Badge.svelte @@ -2,6 +2,7 @@ import {Link} from 'svelte-routing' import {killEvent} from 'src/util/html' import {displayPerson} from 'src/util/nostr' + import {routes} from 'src/app/ui' export let person export let inert = false @@ -16,7 +17,7 @@ {:else}
    - import {propEq, identity, uniq, uniqBy, prop, sortBy} from 'ramda' + import {propEq, identity, uniq, prop, sortBy} from 'ramda' import {onMount} from 'svelte' import {fly} from 'svelte/transition' import {createMap} from 'hurdak/lib/hurdak' - import {now, createScroller, timedelta} from 'src/util/misc' - import {findReply, isLike} from 'src/util/nostr' + import {now, createScroller} from 'src/util/misc' import {getPerson, user, db} from 'src/agent' import {alerts} from 'src/app' import query from 'src/app/query' - import Spinner from "src/partials/Spinner.svelte" import Note from 'src/partials/Note.svelte' import Like from 'src/partials/Like.svelte' @@ -53,7 +51,7 @@ annotatedNotes = sortBy( e => -e.created_at, notes - .filter(e => e.pubkey !== $user.pubkey) + .filter(e => e && e.pubkey !== $user.pubkey) .concat(Object.values(likesById)) ).slice(0, limit) }) diff --git a/src/routes/Keys.svelte b/src/routes/Keys.svelte index 1c7f4835..737067bd 100644 --- a/src/routes/Keys.svelte +++ b/src/routes/Keys.svelte @@ -2,8 +2,8 @@ import {onMount} from "svelte" import {fly} from 'svelte/transition' import {navigate} from "svelte-routing" + import {nip19} from 'nostr-tools' import {copyToClipboard} from "src/util/html" - import {hexToBech32} from "src/util/misc" import Input from "src/partials/Input.svelte" import Anchor from "src/partials/Anchor.svelte" import {user} from "src/agent" @@ -13,10 +13,11 @@ const delegationUrl = 'https://github.com/nostr-protocol/nips/blob/b62aa418dee13aac1899ea7c6946a0f55dd7ee84/26.md' const copyKey = type => { - const prefix = type === 'private' ? 'nsec' : 'npub' - const hex = type === 'private' ? $user.privkey : $user.pubkey - - copyToClipboard(hexToBech32(prefix, hex)) + copyToClipboard( + type === 'private' + ? nip19.nsecEncode($user.privkey) + : nip19.npubEncode($user.pubkey) + ) toast.show("info", `Your ${type} key has been copied to the clipboard.`) } @@ -41,7 +42,7 @@
    Public Key - + copyKey('public')} />

    @@ -52,7 +53,7 @@ {#if $user?.privkey}

    Private Key - + copyKey('private')} />

    diff --git a/src/routes/Login.svelte b/src/routes/Login.svelte index ac9cb5a1..8e515035 100644 --- a/src/routes/Login.svelte +++ b/src/routes/Login.svelte @@ -3,7 +3,7 @@ import {fade, fly} from 'svelte/transition' import {navigate} from 'svelte-routing' import {generatePrivateKey, getPublicKey} from 'nostr-tools' - import {hexToBech32, bech32ToHex} from "src/util/misc" + import {nip19} from 'nostr-tools' import {copyToClipboard} from "src/util/html" import Anchor from "src/partials/Anchor.svelte" import Input from "src/partials/Input.svelte" @@ -27,7 +27,7 @@ } const generateKey = () => { - nsec = hexToBech32('nsec', generatePrivateKey()) + nsec = nip19.nsecEncode(generatePrivateKey()) toast.show("info", "Your private key has been re-generated.") } @@ -50,7 +50,7 @@ } const logInWithPrivateKey = async () => { - const privkey = nsec.startsWith('nsec') ? bech32ToHex(nsec) : nsec + const privkey = nsec.startsWith('nsec') ? nip19.decode(nsec).data : nsec if (!privkey.match(/[a-z0-9]{64}/)) { toast.show("error", "Sorry, but that's an invalid private key.") diff --git a/src/routes/Person.svelte b/src/routes/Person.svelte index 47b2f1b8..d0d4ca17 100644 --- a/src/routes/Person.svelte +++ b/src/routes/Person.svelte @@ -1,6 +1,7 @@