diff --git a/package-lock.json b/package-lock.json index 93293800..249e8bf4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,6 +23,7 @@ "@tiptap/extension-text": "^2.6.6", "@tiptap/suggestion": "^2.6.4", "@types/throttle-debounce": "^5.0.2", + "@welshman/app": "^0.0.1", "@welshman/lib": "^0.0.15", "@welshman/net": "^0.0.20", "@welshman/signer": "^0.0.4", @@ -1652,6 +1653,16 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@welshman/app": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@welshman/app/-/app-0.0.1.tgz", + "integrity": "sha512-3vvbfOwMhY6iSyswhTlmL1TCkHVF7nlpxUVvbNpgS4KD2gIs4YFr9WqAlSL4x1Ebjdm0EE3KakCr3YodP5kIOg==", + "dependencies": { + "@welshman/lib": "0.0.15", + "@welshman/util": "0.0.28", + "svelte": "^4.2.18" + } + }, "node_modules/@welshman/lib": { "version": "0.0.15", "resolved": "https://registry.npmjs.org/@welshman/lib/-/lib-0.0.15.tgz", diff --git a/package.json b/package.json index 4458d476..0c4dae11 100644 --- a/package.json +++ b/package.json @@ -48,6 +48,7 @@ "@tiptap/extension-text": "^2.6.6", "@tiptap/suggestion": "^2.6.4", "@types/throttle-debounce": "^5.0.2", + "@welshman/app": "^0.0.1", "@welshman/lib": "^0.0.15", "@welshman/net": "^0.0.20", "@welshman/signer": "^0.0.4", diff --git a/src/app/base.ts b/src/app/base.ts deleted file mode 100644 index 48b8e8e1..00000000 --- a/src/app/base.ts +++ /dev/null @@ -1,87 +0,0 @@ -import {derived} from "svelte/store" -import {memoize, assoc} from "@welshman/lib" -import type {TrustedEvent, HashedEvent} from "@welshman/util" -import {Repository, createEvent, Relay, REACTION, ZAP_RESPONSE} from "@welshman/util" -import {withGetter} from "@welshman/store" -import {NetworkContext, Tracker} from "@welshman/net" -import {Nip46Broker, Nip46Signer, Nip07Signer, Nip01Signer} from "@welshman/signer" -import {synced} from "@lib/util" -import type {Session} from "@app/types" - -export const DEFAULT_RELAYS = [ - "wss://groups.fiatjaf.com/", - "wss://relay29.galaxoidlabs.com/", - "wss://devrelay.highlighter.com/", - "wss://relay.groups.nip29.com/", -] - -export const INDEXER_RELAYS = ["wss://purplepag.es/", "wss://relay.damus.io/", "wss://nos.lol/"] - -export const DUFFLEPUD_URL = "https://dufflepud.onrender.com" - -export const REACTION_KINDS = [REACTION, ZAP_RESPONSE] - -export const repository = new Repository() - -export const relay = new Relay(repository) - -export const tracker = new Tracker() - -export const pk = withGetter(synced("pk", null)) - -export const sessions = withGetter(synced>("sessions", {})) - -export const session = withGetter( - derived([pk, sessions], ([$pk, $sessions]) => ($pk ? $sessions[$pk] : null)), -) - -export const getSession = (pubkey: string) => sessions.get()[pubkey] - -export const addSession = (session: Session) => { - sessions.update(assoc(session.pubkey, session)) - pk.set(session.pubkey) -} - -export const nip46Perms = "sign_event:22242,nip04_encrypt,nip04_decrypt,nip44_encrypt,nip44_decrypt" - -export const getSigner = memoize((session: Session) => { - switch (session?.method) { - case "extension": - return new Nip07Signer() - case "privkey": - return new Nip01Signer(session.secret!) - case "nip46": - return new Nip46Signer(Nip46Broker.get(session.pubkey, session.secret!, session.handler!)) - default: - return null - } -}) - -export const signer = withGetter(derived(session, getSigner)) - -const seenChallenges = new Set() - -Object.assign(NetworkContext, { - onEvent: (url: string, event: TrustedEvent) => tracker.track(event.id, url), - isDeleted: (url: string, event: TrustedEvent) => repository.isDeleted(event), - onAuth: async (url: string, challenge: string) => { - if (seenChallenges.has(challenge) || !signer.get()) { - return - } - - seenChallenges.add(challenge) - - const event = await signer.get()!.sign( - createEvent(22242, { - tags: [ - ["relay", url], - ["challenge", challenge], - ], - }), - ) - - NetworkContext.pool.get(url).send(["AUTH", event]) - - return event - }, -}) diff --git a/src/app/commands.ts b/src/app/commands.ts index 4ba551f4..cf57b6f9 100644 --- a/src/app/commands.ts +++ b/src/app/commands.ts @@ -8,26 +8,26 @@ import { displayProfile, } from "@welshman/util" import {PublishStatus} from "@welshman/net" -import {pk, repository, INDEXER_RELAYS} from "@app/base" import { + pubkey, + repository, loadOne, - getWriteRelayUrls, - loadGroup, - loadGroupMembership, - loadProfile, - loadFollows, - loadMutes, - getRelaySelectionsByPubkey, - loadRelaySelections, makeThunk, publishThunk, - getProfilesByPubkey, -} from "@app/state" + loadProfile, + profilesByPubkey, + relaySelectionsByPubkey, + loadRelaySelections, + getWriteRelayUrls, + loadFollows, + loadMutes, +} from "@welshman/app" +import {loadGroup, loadGroupMembership, INDEXER_RELAYS} from "@app/state" // Utils export const getPubkeyHints = (pubkey: string) => { - const selections = getRelaySelectionsByPubkey().get(pubkey) + const selections = relaySelectionsByPubkey.get().get(pubkey) const relays = selections ? getWriteRelayUrls(selections) : [] const hints = relays.length ? relays : INDEXER_RELAYS @@ -35,7 +35,7 @@ export const getPubkeyHints = (pubkey: string) => { } export const getPubkeyPetname = (pubkey: string) => { - const profile = getProfilesByPubkey().get(pubkey) + const profile = profilesByPubkey.get().get(pubkey) const display = displayProfile(profile) return display @@ -82,9 +82,9 @@ export const loadUserData = async (pubkey: string, hints: string[] = []) => { export type ModifyTags = (tags: string[][]) => string[][] export const updateList = async (kind: number, modifyTags: ModifyTags) => { - const $pk = pk.get()! - const [prev] = repository.query([{kinds: [kind], authors: [$pk]}]) - const relays = getWriteRelayUrls(getRelaySelectionsByPubkey().get($pk)) + const $pubkey = pubkey.get()! + const [prev] = repository.query([{kinds: [kind], authors: [$pubkey]}]) + const relays = getWriteRelayUrls(relaySelectionsByPubkey.get().get($pubkey)) // Preserve content if we have it const event = prev @@ -102,7 +102,7 @@ export const removeGroupMemberships = (noms: string[]) => export const sendJoinRequest = async (nom: string, url: string): Promise<[boolean, string]> => { const relays = [url] - const filters = [{kinds: [9000], "#h": [nom], "#p": [pk.get()!], since: now() - 30}] + const filters = [{kinds: [9000], "#h": [nom], "#p": [pubkey.get()!], since: now() - 30}] const event = createEvent(GROUP_JOIN, {tags: [["h", nom]]}) const statusData = await publishThunk(makeThunk({event, relays})) diff --git a/src/app/components/GroupCompose.svelte b/src/app/components/GroupCompose.svelte index b1318217..07513874 100644 --- a/src/app/components/GroupCompose.svelte +++ b/src/app/components/GroupCompose.svelte @@ -5,10 +5,11 @@ import {createEditor, type Editor, EditorContent} from "svelte-tiptap" import {NProfileExtension, TagExtension as TopicExtension, ImageExtension} from "nostr-editor" import {createEvent, CHAT_MESSAGE} from "@welshman/util" + import {publishThunk, makeThunk} from "@welshman/app" import {findNodes} from "@lib/tiptap" import Icon from "@lib/components/Icon.svelte" import Button from "@lib/components/Button.svelte" - import {publishThunk, makeThunk, userRelayUrlsByNom} from "@app/state" + import {userRelayUrlsByNom} from "@app/state" import {makeMention, makeIMeta} from "@app/commands" import {getChatEditorOptions, addFile} from "@app/editor" diff --git a/src/app/components/GroupComposeMention.svelte b/src/app/components/GroupComposeMention.svelte index 93638fa6..68477ef0 100644 --- a/src/app/components/GroupComposeMention.svelte +++ b/src/app/components/GroupComposeMention.svelte @@ -3,8 +3,8 @@ import type {NodeViewProps} from "@tiptap/core" import {NodeViewWrapper} from "svelte-tiptap" import {displayProfile} from "@welshman/util" + import {deriveProfile} from "@welshman/app" import Link from "@lib/components/Link.svelte" - import {deriveProfile} from "@app/state" export let node: NodeViewProps["node"] export let selected: NodeViewProps["selected"] diff --git a/src/app/components/GroupComposeProfileSuggestion.svelte b/src/app/components/GroupComposeProfileSuggestion.svelte index 4fa29c9d..16364ad5 100644 --- a/src/app/components/GroupComposeProfileSuggestion.svelte +++ b/src/app/components/GroupComposeProfileSuggestion.svelte @@ -1,5 +1,5 @@ diff --git a/src/app/components/LogIn.svelte b/src/app/components/LogIn.svelte index faf19120..dd730aae 100644 --- a/src/app/components/LogIn.svelte +++ b/src/app/components/LogIn.svelte @@ -1,16 +1,14 @@