Stores and Loaders
The @welshman/app
package provides a powerful system of collection-based reactive stores and loader utilities.
These utilities follow a consistent pattern for working with various types of Nostr data, making it easy to:
- Query data from the repository
- Transform it into application-specific structures
- Access it reactively in your UI
- Trigger network loading when needed
Core Concept
Each collection-based module exports a similar set of utilities:
typescript
// Common pattern across collection-based modules
export const {
// Main collection store (derived from repository)
store: follows,
// Indexed map for efficient lookup
indexStore: followsByPubkey,
// Function to get a reactive store for a specific item
deriveItem: deriveFollows,
// Function to trigger loading an item from the network
loadItem: loadFollows
} = collection({
name: "collection-name",
store: baseStore,
getKey: item => item.keyProperty,
load: async (key) => { /* Loading logic */ }
})
Available Collections
Collection | Key | Kind | Description |
---|---|---|---|
follows | pubkey | 3 | User follow lists |
mutes | pubkey | 10000 | User mute lists |
pins | pubkey | 10001 | User pinned items |
profiles | pubkey | 0 | User profile metadata |
relaySelections | pubkey | 10002 | User relay preferences |
inboxRelaySelections | pubkey | 10005 | User inbox relay settings |
zappers | lnurl | - | Lightning zapper metadata |
handles | nip05 | - | NIP-05 identifier metadata |
Usage Examples
Loading and Accessing Data
typescript
import { loadProfile, deriveProfile, profilesByPubkey } from '@welshman/app'
// Trigger loading a profile from the network
await loadProfile('pubkey123')
// Get a reactive store for a specific profile
const profile = deriveProfile('pubkey123')
// Access all profiles by pubkey
const allProfiles = profilesByPubkey.get()
const specificProfile = allProfiles.get('pubkey123')
User-Specific Collections
Several modules provide user-specific derived stores that automatically load data for the currently signed-in user:
typescript
import { userProfile, userFollows, userMutes, userPins } from '@welshman/app'
// These are derived stores that automatically:
// 1. Watch for changes to the current user's pubkey
// 2. Load the appropriate data when the user changes
// 3. Provide the data reactively
userProfile.subscribe(profile => {
// Current user's profile data
})
userFollows.subscribe(follows => {
// Current user's follow list
})
Web of Trust Utilities
The wot.ts
module provides additional utilities for analyzing the social graph:
typescript
import { getFollows, getFollowers, getNetwork, getWotScore } from '@welshman/app'
// Get users followed by a pubkey
const followedUsers = getFollows('pubkey123')
// Get users following a pubkey
const followers = getFollowers('pubkey123')
// Get extended network (follows-of-follows)
const network = getNetwork('pubkey123')
// Calculate trust score between users
const score = getWotScore('userPubkey', 'targetPubkey')