Skip to content

Storage

The storage system provides IndexedDB persistence for stores and repositories. It's critical to initialize this early in your application lifecycle to ensure data consistency.

typescript
import {
  initStorage,
  storageAdapters,
  throttled,
  repository,
  tracker,
  relays,
  handles,
  freshness,
  plaintext
} from '@welshman/app'

// Real world example from Coracle
const initializeStorage = async () => {
  const ready = initStorage("coracle-db", 1, {
    // Persist relay info
    relays: {
      keyPath: "url",
      store: throttled(3000, relays)
    },

    // Persist NIP-05 handles
    handles: {
      keyPath: "nip05",
      store: throttled(3000, handles)
    },

    // Track data freshness
    freshness: storageAdapters.fromObjectStore(
      freshness,
      {throttle: 3000}
    ),

    // Store decrypted content
    plaintext: storageAdapters.fromObjectStore(
      plaintext,
      {throttle: 3000}
    ),

    // Store events and their sources
    events: storageAdapters.fromRepositoryAndTracker(
      repository,
      tracker,
      {throttle: 3000}
    )
  })

  // Wait for storage to be ready
  await ready

  // App can now start loading data
}

The storage system:

  • Persists data across page reloads
  • Throttles writes for performance
  • Handles store migrations
  • Syncs bidirectionally
  • Supports custom adapters

Initialize storage before making any subscriptions or loading data to ensure proper caching behavior.