# Module @welshman/app

# @welshman/store

Utilities for dealing with svelte stores when using welshman.

    import {ctx, setContext} from '@welshman/lib'
    import {getNip07} from '@welshman/signer'
    import {throttled} from '@welshman/store'
    import {createEvent, NOTE} from '@welshman/util'
    import {
      getDefaultNetContext,
      getDefaultAppContext,
      signer,
      pubkey,
      publishThunk,
      load,
      initStorage,
      storageAdapters,
      freshness,
      plaintext,
      repository,
      tracker,
    } from '@welshman/app'

    // Set up app config
    setContext({
      net: getDefaultNetContext(),
      app: getDefaultAppContext(),
    })

    // Log in via NIP 07
    addSession({method: 'nip07', pubkey: await getNip07().getPubkey()})

    // Signer is ready to go
    const event = signer.get().encrypt(/* ... */)

    // This will fetch the user's profile automatically, and return an observable that updates
    // automatically. Several different stores exist that are ready to go, including handles,
    // zappers, relaySelections, relays, follows, mutes.
    const profile = deriveProfile(pubkey.get())

    // A global router helps make intelligent relay selections
    const router = ctx.app.router

    // Publish is done using thunks, which optimistically publish to the local database, deferring
    // signing and publishing for instant user feedback. Progress is reported as relays accept/reject the event
    const thunk = publishThunk({
      relays: router.FromUser().getUrls(),
      event: createEvent(NOTE, {content: "hi"}),
      delay: 3000,
    })

    // Thunks can be aborted until after `delay`, allowing for soft-undo
    thunk.controller.abort()

    // Subscriptions automatically infer relays using `router` if not provided. If the request can be cached,
    // results from the local repository are returned immediately. `subscribe` and `load` are both available
    const events = await load({filters: [{kinds: [NOTE]}])

    // Some commands are included
    const thunk = follow('97c70a44366a6535c145b333f973ea86dfdc2d7a99da618c40c64705ad98e322')

    // Stores can be easily synchronized with indexeddb. Freshness keeps track of how stale the caches are,
    // plaintext maps encrypted events to their decrypted content, repository and tracker hold events and
    // event/relay mappings, respectively.
    const ready = initStorage("my-db", 1, {
      relays: {keyPath: "url", store: throttled(3000, relays)},
      handles: {keyPath: "nip05", store: throttled(3000, handles)},
      freshness: storageAdapters.fromObjectStore(freshness, {throttle: 3000}),
      plaintext: storageAdapters.fromObjectStore(plaintext, {throttle: 3000}),
      events: storageAdapters.fromRepositoryAndTracker(repository, tracker, {throttle: 3000}),
    })

##
Enumerations

RelayMode

##
Classes

Router
RouterScenario

##
Type Aliases

AppContext
AppSyncOpts
FallbackPolicy
FreshnessUpdate
Handle
IndexedDbAdapter
MergedThunk
PartialSubscribeRequest
Relay
RelayStats
RouterOptions
RouterScenarioOptions
Search
SearchOptions
Selection
Session
SessionAnyMethod
SessionNip01
SessionNip07
SessionNip46
SessionNip55
SessionPubkey
StorageAdapterOptions
Thunk
ThunkEvent
ThunkRequest
ThunkStatus
ThunkStatusByUrl
Topic

##
Variables

dateFormatter
db
dead
defaultFilterSelectionRules
followersByPubkey
follows
followsByPubkey
freshness
handles
handlesByNip05
inboxRelaySelections
inboxRelaySelectionsByPubkey
INDEXED_KINDS
LOCALE
maxWot
mutersByPubkey
mutes
mutesByPubkey
NIP05_REGEX
nip46Perms
plaintext
profiles
profilesByPubkey
profileSearch
pubkey
relay
relays
relaysByPubkey
relaysByUrl
relaySearch
relaySelections
relaySelectionsByPubkey
repository
session
sessions
signer
storageAdapters
subs
thunks
thunkWorker
timeFormatter
timestampFormatter
TIMEZONE
topics
topicSearch
tracker
userFollows
userInboxRelaySelections
userMutes
userProfile
userRelaySelections
wotGraph
zappers
zappersByLnurl

##
Functions

addMaximalFallbacks
addMinimalFallbacks
addNoFallbacks
addSession
bulkDelete
bulkPut
clearStorage
closeStorage
collection
createFeedController
createLocalDate
createSearch
dateToSeconds
deriveFollows
deriveHandle
deriveHandleForPubkey
deriveInboxRelaySelections
deriveMutes
deriveProfile
deriveProfileDisplay
deriveRelay
deriveRelayDisplay
deriveRelaySelections
deriveUserWotScore
deriveZapper
deriveZapperForPubkey
displayHandle
displayNip05
displayProfileByPubkey
displayRelayByPubkey
dropSession
ensurePlaintext
fetchHandles
fetchRelayProfiles
fetchZappers
follow
formatTimestamp
formatTimestampAsDate
formatTimestampAsTime
formatTimestampRelative
getAll
getDefaultAppContext
getDefaultNetContext
getFallbackRelays
getFilterSelections
getFilterSelectionsForAuthors
getFilterSelectionsForIndexedKinds
getFilterSelectionsForSearch
getFilterSelectionsForUser
getFilterSelectionsForWraps
getFollowers
getFollows
getFollowsWhoFollow
getFollowsWhoMute
getFreshness
getFreshnessKey
getIndexerRelays
getMuters
getMutes
getNetwork
getPlaintext
getPubkeyRelays
getPubkeysForScope
getPubkeysForWOTRange
getReadRelayUrls
getRelayQuality
getRelayUrls
getSearchRelays
getSession
getSigner
getUserWotScore
getWotScore
getWriteRelayUrls
hasNegentropy
initIndexedDbAdapter
initStorage
isMergedThunk
load
loadFollows
loadHandle
loadInboxRelaySelections
loadMutes
loadProfile
loadRelay
loadRelaySelections
loadZapper
makeRelayStats
makeRepositoryStore
makeRouter
makeThunk
makeTrackerStore
mergeThunks
mute
nip44EncryptToSelf
prepEvent
publishThunk
publishThunks
pull
push
putSession
queryProfile
request
requestDVM
searchProfiles
secondsToDate
setFreshnessImmediate
setFreshnessThrottled
setPlaintext
subscribe
sync
tagEvent
tagPubkey
tagReactionTo
tagReplyTo
tagZapSplit
trackRelayStats
unfollow
unmute
updateSession
walkThunks