Skip to content

Repository

The Repository module provides a robust in-memory event storage system with indexing, querying, and event replacement capabilities.

Core Features

  • Event storage and indexing
  • Query support with multiple filters
  • Event replacement and deletion tracking
  • Event update notifications
  • Optimized indexes for common queries

Class Definition

typescript
class Repository<E extends HashedEvent = TrustedEvent> extends Emitter {
  // Storage indexes
  eventsById = new Map<string, E>()
  eventsByWrap = new Map<string, E>()
  eventsByAddress = new Map<string, E>()
  eventsByTag = new Map<string, E[]>()
  eventsByDay = new Map<number, E[]>()
  eventsByAuthor = new Map<string, E[]>()
  eventsByKind = new Map<number, E[]>()
  deletes = new Map<string, number>()
}

Core Methods

Event Management

typescript
// Store or update event
publish(event: E, opts = { shouldNotify: true }): boolean

// Get event by ID or address
getEvent(idOrAddress: string): E | undefined

// Check if event exists
hasEvent(event: E): boolean

// Remove event
removeEvent(idOrAddress: string): void

// Check deletion status
isDeleted(event: E): boolean
isDeletedByAddress(event: E): boolean
isDeletedById(event: E): boolean

Querying

typescript
// Query events with filters
query(
  filters: Filter[],
  opts = {
    includeDeleted: false,
    shouldSort: true
  }
): E[]

// Dump all events
dump(): E[]

// Load events in bulk
load(events: E[], chunkSize = 1000): void

Usage Examples

Basic Repository Operations

typescript
// Create repository
const repo = new Repository<TrustedEvent>()

// Add events
repo.publish(event)

// Query events
const events = repo.query([
  { kinds: [1], limit: 100 }
])

// Check event status
if (!repo.isDeleted(event)) {
  processEvent(event)
}

Bulk Operations

typescript
// Load multiple events
repo.load(events, 500) // Process in chunks of 500

// Get all events
const allEvents = repo.dump()

Query Examples

typescript
// Query with multiple filters
const events = repo.query([
  // Recent events from specific authors
  {
    kinds: [1],
    authors: ['pub1', 'pub2'],
    since: now() - 24 * 60 * 60
  },
  // Events with specific tags
  {
    '#t': ['bitcoin', 'nostr'],
    limit: 50
  }
])