From a42ee3006694956287110ed32b799a2c77d2f971 Mon Sep 17 00:00:00 2001 From: Jon Staab Date: Tue, 29 Apr 2025 14:30:12 -0700 Subject: [PATCH] Add blossom server collections --- packages/app/src/blossom.ts | 22 ++++++++++ packages/app/src/index.ts | 1 + packages/app/src/user.ts | 82 ++++++++++++++++++------------------- packages/util/src/Kinds.ts | 1 + packages/util/src/Tags.ts | 2 + 5 files changed, 67 insertions(+), 41 deletions(-) create mode 100644 packages/app/src/blossom.ts diff --git a/packages/app/src/blossom.ts b/packages/app/src/blossom.ts new file mode 100644 index 0000000..335de12 --- /dev/null +++ b/packages/app/src/blossom.ts @@ -0,0 +1,22 @@ +import {BLOSSOM_SERVERS, asDecryptedEvent, readList} from "@welshman/util" +import {TrustedEvent, PublishedList} from "@welshman/util" +import {deriveEventsMapped, collection} from "@welshman/store" +import {repository} from "./core.js" +import {makeOutboxLoader} from "./relaySelections.js" + +export const blossomServers = deriveEventsMapped(repository, { + filters: [{kinds: [BLOSSOM_SERVERS]}], + itemToEvent: item => item.event, + eventToItem: (event: TrustedEvent) => readList(asDecryptedEvent(event)), +}) + +export const { + indexStore: blossomServersByPubkey, + deriveItem: deriveBlossomServers, + loadItem: loadBlossomServers, +} = collection({ + name: "blossomServers", + store: blossomServers, + getKey: blossomServers => blossomServers.event.pubkey, + load: makeOutboxLoader(BLOSSOM_SERVERS), +}) diff --git a/packages/app/src/index.ts b/packages/app/src/index.ts index 4e492a9..a2e71a9 100644 --- a/packages/app/src/index.ts +++ b/packages/app/src/index.ts @@ -1,3 +1,4 @@ +export * from "./blossom.js" export * from "./context.js" export * from "./core.js" export * from "./commands.js" diff --git a/packages/app/src/user.ts b/packages/app/src/user.ts index 623b9b1..6357607 100644 --- a/packages/app/src/user.ts +++ b/packages/app/src/user.ts @@ -1,9 +1,11 @@ -import {derived} from "svelte/store" +import {derived, Readable} from "svelte/store" +import {withGetter} from "@welshman/store" import {pubkey} from "./session.js" import {profilesByPubkey, loadProfile} from "./profiles.js" import {followsByPubkey, loadFollows} from "./follows.js" import {loadPins, pinsByPubkey} from "./pins.js" import {mutesByPubkey, loadMutes} from "./mutes.js" +import {blossomServersByPubkey, loadBlossomServers} from "./blossom.js" import { relaySelectionsByPubkey, inboxRelaySelectionsByPubkey, @@ -12,58 +14,56 @@ import { } from "./relaySelections.js" import {wotGraph} from "./wot.js" -export const userProfile = derived([profilesByPubkey, pubkey], ([$profilesByPubkey, $pubkey]) => { - if (!$pubkey) return undefined +export type MakeUserDataOptions = { + mapStore: Readable> + loadItem: (pubkey: string) => unknown +} - loadProfile($pubkey) +const makeUserData = ({mapStore, loadItem}: MakeUserDataOptions) => + withGetter( + derived([mapStore, pubkey], ([$mapStore, $pubkey]) => { + if (!$pubkey) return undefined - return $profilesByPubkey.get($pubkey) + loadItem($pubkey) + + return $mapStore.get($pubkey) + }) + ) + +export const userProfile = makeUserData({ + mapStore: profilesByPubkey, + loadItem: loadProfile, }) -export const userFollows = derived([followsByPubkey, pubkey], ([$followsByPubkey, $pubkey]) => { - if (!$pubkey) return undefined - - loadFollows($pubkey) - - return $followsByPubkey.get($pubkey) +export const userFollows = makeUserData({ + mapStore: followsByPubkey, + loadItem: loadFollows, }) -export const userMutes = derived([mutesByPubkey, pubkey], ([$mutesByPubkey, $pubkey]) => { - if (!$pubkey) return undefined - - loadMutes($pubkey) - - return $mutesByPubkey.get($pubkey) +export const userMutes = makeUserData({ + mapStore: mutesByPubkey, + loadItem: loadMutes, }) -export const userPins = derived([pinsByPubkey, pubkey], ([$pinsByPubkey, $pubkey]) => { - if (!$pubkey) return undefined - - loadPins($pubkey) - return $pinsByPubkey.get($pubkey) +export const userPins = makeUserData({ + mapStore: pinsByPubkey, + loadItem: loadPins, }) -export const userRelaySelections = derived( - [relaySelectionsByPubkey, pubkey], - ([$relaySelectionsByPubkey, $pubkey]) => { - if (!$pubkey) return undefined +export const userRelaySelections = makeUserData({ + mapStore: relaySelectionsByPubkey, + loadItem: loadRelaySelections, +}) - loadRelaySelections($pubkey) +export const userInboxRelaySelections = makeUserData({ + mapStore: inboxRelaySelectionsByPubkey, + loadItem: loadInboxRelaySelections, +}) - return $relaySelectionsByPubkey.get($pubkey) - }, -) - -export const userInboxRelaySelections = derived( - [inboxRelaySelectionsByPubkey, pubkey], - ([$inboxRelaySelectionsByPubkey, $pubkey]) => { - if (!$pubkey) return undefined - - loadInboxRelaySelections($pubkey) - - return $inboxRelaySelectionsByPubkey.get($pubkey) - }, -) +export const userBlossomServers = makeUserData({ + mapStore: blossomServersByPubkey, + loadItem: loadBlossomServers, +}) export const getUserWotScore = (tpk: string) => wotGraph.get().get(tpk) || 0 diff --git a/packages/util/src/Kinds.ts b/packages/util/src/Kinds.ts index 8b3af27..2c2f033 100644 --- a/packages/util/src/Kinds.ts +++ b/packages/util/src/Kinds.ts @@ -118,6 +118,7 @@ export const FEEDS = 10014 export const TOPICS = 10015 export const EMOJIS = 10030 export const INBOX_RELAYS = 10050 +export const BLOSSOM_SERVERS = 10063 export const FILE_SERVERS = 10096 export const LIGHTNING_PUB_RPC = 21000 export const CLIENT_AUTH = 22242 diff --git a/packages/util/src/Tags.ts b/packages/util/src/Tags.ts index 08a4e0b..e6a46ac 100644 --- a/packages/util/src/Tags.ts +++ b/packages/util/src/Tags.ts @@ -109,3 +109,5 @@ export const getReplyTagValues = (tags: string[][]) => export const uniqTags = (tags: string[][]) => uniqBy(t => t.slice(0, 2).join(":"), tags) export const tagsFromIMeta = (imeta: string[]) => imeta.map((m: string) => m.split(" ")) + +export const tagger = (name: string) => (value: string) => [name, value]