Skip to content

Feed Compiler

The FeedCompiler class transforms feed definitions into optimized RequestItem[] arrays containing filters and relay selections for efficient event fetching.

Types

typescript
export type FeedCompilerOptions = {
  signer?: ISigner
  signal?: AbortSignal
  context?: AdapterContext
  getPubkeysForScope: (scope: Scope) => string[]
  getPubkeysForWOTRange: (minWOT: number, maxWOT: number) => string[]
}

FeedCompiler Class

typescript
export class FeedCompiler {
  constructor(readonly options: FeedCompilerOptions)

  // Check if a feed can be compiled
  canCompile(feed: Feed): boolean

  // Compile a feed into request items
  async compile(feed: Feed): Promise<RequestItem[]>
}

Compilation Logic

Basic Feed Types

  • ID feeds{filters: [{ids: [...]}]}
  • Kind feeds{filters: [{kinds: [...]}]}
  • Author feeds{filters: [{authors: [...]}]}
  • Tag feeds{filters: [{[key]: [...values]}]}
  • Address feeds → Converts to ID filters using getIdFilters()
  • Relay feeds{relays: [...urls]}
  • Global feeds{filters: [{}]}

Time-based Feeds

  • CreatedAt feeds → Processes since/until with optional relative timestamps
  • Scope feeds → Resolves to author filters using getPubkeysForScope()
  • WOT feeds → Resolves to author filters using getPubkeysForWOTRange()
  • Search feeds{filters: [{search: "term"}]}

Complex Feed Types

  • DVM feeds → Requests DVM responses and converts result tags to feeds
  • List feeds → Fetches list events and converts their tags to feeds
  • Label feeds → Fetches label events (kind 1985) and converts tags to feeds

Set Operations

  • Union feeds → Merges all sub-feed results, optimizing by relay
  • Intersection feeds → Finds overlapping filters and relays across sub-feeds

Usage

typescript
import { FeedCompiler, makeAuthorFeed, makeKindFeed } from '@welshman/feeds'

const compiler = new FeedCompiler({
  getPubkeysForScope: (scope) => [...], // Your scope resolution logic
  getPubkeysForWOTRange: (min, max) => [...], // Your WOT logic
  context: adapterContext,
  signal: abortSignal
})

// Compile a simple feed
const feed = makeAuthorFeed("pubkey1", "pubkey2")
const requests = await compiler.compile(feed)
// => [{filters: [{authors: ["pubkey1", "pubkey2"]}]}]

// Check if feed can be compiled
if (compiler.canCompile(feed)) {
  const requests = await compiler.compile(feed)
}